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+Ci0gKi8KLXB1YmxpYyB2b2lkIHN3YXBCdWZmZXJzICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlpbnQgaERDID0gT1MuR2V0REMgKGhhbmRsZSk7Ci0JV0dMLlN3YXBCdWZmZXJzIChoREMpOwotCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvTEFZRVJQTEFORURFU0NSSVBUT1IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL0xBWUVSUExBTkVERVNDUklQVE9SLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNjc0YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvTEFZRVJQTEFORURFU0NSSVBUT1IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmludGVybmFsLndpbjMyOwotCi0KLXB1YmxpYyBjbGFzcyBMQVlFUlBMQU5FREVTQ1JJUFRPUiB7Ci0gICAgcHVibGljIHNob3J0IG5TaXplOwotICAgIHB1YmxpYyBzaG9ydCBuVmVyc2lvbjsKLSAgICBwdWJsaWMgaW50IGR3RmxhZ3M7Ci0gICAgcHVibGljIGJ5dGUgaVBpeGVsVHlwZTsKLSAgICBwdWJsaWMgYnl0ZSBjQ29sb3JCaXRzOwotICAgIHB1YmxpYyBieXRlIGNSZWRCaXRzOwotICAgIHB1YmxpYyBieXRlIGNSZWRTaGlmdDsKLSAgICBwdWJsaWMgYnl0ZSBjR3JlZW5CaXRzOwotICAgIHB1YmxpYyBieXRlIGNHcmVlblNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNCbHVlQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQmx1ZVNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNBbHBoYUJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0FscGhhU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0FjY3VtQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1SZWRCaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUdyZWVuQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1CbHVlQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1BbHBoYUJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0RlcHRoQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjU3RlbmNpbEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0F1eEJ1ZmZlcnM7Ci0gICAgcHVibGljIGJ5dGUgaUxheWVyUGxhbmU7Ci0gICAgcHVibGljIGJ5dGUgYlJlc2VydmVkOwotICAgIHB1YmxpYyBpbnQgY3JUcmFuc3BhcmVudDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSAzNjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL1BJWEVMRk9STUFUREVTQ1JJUFRPUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvUElYRUxGT1JNQVRERVNDUklQVE9SLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTcwMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvUElYRUxGT1JNQVRERVNDUklQVE9SLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC53aW4zMjsKLQotCi1wdWJsaWMgY2xhc3MgUElYRUxGT1JNQVRERVNDUklQVE9SIHsKLSAgIAlwdWJsaWMgc2hvcnQgblNpemU7Ci0gICAgcHVibGljIHNob3J0IG5WZXJzaW9uOwotICAgIHB1YmxpYyBpbnQgZHdGbGFnczsKLSAgICBwdWJsaWMgYnl0ZSBpUGl4ZWxUeXBlOwotICAgIHB1YmxpYyBieXRlIGNDb2xvckJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY1JlZEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY1JlZFNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNHcmVlbkJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0dyZWVuU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0JsdWVCaXRzOwotICAgIHB1YmxpYyBieXRlIGNCbHVlU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0FscGhhQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWxwaGFTaGlmdDsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1CaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bVJlZEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0FjY3VtR3JlZW5CaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUJsdWVCaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUFscGhhQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjRGVwdGhCaXRzOwotICAgIHB1YmxpYyBieXRlIGNTdGVuY2lsQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQXV4QnVmZmVyczsKLSAgICBwdWJsaWMgYnl0ZSBpTGF5ZXJUeXBlOwotICAgIHB1YmxpYyBieXRlIGJSZXNlcnZlZDsKLSAgICBwdWJsaWMgaW50IGR3TGF5ZXJNYXNrOwotICAgIHB1YmxpYyBpbnQgZHdWaXNpYmxlTWFzazsKLSAgICBwdWJsaWMgaW50IGR3RGFtYWdlTWFzazsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSA0MDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL1dHTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvV0dMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZGI2NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvV0dMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuaW50ZXJuYWwud2luMzI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotCi1wdWJsaWMgY2xhc3MgV0dMIHsKLQkKLXN0YXRpYyB7Ci0JTGlicmFyeS5sb2FkTGlicmFyeSgiZ2wiKTsKLX0KLQkKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdHTF9GT05UX0xJTkVTICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX0ZPTlRfUE9MWUdPTlMgICA9IDE7Ci0KLS8qIExBWUVSUExBTkVERVNDUklQVE9SIGZsYWdzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfRE9VQkxFQlVGRkVSICAgICAgICA9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1RFUkVPICAgICAgICAgICAgICA9IDB4MDAwMDAwMDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1VQUE9SVF9HREkgICAgICAgICA9IDB4MDAwMDAwMTA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1VQUE9SVF9PUEVOR0wgICAgICA9IDB4MDAwMDAwMjA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfREVQVEggICAgICAgICA9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfU1RFTkNJTCAgICAgICA9IDB4MDAwMDAwODA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfQUNDVU0gICAgICAgICA9IDB4MDAwMDAxMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1dBUF9FWENIQU5HRSAgICAgICA9IDB4MDAwMDAyMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1dBUF9DT1BZICAgICAgICAgICA9IDB4MDAwMDA0MDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfVFJBTlNQQVJFTlQgICAgICAgICA9IDB4MDAwMDEwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExQRF9UWVBFX1JHQkEgICAgICAgID0gMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExQRF9UWVBFX0NPTE9SSU5ERVggID0gMTsKLQotLyogd2dsU3dhcExheWVyQnVmZmVycyBmbGFncyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfTUFJTl9QTEFORSAgICAgPSAweDAwMDAwMDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEgICAgICAgPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTIgICAgICAgPSAweDAwMDAwMDA0OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTMgICAgICAgPSAweDAwMDAwMDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTQgICAgICAgPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTUgICAgICAgPSAweDAwMDAwMDIwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTYgICAgICAgPSAweDAwMDAwMDQwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTcgICAgICAgPSAweDAwMDAwMDgwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTggICAgICAgPSAweDAwMDAwMTAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTkgICAgICAgPSAweDAwMDAwMjAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEwICAgICAgPSAweDAwMDAwNDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTExICAgICAgPSAweDAwMDAwODAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEyICAgICAgPSAweDAwMDAxMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEzICAgICAgPSAweDAwMDAyMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTE0ICAgICAgPSAweDAwMDA0MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTE1ICAgICAgPSAweDAwMDA4MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxICAgICAgPSAweDAwMDEwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkyICAgICAgPSAweDAwMDIwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkzICAgICAgPSAweDAwMDQwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk0ICAgICAgPSAweDAwMDgwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk1ICAgICAgPSAweDAwMTAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk2ICAgICAgPSAweDAwMjAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk3ICAgICAgPSAweDAwNDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk4ICAgICAgPSAweDAwODAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk5ICAgICAgPSAweDAxMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMCAgICAgPSAweDAyMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMSAgICAgPSAweDA0MDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMiAgICAgPSAweDA4MDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMyAgICAgPSAweDEwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxNCAgICAgPSAweDIwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxNSAgICAgPSAweDQwMDAwMDAwOwotCi0vKiBwaXhlbCB0eXBlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1RZUEVfUkdCQSAgICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1RZUEVfQ09MT1JJTkRFWCAgPSAxOwotCi0vKiBsYXllciB0eXBlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX01BSU5fUExBTkUgICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX09WRVJMQVlfUExBTkUgICAgPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1VOREVSTEFZX1BMQU5FICAgPSAoLTEpOwotCi0vKiBQSVhFTEZPUk1BVERFU0NSSVBUT1IgZmxhZ3MgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9ET1VCTEVCVUZGRVIgICAgICAgICAgICA9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1RFUkVPICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX0RSQVdfVE9fV0lORE9XICAgICAgICAgID0gMHgwMDAwMDAwNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9EUkFXX1RPX0JJVE1BUCAgICAgICAgICA9IDB4MDAwMDAwMDg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1VQUE9SVF9HREkgICAgICAgICAgICAgPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1NVUFBPUlRfT1BFTkdMICAgICAgICAgID0gMHgwMDAwMDAyMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9HRU5FUklDX0ZPUk1BVCAgICAgICAgICA9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfTkVFRF9QQUxFVFRFICAgICAgICAgICAgPSAweDAwMDAwMDgwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX05FRURfU1lTVEVNX1BBTEVUVEUgICAgID0gMHgwMDAwMDEwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9TV0FQX0VYQ0hBTkdFICAgICAgICAgICA9IDB4MDAwMDAyMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1dBUF9DT1BZICAgICAgICAgICAgICAgPSAweDAwMDAwNDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1NXQVBfTEFZRVJfQlVGRkVSUyAgICAgID0gMHgwMDAwMDgwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9HRU5FUklDX0FDQ0VMRVJBVEVEICAgICA9IDB4MDAwMDEwMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1VQUE9SVF9ESVJFQ1REUkFXICAgICAgPSAweDAwMDAyMDAwOwotCi0vKiBQSVhFTEZPUk1BVERFU0NSSVBUT1IgZmxhZ3MgZm9yIHVzZSBpbiBDaG9vc2VQaXhlbEZvcm1hdCBvbmx5ICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfREVQVEhfRE9OVENBUkUgICAgICAgICAgPSAweDIwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX0RPVUJMRUJVRkZFUl9ET05UQ0FSRSAgID0gMHg0MDAwMDAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9TVEVSRU9fRE9OVENBUkUgICAgICAgICA9IDB4ODAwMDAwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBDaG9vc2VQaXhlbEZvcm1hdChpbnQgaGRjLCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgcHBmZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgRGVzY3JpYmVQaXhlbEZvcm1hdChpbnQgaGRjLCBpbnQgaVBpeGVsRm9ybWF0LCBpbnQgbkJ5dGVzLCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgcHBmZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgR2V0UGl4ZWxGb3JtYXQoaW50IGhkYyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIFNldFBpeGVsRm9ybWF0KGludCBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIFBJWEVMRk9STUFUREVTQ1JJUFRPUiBwcGZkKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gU3dhcEJ1ZmZlcnMoaW50IGhkYyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbENvcHlDb250ZXh0KGludCBoZ2xyY1NyYywgaW50IGhnbHJjRHN0LCBpbnQgbWFzayk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsQ3JlYXRlQ29udGV4dChpbnQgaGRjKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCB3Z2xDcmVhdGVMYXllckNvbnRleHQoaW50IGhkYywgaW50IGlMYXllclBsYW5lKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsRGVsZXRlQ29udGV4dChpbnQgaGdscmMpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IHdnbEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsR2V0Q3VycmVudERDKCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsR2V0UHJvY0FkZHJlc3MoYnl0ZVtdIGxwc3pQcm9jKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsTWFrZUN1cnJlbnQoaW50IGhkYywgaW50IGhnbHJjKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsU2hhcmVMaXN0cyhpbnQgaGdscmMxLCBpbnQgaGdscmMyKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsVXNlRm9udEJpdG1hcHNBKGludCBoZGMsIGludCBmaXJzdCwgaW50IGNvdW50LCBpbnQgbGlzdEJhc2UpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiB3Z2xVc2VGb250Qml0bWFwc1coaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gd2dsVXNlRm9udEJpdG1hcHMoaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSkgewotCWlmIChPUy5Jc1VuaWNvZGUpIHJldHVybiB3Z2xVc2VGb250Qml0bWFwc1coaGRjLCBmaXJzdCwgY291bnQsIGxpc3RCYXNlKTsKLQlyZXR1cm4gd2dsVXNlRm9udEJpdG1hcHNBKGhkYywgZmlyc3QsIGNvdW50LCBsaXN0QmFzZSk7Ci19Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFVzZUZvbnRPdXRsaW5lc0EoaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIGludCBscGdtZik7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFVzZUZvbnRPdXRsaW5lc1coaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIGludCBscGdtZik7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gd2dsVXNlRm9udE91dGxpbmVzKGludCBoZGMsIGludCBmaXJzdCwgaW50IGNvdW50LCBpbnQgbGlzdEJhc2UsIGZsb2F0IGRldmlhdGlvbiwgZmxvYXQgZXh0cnVzaW9uLCBpbnQgZm9ybWF0LCBpbnQgbHBnbWYpIHsKLQlpZiAoT1MuSXNVbmljb2RlKSByZXR1cm4gd2dsVXNlRm9udE91dGxpbmVzVyhoZGMsIGZpcnN0LCBjb3VudCwgbGlzdEJhc2UsIGRldmlhdGlvbiwgZXh0cnVzaW9uLCBmb3JtYXQsIGxwZ21mKTsKLQlyZXR1cm4gd2dsVXNlRm9udE91dGxpbmVzQShoZGMsIGZpcnN0LCBjb3VudCwgbGlzdEJhc2UsIGRldmlhdGlvbiwgZXh0cnVzaW9uLCBmb3JtYXQsIGxwZ21mKTsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsRGVzY3JpYmVMYXllclBsYW5lKGludCBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIGludCBpTGF5ZXJQbGFuZSwgaW50IG5CeXRlcywgTEFZRVJQTEFORURFU0NSSVBUT1IgcGxwZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsU2V0TGF5ZXJQYWxldHRlRW50cmllcyhpbnQgaGRjLCBpbnQgaUxheWVyUGxhbmUsIGludCBpU3RhcnQsIGludCBjRW50cmllcywgaW50W10gcGNyKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCB3Z2xHZXRMYXllclBhbGV0dGVFbnRyaWVzKGludCBoZGMsIGludCBpTGF5ZXJQbGFuZSwgaW50IGlTdGFydCwgaW50IGNFbnRyaWVzLCBpbnRbXSBwY3IpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiB3Z2xSZWFsaXplTGF5ZXJQYWxldHRlKGludCBoZGMsIGludCBpTGF5ZXJQbGFuZSwgYm9vbGVhbiBiUmVhbGl6ZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFN3YXBMYXllckJ1ZmZlcnMoaW50IGhkYywgaW50IGZ1UGxhbmVzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTU4MGE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJKTkkgR2VuZXJhdGlvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IlNsZWFrIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iTmF0aXZlU3RhdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJNb3ppbGxhIEdlbmVyYXRpb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJJY29uIEV4ZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGQ1MjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LnRvb2xzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5hcGFjaGUuYW50PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5zd3Q8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9JY29uRXhlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvSWNvbkV4ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjIyNmEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9JY29uRXhlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBDdXN0b21pemUgdGhlIGljb24gb2YgYSBXaW5kb3dzIGV4ZQotICogCi0gKiBXQVJOSU5HISBUaGlzIGNsYXNzIGlzIG5vdCBwYXJ0IG9mIFNXVCBBUEkuIEl0IGlzIE5PVCBBUEkuIEl0IGlzIGFuIGludGVybmFsCi0gKiB0b29sIHRoYXQgbWF5IGJlIGNoYW5nZWQgb3IgcmVtb3ZlZCBhdCBhbnl0aW1lLgotICogCi0gKiBCYXNlZCBvbiBNU0ROICJBbiBJbi1EZXB0aCBMb29rIGludG8gdGhlIFdpbjMyIFBvcnRhYmxlIEV4ZWN1dGFibGUgRmlsZSBGb3JtYXQiCi0gKi8KLXB1YmxpYyBjbGFzcyBJY29uRXhlIHsKLQkKLQkgLyoqCi0JICogUmVwbGFjZSB0aGUgRGVza3RvcCBpY29ucyBwcm92aWRlZCBpbiB0aGUgV2luZG93cyBleGVjdXRhYmxlIHByb2dyYW0KLQkgKiB3aXRoIG1hdGNoaW5nIGljb25zIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLgotCSAqCi0gCSAqIFRha2VzIDIgYXJndW1lbnRzCi0JICogYXJndW1lbnQgMDogdGhlIFdpbmRvd3MgZXhlY3V0YWJsZSBlLmcgYzovZWNsaXBzZS9lY2xpcHNlLmV4ZQotCSAqIGFyZ3VtZW50IDE6IFRoZSAuaWNvIGZpbGUgdG8gd3JpdGUgdG8gdGhlIGdpdmVuIGV4ZWN1dGFibGUgZS5nLiBjOi9teUFwcC5pY28KLQkgKgotCSAqIE5vdGUgMS4gV3JpdGUgYWNjZXNzIHRvIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gaXMgcmVxdWlyZWQuIEFzIGEgcmVzdWx0LCB0aGF0Ci0JICogcHJvZ3JhbSBtdXN0IG5vdCBiZSBjdXJyZW50bHkgcnVubmluZyBvciBlZGl0ZWQgZWxzZXdoZXJlLgotCSAqIAotCSAqIE5vdGUgMi4gIFRoZSBFY2xpcHNlIDMuMSBsYXVuY2hlciByZXF1aXJlcyBhIC5pY28gZmlsZSB3aXRoIHRoZSBmb2xsb3dpbmcgNiBpbWFnZXMKLQkgKiAxLiAzMngzMiwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogMi4gMTZ4MTYsIDQgYml0IChXaW5kb3dzIDE2IGNvbG9ycyBwYWxldHRlKQotCSAqIDMuIDE2eDE2LCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiA0LiAzMngzMiwgOCBiaXQgKDI1NiBjb2xvcnMpCi0JICogNS4gNDh4NDgsIDQgYml0IChXaW5kb3dzIDE2IGNvbG9ycyBwYWxldHRlKQotCSAqIDYuIDQ4eDQ4LCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiBBIHVzZXIgaWNvbiBtYXRjaGluZyBleGFjdGx5IHRoZSB3aWR0aC9oZWlnaHQvZGVwdGggb2YgYW4gZXhlY3V0YWJsZSBpY29uIHdpbGwgYmUgd3JpdHRlbgotCSAqIHRvIHRoZSBleGVjdXRhYmxlIGFuZCB3aWxsIHJlcGxhY2UgdGhhdCBleGVjdXRhYmxlIGljb24uIElmIGFuIGV4ZWN1dGFibGUgaWNvbgotCSAqIGRvZXMgbm90IG1hdGNoIGEgdXNlciBpY29uLCBpdCBpcyBzaWxlbnRseSBsZWZ0IGFzIGlzLgotCSAqIAotCSAqIE5vdGUgMy4gVGhpcyBmdW5jdGlvbiBtb2RpZmllcyB0aGUgY29udGVudCBvZiB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtIGFuZCBtYXkgY2F1c2UKLQkgKiBpdHMgY29ycnVwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmIChhcmdzLmxlbmd0aCA8IDIpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IEljb25FeGUgPHdpbmRvd3MgZXhlY3V0YWJsZT4gPGljbyBmaWxlPiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQl0cnkgewotCQkJSW1hZ2VEYXRhW10gZGF0YSA9IG51bGw7Ci0JCQkKLQkJCWlmIChhcmdzLmxlbmd0aCA9PSAyKSB7Ci0JCQkJLyogSUNPIGNhc2UgKi8KLQkJCQlkYXRhID0gbG9hZGVyLmxvYWQoYXJnc1sxXSk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIEJNUCBjYXNlIC0gZWFjaCBmb2xsb3dpbmcgYXJndW1lbnQgaXMgYSBzaW5nbGUgQk1QIGZpbGUKLQkJCQkgKiBCTVAgaXMgaGFuZGxlZCBmb3IgdGVzdGluZyBwdXJwb3NlIG9ubHkuIFRoZSBJQ08gZmlsZSBpcyB0aGUKLQkJCQkgKiBvZmZpY2lhbCBNaWNyb3NvZnQgZm9ybWF0IGZvciBpbWFnZSByZXNvdXJjZXMuCi0JCQkJICovCi0JCQkJZGF0YSA9IG5ldyBJbWFnZURhdGFbYXJncy5sZW5ndGggLSAxXTsKLQkJCQlmb3IgKGludCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJSW1hZ2VEYXRhW10gY3VycmVudCA9IGxvYWRlci5sb2FkKGFyZ3NbaV0pOwotCQkJCQlkYXRhW2kgLSAxXSA9IGN1cnJlbnRbMF07Ci0JCQkJfQotCQkJfQotCQkJaW50IG5NaXNzaW5nID0gdW5sb2FkSWNvbnMoYXJnc1swXSwgZGF0YSk7Ci0JCQlpZiAobk1pc3NpbmcgIT0gMCkgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciAtICIrbk1pc3NpbmcrIiBpY29uKHMpIG5vdCByZXBsYWNlZCBpbiAiK2FyZ3NbMF0rIiB1c2luZyAiK2FyZ3NbMV0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQkvKiBJbXBsZW1lbnRhdGlvbiAqLwotCi0JLyoqIAotCSAqIFJldHJpZXZlIHRoZSBEZXNrdG9wIGljb25zIHByb3ZpZGVkIGluIHRoZSBXaW5kb3dzIGV4ZWN1dGFibGUgcHJvZ3JhbS4KLQkgKiBUaGVzZSBpY29ucyBhcmUgdHlwaWNhbGx5IHNob3duIGluIHZhcmlvdXMgcGxhY2VzIG9mIHRoZSBXaW5kb3dzIGRlc2t0b3AuCi0JICogCi0JICogTm90ZS4gIFRoZSBFY2xpcHNlIDMuMSBsYXVuY2hlciByZXR1cm5zIHRoZSBmb2xsb3dpbmcgNiBpbWFnZXMKLQkgKiAxLiAzMngzMiwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogMi4gMTZ4MTYsIDQgYml0IChXaW5kb3dzIDE2IGNvbG9ycyBwYWxldHRlKQotCSAqIDMuIDE2eDE2LCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiA0LiAzMngzMiwgOCBiaXQgKDI1NiBjb2xvcnMpCi0JICogNS4gNDh4NDgsIDQgYml0IChXaW5kb3dzIDE2IGNvbG9ycyBwYWxldHRlKQotCSAqIDYuIDQ4eDQ4LCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiAKLQkgKiBAcGFyYW0gcHJvZ3JhbSB0aGUgV2luZG93cyBleGVjdXRhYmxlIGUuZyBjOi9lY2xpcHNlL2VjbGlwc2UuZXhlCi0JICovCQotCXN0YXRpYyBJbWFnZURhdGFbXSBsb2FkSWNvbnMoU3RyaW5nIHByb2dyYW0pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShwcm9ncmFtLCAiciIpOwotCQlJY29uRXhlIGljb25FeGUgPSBuZXcgSWNvbkV4ZSgpOwotCQlJY29uUmVzSW5mb1tdIGljb25JbmZvID0gaWNvbkV4ZS5nZXRJY29ucyhyYWYpOwotCQlJbWFnZURhdGFbXSBkYXRhID0gbmV3IEltYWdlRGF0YVtpY29uSW5mby5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIGRhdGFbaV0gPSBpY29uSW5mb1tpXS5kYXRhOwotCQlyYWYuY2xvc2UoKTsKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCQotCS8qKiAKLQkgKiBSZXBsYWNlIHRoZSBEZXNrdG9wIGljb25zIHByb3ZpZGVkIGluIHRoZSBXaW5kb3dzIGV4ZWN1dGFibGUgcHJvZ3JhbQotCSAqIHdpdGggaWNvbnMgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCi0JICogCi0JICogTm90ZSAxLiBXcml0ZSBhY2Nlc3MgdG8gdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSBpcyByZXF1aXJlZC4gQXMgYSByZXN1bHQsIHRoYXQKLQkgKiBwcm9ncmFtIG11c3Qgbm90IGJlIGN1cnJlbnRseSBydW5uaW5nIG9yIGVkaXRlZCBlbHNld2hlcmUuCi0JICogCi0JICogTm90ZSAyLiBVc2UgbG9hZEljb25zIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgaWNvbnMgKHdpZHRoLCBoZWlnaHQsIGRlcHRoKQotCSAqIGlzIHJlcXVpcmVkIHRvIHJlcGxhY2UgdGhlIGljb25zIGluIHRoZSBleGVjdXRhYmxlIHByb2dyYW0uIEEgdXNlciBpY29uCi0JICogbWF0Y2hpbmcgZXhhY3RseSB0aGUgd2lkdGgvaGVpZ2h0L2RlcHRoIG9mIGFuIGV4ZWN1dGFibGUgaWNvbiB3aWxsIGJlIHdyaXR0ZW4KLQkgKiB0byB0aGUgZXhlY3V0YWJsZSBhbmQgd2lsbCByZXBsYWNlIHRoYXQgZXhlY3V0YWJsZSBpY29uLiBJZiBhbiBleGVjdXRhYmxlIGljb24KLQkgKiBkb2VzIG5vdCBtYXRjaCBhIHVzZXIgaWNvbiwgaXQgaXMgbGVmdCBhcyBpcy4gVmVyaWZ5IHRoZSByZXR1cm4gdmFsdWUgbWF0Y2hlcwotCSAqIHRoZSBudW1iZXIgb2YgaWNvbnMgdG8gd3JpdGUuIEZpbmFsbHksIHVzZSBsb2FkSWNvbnMgYWZ0ZXIgdGhpcyBvcGVyYXRpb24KLQkgKiB0byB2ZXJpZnkgdGhlIGljb25zIGhhdmUgY2hhbmdlZCBhcyBleHBlY3RlZC4KLQkgKiAKLQkgKiBOb3RlIDMuIFRoZSBFY2xpcHNlIDMuMSBsYXVuY2hlciByZXF1aXJlcyB0aGUgZm9sbG93aW5nIDYgaW1hZ2VzIChpbiBhbnkgb3JkZXIpLgotCSAqIDEuIDMyeDMyLCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiAyLiAxNngxNiwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogMy4gMTZ4MTYsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIDQuIDMyeDMyLCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiA1LiA0OHg0OCwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogNi4gNDh4NDgsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIAotCSAqIE5vdGUgNC4gVGhpcyBmdW5jdGlvbiBtb2RpZmllcyB0aGUgY29udGVudCBvZiB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtIGFuZCBtYXkgY2F1c2UKLQkgKiBpdHMgY29ycnVwdGlvbi4gCi0JICogCi0JICogQHBhcmFtIHByb2dyYW0gdGhlIFdpbmRvd3MgZXhlY3V0YWJsZSBlLmcgYzovZWNsaXBzZS9lY2xpcHNlLmV4ZQotCSAqIEBwYXJhbSBpY29ucyB0byB3cml0ZSB0byB0aGUgZ2l2ZW4gZXhlY3V0YWJsZQotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBpY29ucyBmcm9tIHRoZSBvcmlnaW5hbCBwcm9ncmFtIHRoYXQgd2VyZSBub3Qgc3VjY2Vzc2Z1bGx5IHJlcGxhY2VkICgwIGlmIHN1Y2Nlc3MpCi0JICovCQotCXN0YXRpYyBpbnQgdW5sb2FkSWNvbnMoU3RyaW5nIHByb2dyYW0sIEltYWdlRGF0YVtdIGljb25zKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCVJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUocHJvZ3JhbSwgInJ3Iik7Ci0JCUljb25FeGUgaWNvbkV4ZSA9IG5ldyBJY29uRXhlKCk7Ci0JCUljb25SZXNJbmZvW10gaWNvbkluZm8gPSBpY29uRXhlLmdldEljb25zKHJhZik7Ci0JCWludCBjbnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGljb25JbmZvLmxlbmd0aDsgaSsrKSB7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGljb25zLmxlbmd0aDsgaisrKQotCQkJaWYgKGljb25JbmZvW2ldLmRhdGEud2lkdGggPT0gaWNvbnNbal0ud2lkdGggJiYgCi0JCQkJaWNvbkluZm9baV0uZGF0YS5oZWlnaHQgPT0gaWNvbnNbal0uaGVpZ2h0ICYmIAotCQkJCWljb25JbmZvW2ldLmRhdGEuZGVwdGggPT0gaWNvbnNbal0uZGVwdGgpIHsKLQkJCQlyYWYuc2VlayhpY29uSW5mb1tpXS5vZmZzZXQpOwotCQkJCXVubG9hZEljb24ocmFmLCBpY29uc1tqXSk7Ci0JCQkJY250Kys7Ci0JCQl9Ci0JCX0KLQkJcmFmLmNsb3NlKCk7Ci0JCXJldHVybiBpY29uSW5mby5sZW5ndGggLSBjbnQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAiMjAwNTAxMjQiOwotCQotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBjbGFzcyBJY29uUmVzSW5mbyB7Ci0JCUltYWdlRGF0YSBkYXRhOwotCQlpbnQgb2Zmc2V0OwotCQlpbnQgc2l6ZTsKLQl9Ci0JCi0JSWNvblJlc0luZm9bXSBpY29uSW5mbyA9IG51bGw7Ci0JaW50IGljb25DbnQ7Ci0JCi0JSWNvblJlc0luZm9bXSBnZXRJY29ucyhSYW5kb21BY2Nlc3NGaWxlIHJhZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWNvbkluZm8gPSBuZXcgSWNvblJlc0luZm9bNF07Ci0JCWljb25DbnQgPSAwOwotCQlJTUFHRV9ET1NfSEVBREVSIGltYWdlRG9zSGVhZGVyID0gbmV3IElNQUdFX0RPU19IRUFERVIoKTsKLQkJcmVhZChyYWYsIGltYWdlRG9zSGVhZGVyKTsKLQkJaWYgKGltYWdlRG9zSGVhZGVyLmVfbWFnaWMgIT0gSU1BR0VfRE9TX1NJR05BVFVSRSkgcmV0dXJuIG51bGw7Ci0JCWludCBpbWFnZU50SGVhZGVyc09mZnNldCA9IGltYWdlRG9zSGVhZGVyLmVfbGZhbmV3OwotCQlyYWYuc2VlayhpbWFnZU50SGVhZGVyc09mZnNldCk7Ci0JCUlNQUdFX05UX0hFQURFUlMgaW1hZ2VOdEhlYWRlcnMgPSBuZXcgSU1BR0VfTlRfSEVBREVSUygpOwotCQlyZWFkKHJhZiwgaW1hZ2VOdEhlYWRlcnMpOwotCQlpZiAoaW1hZ2VOdEhlYWRlcnMuU2lnbmF0dXJlICE9IElNQUdFX05UX1NJR05BVFVSRSkgcmV0dXJuIG51bGw7Ci0JCQotCQkvLyBEdW1wUmVzb3VyY2VzCi0JCWludCByZXNvdXJjZXNSVkEgPSBpbWFnZU50SGVhZGVycy5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5W0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9SRVNPVVJDRV0uVmlydHVhbEFkZHJlc3M7Ci0JCWlmIChyZXNvdXJjZXNSVkEgPT0gMCkgcmV0dXJuIG51bGw7Ci0JCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCIqIFJlc291cmNlcyAoUlZBPSAiK3Jlc291cmNlc1JWQSsiKSIpOwotCQlJTUFHRV9TRUNUSU9OX0hFQURFUiBpbWFnZVNlY3Rpb25IZWFkZXIgPSBuZXcgSU1BR0VfU0VDVElPTl9IRUFERVIoKTsKLQkJaW50IGZpcnN0U2VjdGlvbk9mZnNldCA9IGltYWdlTnRIZWFkZXJzT2Zmc2V0ICsgSU1BR0VfTlRfSEVBREVSUy5GSUVMRF9PRkZTRVRfT3B0aW9uYWxIZWFkZXIgKyBpbWFnZU50SGVhZGVycy5GaWxlSGVhZGVyLlNpemVPZk9wdGlvbmFsSGVhZGVyOwotCQlyYWYuc2VlayhmaXJzdFNlY3Rpb25PZmZzZXQpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VOdEhlYWRlcnMuRmlsZUhlYWRlci5OdW1iZXJPZlNlY3Rpb25zOyBpKyspIHsKLQkJCXJlYWQocmFmLCBpbWFnZVNlY3Rpb25IZWFkZXIpOwotCQkJaWYgKHJlc291cmNlc1JWQSA+PSBpbWFnZVNlY3Rpb25IZWFkZXIuVmlydHVhbEFkZHJlc3MgJiYgcmVzb3VyY2VzUlZBIDwgaW1hZ2VTZWN0aW9uSGVhZGVyLlZpcnR1YWxBZGRyZXNzICsgaW1hZ2VTZWN0aW9uSGVhZGVyLk1pc2NfVmlydHVhbFNpemUpIHsKLQkJCQkvLyBjb3VsZCBjaGVjayB0aGUgaW1hZ2VTZWN0aW9uSGVhZGVyIG5hbWUgaXMgLnJzcmMKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFmb3VuZCkgcmV0dXJuIG51bGw7Ci0JCWludCBkZWx0YSA9IGltYWdlU2VjdGlvbkhlYWRlci5WaXJ0dWFsQWRkcmVzcyAtIGltYWdlU2VjdGlvbkhlYWRlci5Qb2ludGVyVG9SYXdEYXRhOwotCQlpbnQgaW1hZ2VSZXNvdXJjZURpcmVjdG9yeU9mZnNldCA9IHJlc291cmNlc1JWQSAtIGRlbHRhOwotCQlkdW1wUmVzb3VyY2VEaXJlY3RvcnkocmFmLCBpbWFnZVJlc291cmNlRGlyZWN0b3J5T2Zmc2V0LCBpbWFnZVJlc291cmNlRGlyZWN0b3J5T2Zmc2V0LCBkZWx0YSwgMCwgMCwgZmFsc2UpOwotCQlpZiAoaWNvbkNudCA8IGljb25JbmZvLmxlbmd0aCkgewotCQkJSWNvblJlc0luZm9bXSBuZXdBcnJheSA9IG5ldyBJY29uUmVzSW5mb1tpY29uQ250XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoaWNvbkluZm8sIDAsIG5ld0FycmF5LCAwLCBpY29uQ250KTsKLQkJCWljb25JbmZvID0gbmV3QXJyYXk7Ci0JCX0KLQkJcmV0dXJuIGljb25JbmZvOwotCX0KLQotdm9pZCBkdW1wUmVzb3VyY2VEaXJlY3RvcnkoUmFuZG9tQWNjZXNzRmlsZSByYWYsIGludCBpbWFnZVJlc291cmNlRGlyZWN0b3J5T2Zmc2V0LCBpbnQgcmVzb3VyY2VCYXNlLCBpbnQgZGVsdGEsIGludCB0eXBlLCBpbnQgbGV2ZWwsIGJvb2xlYW4gcnRfaWNvbl9yb290KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCIqKiBMRVZFTCAiK2xldmVsKTsKLQotCUlNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSBpbWFnZVJlc291cmNlRGlyZWN0b3J5ID0gbmV3IElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSgpOwotCXJhZi5zZWVrKGltYWdlUmVzb3VyY2VEaXJlY3RvcnlPZmZzZXQpOwotCXJlYWQocmFmLCBpbWFnZVJlc291cmNlRGlyZWN0b3J5KTsKLQotCWlmIChERUJVRykgewotCQlTdHJpbmcgc1R5cGUgPSAiIit0eXBlOwotCQkvLyBsZXZlbCAxIHJlc291cmNlcyBhcmUgcmVzb3VyY2UgdHlwZXMKLQkJaWYgKGxldmVsID09IDEpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiX19fX19fX19fX19fX19fX19fX19fX19fX19fIik7Ci0JCQlpZiAodHlwZSA9PSBSVF9JQ09OKSBzVHlwZSA9ICJSVF9JQ09OIjsKLQkJCWlmICh0eXBlID09IFJUX0dST1VQX0lDT04pIHNUeXBlID0gIlJUX0dST1VQX0lDT04iOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgRGlyZWN0b3J5IFsiK3NUeXBlKyJdIisiIChOYW1lZCAiK2ltYWdlUmVzb3VyY2VEaXJlY3RvcnkuTnVtYmVyT2ZOYW1lZEVudHJpZXMrIiwgSUQgIitpbWFnZVJlc291cmNlRGlyZWN0b3J5Lk51bWJlck9mSWRFbnRyaWVzKyIpIik7Ci0JfQotCWludCBJUkRFX1N0YXJ0T2Zmc2V0ID0gaW1hZ2VSZXNvdXJjZURpcmVjdG9yeU9mZnNldCArIElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWS5TSVpFT0Y7CQotCUlNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWVtdIGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzID0gbmV3IElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWVtpbWFnZVJlc291cmNlRGlyZWN0b3J5Lk51bWJlck9mSWRFbnRyaWVzXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzW2ldID0gbmV3IElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSgpOwotCQlyZWFkKHJhZiwgaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXNbaV0pOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpbWFnZVJlc291cmNlRGlyZWN0b3J5RW50cmllc1tpXS5EYXRhSXNEaXJlY3RvcnkpIHsKLQkJCWR1bXBSZXNvdXJjZURpcmVjdG9yeShyYWYsIGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzW2ldLk9mZnNldFRvRGlyZWN0b3J5ICsgcmVzb3VyY2VCYXNlLCByZXNvdXJjZUJhc2UsIGRlbHRhLCBpbWFnZVJlc291cmNlRGlyZWN0b3J5RW50cmllc1tpXS5JZCwgbGV2ZWwgKyAxLCBydF9pY29uX3Jvb3QgPyB0cnVlIDogdHlwZSA9PSBSVF9JQ09OKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFJlc291cmNlIGZvdW5kCi0JCQkvLy8gcFJlc0RpckVudHJ5LT5OYW1lCi0JCQlJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkgaXJkZSA9IGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzW2ldOwotCQkJSU1BR0VfUkVTT1VSQ0VfREFUQV9FTlRSWSBkYXRhID0gbmV3IElNQUdFX1JFU09VUkNFX0RBVEFfRU5UUlkoKTsKLQkJCXJhZi5zZWVrKGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzW2ldLk9mZnNldFRvRGF0YSArIHJlc291cmNlQmFzZSk7Ci0JCQlyZWFkKHJhZiwgZGF0YSk7Ci0JCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgSWQgIitpcmRlLklkKyIgRGF0YSBPZmZzZXQgUlZBICIrZGF0YS5PZmZzZXRUb0RhdGErIiwgU2l6ZSAiK2RhdGEuU2l6ZSk7Ci0JCQlpZiAocnRfaWNvbl9yb290KSB7Ci0JCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oImljb25jbnQgIitpY29uQ250KyIgfCIraWNvbkluZm8ubGVuZ3RoKTsKLQkJCQlpY29uSW5mb1tpY29uQ250XSA9IG5ldyBJY29uUmVzSW5mbygpOwotCQkJCWljb25JbmZvW2ljb25DbnRdLmRhdGEgPSBwYXJzZUljb24ocmFmLCBkYXRhLk9mZnNldFRvRGF0YSAtIGRlbHRhLCBkYXRhLlNpemUpOwotCQkJCWljb25JbmZvW2ljb25DbnRdLm9mZnNldCA9IGRhdGEuT2Zmc2V0VG9EYXRhIC0gZGVsdGE7Ci0JCQkJaWNvbkluZm9baWNvbkNudF0uc2l6ZSA9IGRhdGEuU2l6ZTsJCi0JCQkJaWNvbkNudCsrOwotCQkJCWlmIChpY29uQ250ID09IGljb25JbmZvLmxlbmd0aCkgewotCQkJCQlJY29uUmVzSW5mb1tdIG5ld0FycmF5ID0gbmV3IEljb25SZXNJbmZvW2ljb25JbmZvLmxlbmd0aCArIDRdOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGljb25JbmZvLCAwLCBuZXdBcnJheSwgMCwgaWNvbkluZm8ubGVuZ3RoKTsKLQkJCQkJaWNvbkluZm8gPSBuZXdBcnJheTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLSAJfQotfQotCi1zdGF0aWMgSW1hZ2VEYXRhIHBhcnNlSWNvbihSYW5kb21BY2Nlc3NGaWxlIHJhZiwgaW50IG9mZnNldCwgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JcmFmLnNlZWsob2Zmc2V0KTsKLQlCSVRNQVBJTkZPIGJpdG1hcEluZm8gPSBuZXcgQklUTUFQSU5GTygpOwotCXJlYWQocmFmLCBiaXRtYXBJbmZvKTsKLQliaXRtYXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCAvPSAyOwotCWludCB3aWR0aCA9IGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpV2lkdGg7Ci0JaW50IGhlaWdodCA9IGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0OwotCWludCBkZXB0aCA9IGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpQml0Q291bnQ7Ci0KLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbG9hZFBhbGV0dGUoYml0bWFwSW5mby5ibWlIZWFkZXIsIHJhZik7Ci0JYnl0ZVtdIHNoYXBlRGF0YSA9IGxvYWREYXRhKGJpdG1hcEluZm8uYm1pSGVhZGVyLCByYWYpOwotCWJpdG1hcEluZm8uYm1pSGVhZGVyLmJpQml0Q291bnQgPSAxOwotCWJ5dGVbXSBtYXNrRGF0YSA9IGxvYWREYXRhKGJpdG1hcEluZm8uYm1pSGVhZGVyLCByYWYpOwotCW1hc2tEYXRhID0gY29udmVydFBhZChtYXNrRGF0YSwgd2lkdGgsIGhlaWdodCwgMSwgNCwgMik7Ci0JYml0SW52ZXJ0RGF0YShtYXNrRGF0YSwgMCwgbWFza0RhdGEubGVuZ3RoKTsKLQlyZXR1cm4gSW1hZ2VEYXRhLmludGVybmFsX25ldygKLQkJd2lkdGgsCi0JCWhlaWdodCwKLQkJZGVwdGgsCi0JCXBhbGV0dGUsCi0JCTQsCi0JCXNoYXBlRGF0YSwKLQkJMiwKLQkJbWFza0RhdGEsCi0JCW51bGwsCi0JCS0xLAotCQktMSwKLQkJU1dULklNQUdFX0lDTywKLQkJMCwKLQkJMCwKLQkJMCwKLQkJMCk7Ci19Ci0KLXN0YXRpYyBieXRlW10gYml0SW52ZXJ0RGF0YShieXRlW10gZGF0YSwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgewotCS8vIERlc3RydWN0aXZlbHkgYml0IGludmVydCBkYXRhIGluIHRoZSBnaXZlbiBieXRlIGFycmF5LgotCWZvciAoaW50IGkgPSBzdGFydEluZGV4OyBpIDwgZW5kSW5kZXg7IGkrKykgewotCQlkYXRhW2ldID0gKGJ5dGUpKDI1NSAtIGRhdGFbaSAtIHN0YXJ0SW5kZXhdKTsKLQl9Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLXN0YXRpYyBmaW5hbCBieXRlW10gY29udmVydFBhZChieXRlW10gZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIGludCBwYWQsIGludCBuZXdQYWQpIHsKLQlpZiAocGFkID09IG5ld1BhZCkgcmV0dXJuIGRhdGE7Ci0JaW50IHN0cmlkZSA9ICh3aWR0aCAqIGRlcHRoICsgNykgLyA4OwotCWludCBicGwgPSAoc3RyaWRlICsgKHBhZCAtIDEpKSAvIHBhZCAqIHBhZDsKLQlpbnQgbmV3QnBsID0gKHN0cmlkZSArIChuZXdQYWQgLSAxKSkgLyBuZXdQYWQgKiBuZXdQYWQ7Ci0JYnl0ZVtdIG5ld0RhdGEgPSBuZXcgYnl0ZVtoZWlnaHQgKiBuZXdCcGxdOwotCWludCBzcmNJbmRleCA9IDAsIGRlc3RJbmRleCA9IDA7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIHNyY0luZGV4LCBuZXdEYXRhLCBkZXN0SW5kZXgsIG5ld0JwbCk7Ci0JCXNyY0luZGV4ICs9IGJwbDsKLQkJZGVzdEluZGV4ICs9IG5ld0JwbDsKLQl9Ci0JcmV0dXJuIG5ld0RhdGE7Ci19Ci1zdGF0aWMgUGFsZXR0ZURhdGEgbG9hZFBhbGV0dGUoQklUTUFQSU5GT0hFQURFUiBiaWgsIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWludCBkZXB0aCA9IGJpaC5iaUJpdENvdW50OwotCWlmIChkZXB0aCA8PSA4KSB7Ci0JCWludCBudW1Db2xvcnMgPSBiaWguYmlDbHJVc2VkOwotCQlpZiAobnVtQ29sb3JzID09IDApIHsKLQkJCW51bUNvbG9ycyA9IDEgPDwgZGVwdGg7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobnVtQ29sb3JzID4gMjU2KQotCQkJCW51bUNvbG9ycyA9IDI1NjsKLQkJfQotCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbbnVtQ29sb3JzICogNF07Ci0JCXJhZi5yZWFkKGJ1Zik7Ci0JCXJldHVybiBwYWxldHRlRnJvbUJ5dGVzKGJ1ZiwgbnVtQ29sb3JzKTsKLQl9Ci0JaWYgKGRlcHRoID09IDE2KSByZXR1cm4gbmV3IFBhbGV0dGVEYXRhKDB4N0MwMCwgMHgzRTAsIDB4MUYpOwotCWlmIChkZXB0aCA9PSAyNCkgcmV0dXJuIG5ldyBQYWxldHRlRGF0YSgweEZGLCAweEZGMDAsIDB4RkYwMDAwKTsKLQlyZXR1cm4gbmV3IFBhbGV0dGVEYXRhKDB4RkYwMCwgMHhGRjAwMDAsIDB4RkYwMDAwMDApOwotfQotc3RhdGljIFBhbGV0dGVEYXRhIHBhbGV0dGVGcm9tQnl0ZXMoYnl0ZVtdIGJ5dGVzLCBpbnQgbnVtQ29sb3JzKSB7Ci0JaW50IGJ5dGVzT2Zmc2V0ID0gMDsKLQlSR0JbXSBjb2xvcnMgPSBuZXcgUkdCW251bUNvbG9yc107Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2xvcnM7IGkrKykgewotCQljb2xvcnNbaV0gPSBuZXcgUkdCKGJ5dGVzW2J5dGVzT2Zmc2V0ICsgMl0gJiAweEZGLAotCQkJYnl0ZXNbYnl0ZXNPZmZzZXQgKyAxXSAmIDB4RkYsCi0JCQlieXRlc1tieXRlc09mZnNldF0gJiAweEZGKTsKLQkJYnl0ZXNPZmZzZXQgKz0gNDsKLQl9Ci0JcmV0dXJuIG5ldyBQYWxldHRlRGF0YShjb2xvcnMpOwotfQotc3RhdGljIGJ5dGVbXSBsb2FkRGF0YShCSVRNQVBJTkZPSEVBREVSIGJpaCwgUmFuZG9tQWNjZXNzRmlsZSByYWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaW50IHN0cmlkZSA9IChiaWguYmlXaWR0aCAqIGJpaC5iaUJpdENvdW50ICsgNykgLyA4OwotCXN0cmlkZSA9IChzdHJpZGUgKyAzKSAvIDQgKiA0OyAvLyBSb3VuZCB1cCB0byA0IGJ5dGUgbXVsdGlwbGUKLQlieXRlW10gZGF0YSA9IGxvYWREYXRhKGJpaCwgcmFmLCBzdHJpZGUpOwotCWZsaXBTY2FuTGluZXMoZGF0YSwgc3RyaWRlLCBiaWguYmlIZWlnaHQpOwotCXJldHVybiBkYXRhOwotfQotc3RhdGljIHZvaWQgZmxpcFNjYW5MaW5lcyhieXRlW10gZGF0YSwgaW50IHN0cmlkZSwgaW50IGhlaWdodCkgewotCWludCBpMSA9IDA7Ci0JaW50IGkyID0gKGhlaWdodCAtIDEpICogc3RyaWRlOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgaSsrKSB7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzdHJpZGU7IGluZGV4KyspIHsKLQkJCWJ5dGUgYiA9IGRhdGFbaW5kZXggKyBpMV07Ci0JCQlkYXRhW2luZGV4ICsgaTFdID0gZGF0YVtpbmRleCArIGkyXTsKLQkJCWRhdGFbaW5kZXggKyBpMl0gPSBiOwotCQl9Ci0JCWkxICs9IHN0cmlkZTsKLQkJaTIgLT0gc3RyaWRlOwotCX0KLX0KLXN0YXRpYyBieXRlW10gbG9hZERhdGEoQklUTUFQSU5GT0hFQURFUiBiaWgsIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBpbnQgc3RyaWRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWludCBkYXRhU2l6ZSA9IGJpaC5iaUhlaWdodCAqIHN0cmlkZTsKLQlieXRlW10gZGF0YSA9IG5ldyBieXRlW2RhdGFTaXplXTsKLQlpbnQgY21wID0gYmloLmJpQ29tcHJlc3Npb247Ci0JaWYgKGNtcCA9PSAwKSB7IC8vIEJNUF9OT19DT01QUkVTU0lPTgotCQlyYWYucmVhZChkYXRhKTsKLQl9IGVsc2UgewotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiSUNPIGNhbm5vdCBiZSBjb21wcmVzc2VkPyIpOwotCX0KLQlyZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIHZvaWQgdW5sb2FkSWNvbihSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSW1hZ2VEYXRhIGljb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaW50IHNpemVJbWFnZSA9ICgoKGljb24ud2lkdGggKiBpY29uLmRlcHRoICsgMzEpIC8gMzIgKiA0KSArCi0JCSgoaWNvbi53aWR0aCArIDMxKSAvIDMyICogNCkpICogaWNvbi5oZWlnaHQ7Ci0Jd3JpdGU0KHJhZiwgQk1QSGVhZGVyRml4ZWRTaXplKTsKLQl3cml0ZTQocmFmLCBpY29uLndpZHRoKTsKLQl3cml0ZTQocmFmLCBpY29uLmhlaWdodCAqIDIpOwotCXdyaXRlVTIocmFmLCAxKTsKLQl3cml0ZVUyKHJhZiwgaWNvbi5kZXB0aCk7Ci0Jd3JpdGU0KHJhZiwgMCk7Ci0Jd3JpdGU0KHJhZiwgc2l6ZUltYWdlKTsKLQl3cml0ZTQocmFmLCAwKTsKLQl3cml0ZTQocmFmLCAwKTsKLQl3cml0ZTQocmFmLCBpY29uLnBhbGV0dGUuY29sb3JzICE9IG51bGwgPyBpY29uLnBhbGV0dGUuY29sb3JzLmxlbmd0aCA6IDApOwotCXdyaXRlNChyYWYsIDApOwotCQotCWJ5dGVbXSByZ2JzID0gcGFsZXR0ZVRvQnl0ZXMoaWNvbi5wYWxldHRlKTsKLQlyYWYud3JpdGUocmdicyk7Ci0JdW5sb2FkU2hhcGVEYXRhKHJhZiwgaWNvbik7Ci0JdW5sb2FkTWFza0RhdGEocmFmLCBpY29uKTsKLX0KLXN0YXRpYyBieXRlW10gcGFsZXR0ZVRvQnl0ZXMoUGFsZXR0ZURhdGEgcGFsKSB7Ci0JaW50IG4gPSBwYWwuY29sb3JzID09IG51bGwgPyAwIDogKHBhbC5jb2xvcnMubGVuZ3RoIDwgMjU2ID8gcGFsLmNvbG9ycy5sZW5ndGggOiAyNTYpOwotCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW24gKiA0XTsKLQlpbnQgb2Zmc2V0ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQlSR0IgY29sID0gcGFsLmNvbG9yc1tpXTsKLQkJYnl0ZXNbb2Zmc2V0XSA9IChieXRlKWNvbC5ibHVlOwotCQlieXRlc1tvZmZzZXQgKyAxXSA9IChieXRlKWNvbC5ncmVlbjsKLQkJYnl0ZXNbb2Zmc2V0ICsgMl0gPSAoYnl0ZSljb2wucmVkOwotCQlvZmZzZXQgKz0gNDsKLQl9Ci0JcmV0dXJuIGJ5dGVzOwotfQotc3RhdGljIHZvaWQgdW5sb2FkTWFza0RhdGEoUmFuZG9tQWNjZXNzRmlsZSByYWYsIEltYWdlRGF0YSBpY29uKSB7Ci0JSW1hZ2VEYXRhIG1hc2sgPSBpY29uLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQlpbnQgYnBsID0gKGljb24ud2lkdGggKyA3KSAvIDg7Ci0JaW50IHBhZCA9IG1hc2suc2NhbmxpbmVQYWQ7Ci0JaW50IHNyY0JwbCA9IChicGwgKyBwYWQgLSAxKSAvIHBhZCAqIHBhZDsKLQlpbnQgZGVzdEJwbCA9IChicGwgKyAzKSAvIDQgKiA0OwotCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtkZXN0QnBsXTsKLQlpbnQgb2Zmc2V0ID0gKGljb24uaGVpZ2h0IC0gMSkgKiBzcmNCcGw7Ci0JYnl0ZVtdIGRhdGEgPSBtYXNrLmRhdGE7Ci0JdHJ5IHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpY29uLmhlaWdodDsgaSsrKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIG9mZnNldCwgYnVmLCAwLCBicGwpOwotCQkJYml0SW52ZXJ0RGF0YShidWYsIDAsIGJwbCk7Ci0JCQlyYWYud3JpdGUoYnVmLCAwLCBkZXN0QnBsKTsKLQkJCW9mZnNldCAtPSBzcmNCcGw7Ci0JCX0KLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCX0KLX0KLXN0YXRpYyB2b2lkIHVubG9hZFNoYXBlRGF0YShSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSW1hZ2VEYXRhIGljb24pIHsKLQlpbnQgYnBsID0gKGljb24ud2lkdGggKiBpY29uLmRlcHRoICsgNykgLyA4OwotCWludCBwYWQgPSBpY29uLnNjYW5saW5lUGFkOwotCWludCBzcmNCcGwgPSAoYnBsICsgcGFkIC0gMSkgLyBwYWQgKiBwYWQ7Ci0JaW50IGRlc3RCcGwgPSAoYnBsICsgMykgLyA0ICogNDsKLQlieXRlW10gYnVmID0gbmV3IGJ5dGVbZGVzdEJwbF07Ci0JaW50IG9mZnNldCA9IChpY29uLmhlaWdodCAtIDEpICogc3JjQnBsOwotCWJ5dGVbXSBkYXRhID0gaWNvbi5kYXRhOwotCXRyeSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWNvbi5oZWlnaHQ7IGkrKykgewotCQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCBvZmZzZXQsIGJ1ZiwgMCwgYnBsKTsKLQkJCXJhZi53cml0ZShidWYsIDAsIGRlc3RCcGwpOwotCQkJb2Zmc2V0IC09IHNyY0JwbDsKLQkJfQotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotfQotc3RhdGljIGJvb2xlYW4gcmVhZEljb25Hcm91cChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgaW50IG9mZnNldCwgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JcmFmLnNlZWsob2Zmc2V0KTsKLQlORVdIRUFERVIgbmV3SGVhZGVyID0gbmV3IE5FV0hFQURFUigpOwotCXJlYWQocmFmLCBuZXdIZWFkZXIpOwotCWlmIChuZXdIZWFkZXIuUmVzVHlwZSAhPSBSRVNfSUNPTikgcmV0dXJuIGZhbHNlOwotCVJFU0RJUltdIHJlc0RpciA9IG5ldyBSRVNESVJbbmV3SGVhZGVyLlJlc0NvdW50XTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0hlYWRlci5SZXNDb3VudDsgaSsrKSB7Ci0JCXJlc0RpcltpXSA9IG5ldyBSRVNESVIoKTsKLQkJcmVhZChyYWYsIHJlc0RpcltpXSk7Ci0JfQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBjb3B5RmlsZShTdHJpbmcgc3JjLCBTdHJpbmcgZHN0KSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUoc3JjKTsKLQlGaWxlIGRzdEZpbGUgPSBuZXcgRmlsZShkc3QpOwotCUZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3JjRmlsZSk7Ci0JRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkc3RGaWxlKTsKLQlpbnQgYzsKLQl3aGlsZSAoKGMgPSBpbi5yZWFkKCkpICE9IC0xKSBvdXQud3JpdGUoYyk7IAotCWluLmNsb3NlKCk7Ci0Jb3V0LmNsb3NlKCk7Ci19Ci0KLS8qIElPIHV0aWxpdGllcyB0byBwYXJzZSBXaW5kb3dzIGV4ZWN1dGFibGUgKi8KLXN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfRE9TX1NJR05BVFVSRSA9IDB4NWE0ZDsKLXN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfTlRfU0lHTkFUVVJFID0gMHgwMDAwNDU1MDsKLXN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfRElSRUNUT1JZX0VOVFJZX1JFU09VUkNFID0gMjsKLXN0YXRpYyBmaW5hbCBpbnQgUkVTX0lDT04gPSAxOwotc3RhdGljIGZpbmFsIGludCBSVF9JQ09OID0gMzsKLXN0YXRpYyBmaW5hbCBpbnQgUlRfR1JPVVBfSUNPTiA9IDE0Owotc3RhdGljIGZpbmFsIGludCBCTVBIZWFkZXJGaXhlZFNpemUgPSA0MDsKLQkKLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfRE9TX0hFQURFUiB7Ci0JaW50IGVfbWFnaWM7IC8vIFdPUkQKLQlpbnQgZV9jYmxwOyAvLyBXT1JECi0JaW50IGVfY3A7IC8vIFdPUkQKLQlpbnQgZV9jcmxjOyAvLyBXT1JECi0JaW50IGVfY3BhcmhkcjsgLy8gV09SRAotCWludCBlX21pbmFsbG9jOyAvLyBXT1JECi0JaW50IGVfbWF4YWxsb2M7IC8vIFdPUkQKLQlpbnQgZV9zczsgLy8gV09SRAotCWludCBlX3NwOyAvLyBXT1JECi0JaW50IGVfY3N1bTsgLy8gV09SRAotCWludCBlX2lwOyAvLyBXT1JECi0JaW50IGVfY3M7IC8vIFdPUkQKLQlpbnQgZV9sZmFybGM7IC8vIFdPUkQKLQlpbnQgZV9vdm5vOyAvLyBXT1JECi0JaW50W10gZV9yZXMgPSBuZXcgaW50WzRdOyAvLyBXT1JEWzRdCi0JaW50IGVfb2VtaWQ7IC8vIFdPUkQKLQlpbnQgZV9vZW1pbmZvOyAvLyBXT1JECi0JaW50W10gZV9yZXMyID0gbmV3IGludFsxMF07IC8vIFdPUkRbMTBdCi0JaW50IGVfbGZhbmV3OyAvLyBMT05HCi19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfRklMRV9IRUFERVIgewotCWludCBNYWNoaW5lOyAvLyBXT1JECi0JaW50IE51bWJlck9mU2VjdGlvbnM7IC8vIFdPUkQKLQlpbnQgVGltZURhdGVTdGFtcDsgLy8gRFdPUkQKLQlpbnQgUG9pbnRlclRvU3ltYm9sVGFibGU7IC8vIERXT1JECi0JaW50IE51bWJlck9mU3ltYm9sczsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mT3B0aW9uYWxIZWFkZXI7IC8vIFdPUkQKLQlpbnQgQ2hhcmFjdGVyaXN0aWNzOyAvLyBXT1JECi19OwotCi1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX0RBVEFfRElSRUNUT1JZIHsKLQlpbnQgVmlydHVhbEFkZHJlc3M7IC8vIERXT1JECi0JaW50IFNpemU7IC8vIERXT1JECi19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfT1BUSU9OQUxfSEVBREVSIHsKLQlpbnQgTWFnaWM7IC8vIFdPUkQKLQlpbnQgTWFqb3JMaW5rZXJWZXJzaW9uOyAvLyBCWVRFCi0JaW50IE1pbm9yTGlua2VyVmVyc2lvbjsgLy8gQllURQotCWludCBTaXplT2ZDb2RlOyAvLyBEV09SRAotCWludCBTaXplT2ZJbml0aWFsaXplZERhdGE7IC8vIERXT1JECi0JaW50IFNpemVPZlVuaW5pdGlhbGl6ZWREYXRhOyAvLyBEV09SRAotCWludCBBZGRyZXNzT2ZFbnRyeVBvaW50OyAvLyBEV09SRAotCWludCBCYXNlT2ZDb2RlOyAvLyBEV09SRAotCWludCBCYXNlT2ZEYXRhOyAvLyBEV09SRAotCWludCBJbWFnZUJhc2U7IC8vIERXT1JECi0JaW50IFNlY3Rpb25BbGlnbm1lbnQ7IC8vIERXT1JECi0JaW50IEZpbGVBbGlnbm1lbnQ7IC8vIERXT1JECi0JaW50IE1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsgLy8gV09SRAotCWludCBNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb247IC8vIFdPUkQKLQlpbnQgTWFqb3JJbWFnZVZlcnNpb247IC8vIFdPUkQKLQlpbnQgTWlub3JJbWFnZVZlcnNpb247IC8vIFdPUkQKLQlpbnQgTWFqb3JTdWJzeXN0ZW1WZXJzaW9uOyAvLyBXT1JECi0JaW50IE1pbm9yU3Vic3lzdGVtVmVyc2lvbjsgLy8gV09SRAotCWludCBXaW4zMlZlcnNpb25WYWx1ZTsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mSW1hZ2U7IC8vIERXT1JECi0JaW50IFNpemVPZkhlYWRlcnM7IC8vIERXT1JECi0JaW50IENoZWNrU3VtOyAvLyBEV09SRAotCWludCBTdWJzeXN0ZW07IC8vIFdPUkQKLQlpbnQgRGxsQ2hhcmFjdGVyaXN0aWNzOyAvLyBXT1JECi0JaW50IFNpemVPZlN0YWNrUmVzZXJ2ZTsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mU3RhY2tDb21taXQ7IC8vIERXT1JECi0JaW50IFNpemVPZkhlYXBSZXNlcnZlOyAvLyBEV09SRAotCWludCBTaXplT2ZIZWFwQ29tbWl0OyAvLyBEV09SRAotCWludCBMb2FkZXJGbGFnczsgLy8gRFdPUkQKLQlpbnQgTnVtYmVyT2ZSdmFBbmRTaXplczsgLy8gRFdPUkQKLQlJTUFHRV9EQVRBX0RJUkVDVE9SWVtdIERhdGFEaXJlY3RvcnkgPSBuZXcgSU1BR0VfREFUQV9ESVJFQ1RPUllbMTZdOwotfQotcHVibGljIHN0YXRpYyBjbGFzcyBJTUFHRV9OVF9IRUFERVJTIHsKLQlpbnQgU2lnbmF0dXJlOyAvLyBEV09SRAotCUlNQUdFX0ZJTEVfSEVBREVSIEZpbGVIZWFkZXIgPSBuZXcgSU1BR0VfRklMRV9IRUFERVIoKTsKLQlJTUFHRV9PUFRJT05BTF9IRUFERVIgT3B0aW9uYWxIZWFkZXIgPSBuZXcgSU1BR0VfT1BUSU9OQUxfSEVBREVSKCk7Ci0JZmluYWwgc3RhdGljIGludCBGSUVMRF9PRkZTRVRfT3B0aW9uYWxIZWFkZXIgPSAyNDsgIAotfQotCQotcHVibGljIHN0YXRpYyBjbGFzcyBJTUFHRV9TRUNUSU9OX0hFQURFUiB7Ci0JaW50W10gTmFtZSA9IG5ldyBpbnRbOF07IC8vIEJZVEVbOF0KLQlpbnQgTWlzY19WaXJ0dWFsU2l6ZTsgLy8gRFdPUkQgKHVuaW9uIE1pc2MgeyBEV09SRCBQaHlzaWNhbEFkZHJlc3M7IERXT1JEIFZpcnR1YWxTaXplIH0KLQlpbnQgVmlydHVhbEFkZHJlc3M7IC8vIERXT1JECi0JaW50IFNpemVPZlJhd0RhdGE7IC8vIERXT1JECi0JaW50IFBvaW50ZXJUb1Jhd0RhdGE7IC8vIERXT1JECi0JaW50IFBvaW50ZXJUb1JlbG9jYXRpb25zOyAvLyBEV09SRAotCWludCBQb2ludGVyVG9MaW5lbnVtYmVyczsgLy8gRFdPUkQKLQlpbnQgTnVtYmVyT2ZSZWxvY2F0aW9uczsgLy8gV09SRAotCWludCBOdW1iZXJPZkxpbmVudW1iZXJzOyAvLyBXT1JECi0JaW50IENoYXJhY3RlcmlzdGljczsgLy8gRFdPUkQKLX07Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZIHsKLQlpbnQgQ2hhcmFjdGVyaXN0aWNzOyAvLyBEV09SRAotCWludCBUaW1lRGF0ZVN0YW1wOyAvLyBEV09SRAotCWludCBNYWpvclZlcnNpb247IC8vIFdPUkQKLQlpbnQgTWlub3JWZXJzaW9uOyAvLyBXT1JECi0JaW50IE51bWJlck9mTmFtZWRFbnRyaWVzOyAvLyBXT1JEIC0gdXNlZAotCWludCBOdW1iZXJPZklkRW50cmllczsgLy8gV09SRCAtIHVzZWQKLQlmaW5hbCBzdGF0aWMgaW50IFNJWkVPRiA9IDE2OwotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSB7Ci0JLy8gdW5pb24KLQlpbnQgTmFtZU9mZnNldDsgLy8gRFdPUkQgMzEgYml0cwotCWJvb2xlYW4gTmFtZUlzU3RyaW5nOyAvLyBEV09SRCAxIGJpdAotCWludCBOYW1lOyAvLyBEV09SRAotCWludCBJZDsgLy8gV09SRAotCS8vIHVuaW9uCi0JaW50IE9mZnNldFRvRGF0YTsgLy8gRFdPUkQKLQlpbnQgT2Zmc2V0VG9EaXJlY3Rvcnk7IC8vIERXT1JEIDMxIGJpdHMKLQlib29sZWFuIERhdGFJc0RpcmVjdG9yeTsgLy8gRFdPUkQgMSBiaXQKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBJTUFHRV9SRVNPVVJDRV9EQVRBX0VOVFJZIHsKLQlpbnQgT2Zmc2V0VG9EYXRhOyAvLyBEV09SRAotCWludCBTaXplOyAvLyBEV09SRAotCWludCBDb2RlUGFnZTsgLy8gRFdPUkQKLQlpbnQgUmVzZXJ2ZWQ7IC8vIERXT1JECi19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgTkVXSEVBREVSIHsKLQlpbnQgUmVzZXJ2ZWQ7IC8vIFdPUkQKLQlpbnQgUmVzVHlwZTsgLy8gV09SRAotCWludCBSZXNDb3VudDsgLy8gV09SRAotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIElDT05SRVNESVIgewotCWludCBXaWR0aDsgLy8gQllURQotCWludCBIZWlnaHQ7IC8vIEJZVEUKLQlpbnQgQ29sb3JDb3VudDsgLy8gQllURQotCWludCByZXNlcnZlZDsgLy8gQllURQotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIENVUlNPUkRJUiB7Ci0JaW50IFdpZHRoOyAvLyBXT1JECi0JaW50IEhlaWdodDsgLy8gV09SRAotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIFJFU0RJUiB7Ci0JLy8gdW5pb24KLQlJQ09OUkVTRElSIEljb24gPSBuZXcgSUNPTlJFU0RJUigpOwotCUNVUlNPUkRJUiBDdXJzb3IgPSBuZXcgQ1VSU09SRElSKCk7Ci0JaW50IFBsYW5lczsgLy8gV09SRAotCWludCBCaXRDb3VudDsgLy8gV09SRAotCWludCBCeXRlc0luUmVzOyAvLyBEV09SRAotCWludCBJY29uQ3Vyc29ySWQ7IC8vIFdPUkQKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBCSVRNQVBJTkZPSEVBREVSIHsKLQlpbnQgYmlTaXplOyAvLyBEV09SRAotCWludCBiaVdpZHRoOyAvLyBMT05HCi0JaW50IGJpSGVpZ2h0OyAvLyBMT05HCi0JaW50IGJpUGxhbmVzOyAvLyBXT1JECi0JaW50IGJpQml0Q291bnQ7IC8vIFdPUkQKLQlpbnQgYmlDb21wcmVzc2lvbjsgLy8gRFdPUkQKLQlpbnQgYmlTaXplSW1hZ2U7IC8vIERXT1JECi0JaW50IGJpWFBlbHNQZXJNZXRlcjsgLy8gTE9ORwotCWludCBiaVlQZWxzUGVyTWV0ZXI7IC8vIExPTkcKLQlpbnQgYmlDbHJVc2VkOyAvLyBEV09SRAotCWludCBiaUNsckltcG9ydGFudDsgLy8gRFdPUkQKLX0KLQotc3RhdGljIGNsYXNzIFJHQlFVQUQgewotCWludCByZ0JsdWU7IC8vIEJZVEUKLQlpbnQgcmdiR3JlZW47IC8vIEJZVEUKLQlpbnQgcmdiUmVkOyAvLyBCWVRFCi0JaW50IHJnYlJlc2VydmVkOyAvLyBCWVRFCi19Ci1zdGF0aWMgY2xhc3MgQklUTUFQSU5GTyB7Ci0JQklUTUFQSU5GT0hFQURFUiBibWlIZWFkZXIgPSBuZXcgQklUTUFQSU5GT0hFQURFUigpOwotCVJHQlFVQURbXSBibWlDb2xvcnMgPSBudWxsOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgQklUTUFQSU5GT0hFQURFUiBiaWgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JYmloLmJpU2l6ZSA9IHJlYWQ0KHJhZik7Ci0JYmloLmJpV2lkdGggPSByZWFkNChyYWYpOwotCWJpaC5iaUhlaWdodCA9IHJlYWQ0KHJhZik7Ci0JYmloLmJpUGxhbmVzID0gcmVhZFUyKHJhZik7Ci0JYmloLmJpQml0Q291bnQgPSByZWFkVTIocmFmKTsKLQliaWguYmlDb21wcmVzc2lvbiA9IHJlYWQ0KHJhZik7Ci0JYmloLmJpU2l6ZUltYWdlID0gcmVhZDQocmFmKTsKLQliaWguYmlYUGVsc1Blck1ldGVyID0gcmVhZDQocmFmKTsKLQliaWguYmlZUGVsc1Blck1ldGVyID0gcmVhZDQocmFmKTsKLQliaWguYmlDbHJVc2VkID0gcmVhZDQocmFmKTsKLQliaWguYmlDbHJJbXBvcnRhbnQgPSByZWFkNChyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgQklUTUFQSU5GTyBiaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyZWFkKHJhZiwgYmkuYm1pSGVhZGVyKTsKLX0KLS8qIExpdHRsZSBFbmRpYW4gaGVscGVycyAqLwotc3RhdGljIGludCByZWFkVTIoUmFuZG9tQWNjZXNzRmlsZSByYWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaW50IGIwID0gcmFmLnJlYWRCeXRlKCkgJiAweEZGOwotCWludCBiMSA9IHJhZi5yZWFkQnl0ZSgpICYgMHhGRjsKLQlyZXR1cm4gKGIxIDw8IDggfCBiMCk7Ci19Ci1zdGF0aWMgaW50IHJlYWQ0KFJhbmRvbUFjY2Vzc0ZpbGUgcmFmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWludCBiMCA9IHJhZi5yZWFkQnl0ZSgpICYgMHhGRjs7Ci0JaW50IGIxID0gcmFmLnJlYWRCeXRlKCkgJiAweEZGOzsKLQlpbnQgYjIgPSByYWYucmVhZEJ5dGUoKSAmIDB4RkY7OwotCWludCBiMyA9IHJhZi5yZWFkQnl0ZSgpICYgMHhGRjs7Ci0JcmV0dXJuIGIzIDw8IDI0IHwgYjIgPDwgMTYgfCBiMSA8PCA4IHwgYjA7Ci19Ci1zdGF0aWMgdm9pZCB3cml0ZTQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyYWYud3JpdGUodmFsdWUgJiAweEZGKTsKLQlyYWYud3JpdGUoKHZhbHVlID4+IDgpICYgMHhGRik7Ci0JcmFmLndyaXRlKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKLQlyYWYud3JpdGUoKHZhbHVlID4+IDI0KSAmIDB4RkYpOwotfQotc3RhdGljIHZvaWQgd3JpdGVVMihSYW5kb21BY2Nlc3NGaWxlIHJhZiwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCXJhZi53cml0ZSh2YWx1ZSAmIDB4RkYpOwotCXJhZi53cml0ZSgodmFsdWUgPj4gOCkgJiAweEZGKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX0RPU19IRUFERVIgaWRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlkaC5lX21hZ2ljID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfY2JscCA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2NwID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfY3JsYyA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2NwYXJoZHIgPSByZWFkVTIocmFmKTsKLQlpZGguZV9taW5hbGxvYyA9IHJlYWRVMihyYWYpOwotCWlkaC5lX21heGFsbG9jID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfc3MgPSByZWFkVTIocmFmKTsKLQlpZGguZV9zcCA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2NzdW0gPSByZWFkVTIocmFmKTsKLQlpZGguZV9pcCA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2NzID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfbGZhcmxjID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfb3ZubyA9IHJlYWRVMihyYWYpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaWRoLmVfcmVzLmxlbmd0aDsgaSsrKSBpZGguZV9yZXNbaV0gPSByZWFkVTIocmFmKTsKLQlpZGguZV9vZW1pZCA9IHJlYWRVMihyYWYpOwotCWlkaC5lX29lbWluZm8gPSByZWFkVTIocmFmKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGlkaC5lX3JlczIubGVuZ3RoOyBpKyspIGlkaC5lX3JlczJbaV0gPSByZWFkVTIocmFmKTsKLQlpZGguZV9sZmFuZXcgPSByZWFkNChyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfRklMRV9IRUFERVIgaWZoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlmaC5NYWNoaW5lID0gcmVhZFUyKHJhZik7Ci0JaWZoLk51bWJlck9mU2VjdGlvbnMgPSByZWFkVTIocmFmKTsKLQlpZmguVGltZURhdGVTdGFtcCA9IHJlYWQ0KHJhZik7Ci0JaWZoLlBvaW50ZXJUb1N5bWJvbFRhYmxlID0gcmVhZDQocmFmKTsKLQlpZmguTnVtYmVyT2ZTeW1ib2xzID0gcmVhZDQocmFmKTsKLQlpZmguU2l6ZU9mT3B0aW9uYWxIZWFkZXIgPSByZWFkVTIocmFmKTsKLQlpZmguQ2hhcmFjdGVyaXN0aWNzICA9IHJlYWRVMihyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfREFUQV9ESVJFQ1RPUlkgaWRkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlkZC5WaXJ0dWFsQWRkcmVzcyA9IHJlYWQ0KHJhZik7Ci0JaWRkLlNpemUgPSByZWFkNChyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfT1BUSU9OQUxfSEVBREVSIGlvaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpb2guTWFnaWMgPSByZWFkVTIocmFmKTsKLQlpb2guTWFqb3JMaW5rZXJWZXJzaW9uID0gcmFmLnJlYWQoKTsKLQlpb2guTWlub3JMaW5rZXJWZXJzaW9uID0gcmFmLnJlYWQoKTsKLQlpb2guU2l6ZU9mQ29kZSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNpemVPZkluaXRpYWxpemVkRGF0YSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNpemVPZlVuaW5pdGlhbGl6ZWREYXRhID0gcmVhZDQocmFmKTsKLQlpb2guQWRkcmVzc09mRW50cnlQb2ludCA9IHJlYWQ0KHJhZik7Ci0JaW9oLkJhc2VPZkNvZGUgPSByZWFkNChyYWYpOwotCWlvaC5CYXNlT2ZEYXRhID0gcmVhZDQocmFmKTsKLQlpb2guSW1hZ2VCYXNlID0gcmVhZDQocmFmKTsKLQlpb2guU2VjdGlvbkFsaWdubWVudCA9IHJlYWQ0KHJhZik7Ci0JaW9oLkZpbGVBbGlnbm1lbnQgPSByZWFkNChyYWYpOwotCWlvaC5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24gPSByZWFkVTIocmFmKTsKLQlpb2guTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaW9oLk1ham9ySW1hZ2VWZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaW9oLk1pbm9ySW1hZ2VWZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaW9oLk1ham9yU3Vic3lzdGVtVmVyc2lvbiA9IHJlYWRVMihyYWYpOwotCWlvaC5NaW5vclN1YnN5c3RlbVZlcnNpb24gPSByZWFkVTIocmFmKTsKLQlpb2guV2luMzJWZXJzaW9uVmFsdWUgPSByZWFkNChyYWYpOwotCWlvaC5TaXplT2ZJbWFnZSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNpemVPZkhlYWRlcnMgPSByZWFkNChyYWYpOwotCWlvaC5DaGVja1N1bSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlN1YnN5c3RlbSA9IHJlYWRVMihyYWYpOwotCWlvaC5EbGxDaGFyYWN0ZXJpc3RpY3MgPSByZWFkVTIocmFmKTsKLQlpb2guU2l6ZU9mU3RhY2tSZXNlcnZlID0gcmVhZDQocmFmKTsKLQlpb2guU2l6ZU9mU3RhY2tDb21taXQgPSByZWFkNChyYWYpOwotCWlvaC5TaXplT2ZIZWFwUmVzZXJ2ZSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNpemVPZkhlYXBDb21taXQgPSByZWFkNChyYWYpOwotCWlvaC5Mb2FkZXJGbGFncyA9IHJlYWQ0KHJhZik7Ci0JaW9oLk51bWJlck9mUnZhQW5kU2l6ZXMgPSByZWFkNChyYWYpOwotCWZvciAoaW50IGkgPSAwIDsgaSA8IGlvaC5EYXRhRGlyZWN0b3J5Lmxlbmd0aDsgaSsrKSB7Ci0JCWlvaC5EYXRhRGlyZWN0b3J5W2ldID0gbmV3IElNQUdFX0RBVEFfRElSRUNUT1JZKCk7Ci0JCXJlYWQocmFmLCBpb2guRGF0YURpcmVjdG9yeVtpXSk7Ci0JfQotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfTlRfSEVBREVSUyBpbmgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaW5oLlNpZ25hdHVyZSA9IHJlYWQ0KHJhZik7Ci0JcmVhZChyYWYsIGluaC5GaWxlSGVhZGVyKTsKLQlyZWFkKHJhZiwgaW5oLk9wdGlvbmFsSGVhZGVyKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX1NFQ1RJT05fSEVBREVSIGlzaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlmb3IgKGludCBpID0gMCA7IGkgPCBpc2guTmFtZS5sZW5ndGg7IGkrKykgaXNoLk5hbWVbaV0gPSByYWYucmVhZCgpOwotCWlzaC5NaXNjX1ZpcnR1YWxTaXplID0gcmVhZDQocmFmKTsKLQlpc2guVmlydHVhbEFkZHJlc3MgPSByZWFkNChyYWYpOwotCWlzaC5TaXplT2ZSYXdEYXRhID0gcmVhZDQocmFmKTsKLQlpc2guUG9pbnRlclRvUmF3RGF0YSA9IHJlYWQ0KHJhZik7Ci0JaXNoLlBvaW50ZXJUb1JlbG9jYXRpb25zID0gcmVhZDQocmFmKTsKLQlpc2guUG9pbnRlclRvTGluZW51bWJlcnMgPSByZWFkNChyYWYpOwotCWlzaC5OdW1iZXJPZlJlbG9jYXRpb25zID0gcmVhZFUyKHJhZik7Ci0JaXNoLk51bWJlck9mTGluZW51bWJlcnMgPSByZWFkVTIocmFmKTsKLQlpc2guQ2hhcmFjdGVyaXN0aWNzID0gcmVhZDQocmFmKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSBpcmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaXJkLkNoYXJhY3RlcmlzdGljcyA9IHJlYWQ0KHJhZik7Ci0JaXJkLlRpbWVEYXRlU3RhbXAgPSByZWFkNChyYWYpOwotCWlyZC5NYWpvclZlcnNpb24gPSByZWFkVTIocmFmKTsKLQlpcmQuTWlub3JWZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaXJkLk51bWJlck9mTmFtZWRFbnRyaWVzID0gcmVhZFUyKHJhZik7Ci0JaXJkLk51bWJlck9mSWRFbnRyaWVzID0gcmVhZFUyKHJhZik7Ci19Owotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZIGlyZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaXJkZS5OYW1lID0gcmVhZDQocmFmKTsKLQlpcmRlLk9mZnNldFRvRGF0YSA9IHJlYWQ0KHJhZik7Ci0JLy8gY29uc3RydWN0IG90aGVyIHVuaW9uIG1lbWJlcnMKLQlpcmRlLk5hbWVPZmZzZXQgPSBpcmRlLk5hbWUgJiB+ICgxIDw8IDMxKTsKLQlpcmRlLk5hbWVJc1N0cmluZyA9IChpcmRlLk5hbWUgJiAoMSA8PCAzMSkpICE9IDA7Ci0JaXJkZS5JZCA9IGlyZGUuTmFtZSAmIDB4RkZGRjsKLQlpcmRlLk9mZnNldFRvRGlyZWN0b3J5ID0gaXJkZS5PZmZzZXRUb0RhdGEgJiB+ICgxIDw8IDMxKTsKLQlpcmRlLkRhdGFJc0RpcmVjdG9yeSA9IChpcmRlLk9mZnNldFRvRGF0YSAmICgxIDw8IDMxKSkgIT0gMDsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX1JFU09VUkNFX0RBVEFfRU5UUlkgaXJkZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpcmRlLk9mZnNldFRvRGF0YSA9IHJlYWQ0KHJhZik7Ci0JaXJkZS5TaXplID0gcmVhZDQocmFmKTsKLQlpcmRlLkNvZGVQYWdlID0gcmVhZDQocmFmKTsKLQlpcmRlLlJlc2VydmVkID0gcmVhZDQocmFmKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIE5FV0hFQURFUiBuaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQluaC5SZXNlcnZlZCA9IHJlYWRVMihyYWYpOwotCW5oLlJlc1R5cGUgPSByZWFkVTIocmFmKTsKLQluaC5SZXNDb3VudCA9IHJlYWRVMihyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSUNPTlJFU0RJUiBpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWkuV2lkdGggPSByYWYucmVhZCgpOwotCWkuSGVpZ2h0ID0gcmFmLnJlYWQoKTsKLQlpLkNvbG9yQ291bnQgPSByYWYucmVhZCgpOwotCWkucmVzZXJ2ZWQgPSByYWYucmVhZCgpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgQ1VSU09SRElSIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JYy5XaWR0aCA9IHJlYWRVMihyYWYpOwotCWMuSGVpZ2h0ID0gcmVhZFUyKHJhZik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBSRVNESVIgcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JbG9uZyBzdGFydCA9IHJhZi5nZXRGaWxlUG9pbnRlcigpOwotCXJlYWQocmFmLCBycy5JY29uKTsKLQlyYWYuc2VlayhzdGFydCk7Ci0JcmVhZChyYWYsIHJzLkN1cnNvcik7Ci0JcnMuUGxhbmVzID0gcmVhZFUyKHJhZik7Ci0JcnMuQml0Q291bnQgPSByZWFkVTIocmFmKTsKLQlycy5CeXRlc0luUmVzID0gcmVhZDQocmFmKTsKLQlycy5JY29uQ3Vyc29ySWQgPSByZWFkVTIocmFmKTsKLX0KLQotLyogSW1hZ2VEYXRhIGFuZCBJbWFnZSBEZWNvZGVyIGlubGluaW5nIHRvIGF2b2lkIGRlcGVuZGVuY3kgb24gU1dUIAotICogVGhlIGZvbGxvd2luZyBzZWN0aW9uIGNhbiBiZSBlbnRpcmVseSByZW1vdmVkIGlmIFNXVCBjYW4gYmUgdXNlZC4KLSAqLwotCi1zdGF0aWMgY2xhc3MgUkdCIHsKLQkKLQkvKioKLQkgKiB0aGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgUkdCCi0JICovCi0JcHVibGljIGludCByZWQ7Ci0JCi0JLyoqCi0JICogdGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgUkdCCi0JICovCi0JcHVibGljIGludCBncmVlbjsKLQkKLQkvKioKLQkgKiB0aGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIFJHQgotCSAqLwotCXB1YmxpYyBpbnQgYmx1ZTsKLQkKLQlzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1ODQxNTAyMzQ2MTI0OTA3NEw7Ci0JCi0vKioKLSAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIHRoZSBnaXZlbgotICogcmVkLCBncmVlbiBhbmQgYmx1ZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHJlZCB0aGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgbmV3IGluc3RhbmNlCi0gKiBAcGFyYW0gZ3JlZW4gdGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgbmV3IGluc3RhbmNlCi0gKiBAcGFyYW0gYmx1ZSB0aGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIG5ldyBpbnN0YW5jZQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIHJlZCwgZ3JlZW4gb3IgYmx1ZSBhcmd1bWVudCBpcyBub3QgYmV0d2VlbiAwIGFuZCAyNTU8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFJHQihpbnQgcmVkLCBpbnQgZ3JlZW4sIGludCBibHVlKSB7Ci0JaWYgKChyZWQgPiAyNTUpIHx8IChyZWQgPCAwKSB8fAotCQkoZ3JlZW4gPiAyNTUpIHx8IChncmVlbiA8IDApIHx8Ci0JCShibHVlID4gMjU1KSB8fCAoYmx1ZSA8IDApKQotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQl0aGlzLnJlZCA9IHJlZDsKLQl0aGlzLmdyZWVuID0gZ3JlZW47Ci0JdGhpcy5ibHVlID0gYmx1ZTsKLX0KLQotLyoqCi0gKiBDb21wYXJlcyB0aGUgYXJndW1lbnQgdG8gdGhlIHJlY2VpdmVyLCBhbmQgcmV0dXJucyB0cnVlCi0gKiBpZiB0aGV5IHJlcHJlc2VudCB0aGUgPGVtPnNhbWU8L2VtPiBvYmplY3QgdXNpbmcgYSBjbGFzcwotICogc3BlY2lmaWMgY29tcGFyaXNvbi4KLSAqCi0gKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0Ci0gKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgdGhlIHNhbWUgYXMgdGhpcyBvYmplY3QgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAqCi0gKiBAc2VlICNoYXNoQ29kZSgpCi0gKi8KLXB1YmxpYyBib29sZWFuIGVxdWFscyAoT2JqZWN0IG9iamVjdCkgewotCWlmIChvYmplY3QgPT0gdGhpcykgcmV0dXJuIHRydWU7Ci0JaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgUkdCKSkgcmV0dXJuIGZhbHNlOwotCVJHQiByZ2IgPSAoUkdCKW9iamVjdDsKLQlyZXR1cm4gKHJnYi5yZWQgPT0gdGhpcy5yZWQpICYmIChyZ2IuZ3JlZW4gPT0gdGhpcy5ncmVlbikgJiYgKHJnYi5ibHVlID09IHRoaXMuYmx1ZSk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBBbnkgdHdvIAotICogb2JqZWN0cyB3aGljaCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiBwYXNzZWQgdG8gCi0gKiA8Y29kZT5lcXVhbHM8L2NvZGU+IG11c3QgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzCi0gKiBtZXRob2QuCi0gKgotICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCi0gKgotICogQHNlZSAjZXF1YWxzKE9iamVjdCkKLSAqLwotcHVibGljIGludCBoYXNoQ29kZSAoKSB7Ci0JcmV0dXJuIChibHVlIDw8IDE2KSB8IChncmVlbiA8PCA4KSB8IHJlZDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZQotICogZGVzY3JpcHRpb24gb2YgdGhlIHJlY2VpdmVyLgotICoKLSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIDxjb2RlPlJHQjwvY29kZT4KLSAqLwotcHVibGljIFN0cmluZyB0b1N0cmluZyAoKSB7Ci0JcmV0dXJuICJSR0IgeyIgKyByZWQgKyAiLCAiICsgZ3JlZW4gKyAiLCAiICsgYmx1ZSArICJ9IjsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQotLy8kTk9OLU5MUy00JAotfQotCi19Ci1zdGF0aWMgY2xhc3MgUGFsZXR0ZURhdGEgewotCQotCS8qKgotCSAqIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgZGlyZWN0IHBhbGV0dGUsIAotCSAqIGFuZCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdDsKLQkKLQkvKioKLQkgKiB0aGUgUkdCIHZhbHVlcyBmb3IgYW4gaW5kZXhlZCBwYWxldHRlLCB3aGVyZSB0aGUKLQkgKiBpbmRpY2VzIG9mIHRoZSBhcnJheSBjb3JyZXNwb25kIHRvIHBpeGVsIHZhbHVlcwotCSAqLwotCXB1YmxpYyBSR0JbXSBjb2xvcnM7Ci0JCi0JLyoqCi0JICogdGhlIHJlZCBtYXNrIGZvciBhIGRpcmVjdCBwYWxldHRlCi0JICovCi0JcHVibGljIGludCByZWRNYXNrOwotCQotCS8qKgotCSAqIHRoZSBncmVlbiBtYXNrIGZvciBhIGRpcmVjdCBwYWxldHRlCi0JICovCi0JcHVibGljIGludCBncmVlbk1hc2s7Ci0JCi0JLyoqCi0JICogdGhlIGJsdWUgbWFzayBmb3IgYSBkaXJlY3QgcGFsZXR0ZQotCSAqLwotCXB1YmxpYyBpbnQgYmx1ZU1hc2s7Ci0JCi0JLyoqCi0JICogdGhlIHJlZCBzaGlmdCBmb3IgYSBkaXJlY3QgcGFsZXR0ZQotCSAqLwotCXB1YmxpYyBpbnQgcmVkU2hpZnQ7Ci0JCi0JLyoqCi0JICogdGhlIGdyZWVuIHNoaWZ0IGZvciBhIGRpcmVjdCBwYWxldHRlCi0JICovCi0JcHVibGljIGludCBncmVlblNoaWZ0OwotCQotCS8qKgotCSAqIHRoZSBibHVlIHNoaWZ0IGZvciBhIGRpcmVjdCBwYWxldHRlCi0JICovCi0JcHVibGljIGludCBibHVlU2hpZnQ7Ci0KLS8qKgotICogQ29uc3RydWN0cyBhIG5ldyBpbmRleGVkIHBhbGV0dGUgZ2l2ZW4gYW4gYXJyYXkgb2YgUkdCIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gY29sb3JzIHRoZSBhcnJheSBvZiA8Y29kZT5SR0I8L2NvZGU+cyBmb3IgdGhlIHBhbGV0dGUKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBhcmd1bWVudCBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBQYWxldHRlRGF0YShSR0JbXSBjb2xvcnMpIHsKLQlpZiAoY29sb3JzID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JdGhpcy5jb2xvcnMgPSBjb2xvcnM7Ci0JdGhpcy5pc0RpcmVjdCA9IGZhbHNlOwotfQotCi0vKioKLSAqIENvbnN0cnVjdHMgYSBuZXcgZGlyZWN0IHBhbGV0dGUgZ2l2ZW4gdGhlIHJlZCwgZ3JlZW4gYW5kIGJsdWUgbWFza3MuCi0gKgotICogQHBhcmFtIHJlZE1hc2sgdGhlIHJlZCBtYXNrCi0gKiBAcGFyYW0gZ3JlZW5NYXNrIHRoZSBncmVlbiBtYXNrCi0gKiBAcGFyYW0gYmx1ZU1hc2sgdGhlIGJsdWUgbWFzawotICovCi1wdWJsaWMgUGFsZXR0ZURhdGEoaW50IHJlZE1hc2ssIGludCBncmVlbk1hc2ssIGludCBibHVlTWFzaykgewotCXRoaXMucmVkTWFzayA9IHJlZE1hc2s7Ci0JdGhpcy5ncmVlbk1hc2sgPSBncmVlbk1hc2s7Ci0JdGhpcy5ibHVlTWFzayA9IGJsdWVNYXNrOwotCXRoaXMuaXNEaXJlY3QgPSB0cnVlOwotCXRoaXMucmVkU2hpZnQgPSBzaGlmdEZvck1hc2socmVkTWFzayk7Ci0JdGhpcy5ncmVlblNoaWZ0ID0gc2hpZnRGb3JNYXNrKGdyZWVuTWFzayk7Ci0JdGhpcy5ibHVlU2hpZnQgPSBzaGlmdEZvck1hc2soYmx1ZU1hc2spOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIHBpeGVsIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIDxjb2RlPlJCRzwvY29kZT4uCi0gKgotICogQHBhcmFtIHJnYiB0aGUgUkdCIHRvIGdldCB0aGUgcGl4ZWwgdmFsdWUgZm9yCi0gKiBAcmV0dXJuIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGdpdmVuIFJHQgotICogCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBhcmd1bWVudCBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIFJHQiBpcyBub3QgZm91bmQgaW4gdGhlIHBhbGV0dGU8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGludCBnZXRQaXhlbChSR0IgcmdiKSB7Ci0JaWYgKHJnYiA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWlmIChpc0RpcmVjdCkgewotCQlpbnQgcGl4ZWwgPSAwOwotCQlwaXhlbCB8PSAocmVkU2hpZnQgPCAwID8gcmdiLnJlZCA8PCAtcmVkU2hpZnQgOiByZ2IucmVkID4+PiByZWRTaGlmdCkgJiByZWRNYXNrOwotCQlwaXhlbCB8PSAoZ3JlZW5TaGlmdCA8IDAgPyByZ2IuZ3JlZW4gPDwgLWdyZWVuU2hpZnQgOiByZ2IuZ3JlZW4gPj4+IGdyZWVuU2hpZnQpICYgZ3JlZW5NYXNrOwotCQlwaXhlbCB8PSAoYmx1ZVNoaWZ0IDwgMCA/IHJnYi5ibHVlIDw8IC1ibHVlU2hpZnQgOiByZ2IuYmx1ZSA+Pj4gYmx1ZVNoaWZ0KSAmIGJsdWVNYXNrOwotCQlyZXR1cm4gcGl4ZWw7Ci0JfSBlbHNlIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb2xvcnNbaV0uZXF1YWxzKHJnYikpIHJldHVybiBpOwotCQl9Ci0JCS8qIFRoZSBSR0IgZGlkIG5vdCBleGlzdCBpbiB0aGUgcGFsZXR0ZSAqLwotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLS8qKgotICogUmV0dXJucyBhbiA8Y29kZT5SR0I8L2NvZGU+IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHBpeGVsIHZhbHVlLgotICoKLSAqIEBwYXJhbSBwaXhlbCB0aGUgcGl4ZWwgdG8gZ2V0IHRoZSBSR0IgdmFsdWUgZm9yCi0gKiBAcmV0dXJuIHRoZSBSR0IgdmFsdWUgZm9yIHRoZSBnaXZlbiBwaXhlbAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGFyZ3VtZW50IGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgcGl4ZWwgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHBhbGV0dGU8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFJHQiBnZXRSR0IoaW50IHBpeGVsKSB7Ci0JaWYgKGlzRGlyZWN0KSB7Ci0JCWludCByID0gcGl4ZWwgJiByZWRNYXNrOwotCQlyID0gKHJlZFNoaWZ0IDwgMCkgPyByID4+PiAtcmVkU2hpZnQgOiByIDw8IHJlZFNoaWZ0OwotCQlpbnQgZyA9IHBpeGVsICYgZ3JlZW5NYXNrOwotCQlnID0gKGdyZWVuU2hpZnQgPCAwKSA/IGcgPj4+IC1ncmVlblNoaWZ0IDogZyA8PCBncmVlblNoaWZ0OwotCQlpbnQgYiA9IHBpeGVsICYgYmx1ZU1hc2s7Ci0JCWIgPSAoYmx1ZVNoaWZ0IDwgMCkgPyBiID4+PiAtYmx1ZVNoaWZ0IDogYiA8PCBibHVlU2hpZnQ7Ci0JCXJldHVybiBuZXcgUkdCKHIsIGcsIGIpOwotCX0gZWxzZSB7Ci0JCWlmIChwaXhlbCA8IDAgfHwgcGl4ZWwgPj0gY29sb3JzLmxlbmd0aCkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQkJfQotCQlyZXR1cm4gY29sb3JzW3BpeGVsXTsKLQl9Ci19Ci0KLS8qKgotICogUmV0dXJucyBhbGwgdGhlIFJHQiB2YWx1ZXMgaW4gdGhlIHJlY2VpdmVyIGlmIGl0IGlzIGFuCi0gKiBpbmRleGVkIHBhbGV0dGUsIG9yIG51bGwgaWYgaXQgaXMgYSBkaXJlY3QgcGFsZXR0ZS4KLSAqCi0gKiBAcmV0dXJuIHRoZSA8Y29kZT5SR0I8L2NvZGU+cyBmb3IgdGhlIHJlY2VpdmVyIG9yIG51bGwKLSAqLwotcHVibGljIFJHQltdIGdldFJHQnMoKSB7Ci0JcmV0dXJuIGNvbG9yczsKLX0KLQotLyoqCi0gKiBDb21wdXRlcyB0aGUgc2hpZnQgdmFsdWUgZm9yIGEgZ2l2ZW4gbWFzay4KLSAqCi0gKiBAcGFyYW0gbWFzayB0aGUgbWFzayB0byBjb21wdXRlIHRoZSBzaGlmdCBmb3IKLSAqIEByZXR1cm4gdGhlIHNoaWZ0IGFtb3VudAotICoKLSAqIEBzZWUgUGFsZXR0ZURhdGEKLSAqLwotaW50IHNoaWZ0Rm9yTWFzayhpbnQgbWFzaykgewotCWZvciAoaW50IGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsgCi0JCWlmICgoKG1hc2sgPj4gaSkgJiAweDEpICE9IDApIHJldHVybiA3IC0gaTsKLQl9Ci0JcmV0dXJuIDMyOwotfQotCi19Ci1zdGF0aWMgY2xhc3MgSW1hZ2VMb2FkZXIgewotCQotCS8qKgotCSAqIHRoZSBhcnJheSBvZiBJbWFnZURhdGEgb2JqZWN0cyBpbiB0aGlzIEltYWdlTG9hZGVyLgotCSAqIFRoaXMgYXJyYXkgaXMgcmVhZCBpbiB3aGVuIHRoZSBsb2FkIG1ldGhvZCBpcyBjYWxsZWQsCi0JICogYW5kIGl0IGlzIHdyaXR0ZW4gb3V0IHdoZW4gdGhlIHNhdmUgbWV0aG9kIGlzIGNhbGxlZAotCSAqLwotCXB1YmxpYyBJbWFnZURhdGFbXSBkYXRhOwotCQotCS8qKgotCSAqIHRoZSB3aWR0aCBvZiB0aGUgbG9naWNhbCBzY3JlZW4gb24gd2hpY2ggdGhlIGltYWdlcwotCSAqIHJlc2lkZSwgaW4gcGl4ZWxzICh0aGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBHSUY4OWEKLQkgKiBMb2dpY2FsIFNjcmVlbiBXaWR0aCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgaW50IGxvZ2ljYWxTY3JlZW5XaWR0aDsKLQotCS8qKgotCSAqIHRoZSBoZWlnaHQgb2YgdGhlIGxvZ2ljYWwgc2NyZWVuIG9uIHdoaWNoIHRoZSBpbWFnZXMKLQkgKiByZXNpZGUsIGluIHBpeGVscyAodGhpcyBjb3JyZXNwb25kcyB0byB0aGUgR0lGODlhCi0JICogTG9naWNhbCBTY3JlZW4gSGVpZ2h0IHZhbHVlKQotCSAqLwotCXB1YmxpYyBpbnQgbG9naWNhbFNjcmVlbkhlaWdodDsKLQotCS8qKgotCSAqIHRoZSBiYWNrZ3JvdW5kIHBpeGVsIGZvciB0aGUgbG9naWNhbCBzY3JlZW4gKHRoaXMgCi0JICogY29ycmVzcG9uZHMgdG8gdGhlIEdJRjg5YSBCYWNrZ3JvdW5kIENvbG9yIEluZGV4IHZhbHVlKS4KLQkgKiBUaGUgZGVmYXVsdCBpcyAtMSB3aGljaCBtZWFucyAndW5zcGVjaWZpZWQgYmFja2dyb3VuZCcKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGJhY2tncm91bmRQaXhlbDsKLQotCS8qKgotCSAqIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBkaXNwbGF5IG9mIGEgc2VxdWVuY2UKLQkgKiBvZiBhbmltYXRlZCBpbWFnZXMgKHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGNvbW1vbmx5LXVzZWQKLQkgKiBHSUYgYXBwbGljYXRpb24gZXh0ZW5zaW9uIGZvciAiTkVUU0NBUEUgMi4wIDAxIikKLQkgKi8KLQlwdWJsaWMgaW50IHJlcGVhdENvdW50OwotCQkKLQkvKgotCSAqIHRoZSBzZXQgb2YgSW1hZ2VMb2FkZXIgZXZlbnQgbGlzdGVuZXJzLCBjcmVhdGVkIG9uIGRlbWFuZAotCSAqLwotCVZlY3RvciBpbWFnZUxvYWRlckxpc3RlbmVyczsKLQotLyoqCi0gKiBDb25zdHJ1Y3QgYSBuZXcgZW1wdHkgSW1hZ2VMb2FkZXIuCi0gKi8KLXB1YmxpYyBJbWFnZUxvYWRlcigpIHsKLQlyZXNldCgpOwotfQotCi0vKioKLSAqIFJlc2V0cyB0aGUgZmllbGRzIG9mIHRoZSBJbWFnZUxvYWRlciwgZXhjZXB0IGZvciB0aGUKLSAqIDxjb2RlPmltYWdlTG9hZGVyTGlzdGVuZXJzPC9jb2RlPiBmaWVsZC4KLSAqLwotdm9pZCByZXNldCgpIHsKLQlkYXRhID0gbnVsbDsKLQlsb2dpY2FsU2NyZWVuV2lkdGggPSAwOwotCWxvZ2ljYWxTY3JlZW5IZWlnaHQgPSAwOwotCWJhY2tncm91bmRQaXhlbCA9IC0xOwotCXJlcGVhdENvdW50ID0gMTsKLX0KLQotLyoqCi0gKiBMb2FkcyBhbiBhcnJheSBvZiA8Y29kZT5JbWFnZURhdGE8L2NvZGU+IG9iamVjdHMgZnJvbSB0aGUKLSAqIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0uIFRocm93cyBhbiBlcnJvciBpZiBlaXRoZXIgYW4gZXJyb3IKLSAqIG9jY3VycyB3aGlsZSBsb2FkaW5nIHRoZSBpbWFnZXMsIG9yIGlmIHRoZSBpbWFnZXMgYXJlIG5vdAotICogb2YgYSBzdXBwb3J0ZWQgdHlwZS4gUmV0dXJucyB0aGUgbG9hZGVkIGltYWdlIGRhdGEgYXJyYXkuCi0gKgotICogQHBhcmFtIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtIHRvIGxvYWQgdGhlIGltYWdlcyBmcm9tCi0gKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkltYWdlRGF0YTwvY29kZT4gb2JqZWN0cyBsb2FkZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHN0cmVhbSBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9JTUFHRSAtIGlmIHRoZSBpbWFnZSBmaWxlIGNvbnRhaW5zIGludmFsaWQgZGF0YTwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU8gLSBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZGF0YTwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVU5TVVBQT1JURURfRk9STUFUIC0gaWYgdGhlIGltYWdlIGZpbGUgY29udGFpbnMgYW4gdW5yZWNvZ25pemVkIGZvcm1hdDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgSW1hZ2VEYXRhW10gbG9hZChJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLQlpZiAoc3RyZWFtID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JcmVzZXQoKTsKLQlkYXRhID0gRmlsZUZvcm1hdC5sb2FkKHN0cmVhbSwgdGhpcyk7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLS8qKgotICogTG9hZHMgYW4gYXJyYXkgb2YgPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPiBvYmplY3RzIGZyb20gdGhlCi0gKiBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUaHJvd3MgYW4gZXJyb3IgaWYgZWl0aGVyCi0gKiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgbG9hZGluZyB0aGUgaW1hZ2VzLCBvciBpZiB0aGUgaW1hZ2VzIGFyZQotICogbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUuIFJldHVybnMgdGhlIGxvYWRlZCBpbWFnZSBkYXRhIGFycmF5LgotICoKLSAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBsb2FkIHRoZSBpbWFnZXMgZnJvbQotICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5JbWFnZURhdGE8L2NvZGU+IG9iamVjdHMgbG9hZGVkIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgZmlsZSBuYW1lIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0lNQUdFIC0gaWYgdGhlIGltYWdlIGZpbGUgY29udGFpbnMgaW52YWxpZCBkYXRhPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTyAtIGlmIGFuIElPIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIGRhdGE8L2xpPgotICogICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCAtIGlmIHRoZSBpbWFnZSBmaWxlIGNvbnRhaW5zIGFuIHVucmVjb2duaXplZCBmb3JtYXQ8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEltYWdlRGF0YVtdIGxvYWQoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JaWYgKGZpbGVuYW1lID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQl0cnkgewotCQlzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKTsKLQkJcmV0dXJuIGxvYWQoc3RyZWFtKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCX0gZmluYWxseSB7Ci0JCXRyeSB7Ci0JCQlpZiAoc3RyZWFtICE9IG51bGwpIHN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUgZXJyb3IKLQkJfQotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLX0KLXN0YXRpYyBjbGFzcyBJbWFnZURhdGEgewotCQotCS8qKgotCSAqIFRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UsIGluIHBpeGVscy4KLQkgKi8KLQlwdWJsaWMgaW50IHdpZHRoOwotCi0JLyoqCi0JICogVGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UsIGluIHBpeGVscy4KLQkgKi8KLQlwdWJsaWMgaW50IGhlaWdodDsKLQotCS8qKgotCSAqIFRoZSBjb2xvciBkZXB0aCBvZiB0aGUgaW1hZ2UsIGluIGJpdHMgcGVyIHBpeGVsLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBhIGRlcHRoIG9mIDggb3IgbGVzcyBkb2VzIG5vdCBuZWNlc3NhcmlseQotCSAqIG1lYW4gdGhhdCB0aGUgaW1hZ2UgaXMgcGFsZXR0ZSBpbmRleGVkLCBvcgotCSAqIGNvbnZlcnNlbHkgdGhhdCBhIGRlcHRoIGdyZWF0ZXIgdGhhbiA4IG1lYW5zIHRoYXQKLQkgKiB0aGUgaW1hZ2UgaXMgZGlyZWN0IGNvbG9yLiAgQ2hlY2sgdGhlIGFzc29jaWF0ZWQKLQkgKiBQYWxldHRlRGF0YSdzIGlzRGlyZWN0IGZpZWxkIGZvciBzdWNoIGRldGVybWluYXRpb25zLgotCSAqLwotCXB1YmxpYyBpbnQgZGVwdGg7Ci0KLQkvKioKLQkgKiBUaGUgc2NhbmxpbmUgcGFkZGluZy4KLQkgKiA8cD4KLQkgKiBJZiBvbmUgc2NhbmxpbmUgb2YgdGhlIGltYWdlIGlzIG5vdCBhIG11bHRpcGxlIG9mCi0JICogdGhpcyBudW1iZXIsIGl0IHdpbGwgYmUgcGFkZGVkIHdpdGggemVyb3MgdW50aWwgaXQgaXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgc2NhbmxpbmVQYWQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBzY2FubGluZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgbXVsdGlwbGUgb2YgdGhlIHNjYW5saW5lIHBhZGRpbmcuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgYnl0ZXNQZXJMaW5lOwotCi0JLyoqCi0JICogVGhlIHBpeGVsIGRhdGEgb2YgdGhlIGltYWdlLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBmb3IgMTYgYml0IGRlcHRoIGltYWdlcyB0aGUgcGl4ZWwgZGF0YSBpcyBzdG9yZWQKLQkgKiBpbiBsZWFzdCBzaWduaWZpY2FudCBieXRlIG9yZGVyOyBob3dldmVyLCBmb3IgMjRiaXQgYW5kCi0JICogMzJiaXQgZGVwdGggaW1hZ2VzIHRoZSBwaXhlbCBkYXRhIGlzIHN0b3JlZCBpbiBtb3N0Ci0JICogc2lnbmlmaWNhbnQgYnl0ZSBvcmRlci4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGJ5dGVbXSBkYXRhOwotCi0JLyoqCi0JICogVGhlIGNvbG9yIHRhYmxlIGZvciB0aGUgaW1hZ2UuCi0JICovCi0JcHVibGljIFBhbGV0dGVEYXRhIHBhbGV0dGU7Ci0KLQkvKioKLQkgKiBUaGUgdHJhbnNwYXJlbnQgcGl4ZWwuCi0JICogPHA+Ci0JICogUGl4ZWxzIHdpdGggdGhpcyB2YWx1ZSBhcmUgdHJhbnNwYXJlbnQuCi0JICogPC9wPjxwPgotCSAqIFRoZSBkZWZhdWx0IGlzIC0xIHdoaWNoIG1lYW5zICdubyB0cmFuc3BhcmVudCBwaXhlbCcuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgdHJhbnNwYXJlbnRQaXhlbDsKLQotCS8qKgotCSAqIEFuIGljb24tc3BlY2lmaWMgZmllbGQgY29udGFpbmluZyB0aGUgZGF0YSBmcm9tIHRoZSBpY29uIG1hc2suCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIDEgYml0IGJpdG1hcCBzdG9yZWQgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAotCSAqIGJpdCBmaXJzdC4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIHNjYW5saW5lIGlzCi0JICogJygod2lkdGggKyA3KSAvIDggKyAobWFza1BhZCAtIDEpKSAvIG1hc2tQYWQgKiBtYXNrUGFkJy4KLQkgKiA8L3A+PHA+Ci0JICogVGhlIGRlZmF1bHQgaXMgbnVsbCB3aGljaCBtZWFucyAnbm8gdHJhbnNwYXJlbmN5IG1hc2snLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIG1hc2tEYXRhOwotCi0JLyoqCi0JICogQW4gaWNvbi1zcGVjaWZpYyBmaWVsZCBjb250YWluaW5nIHRoZSBzY2FubGluZSBwYWQgb2YgdGhlIG1hc2suCi0JICogPHA+Ci0JICogSWYgb25lIHNjYW5saW5lIG9mIHRoZSB0cmFuc3BhcmVuY3kgbWFzayBpcyBub3QgYQotCSAqIG11bHRpcGxlIG9mIHRoaXMgbnVtYmVyLCBpdCB3aWxsIGJlIHBhZGRlZCB3aXRoIHplcm9zIHVudGlsCi0JICogaXQgaXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgbWFza1BhZDsKLQkKLQkvKioKLQkgKiBUaGUgYWxwaGEgZGF0YSBvZiB0aGUgaW1hZ2UuCi0JICogPHA+Ci0JICogRXZlcnkgcGl4ZWwgY2FuIGhhdmUgYW4gPGVtPmFscGhhIGJsZW5kaW5nPC9lbT4gdmFsdWUgdGhhdAotCSAqIHZhcmllcyBmcm9tIDAsIG1lYW5pbmcgZnVsbHkgdHJhbnNwYXJlbnQsIHRvIDI1NSBtZWFuaW5nCi0JICogZnVsbHkgb3BhcXVlLiAgVGhlIG51bWJlciBvZiBieXRlcyBwZXIgc2NhbmxpbmUgaXMKLQkgKiAnd2lkdGgnLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGFscGhhRGF0YTsKLQkKLQkvKioKLQkgKiBUaGUgZ2xvYmFsIGFscGhhIHZhbHVlIHRvIGJlIHVzZWQgZm9yIGV2ZXJ5IHBpeGVsLgotCSAqIDxwPgotCSAqIElmIHRoaXMgdmFsdWUgaXMgc2V0LCB0aGUgPGNvZGU+YWxwaGFEYXRhPC9jb2RlPiBmaWVsZAotCSAqIGlzIGlnbm9yZWQgYW5kIHdoZW4gdGhlIGltYWdlIGlzIHJlbmRlcmVkIGVhY2ggcGl4ZWwKLQkgKiB3aWxsIGJlIGJsZW5kZWQgd2l0aCB0aGUgYmFja2dyb3VuZCBhbiBhbW91bnQKLQkgKiBwcm9wb3J0aW9uYWwgdG8gdGhpcyB2YWx1ZS4KLQkgKiA8L3A+PHA+Ci0JICogVGhlIGRlZmF1bHQgaXMgLTEgd2hpY2ggbWVhbnMgJ25vIGdsb2JhbCBhbHBoYSB2YWx1ZScKLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGludCBhbHBoYTsKLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIGZpbGUgZnJvbSB3aGljaCB0aGUgaW1hZ2Ugd2FzIHJlYWQuCi0JICogCi0JICogSXQgaXMgZXhwcmVzc2VkIGFzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLQkgKiA8ZGw+Ci0JICogPGR0Pjxjb2RlPklNQUdFX0JNUDwvY29kZT48L2R0PgotCSAqIDxkZD5XaW5kb3dzIEJNUCBmaWxlIGZvcm1hdCwgbm8gY29tcHJlc3Npb248L2RkPgotCSAqIDxkdD48Y29kZT5JTUFHRV9CTVBfUkxFPC9jb2RlPjwvZHQ+Ci0JICogPGRkPldpbmRvd3MgQk1QIGZpbGUgZm9ybWF0LCBSTEUgY29tcHJlc3Npb24gaWYgYXBwcm9wcmlhdGU8L2RkPgotCSAqIDxkdD48Y29kZT5JTUFHRV9HSUY8L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+R0lGIGZpbGUgZm9ybWF0PC9kZD4KLQkgKiA8ZHQ+PGNvZGU+SU1BR0VfSUNPPC9jb2RlPjwvZHQ+Ci0JICogPGRkPldpbmRvd3MgSUNPIGZpbGUgZm9ybWF0PC9kZD4KLQkgKiA8ZHQ+PGNvZGU+SU1BR0VfSlBFRzwvY29kZT48L2R0PgotCSAqIDxkZD5KUEVHIGZpbGUgZm9ybWF0PC9kZD4KLQkgKiA8ZHQ+PGNvZGU+SU1BR0VfUE5HPC9jb2RlPjwvZHQ+Ci0JICogPGRkPlBORyBmaWxlIGZvcm1hdDwvZGQ+Ci0JICogPC9kbD4KLQkgKi8KLQlwdWJsaWMgaW50IHR5cGU7Ci0KLQkvKioKLQkgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlCi0JICogd2l0aGluIHRoZSBsb2dpY2FsIHNjcmVlbiAodGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0bwotCSAqIHRoZSBHSUY4OWEgSW1hZ2UgTGVmdCBQb3NpdGlvbiB2YWx1ZSkuCi0JICovCi0JcHVibGljIGludCB4OwotCi0JLyoqCi0JICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBpbWFnZQotCSAqIHdpdGhpbiB0aGUgbG9naWNhbCBzY3JlZW4gKHRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8KLQkgKiB0aGUgR0lGODlhIEltYWdlIFRvcCBQb3NpdGlvbiB2YWx1ZSkuCi0JICovCi0JcHVibGljIGludCB5OwotCi0JLyoqCi0JICogQSBkZXNjcmlwdGlvbiBvZiBob3cgdG8gZGlzcG9zZSBvZiB0aGUgY3VycmVudCBpbWFnZQotCSAqIGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBuZXh0LgotCSAqIAotCSAqIEl0IGlzIGV4cHJlc3NlZCBhcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0JICogPGRsPgotCSAqIDxkdD48Y29kZT5ETV9VTlNQRUNJRklFRDwvY29kZT48L2R0PgotCSAqIDxkZD5kaXNwb3NhbCBtZXRob2Qgbm90IHNwZWNpZmllZDwvZGQ+Ci0JICogPGR0Pjxjb2RlPkRNX0ZJTExfTk9ORTwvY29kZT48L2R0PgotCSAqIDxkZD5kbyBub3RoaW5nIC0gbGVhdmUgdGhlIGltYWdlIGluIHBsYWNlPC9kZD4KLQkgKiA8ZHQ+PGNvZGU+RE1fRklMTF9CQUNLR1JPVU5EPC9jb2RlPjwvZHQ+Ci0JICogPGRkPmZpbGwgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvcjwvZGQ+Ci0JICogPGR0Pjxjb2RlPkRNX0ZJTExfUFJFVklPVVM8L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+cmVzdG9yZSB0aGUgcHJldmlvdXMgcGljdHVyZTwvZGQ+Ci0JICogPC9kbD4KLQkgKiAodGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgR0lGODlhIERpc3Bvc2FsIE1ldGhvZCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgaW50IGRpc3Bvc2FsTWV0aG9kOwotCi0JLyoqCi0JICogVGhlIHRpbWUgdG8gZGVsYXkgYmVmb3JlIGRpc3BsYXlpbmcgdGhlIG5leHQgaW1hZ2UKLQkgKiBpbiBhbiBhbmltYXRpb24gKHRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIEdJRjg5YQotCSAqIERlbGF5IFRpbWUgdmFsdWUpLgotCSAqLwotCXB1YmxpYyBpbnQgZGVsYXlUaW1lOwotCi0JLyoqCi0JICogQXJiaXRyYXJ5IGNoYW5uZWwgd2lkdGggZGF0YSB0byA4LWJpdCBjb252ZXJzaW9uIHRhYmxlLgotCSAqLwotCXN0YXRpYyBmaW5hbCBieXRlW11bXSBBTllfVE9fRUlHSFQgPSBuZXcgYnl0ZVs5XVtdOwotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGIgPSAwOyBiIDwgOTsgKytiKSB7Ci0JCQlieXRlW10gZGF0YSA9IEFOWV9UT19FSUdIVFtiXSA9IG5ldyBieXRlWzEgPDwgYl07Ci0JCQlpZiAoYiA9PSAwKSBjb250aW51ZTsKLQkJCWludCBpbmMgPSAwOwotCQkJZm9yIChpbnQgYml0ID0gMHgxMDAwMDsgKGJpdCA+Pj0gYikgIT0gMDspIGluYyB8PSBiaXQ7Ci0JCQlmb3IgKGludCB2ID0gMCwgcCA9IDA7IHYgPCAweDEwMDAwOyB2Kz0gaW5jKSBkYXRhW3ArK10gPSAoYnl0ZSkodiA+PiA4KTsKLQkJfQotCX0KLQlzdGF0aWMgZmluYWwgYnl0ZVtdIE9ORV9UT19PTkVfTUFQUElORyA9IEFOWV9UT19FSUdIVFs4XTsKLQotCS8qKgotCSAqIFNjYWxlZCA4eDggQmF5ZXIgZGl0aGVyIG1hdHJpeC4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50W11bXSBESVRIRVJfTUFUUklYID0gewotCQl7IDB4ZmMwMDAwLCAweDdjMDAwMCwgMHhkYzAwMDAsIDB4NWMwMDAwLCAweGY0MDAwMCwgMHg3NDAwMDAsIDB4ZDQwMDAwLCAweDU0MDAwMCB9LAotCQl7IDB4M2MwMDAwLCAweGJjMDAwMCwgMHgxYzAwMDAsIDB4OWMwMDAwLCAweDM0MDAwMCwgMHhiNDAwMDAsIDB4MTQwMDAwLCAweDk0MDAwMCB9LAotCQl7IDB4Y2MwMDAwLCAweDRjMDAwMCwgMHhlYzAwMDAsIDB4NmMwMDAwLCAweGM0MDAwMCwgMHg0NDAwMDAsIDB4ZTQwMDAwLCAweDY0MDAwMCB9LAotCQl7IDB4MGMwMDAwLCAweDhjMDAwMCwgMHgyYzAwMDAsIDB4YWMwMDAwLCAweDA0MDAwMCwgMHg4NDAwMDAsIDB4MjQwMDAwLCAweGE0MDAwMCB9LAotCQl7IDB4ZjAwMDAwLCAweDcwMDAwMCwgMHhkMDAwMDAsIDB4NTAwMDAwLCAweGY4MDAwMCwgMHg3ODAwMDAsIDB4ZDgwMDAwLCAweDU4MDAwMCB9LAotCQl7IDB4MzAwMDAwLCAweGIwMDAwMCwgMHgxMDAwMDAsIDB4OTAwMDAwLCAweDM4MDAwMCwgMHhiODAwMDAsIDB4MTgwMDAwLCAweDk4MDAwMCB9LAotCQl7IDB4YzAwMDAwLCAweDQwMDAwMCwgMHhlMDAwMDAsIDB4NjAwMDAwLCAweGM4MDAwMCwgMHg0ODAwMDAsIDB4ZTgwMDAwLCAweDY4MDAwMCB9LAotCQl7IDB4MDAwMDAwLCAweDgwMDAwMCwgMHgyMDAwMDAsIDB4YTAwMDAwLCAweDA4MDAwMCwgMHg4ODAwMDAsIDB4MjgwMDAwLCAweGE4MDAwMCB9Ci0JfTsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBJbWFnZURhdGEgd2l0aCB0aGUgZ2l2ZW4gd2lkdGgsIGhlaWdodCwKLSAqIGRlcHRoIGFuZCBwYWxldHRlLiBUaGUgZGF0YSB3aWxsIGJlIGluaXRpYWxpemVkIHRvIGFuIChhbGwgemVybykKLSAqIGFycmF5IG9mIHRoZSBhcHByb3ByaWF0ZSBzaXplLgotICoKLSAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gZGVwdGggdGhlIGRlcHRoIG9mIHRoZSBpbWFnZQotICogQHBhcmFtIHBhbGV0dGUgdGhlIHBhbGV0dGUgb2YgdGhlIGltYWdlIChtdXN0IG5vdCBiZSBudWxsKQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIHdpZHRoIG9yIGhlaWdodCBpcyBuZWdhdGl2ZSwgb3IgaWYgdGhlIGRlcHRoIGlzIG5vdAotICogICAgICAgIAlvbmUgb2YgMSwgMiwgNCwgOCwgMTYsIDI0IG9yIDMyPC9saT4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHBhbGV0dGUgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgSW1hZ2VEYXRhKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBQYWxldHRlRGF0YSBwYWxldHRlKSB7Ci0JdGhpcyh3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgcGFsZXR0ZSwKLQkJNCwgbnVsbCwgMCwgbnVsbCwKLQkJbnVsbCwgLTEsIC0xLCBTV1QuSU1BR0VfVU5ERUZJTkVELAotCQkwLCAwLCAwLCAwKTsKLX0KLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBJbWFnZURhdGEgd2l0aCB0aGUgZ2l2ZW4gd2lkdGgsIGhlaWdodCwKLSAqIGRlcHRoLCBwYWxldHRlLCBzY2FubGluZVBhZCBhbmQgZGF0YS4KLSAqCi0gKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBpbWFnZQotICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZQotICogQHBhcmFtIGRlcHRoIHRoZSBkZXB0aCBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBwYWxldHRlIHRoZSBwYWxldHRlIG9mIHRoZSBpbWFnZQotICogQHBhcmFtIHNjYW5saW5lUGFkIHRoZSBwYWRkaW5nIG9mIGVhY2ggbGluZSwgaW4gYnl0ZXMKLSAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIG9mIHRoZSBpbWFnZQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIHdpZHRoIG9yIGhlaWdodCBpcyBuZWdhdGl2ZSwgb3IgaWYgdGhlIGRlcHRoIGlzIG5vdAotICogICAgICAgIAlvbmUgb2YgMSwgMiwgNCwgOCwgMTYsIDI0IG9yIDMyPC9saT4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHBhbGV0dGUgb3IgZGF0YSBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9DQU5OT1RfQkVfWkVSTyAtIGlmIHRoZSBzY2FubGluZVBhZCBpcyB6ZXJvPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBJbWFnZURhdGEoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIFBhbGV0dGVEYXRhIHBhbGV0dGUsIGludCBzY2FubGluZVBhZCwgYnl0ZVtdIGRhdGEpIHsKLQl0aGlzKHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBwYWxldHRlLAotCQlzY2FubGluZVBhZCwgY2hlY2tEYXRhKGRhdGEpLCAwLCBudWxsLAotCQludWxsLCAtMSwgLTEsIFNXVC5JTUFHRV9VTkRFRklORUQsCi0JCTAsIDAsIDAsIDApOwotfQotCi0vKioKLSAqIENvbnN0cnVjdHMgYW4gPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPiBsb2FkZWQgZnJvbSBhIGZpbGUgd2l0aCB0aGUKLSAqIHNwZWNpZmllZCBuYW1lLiBUaHJvd3MgYW4gZXJyb3IgaWYgYW4gZXJyb3Igb2NjdXJzIGxvYWRpbmcgdGhlCi0gKiBpbWFnZSwgb3IgaWYgdGhlIGltYWdlIGhhcyBhbiB1bnN1cHBvcnRlZCB0eXBlLgotICogPHA+Ci0gKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZSB3aGVuIGxvYWRpbmcgYSBzaW5nbGUKLSAqIGltYWdlIG9ubHkuIElmIHRoZSBmaWxlIGNvbnRhaW5zIG11bHRpcGxlIGltYWdlcywgb25seSB0aGUgZmlyc3QKLSAqIG9uZSB3aWxsIGJlIGxvYWRlZC4gVG8gbG9hZCBtdWx0aXBsZSBpbWFnZXMsIHVzZSAKLSAqIDxjb2RlPkltYWdlTG9hZGVyLmxvYWQoKTwvY29kZT4uCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIGZpbGVuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGxvYWQgdGhlIGltYWdlIGZyb20gKG11c3Qgbm90IGJlIG51bGwpCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgZmlsZSBuYW1lIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0lNQUdFIC0gaWYgdGhlIGltYWdlIGZpbGUgY29udGFpbnMgaW52YWxpZCBkYXRhPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTyBpZiBhbiBJTyBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBkYXRhPC9saT4KLSAqICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQgLSBpZiB0aGUgaW1hZ2UgZmlsZSBjb250YWlucyBhbiB1bnJlY29nbml6ZWQgZm9ybWF0PC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBJbWFnZURhdGEoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JSW1hZ2VEYXRhW10gZGF0YSA9IG5ldyBJbWFnZUxvYWRlcigpLmxvYWQoZmlsZW5hbWUpOwotCWlmIChkYXRhLmxlbmd0aCA8IDEpIFNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JSW1hZ2VEYXRhIGkgPSBkYXRhWzBdOwotCXNldEFsbEZpZWxkcygKLQkJaS53aWR0aCwKLQkJaS5oZWlnaHQsCi0JCWkuZGVwdGgsCi0JCWkuc2NhbmxpbmVQYWQsCi0JCWkuYnl0ZXNQZXJMaW5lLAotCQlpLmRhdGEsCi0JCWkucGFsZXR0ZSwKLQkJaS50cmFuc3BhcmVudFBpeGVsLAotCQlpLm1hc2tEYXRhLAotCQlpLm1hc2tQYWQsCi0JCWkuYWxwaGFEYXRhLAotCQlpLmFscGhhLAotCQlpLnR5cGUsCi0JCWkueCwKLQkJaS55LAotCQlpLmRpc3Bvc2FsTWV0aG9kLAotCQlpLmRlbGF5VGltZSk7Ci19Ci0KLS8qKgotICogUHJldmVudHMgdW5pbml0aWFsaXplZCBpbnN0YW5jZXMgZnJvbSBiZWluZyBjcmVhdGVkIG91dHNpZGUgdGhlIHBhY2thZ2UuCi0gKi8KLUltYWdlRGF0YSgpIHsKLX0KLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGFuIGltYWdlIGRhdGEgYnkgZ2l2aW5nIHZhbHVlcyBmb3IgYWxsIG5vbi1jb21wdXRhYmxlIGZpZWxkcy4KLSAqIDxwPgotICogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSwgYW5kIGlzIG5vdCBkZXNjcmliZWQgZnVydGhlci4KLSAqIDwvcD4KLSAqLwotSW1hZ2VEYXRhKAotCWludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBQYWxldHRlRGF0YSBwYWxldHRlLAotCWludCBzY2FubGluZVBhZCwgYnl0ZVtdIGRhdGEsIGludCBtYXNrUGFkLCBieXRlW10gbWFza0RhdGEsCi0JYnl0ZVtdIGFscGhhRGF0YSwgaW50IGFscGhhLCBpbnQgdHJhbnNwYXJlbnRQaXhlbCwgaW50IHR5cGUsCi0JaW50IHgsIGludCB5LCBpbnQgZGlzcG9zYWxNZXRob2QsIGludCBkZWxheVRpbWUpCi17Ci0KLQlpZiAocGFsZXR0ZSA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWlmICghKGRlcHRoID09IDEgfHwgZGVwdGggPT0gMiB8fCBkZXB0aCA9PSA0IHx8IGRlcHRoID09IDgKLQkJfHwgZGVwdGggPT0gMTYgfHwgZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JfQotCWlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JfQotCWlmIChzY2FubGluZVBhZCA9PSAwKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTyk7Ci0KLQlpbnQgYnl0ZXNQZXJMaW5lID0gKCgod2lkdGggKiBkZXB0aCArIDcpIC8gOCkgKyAoc2NhbmxpbmVQYWQgLSAxKSkKLQkJLyBzY2FubGluZVBhZCAqIHNjYW5saW5lUGFkOwotCXNldEFsbEZpZWxkcygKLQkJd2lkdGgsCi0JCWhlaWdodCwKLQkJZGVwdGgsCi0JCXNjYW5saW5lUGFkLAotCQlieXRlc1BlckxpbmUsCi0JCWRhdGEgIT0gbnVsbCA/IGRhdGEgOiBuZXcgYnl0ZVtieXRlc1BlckxpbmUgKiBoZWlnaHRdLAotCQlwYWxldHRlLAotCQl0cmFuc3BhcmVudFBpeGVsLAotCQltYXNrRGF0YSwKLQkJbWFza1BhZCwKLQkJYWxwaGFEYXRhLAotCQlhbHBoYSwKLQkJdHlwZSwKLQkJeCwKLQkJeSwKLQkJZGlzcG9zYWxNZXRob2QsCi0JCWRlbGF5VGltZSk7Ci19Ci0KLS8qKgotICogSW5pdGlhbGl6ZXMgYWxsIGZpZWxkcyBpbiB0aGUgcmVjZWl2ZXIuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkCi0gKiBieSBhbGwgcHVibGljIGNvbnN0cnVjdG9ycyB0byBlbnN1cmUgdGhhdCBhbGwgZmllbGRzIGFyZSBpbml0aWFsaXplZAotICogZm9yIGEgbmV3IEltYWdlRGF0YSBvYmplY3QuIElmIGEgbmV3IGZpZWxkIGlzIGFkZGVkIHRvIHRoZSBjbGFzcywKLSAqIHRoZW4gaXQgbXVzdCBiZSBhZGRlZCB0byB0aGlzIG1ldGhvZC4KLSAqIDxwPgotICogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSwgYW5kIGlzIG5vdCBkZXNjcmliZWQgZnVydGhlci4KLSAqIDwvcD4KLSAqLwotdm9pZCBzZXRBbGxGaWVsZHMoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIGludCBzY2FubGluZVBhZCwKLQlpbnQgYnl0ZXNQZXJMaW5lLCBieXRlW10gZGF0YSwgUGFsZXR0ZURhdGEgcGFsZXR0ZSwgaW50IHRyYW5zcGFyZW50UGl4ZWwsCi0JYnl0ZVtdIG1hc2tEYXRhLCBpbnQgbWFza1BhZCwgYnl0ZVtdIGFscGhhRGF0YSwgaW50IGFscGhhLAotCWludCB0eXBlLCBpbnQgeCwgaW50IHksIGludCBkaXNwb3NhbE1ldGhvZCwgaW50IGRlbGF5VGltZSkgewotCi0JdGhpcy53aWR0aCA9IHdpZHRoOwotCXRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwotCXRoaXMuZGVwdGggPSBkZXB0aDsKLQl0aGlzLnNjYW5saW5lUGFkID0gc2NhbmxpbmVQYWQ7Ci0JdGhpcy5ieXRlc1BlckxpbmUgPSBieXRlc1BlckxpbmU7Ci0JdGhpcy5kYXRhID0gZGF0YTsKLQl0aGlzLnBhbGV0dGUgPSBwYWxldHRlOwotCXRoaXMudHJhbnNwYXJlbnRQaXhlbCA9IHRyYW5zcGFyZW50UGl4ZWw7Ci0JdGhpcy5tYXNrRGF0YSA9IG1hc2tEYXRhOwotCXRoaXMubWFza1BhZCA9IG1hc2tQYWQ7Ci0JdGhpcy5hbHBoYURhdGEgPSBhbHBoYURhdGE7Ci0JdGhpcy5hbHBoYSA9IGFscGhhOwotCXRoaXMudHlwZSA9IHR5cGU7Ci0JdGhpcy54ID0geDsKLQl0aGlzLnkgPSB5OwotCXRoaXMuZGlzcG9zYWxNZXRob2QgPSBkaXNwb3NhbE1ldGhvZDsKLQl0aGlzLmRlbGF5VGltZSA9IGRlbGF5VGltZTsKLX0KLQotLyoqCSAKLSAqIEludm9rZXMgaW50ZXJuYWwgU1dUIGZ1bmN0aW9uYWxpdHkgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mCi0gKiB0aGlzIGNsYXNzLgotICogPHA+Ci0gKiA8Yj5JTVBPUlRBTlQ6PC9iPiBUaGlzIG1ldGhvZCBpcyA8ZW0+bm90PC9lbT4gcGFydCBvZiB0aGUgcHVibGljCi0gKiBBUEkgZm9yIDxjb2RlPkltYWdlRGF0YTwvY29kZT4uIEl0IGlzIG1hcmtlZCBwdWJsaWMgb25seSBzbyB0aGF0IGl0Ci0gKiBjYW4gYmUgc2hhcmVkIHdpdGhpbiB0aGUgcGFja2FnZXMgcHJvdmlkZWQgYnkgU1dULiBJdCBpcyBzdWJqZWN0Ci0gKiB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UsIGFuZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZyb20KLSAqIGFwcGxpY2F0aW9uIGNvZGUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2UsIGFuZCBpcyBub3QgZGVzY3JpYmVkIGZ1cnRoZXIuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBzdGF0aWMgSW1hZ2VEYXRhIGludGVybmFsX25ldygKLQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgUGFsZXR0ZURhdGEgcGFsZXR0ZSwKLQlpbnQgc2NhbmxpbmVQYWQsIGJ5dGVbXSBkYXRhLCBpbnQgbWFza1BhZCwgYnl0ZVtdIG1hc2tEYXRhLAotCWJ5dGVbXSBhbHBoYURhdGEsIGludCBhbHBoYSwgaW50IHRyYW5zcGFyZW50UGl4ZWwsIGludCB0eXBlLAotCWludCB4LCBpbnQgeSwgaW50IGRpc3Bvc2FsTWV0aG9kLCBpbnQgZGVsYXlUaW1lKQotewotCXJldHVybiBuZXcgSW1hZ2VEYXRhKAotCQl3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgcGFsZXR0ZSwgc2NhbmxpbmVQYWQsIGRhdGEsIG1hc2tQYWQsIG1hc2tEYXRhLAotCQlhbHBoYURhdGEsIGFscGhhLCB0cmFuc3BhcmVudFBpeGVsLCB0eXBlLCB4LCB5LCBkaXNwb3NhbE1ldGhvZCwgZGVsYXlUaW1lKTsKLX0KLQotSW1hZ2VEYXRhIGNvbG9yTWFza0ltYWdlKGludCBwaXhlbCkgewotCUltYWdlRGF0YSBtYXNrID0gbmV3IEltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0LCAxLCBid1BhbGV0dGUoKSwKLQkJMiwgbnVsbCwgMCwgbnVsbCwgbnVsbCwgLTEsIC0xLCBTV1QuSU1BR0VfVU5ERUZJTkVELAotCQkwLCAwLCAwLCAwKTsKLQlpbnRbXSByb3cgPSBuZXcgaW50W3dpZHRoXTsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0JCWdldFBpeGVscygwLCB5LCB3aWR0aCwgcm93LCAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7Ci0JCQlpZiAocGl4ZWwgIT0gLTEgJiYgcm93W2ldID09IHBpeGVsKSB7Ci0JCQkJcm93W2ldID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcm93W2ldID0gMTsKLQkJCX0KLQkJfQotCQltYXNrLnNldFBpeGVscygwLCB5LCB3aWR0aCwgcm93LCAwKTsKLQl9Ci0JcmV0dXJuIG1hc2s7Ci19Ci0KLXN0YXRpYyBieXRlW10gY2hlY2tEYXRhKGJ5dGUgW10gZGF0YSkgewotCWlmIChkYXRhID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLS8qKgotICogUmV0dXJucyA8Y29kZT5nZXRXaWR0aDwvY29kZT4gcGl4ZWwgdmFsdWVzIHN0YXJ0aW5nIGF0IG9mZnNldAotICogPGNvZGU+eDwvY29kZT4gaW4gc2NhbmxpbmUgPGNvZGU+eTwvY29kZT4gaW4gdGhlIHJlY2VpdmVyJ3MKLSAqIGRhdGEgc3RhcnRpbmcgYXQgPGNvZGU+c3RhcnRJbmRleDwvY29kZT4uCi0gKgotICogQHBhcmFtIHggdGhlIHggcG9zaXRpb24gb2YgdGhlIGZpcnN0IHBpeGVsIHRvIGdldAotICogQHBhcmFtIHkgdGhlIHkgcG9zaXRpb24gb2YgdGhlIGZpcnN0IHBpeGVsIHRvIGdldAotICogQHBhcmFtIGdldFdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgZGF0YSB0byBnZXQKLSAqIEBwYXJhbSBwaXhlbHMgdGhlIGJ1ZmZlciBpbiB3aGljaCB0byBwdXQgdGhlIHBpeGVscwotICogQHBhcmFtIHN0YXJ0SW5kZXggdGhlIG9mZnNldCBpbnRvIHRoZSBieXRlIGFycmF5IHRvIGJlZ2luIHN0b3JpbmcgcGl4ZWxzCi0gKgotICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGdldFdpZHRoIGlzIHRvbyBsYXJnZQotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiBwaXhlbHMgaXMgbnVsbDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHggb3IgeSBpcyBvdXQgb2YgYm91bmRzPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgZ2V0V2lkdGggaXMgbmVnYXRpdmU8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCAtIGlmIHRoZSBkZXB0aCBpcyBub3Qgb25lIG9mIDEsIDIsIDQgb3IgOAotICogICAgICAgIChGb3IgaGlnaGVyIGRlcHRocywgdXNlIHRoZSBpbnRbXSB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kLik8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgZ2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IGdldFdpZHRoLCBieXRlW10gcGl4ZWxzLCBpbnQgc3RhcnRJbmRleCkgewotCWlmIChwaXhlbHMgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlpZiAoZ2V0V2lkdGggPCAwIHx8IHggPj0gd2lkdGggfHwgeSA+PSBoZWlnaHQgfHwgeCA8IDAgfHwgeSA8IDApIFNXVC5lcnJvcgotCi0oU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCWlmIChnZXRXaWR0aCA9PSAwKSByZXR1cm47Ci0JaW50IGluZGV4OwotCWludCB0aGVCeXRlOwotCWludCBtYXNrID0gMDsKLQlpbnQgbiA9IGdldFdpZHRoOwotCWludCBpID0gc3RhcnRJbmRleDsKLQlpbnQgc3JjWCA9IHgsIHNyY1kgPSB5OwotCWlmIChkZXB0aCA9PSAxKSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMyk7Ci0JCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJbWFzayA9IDEgPDwgKDcgLSAoc3JjWCAmIDB4NykpOwotCQkJaWYgKCh0aGVCeXRlICYgbWFzaykgPT0gMCkgewotCQkJCXBpeGVsc1tpXSA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXBpeGVsc1tpXSA9IDE7Ci0JCQl9Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJaWYgKG4gPiAwKSB0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobWFzayA9PSAxKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJCWlmIChuID4gMCkgdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gMikgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDIpOwotCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQlpbnQgb2Zmc2V0OwotCQl3aGlsZSAobiA+IDApIHsKLQkJCW9mZnNldCA9IDMgLSAoc3JjWCAlIDQpOwotCQkJbWFzayA9IDMgPDwgKG9mZnNldCAqIDIpOwotCQkJcGl4ZWxzW2ldID0gKGJ5dGUpKCh0aGVCeXRlICYgbWFzaykgPj4gKG9mZnNldCAqIDIpKTsKLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlpZiAobiA+IDApIHRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvZmZzZXQgPT0gMCkgewotCQkJCQlpbmRleCsrOwotCQkJCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSA0KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMSk7Ci0JCWlmICgoeCAmIDB4MSkgPT0gMSkgewotCQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCXBpeGVsc1tpXSA9IChieXRlKSh0aGVCeXRlICYgMHgwRik7Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKG4gPiAxKSB7Ci0JCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJcGl4ZWxzW2ldID0gKGJ5dGUpKHRoZUJ5dGUgPj4gNCk7Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXBpeGVsc1tpXSA9IChieXRlKSh0aGVCeXRlICYgMHgwRik7Ci0JCQkJaSsrOwotCQkJCW4tLTsKLQkJCQlzcmNYKys7Ci0JCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQkJc3JjWSsrOwotCQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJCXNyY1ggPSAwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChuID4gMCkgewotCQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCXBpeGVsc1tpXSA9IChieXRlKSh0aGVCeXRlID4+IDQpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDgpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyB4OwotCQlmb3IgKGludCBqID0gMDsgaiA8IGdldFdpZHRoOyBqKyspIHsKLQkJCXBpeGVsc1tpXSA9IGRhdGFbaW5kZXhdOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JU1dULmVycm9yKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyA8Y29kZT5nZXRXaWR0aDwvY29kZT4gcGl4ZWwgdmFsdWVzIHN0YXJ0aW5nIGF0IG9mZnNldAotICogPGNvZGU+eDwvY29kZT4gaW4gc2NhbmxpbmUgPGNvZGU+eTwvY29kZT4gaW4gdGhlIHJlY2VpdmVyJ3MKLSAqIGRhdGEgc3RhcnRpbmcgYXQgPGNvZGU+c3RhcnRJbmRleDwvY29kZT4uCi0gKgotICogQHBhcmFtIHggdGhlIHggcG9zaXRpb24gb2YgdGhlIGZpcnN0IHBpeGVsIHRvIGdldAotICogQHBhcmFtIHkgdGhlIHkgcG9zaXRpb24gb2YgdGhlIGZpcnN0IHBpeGVsIHRvIGdldAotICogQHBhcmFtIGdldFdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgZGF0YSB0byBnZXQKLSAqIEBwYXJhbSBwaXhlbHMgdGhlIGJ1ZmZlciBpbiB3aGljaCB0byBwdXQgdGhlIHBpeGVscwotICogQHBhcmFtIHN0YXJ0SW5kZXggdGhlIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgdG8gYmVnaW4gc3RvcmluZyBwaXhlbHMKLSAqCi0gKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgZ2V0V2lkdGggaXMgdG9vIGxhcmdlCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHBpeGVscyBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgeCBvciB5IGlzIG91dCBvZiBib3VuZHM8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBnZXRXaWR0aCBpcyBuZWdhdGl2ZTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIIC0gaWYgdGhlIGRlcHRoIGlzIG5vdCBvbmUgb2YgMSwgMiwgNCwgOCwgMTYsIDI0IG9yIDMyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIGdldFBpeGVscyhpbnQgeCwgaW50IHksIGludCBnZXRXaWR0aCwgaW50W10gcGl4ZWxzLCBpbnQgc3RhcnRJbmRleCkgewotCWlmIChwaXhlbHMgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlpZiAoZ2V0V2lkdGggPCAwIHx8IHggPj0gd2lkdGggfHwgeSA+PSBoZWlnaHQgfHwgeCA8IDAgfHwgeSA8IDApIFNXVC5lcnJvcgotCi0oU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCWlmIChnZXRXaWR0aCA9PSAwKSByZXR1cm47Ci0JaW50IGluZGV4OwotCWludCB0aGVCeXRlOwotCWludCBtYXNrOwotCWludCBuID0gZ2V0V2lkdGg7Ci0JaW50IGkgPSBzdGFydEluZGV4OwotCWludCBzcmNYID0geCwgc3JjWSA9IHk7Ci0JaWYgKGRlcHRoID09IDEpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAzKTsKLQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQltYXNrID0gMSA8PCAoNyAtIChzcmNYICYgMHg3KSk7Ci0JCQlpZiAoKHRoZUJ5dGUgJiBtYXNrKSA9PSAwKSB7Ci0JCQkJcGl4ZWxzW2ldID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGl4ZWxzW2ldID0gMTsKLQkJCX0KLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlpZiAobiA+IDApIHRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChtYXNrID09IDEpIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQkJaWYgKG4gPiAwKSB0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQkJCi0JaWYgKGRlcHRoID09IDIpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAyKTsKLQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJaW50IG9mZnNldDsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQlvZmZzZXQgPSAzIC0gKHNyY1ggJSA0KTsKLQkJCW1hc2sgPSAzIDw8IChvZmZzZXQgKiAyKTsKLQkJCXBpeGVsc1tpXSA9IChieXRlKSgodGhlQnl0ZSAmIG1hc2spID4+IChvZmZzZXQgKiAyKSk7Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJaWYgKG4gPiAwKSB0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAob2Zmc2V0ID09IDApIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gNCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDEpOwotCQlpZiAoKHggJiAweDEpID09IDEpIHsKLQkJCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQlwaXhlbHNbaV0gPSB0aGVCeXRlICYgMHgwRjsKLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCQl3aGlsZSAobiA+IDEpIHsKLQkJCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQlwaXhlbHNbaV0gPSB0aGVCeXRlID4+IDQ7Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXBpeGVsc1tpXSA9IHRoZUJ5dGUgJiAweDBGOwotCQkJCWkrKzsKLQkJCQluLS07Ci0JCQkJc3JjWCsrOwotCQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJCXNyY1krKzsKLQkJCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCQlzcmNYID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobiA+IDApIHsKLQkJCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQlwaXhlbHNbaV0gPSB0aGVCeXRlID4+IDQ7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gOCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArIHg7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZ2V0V2lkdGg7IGorKykgewotCQkJcGl4ZWxzW2ldID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDE2KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggKiAyKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBnZXRXaWR0aDsgaisrKSB7Ci0JCQlwaXhlbHNbaV0gPSAoKGRhdGFbaW5kZXgrMV0gJiAweEZGKSA8PCA4KSArIChkYXRhW2luZGV4XSAmIDB4RkYpOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCArPSAyOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDI0KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggKiAzKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBnZXRXaWR0aDsgaisrKSB7Ci0JCQlwaXhlbHNbaV0gPSAoKGRhdGFbaW5kZXhdICYgMHhGRikgPDwgMTYpIHwgKChkYXRhW2luZGV4KzFdICYgMHhGRikgPDwgOCkKLQkJCQl8IChkYXRhW2luZGV4KzJdICYgMHhGRik7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ICs9IDM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gMzIpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCAqIDQpOwotCQlpID0gc3RhcnRJbmRleDsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBnZXRXaWR0aDsgaisrKSB7Ci0JCQlwaXhlbHNbaV0gPSAoKGRhdGFbaW5kZXhdICYgMHhGRikgPDwgMjQpIHwgKChkYXRhW2luZGV4KzFdICYgMHhGRikgPDwgMTYpCi0JCQkJfCAoKGRhdGFbaW5kZXgrMl0gJiAweEZGKSA8PCA4KSB8IChkYXRhW2luZGV4KzNdICYgMHhGRik7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ICs9IDQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlTV1QuZXJyb3IoU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGFuIGFycmF5IG9mIDxjb2RlPlJHQjwvY29kZT5zIHdoaWNoIGNvbXByaXNlIHRoZQotICogaW5kZXhlZCBjb2xvciB0YWJsZSBvZiB0aGUgcmVjZWl2ZXIsIG9yIG51bGwgaWYgdGhlIHJlY2VpdmVyCi0gKiBoYXMgYSBkaXJlY3QgY29sb3IgbW9kZWwuCi0gKgotICogQHJldHVybiB0aGUgUkdCIHZhbHVlcyBmb3IgdGhlIGltYWdlIG9yIG51bGwgaWYgZGlyZWN0IGNvbG9yCi0gKgotICogQHNlZSBQYWxldHRlRGF0YSNnZXRSR0JzKCkKLSAqLwotcHVibGljIFJHQltdIGdldFJHQnMoKSB7Ci0JcmV0dXJuIHBhbGV0dGUuZ2V0UkdCcygpOwotfQotCi0vKioKLSAqIFJldHVybnMgYW4gPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPiB3aGljaCBzcGVjaWZpZXMgdGhlCi0gKiB0cmFuc3BhcmVuY3kgbWFzayBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlY2VpdmVyLCBvciBudWxsIGlmIHRoZQotICogcmVjZWl2ZXIgaGFzIG5vIHRyYW5zcGFyZW5jeSBhbmQgaXMgbm90IGFuIGljb24uCi0gKgotICogQHJldHVybiB0aGUgdHJhbnNwYXJlbmN5IG1hc2sgb3IgbnVsbCBpZiBub25lIGV4aXN0cwotICovCi1wdWJsaWMgSW1hZ2VEYXRhIGdldFRyYW5zcGFyZW5jeU1hc2soKSB7Ci0JaWYgKGdldFRyYW5zcGFyZW5jeVR5cGUoKSA9PSBTV1QuVFJBTlNQQVJFTkNZX01BU0spIHsKLQkJcmV0dXJuIG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodCwgMSwgYndQYWxldHRlKCksIG1hc2tQYWQsIG1hc2tEYXRhKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gY29sb3JNYXNrSW1hZ2UodHJhbnNwYXJlbnRQaXhlbCk7Ci0JfQotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIGltYWdlIHRyYW5zcGFyZW5jeSB0eXBlLgotICoKLSAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgdHJhbnNwYXJlbmN5IHR5cGUKLSAqLwotcHVibGljIGludCBnZXRUcmFuc3BhcmVuY3lUeXBlKCkgewotCWlmIChtYXNrRGF0YSAhPSBudWxsKSByZXR1cm4gU1dULlRSQU5TUEFSRU5DWV9NQVNLOwotCWlmICh0cmFuc3BhcmVudFBpeGVsICE9IC0xKSByZXR1cm4gU1dULlRSQU5TUEFSRU5DWV9QSVhFTDsKLQlpZiAoYWxwaGFEYXRhICE9IG51bGwpIHJldHVybiBTV1QuVFJBTlNQQVJFTkNZX0FMUEhBOwotCXJldHVybiBTV1QuVFJBTlNQQVJFTkNZX05PTkU7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgcmVjZWl2ZXIuCi0gKiAKLSAqIEByZXR1cm4gTVNCX0ZJUlNUIG9yIExTQl9GSVJTVAotICovCi1pbnQgZ2V0Qnl0ZU9yZGVyKCkgewotCXJldHVybiBkZXB0aCAhPSAxNiA/IE1TQl9GSVJTVCA6IExTQl9GSVJTVDsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBwaXhlbCB2YWx1ZXMgc3RhcnRpbmcgYXQgb2Zmc2V0IDxjb2RlPng8L2NvZGU+IGluCi0gKiBzY2FubGluZSA8Y29kZT55PC9jb2RlPiBpbiB0aGUgcmVjZWl2ZXIncyBkYXRhIHRvIHRoZQotICogdmFsdWVzIGZyb20gdGhlIGFycmF5IDxjb2RlPnBpeGVsczwvY29kZT4gc3RhcnRpbmcgYXQKLSAqIDxjb2RlPnN0YXJ0SW5kZXg8L2NvZGU+LgotICoKLSAqIEBwYXJhbSB4IHRoZSB4IHBvc2l0aW9uIG9mIHRoZSBwaXhlbCB0byBzZXQKLSAqIEBwYXJhbSB5IHRoZSB5IHBvc2l0aW9uIG9mIHRoZSBwaXhlbCB0byBzZXQKLSAqIEBwYXJhbSBwdXRXaWR0aCB0aGUgd2lkdGggb2YgdGhlIHBpeGVscyB0byBzZXQKLSAqIEBwYXJhbSBwaXhlbHMgdGhlIHBpeGVscyB0byBzZXQKLSAqIEBwYXJhbSBzdGFydEluZGV4IHRoZSBpbmRleCBhdCB3aGljaCB0byBiZWdpbiBzZXR0aW5nCi0gKgotICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHB1dFdpZHRoIGlzIHRvbyBsYXJnZQotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiBwaXhlbHMgaXMgbnVsbDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHggb3IgeSBpcyBvdXQgb2YgYm91bmRzPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgcHV0V2lkdGggaXMgbmVnYXRpdmU8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCBpZiB0aGUgZGVwdGggaXMgbm90IG9uZSBvZiAxLCAyLCA0LCA4Ci0gKiAgICAgICAgKEZvciBoaWdoZXIgZGVwdGhzLCB1c2UgdGhlIGludFtdIHZlcnNpb24gb2YgdGhpcyBtZXRob2QuKTwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgcHV0V2lkdGgsIGJ5dGVbXSBwaXhlbHMsIGludCBzdGFydEluZGV4KSB7Ci0JaWYgKHBpeGVscyA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWlmIChwdXRXaWR0aCA8IDAgfHwgeCA+PSB3aWR0aCB8fCB5ID49IGhlaWdodCB8fCB4IDwgMCB8fCB5IDwgMCkgU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQlpZiAocHV0V2lkdGggPT0gMCkgcmV0dXJuOwotCWludCBpbmRleDsKLQlpbnQgdGhlQnl0ZTsKLQlpbnQgbWFzazsKLQlpbnQgbiA9IHB1dFdpZHRoOwotCWludCBpID0gc3RhcnRJbmRleDsKLQlpbnQgc3JjWCA9IHgsIHNyY1kgPSB5OwotCWlmIChkZXB0aCA9PSAxKSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMyk7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJbWFzayA9IDEgPDwgKDcgLSAoc3JjWCAmIDB4NykpOwotCQkJaWYgKChwaXhlbHNbaV0gJiAweDEpID09IDEpIHsKLQkJCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiAweEZGKSB8IG1hc2spOwotCQkJfSBlbHNlIHsKLQkJCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiAweEZGKSAmIChtYXNrIF4gLTEpKTsKLQkJCX0KLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG1hc2sgPT0gMSkgewotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSAyKSB7Ci0JCWJ5dGUgW10gbWFza3MgPSB7IChieXRlKTB4RkMsIChieXRlKTB4RjMsIChieXRlKTB4Q0YsIChieXRlKTB4M0YgfTsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAyKTsKLQkJaW50IG9mZnNldCA9IDMgLSAoeCAlIDQpOwotCQl3aGlsZSAobiA+IDApIHsKLQkJCXRoZUJ5dGUgPSBwaXhlbHNbaV0gJiAweDM7Ci0JCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiBtYXNrc1tvZmZzZXRdKSB8ICh0aGVCeXRlIDw8IChvZmZzZXQgKiAyKSkpOwotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCW9mZnNldCA9IDA7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvZmZzZXQgPT0gMCkgewotCQkJCQlpbmRleCsrOwotCQkJCQlvZmZzZXQgPSAzOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9mZnNldC0tOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSA0KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMSk7Ci0JCWJvb2xlYW4gaGlnaCA9ICh4ICYgMHgxKSA9PSAwOwotCQl3aGlsZSAobiA+IDApIHsKLQkJCXRoZUJ5dGUgPSBwaXhlbHNbaV0gJiAweDBGOwotCQkJaWYgKGhpZ2gpIHsKLQkJCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiAweDBGKSB8ICh0aGVCeXRlIDw8IDQpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgMHhGMCkgfCB0aGVCeXRlKTsKLQkJCX0KLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQloaWdoID0gdHJ1ZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFoaWdoKSBpbmRleCsrOwotCQkJCWhpZ2ggPSAhaGlnaDsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSA4KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgeDsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwdXRXaWR0aDsgaisrKSB7Ci0JCQlkYXRhW2luZGV4XSA9IChieXRlKShwaXhlbHNbaV0gJiAweEZGKTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCVNXVC5lcnJvcihTV1QuRVJST1JfVU5TVVBQT1JURURfREVQVEgpOwotfQotCi0vKioKLSAqIFNldHMgdGhlIHBpeGVsIHZhbHVlcyBzdGFydGluZyBhdCBvZmZzZXQgPGNvZGU+eDwvY29kZT4gaW4KLSAqIHNjYW5saW5lIDxjb2RlPnk8L2NvZGU+IGluIHRoZSByZWNlaXZlcidzIGRhdGEgdG8gdGhlCi0gKiB2YWx1ZXMgZnJvbSB0aGUgYXJyYXkgPGNvZGU+cGl4ZWxzPC9jb2RlPiBzdGFydGluZyBhdAotICogPGNvZGU+c3RhcnRJbmRleDwvY29kZT4uCi0gKgotICogQHBhcmFtIHggdGhlIHggcG9zaXRpb24gb2YgdGhlIHBpeGVsIHRvIHNldAotICogQHBhcmFtIHkgdGhlIHkgcG9zaXRpb24gb2YgdGhlIHBpeGVsIHRvIHNldAotICogQHBhcmFtIHB1dFdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcGl4ZWxzIHRvIHNldAotICogQHBhcmFtIHBpeGVscyB0aGUgcGl4ZWxzIHRvIHNldAotICogQHBhcmFtIHN0YXJ0SW5kZXggdGhlIGluZGV4IGF0IHdoaWNoIHRvIGJlZ2luIHNldHRpbmcKLSAqCi0gKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgcHV0V2lkdGggaXMgdG9vIGxhcmdlCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHBpeGVscyBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgeCBvciB5IGlzIG91dCBvZiBib3VuZHM8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBwdXRXaWR0aCBpcyBuZWdhdGl2ZTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIIGlmIHRoZSBkZXB0aCBpcyBub3Qgb25lIG9mIDEsIDIsIDQsIDgsIDE2LCAyNCBvciAzMjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgcHV0V2lkdGgsIGludFtdIHBpeGVscywgaW50IHN0YXJ0SW5kZXgpIHsKLQlpZiAocGl4ZWxzID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JaWYgKHB1dFdpZHRoIDwgMCB8fCB4ID49IHdpZHRoIHx8IHkgPj0gaGVpZ2h0IHx8IHggPCAwIHx8IHkgPCAwKSBTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCWlmIChwdXRXaWR0aCA9PSAwKSByZXR1cm47Ci0JaW50IGluZGV4OwotCWludCB0aGVCeXRlOwotCWludCBtYXNrOwotCWludCBuID0gcHV0V2lkdGg7Ci0JaW50IGkgPSBzdGFydEluZGV4OwotCWludCBwaXhlbDsKLQlpbnQgc3JjWCA9IHgsIHNyY1kgPSB5OwotCWlmIChkZXB0aCA9PSAxKSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMyk7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJbWFzayA9IDEgPDwgKDcgLSAoc3JjWCAmIDB4NykpOwotCQkJaWYgKChwaXhlbHNbaV0gJiAweDEpID09IDEpIHsKLQkJCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiAweEZGKSB8IG1hc2spOwotCQkJfSBlbHNlIHsKLQkJCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiAweEZGKSAmIChtYXNrIF4gLTEpKTsKLQkJCX0KLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG1hc2sgPT0gMSkgewotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSAyKSB7Ci0JCWJ5dGUgW10gbWFza3MgPSB7IChieXRlKTB4RkMsIChieXRlKTB4RjMsIChieXRlKTB4Q0YsIChieXRlKTB4M0YgfTsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAyKTsKLQkJaW50IG9mZnNldCA9IDMgLSAoeCAlIDQpOwotCQl3aGlsZSAobiA+IDApIHsKLQkJCXRoZUJ5dGUgPSBwaXhlbHNbaV0gJiAweDM7Ci0JCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiBtYXNrc1tvZmZzZXRdKSB8ICh0aGVCeXRlIDw8IChvZmZzZXQgKiAyKSkpOwotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCW9mZnNldCA9IDM7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvZmZzZXQgPT0gMCkgewotCQkJCQlpbmRleCsrOwotCQkJCQlvZmZzZXQgPSAzOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9mZnNldC0tOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSA0KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMSk7Ci0JCWJvb2xlYW4gaGlnaCA9ICh4ICYgMHgxKSA9PSAwOwotCQl3aGlsZSAobiA+IDApIHsKLQkJCXRoZUJ5dGUgPSBwaXhlbHNbaV0gJiAweDBGOwotCQkJaWYgKGhpZ2gpIHsKLQkJCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiAweDBGKSB8ICh0aGVCeXRlIDw8IDQpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgMHhGMCkgfCB0aGVCeXRlKTsKLQkJCX0KLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQloaWdoID0gdHJ1ZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFoaWdoKSBpbmRleCsrOwotCQkJCWhpZ2ggPSAhaGlnaDsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSA4KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgeDsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwdXRXaWR0aDsgaisrKSB7Ci0JCQlkYXRhW2luZGV4XSA9IChieXRlKShwaXhlbHNbaV0gJiAweEZGKTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0KLQl9Ci0JaWYgKGRlcHRoID09IDE2KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggKiAyKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwdXRXaWR0aDsgaisrKSB7Ci0JCQlwaXhlbCA9IHBpeGVsc1tpXTsKLQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKHBpeGVsICYgMHhGRik7Ci0JCQlkYXRhW2luZGV4ICsgMV0gPSAoYnl0ZSkoKHBpeGVsID4+IDgpICYgMHhGRik7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ICs9IDI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gMjQpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCAqIDMpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHB1dFdpZHRoOyBqKyspIHsKLQkJCXBpeGVsID0gcGl4ZWxzW2ldOwotCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKHBpeGVsID4+IDE2KSAmIDB4RkYpOwotCQkJZGF0YVtpbmRleCArIDFdID0gKGJ5dGUpKChwaXhlbCA+PiA4KSAmIDB4RkYpOwotCQkJZGF0YVtpbmRleCArIDJdID0gKGJ5dGUpKHBpeGVsICYgMHhGRik7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ICs9IDM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gMzIpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCAqIDQpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHB1dFdpZHRoOyBqKyspIHsKLQkJCXBpeGVsID0gcGl4ZWxzW2ldOwotCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKHBpeGVsID4+IDI0KSAmIDB4RkYpOwotCQkJZGF0YVtpbmRleCArIDFdID0gKGJ5dGUpKChwaXhlbCA+PiAxNikgJiAweEZGKTsKLQkJCWRhdGFbaW5kZXggKyAyXSA9IChieXRlKSgocGl4ZWwgPj4gOCkgJiAweEZGKTsKLQkJCWRhdGFbaW5kZXggKyAzXSA9IChieXRlKShwaXhlbCAmIDB4RkYpOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCArPSA0OwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JU1dULmVycm9yKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIHBhbGV0dGUgd2l0aCAyIGNvbG9yczogYmxhY2sgJiB3aGl0ZS4KLSAqLwotc3RhdGljIFBhbGV0dGVEYXRhIGJ3UGFsZXR0ZSgpIHsKLQlyZXR1cm4gbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pOwotfQotCi0vKioKLSAqIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgZm9yCi0gKiB0aGUgZ2l2ZW4gbWFzay4KLSAqLwotc3RhdGljIGludCBnZXRNU0JPZmZzZXQoaW50IG1hc2spIHsKLQlmb3IgKGludCBpID0gMzE7IGkgPj0gMDsgaS0tKSB7Ci0JCWlmICgoKG1hc2sgPj4gaSkgJiAweDEpICE9IDApIHJldHVybiBpICsgMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogRmluZHMgdGhlIGNsb3Nlc3QgbWF0Y2guCi0gKi8KLXN0YXRpYyBpbnQgY2xvc2VzdE1hdGNoKGludCBkZXB0aCwgYnl0ZSByZWQsIGJ5dGUgZ3JlZW4sIGJ5dGUgYmx1ZSwgaW50IHJlZE1hc2ssIGludCBncmVlbk1hc2ssIGludCBibHVlTWFzaywgYnl0ZVtdIHJlZHMsIGJ5dGVbXSBncmVlbnMsIGJ5dGVbXSBibHVlcykgewotCWlmIChkZXB0aCA+IDgpIHsKLQkJaW50IHJzaGlmdCA9IDMyIC0gZ2V0TVNCT2Zmc2V0KHJlZE1hc2spOwotCQlpbnQgZ3NoaWZ0ID0gMzIgLSBnZXRNU0JPZmZzZXQoZ3JlZW5NYXNrKTsKLQkJaW50IGJzaGlmdCA9IDMyIC0gZ2V0TVNCT2Zmc2V0KGJsdWVNYXNrKTsKLQkJcmV0dXJuICgoKHJlZCA8PCAyNCkgPj4+IHJzaGlmdCkgJiByZWRNYXNrKSB8Ci0JCQkoKChncmVlbiA8PCAyNCkgPj4+IGdzaGlmdCkgJiBncmVlbk1hc2spIHwKLQkJCSgoKGJsdWUgPDwgMjQpID4+PiBic2hpZnQpICYgYmx1ZU1hc2spOwotCX0KLQlpbnQgciwgZywgYjsKLQlpbnQgbWluRGlzdGFuY2UgPSAweDdmZmZmZmZmOwotCWludCBuZWFyZXN0UGl4ZWwgPSAwOwotCWludCBuID0gcmVkcy5sZW5ndGg7Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLQkJciA9IChyZWRzW2pdICYgMHhGRikgLSAocmVkICYgMHhGRik7Ci0JCWcgPSAoZ3JlZW5zW2pdICYgMHhGRikgLSAoZ3JlZW4gJiAweEZGKTsKLQkJYiA9IChibHVlc1tqXSAmIDB4RkYpIC0gKGJsdWUgJiAweEZGKTsKLQkJaW50IGRpc3RhbmNlID0gcipyICsgZypnICsgYipiOwotCQlpZiAoZGlzdGFuY2UgPCBtaW5EaXN0YW5jZSkgewotCQkJbmVhcmVzdFBpeGVsID0gajsKLQkJCWlmIChkaXN0YW5jZSA9PSAwKSBicmVhazsKLQkJCW1pbkRpc3RhbmNlID0gZGlzdGFuY2U7Ci0JCX0KLQl9Ci0JcmV0dXJuIG5lYXJlc3RQaXhlbDsKLX0KLQotc3RhdGljIGZpbmFsIEltYWdlRGF0YSBjb252ZXJ0TWFzayhJbWFnZURhdGEgbWFzaykgewotCWlmIChtYXNrLmRlcHRoID09IDEpIHJldHVybiBtYXNrOwotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwyNTUsMjU1KX0pOwotCUltYWdlRGF0YSBuZXdNYXNrID0gbmV3IEltYWdlRGF0YShtYXNrLndpZHRoLCBtYXNrLmhlaWdodCwgMSwgcGFsZXR0ZSk7Ci0JLyogRmluZCBpbmRleCBvZiBibGFjayBpbiBtYXNrIHBhbGV0dGUgKi8KLQlpbnQgYmxhY2tJbmRleCA9IDA7Ci0JUkdCW10gcmdicyA9IG1hc2suZ2V0UkdCcygpOwotCWlmIChyZ2JzICE9IG51bGwpIHsKLQkJd2hpbGUgKGJsYWNrSW5kZXggPCByZ2JzLmxlbmd0aCkgewotCQkJaWYgKHJnYnNbYmxhY2tJbmRleF0uZXF1YWxzKHBhbGV0dGUuY29sb3JzWzBdKSkgYnJlYWs7Ci0JCQlibGFja0luZGV4Kys7Ci0JCX0KLQl9Ci0JaW50W10gcGl4ZWxzID0gbmV3IGludFttYXNrLndpZHRoXTsKLQlmb3IgKGludCB5ID0gMDsgeSA8IG1hc2suaGVpZ2h0OyB5KyspIHsKLQkJbWFzay5nZXRQaXhlbHMoMCwgeSwgbWFzay53aWR0aCwgcGl4ZWxzLCAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwaXhlbHNbaV0gPT0gYmxhY2tJbmRleCkgewotCQkJCXBpeGVsc1tpXSA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXBpeGVsc1tpXSA9IDE7Ci0JCQl9Ci0JCX0KLQkJbmV3TWFzay5zZXRQaXhlbHMoMCwgeSwgbWFzay53aWR0aCwgcGl4ZWxzLCAwKTsKLQl9Ci0JcmV0dXJuIG5ld01hc2s7Ci19Ci0KLXN0YXRpYyBmaW5hbCBieXRlW10gY29udmVydFBhZChieXRlW10gZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIGludCBwYWQsIGludCBuZXdQYWQpIHsKLQlpZiAocGFkID09IG5ld1BhZCkgcmV0dXJuIGRhdGE7Ci0JaW50IHN0cmlkZSA9ICh3aWR0aCAqIGRlcHRoICsgNykgLyA4OwotCWludCBicGwgPSAoc3RyaWRlICsgKHBhZCAtIDEpKSAvIHBhZCAqIHBhZDsJCi0JaW50IG5ld0JwbCA9IChzdHJpZGUgKyAobmV3UGFkIC0gMSkpIC8gbmV3UGFkICogbmV3UGFkOwotCWJ5dGVbXSBuZXdEYXRhID0gbmV3IGJ5dGVbaGVpZ2h0ICogbmV3QnBsXTsKLQlpbnQgc3JjSW5kZXggPSAwLCBkZXN0SW5kZXggPSAwOwotCWZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCBzcmNJbmRleCwgbmV3RGF0YSwgZGVzdEluZGV4LCBzdHJpZGUpOwotCQlzcmNJbmRleCArPSBicGw7Ci0JCWRlc3RJbmRleCArPSBuZXdCcGw7Ci0JfQotCXJldHVybiBuZXdEYXRhOwotfQotCi0vKioKLSAqIEJsaXQgb3BlcmF0aW9uIGJpdHMgdG8gYmUgT1InZWQgdG9nZXRoZXIgdG8gc3BlY2lmeSB0aGUgZGVzaXJlZCBvcGVyYXRpb24uCi0gKi8KLXN0YXRpYyBmaW5hbCBpbnQKLQlCTElUX1NSQyA9IDEsICAgICAvLyBjb3B5IHNvdXJjZSBkaXJlY3RseSwgZWxzZSBhcHBsaWVzIGxvZ2ljIG9wZXJhdGlvbnMKLQlCTElUX0FMUEhBID0gMiwgICAvLyBlbmFibGUgYWxwaGEgYmxlbmRpbmcKLQlCTElUX0RJVEhFUiA9IDQ7ICAvLyBlbmFibGUgZGl0aGVyaW5nIGluIGxvdyBjb2xvciBtb2RlcwotCi0vKioKLSAqIEFscGhhIG1vZGUsIHZhbHVlcyAwIC0gMjU1IHNwZWNpZnkgZ2xvYmFsIGFscGhhIGxldmVsCi0gKi8KLXN0YXRpYyBmaW5hbCBpbnQKLQlBTFBIQV9PUEFRVUUgPSAyNTUsICAgICAgICAgICAvLyBGdWxseSBvcGFxdWUgKGlnbm9yZXMgYW55IGFscGhhIGRhdGEpCi0JQUxQSEFfVFJBTlNQQVJFTlQgPSAwLCAgICAgICAgLy8gRnVsbHkgdHJhbnNwYXJlbnQgKGlnbm9yZXMgYW55IGFscGhhIGRhdGEpCi0JQUxQSEFfQ0hBTk5FTF9TRVBBUkFURSA9IC0xLCAgLy8gVXNlIGFscGhhIGNoYW5uZWwgZnJvbSBzZXBhcmF0ZSBhbHBoYURhdGEKLQlBTFBIQV9DSEFOTkVMX1NPVVJDRSA9IC0yLCAgICAvLyBVc2UgYWxwaGEgY2hhbm5lbCBlbWJlZGRlZCBpbiBzb3VyY2VEYXRhCi0JQUxQSEFfTUFTS19VTlBBQ0tFRCA9IC0zLCAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBieXRlcyBpbiBhbHBoYURhdGEgKG5vbi16ZXJvIGlzIG9wYXF1ZSkKLQlBTFBIQV9NQVNLX1BBQ0tFRCA9IC00LCAgICAgICAvLyBVc2UgdHJhbnNwYXJlbmN5IG1hc2sgZm9ybWVkIGJ5IHBhY2tlZCBiaXRzIGluIGFscGhhRGF0YQotCUFMUEhBX01BU0tfSU5ERVggPSAtNSwgICAgICAgIC8vIENvbnNpZGVyIHNvdXJjZSBwYWxldHRlIGluZGljZXMgdHJhbnNwYXJlbnQgaWYgaW4gYWxwaGFEYXRhIGFycmF5Ci0JQUxQSEFfTUFTS19SR0IgPSAtNjsgICAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIFJHQnMgdHJhbnNwYXJlbnQgaWYgaW4gUkdCODg4IGZvcm1hdCBhbHBoYURhdGEgYXJyYXkKLQotLyoqCi0gKiBCeXRlIGFuZCBiaXQgb3JkZXIgY29uc3RhbnRzLgotICovCi1zdGF0aWMgZmluYWwgaW50IExTQl9GSVJTVCA9IDA7Ci1zdGF0aWMgZmluYWwgaW50IE1TQl9GSVJTVCA9IDE7Ci0KLS8qKgotICogRGF0YSB0eXBlcyAoaW50ZXJuYWwpCi0gKi8KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludAotCS8vIGRpcmVjdCAvIHRydWUgY29sb3IgZm9ybWF0cyB3aXRoIGFyYml0cmFyeSBtYXNrcyAmIHNoaWZ0cwotCVRZUEVfR0VORVJJQ184ID0gMCwKLQlUWVBFX0dFTkVSSUNfMTZfTVNCID0gMSwKLQlUWVBFX0dFTkVSSUNfMTZfTFNCID0gMiwKLQlUWVBFX0dFTkVSSUNfMjQgPSAzLAotCVRZUEVfR0VORVJJQ18zMl9NU0IgPSA0LAotCVRZUEVfR0VORVJJQ18zMl9MU0IgPSA1LAotCS8vIHBhbGV0dGUgaW5kZXhlZCBjb2xvciBmb3JtYXRzCi0JVFlQRV9JTkRFWF84ID0gNiwKLQlUWVBFX0lOREVYXzQgPSA3LAotCVRZUEVfSU5ERVhfMiA9IDgsCi0JVFlQRV9JTkRFWF8xX01TQiA9IDksCi0JVFlQRV9JTkRFWF8xX0xTQiA9IDEwOwotCi0vKioKLSAqIENvbXB1dGVzIHRoZSByZXF1aXJlZCBjaGFubmVsIHNoaWZ0IGZyb20gYSBtYXNrLgotICovCi1zdGF0aWMgaW50IGdldENoYW5uZWxTaGlmdChpbnQgbWFzaykgewotCWlmIChtYXNrID09IDApIHJldHVybiAwOwotCWludCBpOwotCWZvciAoaSA9IDA7ICgobWFzayAmIDEpID09IDApICYmIChpIDwgMzIpOyArK2kpIHsKLQkJbWFzayA+Pj49IDE7Ci0JfQotCXJldHVybiBpOwotfQotCi0vKioKLSAqIENvbXB1dGVzIHRoZSByZXF1aXJlZCBjaGFubmVsIHdpZHRoIChkZXB0aCkgZnJvbSBhIG1hc2suCi0gKi8KLXN0YXRpYyBpbnQgZ2V0Q2hhbm5lbFdpZHRoKGludCBtYXNrLCBpbnQgc2hpZnQpIHsKLQlpZiAobWFzayA9PSAwKSByZXR1cm4gMDsKLQlpbnQgaTsKLQltYXNrID4+Pj0gc2hpZnQ7Ci0JZm9yIChpID0gc2hpZnQ7ICgobWFzayAmIDEpICE9IDApICYmIChpIDwgMzIpOyArK2kpIHsKLQkJbWFzayA+Pj49IDE7Ci0JfQotCXJldHVybiBpIC0gc2hpZnQ7Ci19Ci0KLS8qKgotICogRXh0cmFjdHMgYSBmaWVsZCBmcm9tIHBhY2tlZCBSR0IgZGF0YSBnaXZlbiBhIG1hc2sgZm9yIHRoYXQgZmllbGQuCi0gKi8KLXN0YXRpYyBieXRlIGdldENoYW5uZWxGaWVsZChpbnQgZGF0YSwgaW50IG1hc2spIHsKLQlmaW5hbCBpbnQgc2hpZnQgPSBnZXRDaGFubmVsU2hpZnQobWFzayk7Ci0JcmV0dXJuIEFOWV9UT19FSUdIVFtnZXRDaGFubmVsV2lkdGgobWFzaywgc2hpZnQpXVsoZGF0YSAmIG1hc2spID4+PiBzaGlmdF07Ci19Ci0KLS8qIAotICogRmlsbCBpbiBkaXRoZXJlZCBncmFkYXRlZCB2YWx1ZXMgZm9yIGEgY29sb3IgY2hhbm5lbAotICovCi1zdGF0aWMgZmluYWwgdm9pZCBidWlsZERpdGhlcmVkR3JhZGllbnRDaGFubmVsKGludCBmcm9tLCBpbnQgdG8sIGludCBzdGVwcywKLQlpbnQgYmFuZFdpZHRoLCBpbnQgYmFuZEhlaWdodCwgYm9vbGVhbiB2ZXJ0aWNhbCwKLQlieXRlW10gYml0bWFwRGF0YSwgaW50IGRwLCBpbnQgYnl0ZXNQZXJMaW5lLCBpbnQgYml0cykgewotCWZpbmFsIGludCBtYXNrID0gMHhmZjAwID4+PiBiaXRzOwotCWludCB2YWwgPSBmcm9tIDw8IDE2OwotCWZpbmFsIGludCBpbmMgPSAoKHRvIDw8IDE2KSAtIHZhbCkgLyBzdGVwcyArIDE7Ci0JaWYgKHZlcnRpY2FsKSB7Ci0JCWZvciAoaW50IGR5ID0gMDsgZHkgPCBiYW5kSGVpZ2h0OyArK2R5LCBkcCArPSBieXRlc1BlckxpbmUpIHsKLQkJCWZvciAoaW50IGR4ID0gMCwgZHB0ciA9IGRwOyBkeCA8IGJhbmRXaWR0aDsgKytkeCwgZHB0ciArPSA0KSB7Ci0JCQkJZmluYWwgaW50IHRocmVzaCA9IERJVEhFUl9NQVRSSVhbZHkgJiA3XVtkeF0gPj4+IGJpdHM7Ci0JCQkJaW50IHRlbXAgPSB2YWwgKyB0aHJlc2g7Ci0JCQkJaWYgKHRlbXAgPiAweGZmZmZmZikgYml0bWFwRGF0YVtkcHRyXSA9IC0xOwotCQkJCWVsc2UgYml0bWFwRGF0YVtkcHRyXSA9IChieXRlKSgodGVtcCA+Pj4gMTYpICYgbWFzayk7Ci0JCQl9Ci0JCQl2YWwgKz0gaW5jOwotCQl9Ci0JfSBlbHNlIHsKLQkJZm9yIChpbnQgZHggPSAwOyBkeCA8IGJhbmRXaWR0aDsgKytkeCwgZHAgKz0gNCkgewotCQkJZm9yIChpbnQgZHkgPSAwLCBkcHRyID0gZHA7IGR5IDwgYmFuZEhlaWdodDsgKytkeSwgZHB0ciArPSBieXRlc1BlckxpbmUpIHsKLQkJCQlmaW5hbCBpbnQgdGhyZXNoID0gRElUSEVSX01BVFJJWFtkeV1bZHggJiA3XSA+Pj4gYml0czsKLQkJCQlpbnQgdGVtcCA9IHZhbCArIHRocmVzaDsKLQkJCQlpZiAodGVtcCA+IDB4ZmZmZmZmKSBiaXRtYXBEYXRhW2RwdHJdID0gLTE7Ci0JCQkJZWxzZSBiaXRtYXBEYXRhW2RwdHJdID0gKGJ5dGUpKCh0ZW1wID4+PiAxNikgJiBtYXNrKTsKLQkJCX0KLQkJCXZhbCArPSBpbmM7Ci0JCX0KLQl9Ci19Ci19Ci0KLXN0YXRpYyBjbGFzcyBMRURhdGFJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKLQlpbnQgcG9zaXRpb247Ci0JSW5wdXRTdHJlYW0gaW47Ci0KLQkvKioKLQkgKiBUaGUgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBieXRlcyB0byByZWFkLgotCSAqLwotCXByb3RlY3RlZCBieXRlW10gYnVmOwotCQotCS8qKgotCSAqIFRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgYnl0ZSBhcnJheSA8Y29kZT5idWY8L2NvZGU+LiBBIHZhbHVlCi0JICogZXF1YWwgdG8gYnVmLmxlbmd0aCBpbmRpY2F0ZXMgbm8gYnl0ZXMgYXZhaWxhYmxlLiAgQSB2YWx1ZSBvZgotCSAqIDAgaW5kaWNhdGVzIHRoZSBidWZmZXIgaXMgZnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHBvczsKLQkKLQotCXB1YmxpYyBMRURhdGFJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dCkgewotCQl0aGlzKGlucHV0LCA1MTIpOwotCX0KLQkKLQlwdWJsaWMgTEVEYXRhSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXQsIGludCBidWZmZXJTaXplKSB7Ci0JCXRoaXMuaW4gPSBpbnB1dDsKLQkJaWYgKGJ1ZmZlclNpemUgPiAwKSB7Ci0JCQlidWYgPSBuZXcgYnl0ZVtidWZmZXJTaXplXTsKLQkJCXBvcyA9IGJ1ZmZlclNpemU7Ci0JCX0gCi0JCWVsc2UgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ1ZiA9IG51bGw7Ci0JCWlmIChpbiAhPSBudWxsKSB7Ci0JCQlpbi5jbG9zZSgpOwotCQkJaW4gPSBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBob3cgbWFueSBieXRlcyB3ZXJlIHJlYWQuCi0JICovCi0JcHVibGljIGludCBnZXRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIHBvc2l0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXJzIGhvdyBtYW55IGJ5dGVzIGFyZSBhdmFpbGFibGUgZm9yIHJlYWRpbmcgd2l0aG91dCBibG9ja2luZwotCSAqLwotCXB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGJ1ZiA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKLQkJcmV0dXJuIChidWYubGVuZ3RoIC0gcG9zKSArIGluLmF2YWlsYWJsZSgpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIG5leHQgYnl0ZSBvZiB0aGUgaW5wdXQgc3RyZWFtLgotCSAqLwotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChidWYgPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0JCXBvc2l0aW9uKys7Ci0JCWlmIChwb3MgPCBidWYubGVuZ3RoKSByZXR1cm4gKGJ1Zltwb3MrK10gJiAweEZGKTsKLQkJcmV0dXJuIGluLnJlYWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogRG9uJ3QgaW1pdGF0ZSB0aGUgSkRLIGJlaGF2aW91ciBvZiByZWFkaW5nIGEgcmFuZG9tIG51bWJlcgotCSAqIG9mIGJ5dGVzIHdoZW4geW91IGNhbiBhY3R1YWxseSByZWFkIHRoZW0gYWxsLgotCSAqLwotCXB1YmxpYyBpbnQgcmVhZChieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdDsKLQkJaW50IGxlZnQgPSBsZW47Ci0JCXJlc3VsdCA9IHJlYWREYXRhKGIsIG9mZiwgbGVuKTsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChyZXN1bHQgPT0gLTEpIHJldHVybiAtMTsKLQkJCXBvc2l0aW9uICs9IHJlc3VsdDsKLQkJCWlmIChyZXN1bHQgPT0gbGVmdCkgcmV0dXJuIGxlbjsKLQkJCWxlZnQgLT0gcmVzdWx0OwotCQkJb2ZmICs9IHJlc3VsdDsKLQkJCXJlc3VsdCA9IHJlYWREYXRhKGIsIG9mZiwgbGVmdCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0gCSAqIFJlYWRzIGF0IG1vc3QgPGNvZGU+bGVuZ3RoPC9jb2RlPiBieXRlcyBmcm9tIHRoaXMgTEVEYXRhSW5wdXRTdHJlYW0gYW5kIAotIAkgKiBzdG9yZXMgdGhlbSBpbiBieXRlIGFycmF5IDxjb2RlPmJ1ZmZlcjwvY29kZT4gc3RhcnRpbmcgYXQgPGNvZGU+b2Zmc2V0PC9jb2RlPi4KLSAJICogPHA+Ci0gCSAqIEFuc3dlciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgbm8gYnl0ZXMgd2VyZSByZWFkIGFuZCAKLSAJICogZW5kIG9mIHN0cmVhbSB3YXMgZW5jb3VudGVyZWQuICBUaGlzIGltcGxlbWVudGF0aW9uIHJlYWRzIGJ5dGVzIGZyb20gCi0gCSAqIHRoZSBwdXNoYmFjayBidWZmZXIgZmlyc3QsIHRoZW4gdGhlIHRhcmdldCBzdHJlYW0gaWYgbW9yZSBieXRlcyBhcmUgcmVxdWlyZWQKLSAJICogdG8gc2F0aXNmeSA8Y29kZT5jb3VudDwvY29kZT4uCi0JICogPC9wPgotCSAqIEBwYXJhbSBidWZmZXIgdGhlIGJ5dGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHJlYWQgYnl0ZXMuCi0JICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGluIDxjb2RlPmJ1ZmZlcjwvY29kZT4gdG8gc3RvcmUgdGhlIHJlYWQgYnl0ZXMuCi0JICogQHBhcmFtIGxlbmd0aCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4gPGNvZGU+YnVmZmVyPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gaW50IHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiBlbmQgb2Ygc3RyZWFtLgotCSAqCi0JICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KLQkgKi8KLQlwcml2YXRlIGludCByZWFkRGF0YShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoYnVmID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmZXIubGVuZ3RoIHx8Ci0gIAkJIAlsZW5ndGggPCAwIHx8IChsZW5ndGggPiBidWZmZXIubGVuZ3RoIC0gb2Zmc2V0KSkgewotCSAJCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJIAl9Ci0JCQkJCi0JCWludCBjYWNoZUNvcGllZCA9IDA7Ci0JCWludCBuZXdPZmZzZXQgPSBvZmZzZXQ7Ci0JCi0JCS8vIEFyZSB0aGVyZSBwdXNoYmFjayBieXRlcyBhdmFpbGFibGU/Ci0JCWludCBhdmFpbGFibGUgPSBidWYubGVuZ3RoIC0gcG9zOwotCQlpZiAoYXZhaWxhYmxlID4gMCkgewotCQkJY2FjaGVDb3BpZWQgPSAoYXZhaWxhYmxlID49IGxlbmd0aCkgPyBsZW5ndGggOiBhdmFpbGFibGU7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgcG9zLCBidWZmZXIsIG5ld09mZnNldCwgY2FjaGVDb3BpZWQpOwotCQkJbmV3T2Zmc2V0ICs9IGNhY2hlQ29waWVkOwotCQkJcG9zICs9IGNhY2hlQ29waWVkOwotCQl9Ci0JCi0JCS8vIEhhdmUgd2UgY29waWVkIGVub3VnaD8KLQkJaWYgKGNhY2hlQ29waWVkID09IGxlbmd0aCkgcmV0dXJuIGxlbmd0aDsKLQotCQlpbnQgaW5Db3BpZWQgPSBpbi5yZWFkKGJ1ZmZlciwgbmV3T2Zmc2V0LCBsZW5ndGggLSBjYWNoZUNvcGllZCk7Ci0KLQkJaWYgKGluQ29waWVkID4gMCkgcmV0dXJuIGluQ29waWVkICsgY2FjaGVDb3BpZWQ7Ci0JCWlmIChjYWNoZUNvcGllZCA9PSAwKSByZXR1cm4gaW5Db3BpZWQ7Ci0JCXJldHVybiBjYWNoZUNvcGllZDsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGFuIGludGVnZXIgY29tcHJpc2VkIG9mIHRoZSBuZXh0Ci0JICogZm91ciBieXRlcyBvZiB0aGUgaW5wdXQgc3RyZWFtLgotCSAqLwotCXB1YmxpYyBpbnQgcmVhZEludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs0XTsKLQkJcmVhZChidWYpOwotCQlyZXR1cm4gKCgoKCgoYnVmWzNdICYgMHhGRikgPDwgOCkgfCAKLQkJCShidWZbMl0gJiAweEZGKSkgPDwgOCkgfCAKLQkJCShidWZbMV0gJiAweEZGKSkgPDwgOCkgfCAKLQkJCShidWZbMF0gJiAweEZGKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGEgc2hvcnQgY29tcHJpc2VkIG9mIHRoZSBuZXh0Ci0JICogdHdvIGJ5dGVzIG9mIHRoZSBpbnB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIHNob3J0IHJlYWRTaG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsyXTsKLQkJcmVhZChidWYpOwotCQlyZXR1cm4gKHNob3J0KSgoKGJ1ZlsxXSAmIDB4RkYpIDw8IDgpIHwgKGJ1ZlswXSAmIDB4RkYpKTsKLQl9Ci0JCi0JLyoqCi0JICogUHVzaCBiYWNrIHRoZSBlbnRpcmUgY29udGVudCBvZiB0aGUgZ2l2ZW4gYnVmZmVyIDxjb2RlPmI8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoZSBieXRlcyBhcmUgcHVzaGVkIHNvIHRoYXQgdGhleSB3b3VsZCBiZSByZWFkIGJhY2sgYlswXSwgYlsxXSwgZXRjLiAKLQkgKiBJZiB0aGUgcHVzaCBiYWNrIGJ1ZmZlciBjYW5ub3QgaGFuZGxlIHRoZSBieXRlcyBjb3BpZWQgZnJvbSA8Y29kZT5iPC9jb2RlPiwgCi0JICogYW4gSU9FeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gYW5kIG5vIGJ5dGUgd2lsbCBiZSBwdXNoZWQgYmFjay4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGIgdGhlIGJ5dGUgYXJyYXkgY29udGFpbmluZyBieXRlcyB0byBwdXNoIGJhY2sgaW50byB0aGUgc3RyZWFtCi0JICoKLQkgKiBAZXhjZXB0aW9uIAlqYXZhLmlvLklPRXhjZXB0aW9uIGlmIHRoZSBwdXNoYmFjayBidWZmZXIgaXMgdG9vIHNtYWxsCi0JICovCi0JcHVibGljIHZvaWQgdW5yZWFkKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgbGVuZ3RoID0gYi5sZW5ndGg7Ci0JCWlmIChsZW5ndGggPiBwb3MpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotCQlwb3NpdGlvbiAtPSBsZW5ndGg7Ci0JCXBvcyAtPSBsZW5ndGg7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYiwgMCwgYnVmLCBwb3MsIGxlbmd0aCk7Ci0JfQotfQotcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGaWxlRm9ybWF0IHsJCi0JTEVEYXRhSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW07Ci0JSW1hZ2VMb2FkZXIgbG9hZGVyOwotCWludCBjb21wcmVzc2lvbjsKLQotYnl0ZVtdIGJpdEludmVydERhdGEoYnl0ZVtdIGRhdGEsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHsKLQkvLyBEZXN0cnVjdGl2ZWx5IGJpdCBpbnZlcnQgZGF0YSBpbiB0aGUgZ2l2ZW4gYnl0ZSBhcnJheS4KLQlmb3IgKGludCBpID0gc3RhcnRJbmRleDsgaSA8IGVuZEluZGV4OyBpKyspIHsKLQkJZGF0YVtpXSA9IChieXRlKSgyNTUgLSBkYXRhW2kgLSBzdGFydEluZGV4XSk7Ci0JfQotCXJldHVybiBkYXRhOwotfQotCi0vKioKLSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbQotICogcmVwcmVzZW50cyBhIHN1cHBvcnRlZCBmaWxlIGZvcm1hdC4KLSAqLwotYWJzdHJhY3QgYm9vbGVhbiBpc0ZpbGVGb3JtYXQoTEVEYXRhSW5wdXRTdHJlYW0gc3RyZWFtKTsKLQotYWJzdHJhY3QgSW1hZ2VEYXRhW10gbG9hZEZyb21CeXRlU3RyZWFtKCk7Ci0KLXB1YmxpYyBJbWFnZURhdGFbXSBsb2FkRnJvbVN0cmVhbShMRURhdGFJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLQl0cnkgewotCQlpbnB1dFN0cmVhbSA9IHN0cmVhbTsKLQkJcmV0dXJuIGxvYWRGcm9tQnl0ZVN0cmVhbSgpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgSW1hZ2VEYXRhW10gbG9hZChJbnB1dFN0cmVhbSBpcywgSW1hZ2VMb2FkZXIgbG9hZGVyKSB7Ci0JTEVEYXRhSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IExFRGF0YUlucHV0U3RyZWFtKGlzKTsKLQlib29sZWFuIGlzU3VwcG9ydGVkID0gZmFsc2U7CQotCUZpbGVGb3JtYXQgZmlsZUZvcm1hdCA9IG5ldyBXaW5JQ09GaWxlRm9ybWF0KCk7Ci0JaWYgKGZpbGVGb3JtYXQuaXNGaWxlRm9ybWF0KHN0cmVhbSkpIGlzU3VwcG9ydGVkID0gdHJ1ZTsKLQllbHNlIHsKLQkJZmlsZUZvcm1hdCA9IG5ldyBXaW5CTVBGaWxlRm9ybWF0KCk7Ci0JCWlmIChmaWxlRm9ybWF0LmlzRmlsZUZvcm1hdChzdHJlYW0pKSBpc1N1cHBvcnRlZCA9IHRydWU7Ci0JfQotCWlmICghaXNTdXBwb3J0ZWQpIFNXVC5lcnJvcihTV1QuRVJST1JfVU5TVVBQT1JURURfRk9STUFUKTsKLQlmaWxlRm9ybWF0LmxvYWRlciA9IGxvYWRlcjsKLQlyZXR1cm4gZmlsZUZvcm1hdC5sb2FkRnJvbVN0cmVhbShzdHJlYW0pOwotfQotfQotc3RhdGljIGNsYXNzIFdpbkJNUEZpbGVGb3JtYXQgZXh0ZW5kcyBGaWxlRm9ybWF0IHsKLQlzdGF0aWMgZmluYWwgaW50IEJNUEZpbGVIZWFkZXJTaXplID0gMTQ7Ci0Jc3RhdGljIGZpbmFsIGludCBCTVBIZWFkZXJGaXhlZFNpemUgPSA0MDsKLQlpbnQgaW1wb3J0YW50Q29sb3JzOwotCi12b2lkIGRlY29tcHJlc3NEYXRhKGJ5dGVbXSBzcmMsIGJ5dGVbXSBkZXN0LCBpbnQgc3RyaWRlLCBpbnQgY21wKSB7Ci0JaWYgKGNtcCA9PSAxKSB7IC8vIEJNUF9STEU4X0NPTVBSRVNTSU9OCi0JCWlmIChkZWNvbXByZXNzUkxFOERhdGEoc3JjLCBzcmMubGVuZ3RoLCBzdHJpZGUsIGRlc3QsIGRlc3QubGVuZ3RoKSA8PSAwKQotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoY21wID09IDIpIHsgLy8gQk1QX1JMRTRfQ09NUFJFU1NJT04KLQkJaWYgKGRlY29tcHJlc3NSTEU0RGF0YShzcmMsIHNyYy5sZW5ndGgsIHN0cmlkZSwgZGVzdCwgZGVzdC5sZW5ndGgpIDw9IDApCi0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCQlyZXR1cm47Ci0JfQotCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci19Ci1pbnQgZGVjb21wcmVzc1JMRTREYXRhKGJ5dGVbXSBzcmMsIGludCBudW1CeXRlcywgaW50IHN0cmlkZSwgYnl0ZVtdIGRlc3QsIGludCBkZXN0U2l6ZSkgewotCWludCBzcCA9IDA7Ci0JaW50IHNlID0gbnVtQnl0ZXM7Ci0JaW50IGRwID0gMDsKLQlpbnQgZGUgPSBkZXN0U2l6ZTsKLQlpbnQgeCA9IDAsIHkgPSAwOwotCXdoaWxlIChzcCA8IHNlKSB7Ci0JCWludCBsZW4gPSBzcmNbc3BdICYgMHhGRjsKLQkJc3ArKzsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlsZW4gPSBzcmNbc3BdICYgMHhGRjsKLQkJCXNwKys7Ci0JCQlzd2l0Y2ggKGxlbikgewotCQkJCWNhc2UgMDogLyogZW5kIG9mIGxpbmUgKi8KLQkJCQkJeSsrOwotCQkJCQl4ID0gMDsKLQkJCQkJZHAgPSB5ICogc3RyaWRlOwotCQkJCQlpZiAoZHAgPj0gZGUpCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTogLyogZW5kIG9mIGJpdG1hcCAqLwotCQkJCQlyZXR1cm4gMTsKLQkJCQljYXNlIDI6IC8qIGRlbHRhICovCi0JCQkJCXggKz0gc3JjW3NwXSAmIDB4RkY7Ci0JCQkJCXNwKys7Ci0JCQkJCXkgKz0gc3JjW3NwXSAmIDB4RkY7Ci0JCQkJCXNwKys7Ci0JCQkJCWRwID0geSAqIHN0cmlkZSArIHggLyAyOwotCQkJCQlpZiAoZHAgPj0gZGUpCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6IC8qIGFic29sdXRlIG1vZGUgcnVuICovCi0JCQkJCWlmICgobGVuICYgMSkgIT0gMCkgLyogb2RkIHJ1biBsZW5ndGhzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkICovCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCXggKz0gbGVuOwotCQkJCQlsZW4gPSBsZW4gLyAyOwotCQkJCQlpZiAobGVuID4gKHNlIC0gc3ApKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlpZiAobGVuID4gKGRlIC0gZHApKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJCQlkZXN0W2RwXSA9IHNyY1tzcF07Ci0JCQkJCQlkcCsrOwotCQkJCQkJc3ArKzsKLQkJCQkJfQotCQkJCQlpZiAoKHNwICYgMSkgIT0gMCkKLQkJCQkJCXNwKys7IC8qIHdvcmQgYWxpZ24gc3A/ICovCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChsZW4gJiAxKSAhPSAwKQotCQkJCXJldHVybiAtMTsKLQkJCXggKz0gbGVuOwotCQkJbGVuID0gbGVuIC8gMjsKLQkJCWJ5dGUgdGhlQnl0ZSA9IHNyY1tzcF07Ci0JCQlzcCsrOwotCQkJaWYgKGxlbiA+IChkZSAtIGRwKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJZGVzdFtkcF0gPSB0aGVCeXRlOwotCQkJCWRwKys7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7Ci19Ci1pbnQgZGVjb21wcmVzc1JMRThEYXRhKGJ5dGVbXSBzcmMsIGludCBudW1CeXRlcywgaW50IHN0cmlkZSwgYnl0ZVtdIGRlc3QsIGludCBkZXN0U2l6ZSkgewotCWludCBzcCA9IDA7Ci0JaW50IHNlID0gbnVtQnl0ZXM7Ci0JaW50IGRwID0gMDsKLQlpbnQgZGUgPSBkZXN0U2l6ZTsKLQlpbnQgeCA9IDAsIHkgPSAwOwotCXdoaWxlIChzcCA8IHNlKSB7Ci0JCWludCBsZW4gPSBzcmNbc3BdICYgMHhGRjsKLQkJc3ArKzsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlsZW4gPSBzcmNbc3BdICYgMHhGRjsKLQkJCXNwKys7Ci0JCQlzd2l0Y2ggKGxlbikgewotCQkJCWNhc2UgMDogLyogZW5kIG9mIGxpbmUgKi8KLQkJCQkJeSsrOwotCQkJCQl4ID0gMDsKLQkJCQkJZHAgPSB5ICogc3RyaWRlOwotCQkJCQlpZiAoZHAgPj0gZGUpCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTogLyogZW5kIG9mIGJpdG1hcCAqLwotCQkJCQlyZXR1cm4gMTsKLQkJCQljYXNlIDI6IC8qIGRlbHRhICovCi0JCQkJCXggKz0gc3JjW3NwXSAmIDB4RkY7Ci0JCQkJCXNwKys7Ci0JCQkJCXkgKz0gc3JjW3NwXSAmIDB4RkY7Ci0JCQkJCXNwKys7Ci0JCQkJCWRwID0geSAqIHN0cmlkZSArIHg7Ci0JCQkJCWlmIChkcCA+PSBkZSkKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDogLyogYWJzb2x1dGUgbW9kZSBydW4gKi8KLQkJCQkJaWYgKGxlbiA+IChzZSAtIHNwKSkKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJaWYgKGxlbiA+IChkZSAtIGRwKSkKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCQkJZGVzdFtkcF0gPSBzcmNbc3BdOwotCQkJCQkJZHArKzsKLQkJCQkJCXNwKys7Ci0JCQkJCX0KLQkJCQkJaWYgKChzcCAmIDEpICE9IDApCi0JCQkJCQlzcCsrOyAvKiB3b3JkIGFsaWduIHNwPyAqLwotCQkJCQl4ICs9IGxlbjsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlieXRlIHRoZUJ5dGUgPSBzcmNbc3BdOwotCQkJc3ArKzsKLQkJCWlmIChsZW4gPiAoZGUgLSBkcCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWRlc3RbZHBdID0gdGhlQnl0ZTsKLQkJCQlkcCsrOwotCQkJfQotCQkJeCArPSBsZW47Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7Ci19Ci1ib29sZWFuIGlzRmlsZUZvcm1hdChMRURhdGFJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLQl0cnkgewotCQlieXRlW10gaGVhZGVyID0gbmV3IGJ5dGVbMThdOwotCQlzdHJlYW0ucmVhZChoZWFkZXIpOwotCQlzdHJlYW0udW5yZWFkKGhlYWRlcik7Ci0JCWludCBpbmZvSGVhZGVyU2l6ZSA9IChoZWFkZXJbMTRdICYgMHhGRikgfCAoKGhlYWRlclsxNV0gJiAweEZGKSA8PCA4KSB8ICgoaGVhZGVyWzE2XSAmIDB4RkYpIDw8IDE2KSB8ICgoaGVhZGVyWzE3XSAmIDB4RkYpIDw8IDI0KTsKLQkJcmV0dXJuIGhlYWRlclswXSA9PSAweDQyICYmIGhlYWRlclsxXSA9PSAweDREICYmIGluZm9IZWFkZXJTaXplID49IEJNUEhlYWRlckZpeGVkU2l6ZTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotYnl0ZVtdIGxvYWREYXRhKGJ5dGVbXSBpbmZvSGVhZGVyKSB7Ci0JaW50IHdpZHRoID0gKGluZm9IZWFkZXJbNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlcls1XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzZdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzddICYgMHhGRikgPDwgMjQpOwotCWludCBoZWlnaHQgPSAoaW5mb0hlYWRlcls4XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzldICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMTBdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzExXSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgYml0Q291bnQgPSAoaW5mb0hlYWRlclsxNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsxNV0gJiAweEZGKSA8PCA4KTsKLQlpbnQgc3RyaWRlID0gKHdpZHRoICogYml0Q291bnQgKyA3KSAvIDg7Ci0Jc3RyaWRlID0gKHN0cmlkZSArIDMpIC8gNCAqIDQ7IC8vIFJvdW5kIHVwIHRvIDQgYnl0ZSBtdWx0aXBsZQotCWJ5dGVbXSBkYXRhID0gbG9hZERhdGEoaW5mb0hlYWRlciwgc3RyaWRlKTsKLQlmbGlwU2NhbkxpbmVzKGRhdGEsIHN0cmlkZSwgaGVpZ2h0KTsKLQlyZXR1cm4gZGF0YTsKLX0KLWJ5dGVbXSBsb2FkRGF0YShieXRlW10gaW5mb0hlYWRlciwgaW50IHN0cmlkZSkgewotCWludCBoZWlnaHQgPSAoaW5mb0hlYWRlcls4XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzldICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMTBdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzExXSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgZGF0YVNpemUgPSBoZWlnaHQgKiBzdHJpZGU7Ci0JYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtkYXRhU2l6ZV07Ci0JaW50IGNtcCA9IChpbmZvSGVhZGVyWzE2XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzE3XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzE4XSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclsxOV0gJiAweEZGKSA8PCAyNCk7Ci0JaWYgKGNtcCA9PSAwKSB7IC8vIEJNUF9OT19DT01QUkVTU0lPTgotCQl0cnkgewotCQkJaWYgKGlucHV0U3RyZWFtLnJlYWQoZGF0YSkgIT0gZGF0YVNpemUpCi0JCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JCX0KLQl9IGVsc2UgewotCQlpbnQgY29tcHJlc3NlZFNpemUgPSAoaW5mb0hlYWRlclsyMF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsyMV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsyMl0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMjNdICYgMHhGRikgPDwgMjQpOwotCQlieXRlW10gY29tcHJlc3NlZCA9IG5ldyBieXRlW2NvbXByZXNzZWRTaXplXTsKLQkJdHJ5IHsKLQkJCWlmIChpbnB1dFN0cmVhbS5yZWFkKGNvbXByZXNzZWQpICE9IGNvbXByZXNzZWRTaXplKQotCQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCQl9Ci0JCWRlY29tcHJlc3NEYXRhKGNvbXByZXNzZWQsIGRhdGEsIHN0cmlkZSwgY21wKTsKLQl9Ci0JcmV0dXJuIGRhdGE7Ci19Ci1pbnRbXSBsb2FkRmlsZUhlYWRlcigpIHsKLQlpbnRbXSBoZWFkZXIgPSBuZXcgaW50WzVdOwotCXRyeSB7Ci0JCWhlYWRlclswXSA9IGlucHV0U3RyZWFtLnJlYWRTaG9ydCgpOwotCQloZWFkZXJbMV0gPSBpbnB1dFN0cmVhbS5yZWFkSW50KCk7Ci0JCWhlYWRlclsyXSA9IGlucHV0U3RyZWFtLnJlYWRTaG9ydCgpOwotCQloZWFkZXJbM10gPSBpbnB1dFN0cmVhbS5yZWFkU2hvcnQoKTsKLQkJaGVhZGVyWzRdID0gaW5wdXRTdHJlYW0ucmVhZEludCgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotCWlmIChoZWFkZXJbMF0gIT0gMHg0RDQyKQotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCXJldHVybiBoZWFkZXI7Ci19Ci1JbWFnZURhdGFbXSBsb2FkRnJvbUJ5dGVTdHJlYW0oKSB7Ci0JaW50W10gZmlsZUhlYWRlciA9IGxvYWRGaWxlSGVhZGVyKCk7Ci0JYnl0ZVtdIGluZm9IZWFkZXIgPSBuZXcgYnl0ZVtCTVBIZWFkZXJGaXhlZFNpemVdOwotCXRyeSB7Ci0JCWlucHV0U3RyZWFtLnJlYWQoaW5mb0hlYWRlcik7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotCWludCB3aWR0aCA9IChpbmZvSGVhZGVyWzRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbNV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlcls2XSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlcls3XSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgaGVpZ2h0ID0gKGluZm9IZWFkZXJbOF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlcls5XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzEwXSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclsxMV0gJiAweEZGKSA8PCAyNCk7Ci0JaW50IGJpdENvdW50ID0gKGluZm9IZWFkZXJbMTRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMTVdICYgMHhGRikgPDwgOCk7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IGxvYWRQYWxldHRlKGluZm9IZWFkZXIpOwotCWlmIChpbnB1dFN0cmVhbS5nZXRQb3NpdGlvbigpIDwgZmlsZUhlYWRlcls0XSkgewotCQkvLyBTZWVrIHRvIHRoZSBzcGVjaWZpZWQgb2Zmc2V0Ci0JCXRyeSB7Ci0JCQlpbnB1dFN0cmVhbS5za2lwKGZpbGVIZWFkZXJbNF0gLSBpbnB1dFN0cmVhbS5nZXRQb3NpdGlvbigpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JCX0KLQl9Ci0JYnl0ZVtdIGRhdGEgPSBsb2FkRGF0YShpbmZvSGVhZGVyKTsKLQl0aGlzLmNvbXByZXNzaW9uID0gKGluZm9IZWFkZXJbMTZdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMTddICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMThdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzE5XSAmIDB4RkYpIDw8IDI0KTsKLQl0aGlzLmltcG9ydGFudENvbG9ycyA9IChpbmZvSGVhZGVyWzM2XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzM3XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzM4XSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclszOV0gJiAweEZGKSA8PCAyNCk7Ci0JaW50IHhQZWxzUGVyTWV0ZXIgPSAoaW5mb0hlYWRlclsyNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsyNV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsyNl0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMjddICYgMHhGRikgPDwgMjQpOwotCWludCB5UGVsc1Blck1ldGVyID0gKGluZm9IZWFkZXJbMjhdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMjldICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMzBdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzMxXSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgdHlwZSA9ICh0aGlzLmNvbXByZXNzaW9uID09IDEgLypCTVBfUkxFOF9DT01QUkVTU0lPTiovKSB8fCAodGhpcy5jb21wcmVzc2lvbiA9PSAyIAotCi0vKkJNUF9STEU0X0NPTVBSRVNTSU9OKi8pID8gU1dULklNQUdFX0JNUF9STEUgOiBTV1QuSU1BR0VfQk1QOwotCXJldHVybiBuZXcgSW1hZ2VEYXRhW10gewotCQlJbWFnZURhdGEuaW50ZXJuYWxfbmV3KAotCQkJd2lkdGgsCi0JCQloZWlnaHQsCi0JCQliaXRDb3VudCwKLQkJCXBhbGV0dGUsCi0JCQk0LAotCQkJZGF0YSwKLQkJCTAsCi0JCQludWxsLAotCQkJbnVsbCwKLQkJCS0xLAotCQkJLTEsCi0JCQl0eXBlLAotCQkJMCwKLQkJCTAsCi0JCQkwLAotCQkJMCkKLQl9OwotfQotUGFsZXR0ZURhdGEgbG9hZFBhbGV0dGUoYnl0ZVtdIGluZm9IZWFkZXIpIHsKLQlpbnQgZGVwdGggPSAoaW5mb0hlYWRlclsxNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsxNV0gJiAweEZGKSA8PCA4KTsKLQlpZiAoZGVwdGggPD0gOCkgewotCQlpbnQgbnVtQ29sb3JzID0gKGluZm9IZWFkZXJbMzJdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMzNdICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMzRdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzM1XSAmIDB4RkYpIDw8IDI0KTsKLQkJaWYgKG51bUNvbG9ycyA9PSAwKSB7Ci0JCQludW1Db2xvcnMgPSAxIDw8IGRlcHRoOwotCQl9IGVsc2UgewotCQkJaWYgKG51bUNvbG9ycyA+IDI1NikKLQkJCQludW1Db2xvcnMgPSAyNTY7Ci0JCX0KLQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW251bUNvbG9ycyAqIDRdOwotCQl0cnkgewotCQkJaWYgKGlucHV0U3RyZWFtLnJlYWQoYnVmKSAhPSBidWYubGVuZ3RoKQotCQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCQl9Ci0JCXJldHVybiBwYWxldHRlRnJvbUJ5dGVzKGJ1ZiwgbnVtQ29sb3JzKTsKLQl9Ci0JaWYgKGRlcHRoID09IDE2KSByZXR1cm4gbmV3IFBhbGV0dGVEYXRhKDB4N0MwMCwgMHgzRTAsIDB4MUYpOwotCWlmIChkZXB0aCA9PSAyNCkgcmV0dXJuIG5ldyBQYWxldHRlRGF0YSgweEZGLCAweEZGMDAsIDB4RkYwMDAwKTsKLQlyZXR1cm4gbmV3IFBhbGV0dGVEYXRhKDB4RkYwMCwgMHhGRjAwMDAsIDB4RkYwMDAwMDApOwotfQotUGFsZXR0ZURhdGEgcGFsZXR0ZUZyb21CeXRlcyhieXRlW10gYnl0ZXMsIGludCBudW1Db2xvcnMpIHsKLQlpbnQgYnl0ZXNPZmZzZXQgPSAwOwotCVJHQltdIGNvbG9ycyA9IG5ldyBSR0JbbnVtQ29sb3JzXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbG9yczsgaSsrKSB7Ci0JCWNvbG9yc1tpXSA9IG5ldyBSR0IoYnl0ZXNbYnl0ZXNPZmZzZXQgKyAyXSAmIDB4RkYsCi0JCQlieXRlc1tieXRlc09mZnNldCArIDFdICYgMHhGRiwKLQkJCWJ5dGVzW2J5dGVzT2Zmc2V0XSAmIDB4RkYpOwotCQlieXRlc09mZnNldCArPSA0OwotCX0KLQlyZXR1cm4gbmV3IFBhbGV0dGVEYXRhKGNvbG9ycyk7Ci19Ci0vKioKLSAqIEFuc3dlciBhIGJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgQk1QIHJlcHJlc2VudGF0aW9uIG9mCi0gKiB0aGUgZ2l2ZW4gZGV2aWNlIGluZGVwZW5kZW50IHBhbGV0dGUuCi0gKi8KLXN0YXRpYyBieXRlW10gcGFsZXR0ZVRvQnl0ZXMoUGFsZXR0ZURhdGEgcGFsKSB7Ci0JaW50IG4gPSBwYWwuY29sb3JzID09IG51bGwgPyAwIDogKHBhbC5jb2xvcnMubGVuZ3RoIDwgMjU2ID8gcGFsLmNvbG9ycy5sZW5ndGggOiAyNTYpOwotCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW24gKiA0XTsKLQlpbnQgb2Zmc2V0ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQlSR0IgY29sID0gcGFsLmNvbG9yc1tpXTsKLQkJYnl0ZXNbb2Zmc2V0XSA9IChieXRlKWNvbC5ibHVlOwotCQlieXRlc1tvZmZzZXQgKyAxXSA9IChieXRlKWNvbC5ncmVlbjsKLQkJYnl0ZXNbb2Zmc2V0ICsgMl0gPSAoYnl0ZSljb2wucmVkOwotCQlvZmZzZXQgKz0gNDsKLQl9Ci0JcmV0dXJuIGJ5dGVzOwotfQotCi12b2lkIGZsaXBTY2FuTGluZXMoYnl0ZVtdIGRhdGEsIGludCBzdHJpZGUsIGludCBoZWlnaHQpIHsKLQlpbnQgaTEgPSAwOwotCWludCBpMiA9IChoZWlnaHQgLSAxKSAqIHN0cmlkZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGhlaWdodCAvIDI7IGkrKykgewotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc3RyaWRlOyBpbmRleCsrKSB7Ci0JCQlieXRlIGIgPSBkYXRhW2luZGV4ICsgaTFdOwotCQkJZGF0YVtpbmRleCArIGkxXSA9IGRhdGFbaW5kZXggKyBpMl07Ci0JCQlkYXRhW2luZGV4ICsgaTJdID0gYjsKLQkJfQotCQlpMSArPSBzdHJpZGU7Ci0JCWkyIC09IHN0cmlkZTsKLQl9Ci19Ci0KLX0KLQotc3RhdGljIGNsYXNzIFdpbklDT0ZpbGVGb3JtYXQgZXh0ZW5kcyBGaWxlRm9ybWF0IHsKLQkKLXN0YXRpYyBmaW5hbCBieXRlW10gY29udmVydFBhZChieXRlW10gZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIGludCBwYWQsIGludCBuZXdQYWQpIHsKLQlpZiAocGFkID09IG5ld1BhZCkgcmV0dXJuIGRhdGE7Ci0JaW50IHN0cmlkZSA9ICh3aWR0aCAqIGRlcHRoICsgNykgLyA4OwotCWludCBicGwgPSAoc3RyaWRlICsgKHBhZCAtIDEpKSAvIHBhZCAqIHBhZDsKLQlpbnQgbmV3QnBsID0gKHN0cmlkZSArIChuZXdQYWQgLSAxKSkgLyBuZXdQYWQgKiBuZXdQYWQ7Ci0JYnl0ZVtdIG5ld0RhdGEgPSBuZXcgYnl0ZVtoZWlnaHQgKiBuZXdCcGxdOwotCWludCBzcmNJbmRleCA9IDAsIGRlc3RJbmRleCA9IDA7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIHNyY0luZGV4LCBuZXdEYXRhLCBkZXN0SW5kZXgsIG5ld0JwbCk7Ci0JCXNyY0luZGV4ICs9IGJwbDsKLQkJZGVzdEluZGV4ICs9IG5ld0JwbDsKLQl9Ci0JcmV0dXJuIG5ld0RhdGE7Ci19Ci0vKioKLSAqIEFuc3dlciB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZmlsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4KLSAqIGljb24KLSAqLwotaW50IGljb25TaXplKEltYWdlRGF0YSBpKSB7Ci0JaW50IHNoYXBlRGF0YVN0cmlkZSA9IChpLndpZHRoICogaS5kZXB0aCArIDMxKSAvIDMyICogNDsKLQlpbnQgbWFza0RhdGFTdHJpZGUgPSAoaS53aWR0aCArIDMxKSAvIDMyICogNDsKLQlpbnQgZGF0YVNpemUgPSAoc2hhcGVEYXRhU3RyaWRlICsgbWFza0RhdGFTdHJpZGUpICogaS5oZWlnaHQ7Ci0JaW50IHBhbGV0dGVTaXplID0gaS5wYWxldHRlLmNvbG9ycyAhPSBudWxsID8gaS5wYWxldHRlLmNvbG9ycy5sZW5ndGggKiA0IDogMDsKLQlyZXR1cm4gV2luQk1QRmlsZUZvcm1hdC5CTVBIZWFkZXJGaXhlZFNpemUgKyBwYWxldHRlU2l6ZSArIGRhdGFTaXplOwotfQotYm9vbGVhbiBpc0ZpbGVGb3JtYXQoTEVEYXRhSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0JdHJ5IHsKLQkJYnl0ZVtdIGhlYWRlciA9IG5ldyBieXRlWzRdOwotCQlzdHJlYW0ucmVhZChoZWFkZXIpOwotCQlzdHJlYW0udW5yZWFkKGhlYWRlcik7Ci0JCXJldHVybiBoZWFkZXJbMF0gPT0gMCAmJiBoZWFkZXJbMV0gPT0gMCAmJiBoZWFkZXJbMl0gPT0gMSAmJiBoZWFkZXJbM10gPT0gMDsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotYm9vbGVhbiBpc1ZhbGlkSWNvbihJbWFnZURhdGEgaSkgewotCXN3aXRjaCAoaS5kZXB0aCkgewotCQljYXNlIDE6Ci0JCWNhc2UgNDoKLQkJY2FzZSA4OgotCQkJaWYgKGkucGFsZXR0ZS5pc0RpcmVjdCkgcmV0dXJuIGZhbHNlOwotCQkJaW50IHNpemUgPSBpLnBhbGV0dGUuY29sb3JzLmxlbmd0aDsKLQkJCXJldHVybiBzaXplID09IDIgfHwgc2l6ZSA9PSAxNiB8fCBzaXplID09IDMyIHx8IHNpemUgPT0gMjU2OwotCQljYXNlIDI0OgotCQljYXNlIDMyOgotCQkJcmV0dXJuIGkucGFsZXR0ZS5pc0RpcmVjdDsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotaW50IGxvYWRGaWxlSGVhZGVyKExFRGF0YUlucHV0U3RyZWFtIGJ5dGVTdHJlYW0pIHsKLQlpbnRbXSBmaWxlSGVhZGVyID0gbmV3IGludFszXTsKLQl0cnkgewotCQlmaWxlSGVhZGVyWzBdID0gYnl0ZVN0cmVhbS5yZWFkU2hvcnQoKTsKLQkJZmlsZUhlYWRlclsxXSA9IGJ5dGVTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCWZpbGVIZWFkZXJbMl0gPSBieXRlU3RyZWFtLnJlYWRTaG9ydCgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotCWlmICgoZmlsZUhlYWRlclswXSAhPSAwKSB8fCAoZmlsZUhlYWRlclsxXSAhPSAxKSkKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQlpbnQgbnVtSWNvbnMgPSBmaWxlSGVhZGVyWzJdOwotCWlmIChudW1JY29ucyA8PSAwKQotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCXJldHVybiBudW1JY29uczsKLX0KLWludCBsb2FkRmlsZUhlYWRlcihMRURhdGFJbnB1dFN0cmVhbSBieXRlU3RyZWFtLCBib29sZWFuIGhhc0hlYWRlcikgewotCWludFtdIGZpbGVIZWFkZXIgPSBuZXcgaW50WzNdOwotCXRyeSB7Ci0JCWlmIChoYXNIZWFkZXIpIHsKLQkJCWZpbGVIZWFkZXJbMF0gPSBieXRlU3RyZWFtLnJlYWRTaG9ydCgpOwotCQkJZmlsZUhlYWRlclsxXSA9IGJ5dGVTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlmaWxlSGVhZGVyWzBdID0gMDsKLQkJCWZpbGVIZWFkZXJbMV0gPSAxOwotCQl9Ci0JCWZpbGVIZWFkZXJbMl0gPSBieXRlU3RyZWFtLnJlYWRTaG9ydCgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotCWlmICgoZmlsZUhlYWRlclswXSAhPSAwKSB8fCAoZmlsZUhlYWRlclsxXSAhPSAxKSkKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQlpbnQgbnVtSWNvbnMgPSBmaWxlSGVhZGVyWzJdOwotCWlmIChudW1JY29ucyA8PSAwKQotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCXJldHVybiBudW1JY29uczsKLX0KLUltYWdlRGF0YVtdIGxvYWRGcm9tQnl0ZVN0cmVhbSgpIHsKLQlpbnQgbnVtSWNvbnMgPSBsb2FkRmlsZUhlYWRlcihpbnB1dFN0cmVhbSk7Ci0JaW50W11bXSBoZWFkZXJzID0gbG9hZEljb25IZWFkZXJzKG51bUljb25zKTsKLQlJbWFnZURhdGFbXSBpY29ucyA9IG5ldyBJbWFnZURhdGFbaGVhZGVycy5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaWNvbnMubGVuZ3RoOyBpKyspIHsKLQkJaWNvbnNbaV0gPSBsb2FkSWNvbihoZWFkZXJzW2ldKTsKLQl9Ci0JcmV0dXJuIGljb25zOwotfQotLyoqCi0gKiBMb2FkIG9uZSBpY29uIGZyb20gdGhlIGJ5dGUgc3RyZWFtLgotICovCi1JbWFnZURhdGEgbG9hZEljb24oaW50W10gaWNvbkhlYWRlcikgewotCWJ5dGVbXSBpbmZvSGVhZGVyID0gbG9hZEluZm9IZWFkZXIoaWNvbkhlYWRlcik7Ci0JV2luQk1QRmlsZUZvcm1hdCBibXBGb3JtYXQgPSBuZXcgV2luQk1QRmlsZUZvcm1hdCgpOwotCWJtcEZvcm1hdC5pbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBibXBGb3JtYXQubG9hZFBhbGV0dGUoaW5mb0hlYWRlcik7Ci0JYnl0ZVtdIHNoYXBlRGF0YSA9IGJtcEZvcm1hdC5sb2FkRGF0YShpbmZvSGVhZGVyKTsKLQlpbnQgd2lkdGggPSAoaW5mb0hlYWRlcls0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzVdICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbNl0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbN10gJiAweEZGKSA8PCAyNCk7Ci0JaW50IGhlaWdodCA9IChpbmZvSGVhZGVyWzhdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbOV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsxMF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMTFdICYgMHhGRikgPDwgMjQpOwotCWludCBkZXB0aCA9IChpbmZvSGVhZGVyWzE0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzE1XSAmIDB4RkYpIDw8IDgpOwotCWluZm9IZWFkZXJbMTRdID0gMTsKLQlpbmZvSGVhZGVyWzE1XSA9IDA7Ci0JYnl0ZVtdIG1hc2tEYXRhID0gYm1wRm9ybWF0LmxvYWREYXRhKGluZm9IZWFkZXIpOwotCW1hc2tEYXRhID0gY29udmVydFBhZChtYXNrRGF0YSwgd2lkdGgsIGhlaWdodCwgMSwgNCwgMik7Ci0JYml0SW52ZXJ0RGF0YShtYXNrRGF0YSwgMCwgbWFza0RhdGEubGVuZ3RoKTsKLQlyZXR1cm4gSW1hZ2VEYXRhLmludGVybmFsX25ldygKLQkJd2lkdGgsCi0JCWhlaWdodCwKLQkJZGVwdGgsCi0JCXBhbGV0dGUsCi0JCTQsCi0JCXNoYXBlRGF0YSwKLQkJMiwKLQkJbWFza0RhdGEsCi0JCW51bGwsCi0JCS0xLAotCQktMSwKLQkJU1dULklNQUdFX0lDTywKLQkJMCwKLQkJMCwKLQkJMCwKLQkJMCk7Ci19Ci1pbnRbXVtdIGxvYWRJY29uSGVhZGVycyhpbnQgbnVtSWNvbnMpIHsKLQlpbnRbXVtdIGhlYWRlcnMgPSBuZXcgaW50W251bUljb25zXVs3XTsKLQl0cnkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUljb25zOyBpKyspIHsKLQkJCWhlYWRlcnNbaV1bMF0gPSBpbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCQloZWFkZXJzW2ldWzFdID0gaW5wdXRTdHJlYW0ucmVhZCgpOwotCQkJaGVhZGVyc1tpXVsyXSA9IGlucHV0U3RyZWFtLnJlYWRTaG9ydCgpOwotCQkJaGVhZGVyc1tpXVszXSA9IGlucHV0U3RyZWFtLnJlYWRTaG9ydCgpOwotCQkJaGVhZGVyc1tpXVs0XSA9IGlucHV0U3RyZWFtLnJlYWRTaG9ydCgpOwotCQkJaGVhZGVyc1tpXVs1XSA9IGlucHV0U3RyZWFtLnJlYWRJbnQoKTsKLQkJCWhlYWRlcnNbaV1bNl0gPSBpbnB1dFN0cmVhbS5yZWFkSW50KCk7Ci0JCX0KLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCX0KLQlyZXR1cm4gaGVhZGVyczsKLX0KLWJ5dGVbXSBsb2FkSW5mb0hlYWRlcihpbnRbXSBpY29uSGVhZGVyKSB7Ci0JaW50IHdpZHRoID0gaWNvbkhlYWRlclswXTsKLQlpbnQgaGVpZ2h0ID0gaWNvbkhlYWRlclsxXTsKLQlpbnQgbnVtQ29sb3JzID0gaWNvbkhlYWRlclsyXTsgLy8gdGhlIG51bWJlciBvZiBjb2xvcnMgaXMgaW4gdGhlIGxvdyBieXRlLCBidXQgdGhlIGhpZ2ggYnl0ZSBtdXN0IGJlIDAKLQlpZiAobnVtQ29sb3JzID09IDApIG51bUNvbG9ycyA9IDI1NjsgLy8gdGhpcyBpcyBzcGVjaWZpZWQ6ICcwMCcgcmVwcmVzZW50cyAnMjU2JyAoMHgxMDApIGNvbG9ycwotCWlmICgobnVtQ29sb3JzICE9IDIpICYmIChudW1Db2xvcnMgIT0gOCkgJiYgKG51bUNvbG9ycyAhPSAxNikgJiYKLQkJKG51bUNvbG9ycyAhPSAzMikgJiYgKG51bUNvbG9ycyAhPSAyNTYpKQotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCWlmIChpbnB1dFN0cmVhbS5nZXRQb3NpdGlvbigpIDwgaWNvbkhlYWRlcls2XSkgewotCQkvLyBTZWVrIHRvIHRoZSBzcGVjaWZpZWQgb2Zmc2V0Ci0JCXRyeSB7Ci0JCQlpbnB1dFN0cmVhbS5za2lwKGljb25IZWFkZXJbNl0gLSBpbnB1dFN0cmVhbS5nZXRQb3NpdGlvbigpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQlieXRlW10gaW5mb0hlYWRlciA9IG5ldyBieXRlW1dpbkJNUEZpbGVGb3JtYXQuQk1QSGVhZGVyRml4ZWRTaXplXTsKLQl0cnkgewotCQlpbnB1dFN0cmVhbS5yZWFkKGluZm9IZWFkZXIpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotCWlmICgoKGluZm9IZWFkZXJbMTJdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMTNdICYgMHhGRikgPDwgOCkpICE9IDEpCi0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JaW50IGluZm9XaWR0aCA9IChpbmZvSGVhZGVyWzRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbNV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlcls2XSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlcls3XSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgaW5mb0hlaWdodCA9IChpbmZvSGVhZGVyWzhdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbOV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsxMF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMTFdICYgMHhGRikgPDwgMjQpOwotCWludCBiaXRDb3VudCA9IChpbmZvSGVhZGVyWzE0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzE1XSAmIDB4RkYpIDw8IDgpOwotCWlmIChoZWlnaHQgPT0gaW5mb0hlaWdodCAmJiBiaXRDb3VudCA9PSAxKSBoZWlnaHQgLz0gMjsKLQlpZiAoISgod2lkdGggPT0gaW5mb1dpZHRoKSAmJiAoaGVpZ2h0ICogMiA9PSBpbmZvSGVpZ2h0KSAmJgotCQkoYml0Q291bnQgPT0gMSB8fCBiaXRDb3VudCA9PSA0IHx8IGJpdENvdW50ID09IDggfHwgYml0Q291bnQgPT0gMjQgfHwgYml0Q291bnQgPT0gMzIpKSkKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JaW5mb0hlYWRlcls4XSA9IChieXRlKShoZWlnaHQgJiAweEZGKTsKLQlpbmZvSGVhZGVyWzldID0gKGJ5dGUpKChoZWlnaHQgPj4gOCkgJiAweEZGKTsKLQlpbmZvSGVhZGVyWzEwXSA9IChieXRlKSgoaGVpZ2h0ID4+IDE2KSAmIDB4RkYpOwotCWluZm9IZWFkZXJbMTFdID0gKGJ5dGUpKChoZWlnaHQgPj4gMjQpICYgMHhGRik7Ci0JcmV0dXJuIGluZm9IZWFkZXI7Ci19Ci19Ci1zdGF0aWMgY2xhc3MgU1dUIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTUFHRV9JQ08gPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0lPID0gMzk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfSU5WQUxJRF9JTUFHRSA9IDQwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX05VTExfQVJHVU1FTlQgPSA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0lOVkFMSURfQVJHVU1FTlQgPSA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0NBTk5PVF9CRV9aRVJPID0gNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTUFHRV9VTkRFRklORUQgPSAtMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCA9IDM4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TUEFSRU5DWV9NQVNLID0gMSA8PCAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCA9IDQyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TUEFSRU5DWV9BTFBIQSA9IDEgPDwgMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU1BBUkVOQ1lfTk9ORSA9IDB4MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU1BBUkVOQ1lfUElYRUwgPSAxIDw8IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfQk1QID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTUFHRV9CTVBfUkxFID0gMTsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZXJyb3IoaW50IGNvZGUpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yICIrY29kZSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvcihpbnQgY29kZSwgVGhyb3dhYmxlIHQpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odCk7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfMTZfNC5ibXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8xNl80LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhM2Q1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8xNl80LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzE2XzguYm1wIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfMTZfOC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YTUxZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfMTZfOC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8zMl80LmJtcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzMyXzQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWZlYjI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzMyXzQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfMzJfOC5ibXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8zMl84LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5NDA2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8zMl84LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzQ4XzQuYm1wIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfNDhfNC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNGFiYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfNDhfNC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF80OF84LmJtcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzQ4XzguYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDY2NzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzQ4XzguYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsYXNzRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsYXNzRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTRiMDMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9DbGFzc0RhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc0RhdGEgZXh0ZW5kcyBJdGVtRGF0YSB7Ci0JCi0JQ2xhc3MgY2xheno7Ci0KLXB1YmxpYyBDbGFzc0RhdGEoQ2xhc3MgY2xhenosIFN0cmluZyBzdHIpIHsKLQlzdXBlcihzdHIpOwotCXRoaXMuY2xhenogPSBjbGF6ejsKLX0KLQkKLXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QWxsRmxhZ3MoKSB7Ci0JcmV0dXJuIG5ldyBTdHJpbmdbXXsibm9fZ2VuIiwgImNwcCJ9OwotfQotCi1wdWJsaWMgQ2xhc3MgZ2V0Q2xhenooKSB7Ci0JcmV0dXJuIGNsYXp6OwotfQotCi1wdWJsaWMgU3RyaW5nIGdldEV4Y2x1ZGUoKSB7Ci0JcmV0dXJuIChTdHJpbmcpZ2V0UGFyYW0oImV4Y2x1ZGUiKTsKLX0KLQotcHVibGljIHZvaWQgc2V0RXhjbHVkZShTdHJpbmcgc3RyKSB7IAotCXNldFBhcmFtKCJleGNsdWRlIiwgc3RyKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsZWFudXBDbGFzcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsZWFudXBDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMThkMGQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9DbGVhbnVwQ2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGVhbnVwQ2xhc3MgZXh0ZW5kcyBKTklHZW5lcmF0b3IgewotCi1TdHJpbmcgY2xhc3NTb3VyY2VQYXRoOwotU3RyaW5nW10gc291cmNlUGF0aDsKLVN0cmluZyBjbGFzc1NvdXJjZTsKLUhhc2h0YWJsZSBmaWxlczsKLWludCB1c2VkQ291bnQsIHVudXNlZENvdW50OwotCi12b2lkIGxvYWRDbGFzc1NvdXJjZSgpIHsKLQlpZiAoY2xhc3NTb3VyY2VQYXRoID09IG51bGwpIHJldHVybjsKLQlGaWxlIGYgPSBuZXcgRmlsZShjbGFzc1NvdXJjZVBhdGgpOwotCWNsYXNzU291cmNlID0gbG9hZEZpbGUoZik7Ci19Ci0KLXZvaWQgbG9hZEZpbGVzICgpIHsKLQkvLyBCQUQgLSBob2xkcyBvbiB0byBhIGxvdCBvZiBtZW1vcnkKLQlpZiAoc291cmNlUGF0aCA9PSBudWxsKSByZXR1cm47Ci0JZmlsZXMgPSBuZXcgSGFzaHRhYmxlICgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlUGF0aC5sZW5ndGg7IGkrKykgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShzb3VyY2VQYXRoW2ldKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCWlmICghZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJaWYgKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkuZW5kc1dpdGgoIi5qYXZhIikpIHsKLQkJCQkJZmlsZXMucHV0KGZpbGUsIGxvYWRGaWxlKGZpbGUpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWxvYWREaXJlY3RvcnkoZmlsZSk7Ci0JCQl9CQkKLQkJfQotCX0KLX0KLQotU3RyaW5nIGxvYWRGaWxlIChGaWxlIGZpbGUpIHsKLQl0cnkgewotCQlGaWxlUmVhZGVyIGZyID0gbmV3IEZpbGVSZWFkZXIoZmlsZSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyKTsKLQkJU3RyaW5nQnVmZmVyIHN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzEwMjRdOwotCQlpbnQgcmVhZDsKLQkJd2hpbGUgKChyZWFkID0gYnIucmVhZChidWZmZXIpKSAhPSAtMSkgewotCQkJc3RyLmFwcGVuZChidWZmZXIsIDAsIHJlYWQpOwotCQl9Ci0JCWZyLmNsb3NlKCk7Ci0JCXJldHVybiBzdHIudG9TdHJpbmcoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLQlyZXR1cm4gIiI7Ci19Ci0KLXZvaWQgbG9hZERpcmVjdG9yeShGaWxlIGZpbGUpIHsKLQlTdHJpbmdbXSBlbnRyaWVzID0gZmlsZS5saXN0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCVN0cmluZyBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKGZpbGUsIGVudHJ5KTsKLQkJaWYgKCFmLmlzRGlyZWN0b3J5KCkpIHsKLQkJCWlmIChmLmdldEFic29sdXRlUGF0aCgpLmVuZHNXaXRoKCIuamF2YSIpKSB7Ci0JCQkJZmlsZXMucHV0KGYsIGxvYWRGaWxlKGYpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWxvYWREaXJlY3RvcnkoZik7Ci0JCX0JCQkJCQotCX0KLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoQ2xhc3MgY2xhenopIHsKLQlsb2FkRmlsZXMgKCk7Ci0JbG9hZENsYXNzU291cmNlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNvdXJjZVBhdGgoU3RyaW5nW10gc291cmNlUGF0aCkgewotCXRoaXMuc291cmNlUGF0aCA9IHNvdXJjZVBhdGg7Ci0JZmlsZXMgPSBudWxsOwotfQotCi1wdWJsaWMgdm9pZCBzZXRDbGFzc1NvdXJjZVBhdGgoU3RyaW5nIGNsYXNzU291cmNlUGF0aCkgewotCXRoaXMuY2xhc3NTb3VyY2VQYXRoID0gY2xhc3NTb3VyY2VQYXRoOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ2xlYW51cENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsZWFudXBDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1MWFlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ2xlYW51cENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwQ29uc3RhbnRzIGV4dGVuZHMgQ2xlYW51cENsYXNzIHsKLQotU3RyaW5nIGdldEZpZWxkVmFsdWUoRmllbGQgZmllbGQpIHsKLQlTdHJpbmcgbmFtZSA9IGZpZWxkLmdldE5hbWUoKTsKLQlpbnQgaW5kZXggPSAwOwotCXdoaWxlICh0cnVlKSB7Ci0JCWluZGV4ID0gY2xhc3NTb3VyY2UuaW5kZXhPZihuYW1lLCBpbmRleCArIDEpOwotCQlpZiAoaW5kZXggPT0gLTEpIHJldHVybiBudWxsOwotCQlpbnQgZXF1YWxzSW5kZXggPSBjbGFzc1NvdXJjZS5pbmRleE9mKCI9IiwgaW5kZXgpOwotCQlpZiAoY2xhc3NTb3VyY2Uuc3Vic3RyaW5nKGluZGV4ICsgbmFtZS5sZW5ndGgoKSwgZXF1YWxzSW5kZXgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpbnQgc2VtaUluZGV4ID0gY2xhc3NTb3VyY2UuaW5kZXhPZigiOyIsIGVxdWFsc0luZGV4KTsKLSAJCQlyZXR1cm4gY2xhc3NTb3VyY2Uuc3Vic3RyaW5nKGVxdWFsc0luZGV4ICsgMSwgc2VtaUluZGV4KS50cmltKCk7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKENsYXNzIGNsYXp6KSB7Ci0JdW51c2VkQ291bnQgPSB1c2VkQ291bnQgPSAwOwotCXN1cGVyLmdlbmVyYXRlKGNsYXp6KTsKLQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JZ2VuZXJhdGUoZmllbGRzKTsKLQlvdXRwdXQoInVzZWQ9IiArIHVzZWRDb3VudCArICIgdW51c2VkPSIgKyB1bnVzZWRDb3VudCArICIgdG90YWw9IiArICh1bnVzZWRDb3VudCArIHVzZWRDb3VudCkpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShGaWVsZFtdIGZpZWxkcykgewotCXNvcnQoZmllbGRzKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQlGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJaWYgKChmaWVsZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLkZJTkFMKSA9PSAwKSBjb250aW51ZTsKLQkJZ2VuZXJhdGUoZmllbGQpOwotCX0KLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoRmllbGQgZmllbGQpIHsKLQlTdHJpbmcgbmFtZSA9IGZpZWxkLmdldE5hbWUoKTsKLQlFbnVtZXJhdGlvbiBrZXlzID0gZmlsZXMua2V5cygpOwotCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCU9iamVjdCBrZXkgPSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCVN0cmluZyBzdHIgPSAoU3RyaW5nKWZpbGVzLmdldChrZXkpOwotCQlpZiAoc3RyLmluZGV4T2YobmFtZSkgIT0gLTEpIHsKLQkJCWludCBtb2RpZmllcnMgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsKLQkJCVN0cmluZyBtb2RpZmllcnNTdHIgPSBNb2RpZmllci50b1N0cmluZyhtb2RpZmllcnMpOwotCQkJb3V0cHV0KCJcdCIpOwotCQkJb3V0cHV0KG1vZGlmaWVyc1N0cik7Ci0JCQlpZiAobW9kaWZpZXJzU3RyLmxlbmd0aCgpID4gMCkgb3V0cHV0KCIgIik7Ci0JCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTMoZmllbGQuZ2V0VHlwZSgpKSk7Ci0JCQlvdXRwdXQoIiAiICk7Ci0JCQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQkJCW91dHB1dCgiID0gIik7Ci0JCQlvdXRwdXQoZ2V0RmllbGRWYWx1ZShmaWVsZCkpOwotCQkJb3V0cHV0bG4oIjsiKTsKLQkJCXVzZWRDb3VudCsrOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCXVudXNlZENvdW50Kys7Ci0vLwlvdXRwdXQoIk5PVCBVU0VEPSIgKyBmaWVsZC50b1N0cmluZygpICsgIiBcbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JaWYgKGFyZ3MubGVuZ3RoIDwgMikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBqYXZhIENsZWFudXBDb25zdGFudHMgPE9TIGNsYXNzTmFtZT4gPHNyYyBwYXRoPiA8Y2xhc3Mgc291cmNlPiIpOwotCQlyZXR1cm47Ci0JfQotCXRyeSB7Ci0JCUNsZWFudXBDb25zdGFudHMgZ2VuID0gbmV3IENsZWFudXBDb25zdGFudHMoKTsKLQkJU3RyaW5nIGNsYXp6TmFtZSA9IGFyZ3NbMF07Ci0JCVN0cmluZ1tdIHNvdXJjZVBhdGggPSBuZXcgU3RyaW5nW117YXJnc1sxXX07Ci0JCVN0cmluZyBjbGFzc1NvdXJjZSA9IGFyZ3NbMl07Ci0JCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGF6ek5hbWUpOwotCQlnZW4uc2V0U291cmNlUGF0aChzb3VyY2VQYXRoKTsKLQkJZ2VuLnNldENsYXNzU291cmNlUGF0aChjbGFzc1NvdXJjZSk7Ci0JCWdlbi5nZW5lcmF0ZShjbGF6eik7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsZWFudXBOYXRpdmVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ2xlYW51cE5hdGl2ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5ZGZjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ2xlYW51cE5hdGl2ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotcHVibGljIGNsYXNzIENsZWFudXBOYXRpdmVzIGV4dGVuZHMgQ2xlYW51cENsYXNzIHsKLQkKLXB1YmxpYyBDbGVhbnVwTmF0aXZlcygpIHsKLX0KLQotU3RyaW5nW10gZ2V0QXJnTmFtZXMoTWV0aG9kIG1ldGhvZCkgewotCWludCBuX2FyZ3MgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGg7Ci0JaWYgKG5fYXJncyA9PSAwKSByZXR1cm4gbmV3IFN0cmluZ1swXTsKLQlTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0JU3RyaW5nIHBhcmFtcyA9ICIiOwotCWludCBpbmRleCA9IDA7Ci0Jd2hpbGUgKHRydWUpIHsKLQkJaW5kZXggPSBjbGFzc1NvdXJjZS5pbmRleE9mKG5hbWUsIGluZGV4ICsgMSk7Ci0JCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuIG51bGw7Ci0JCWludCBwYXJhbnRlc2VzU3RhcnQgPSBjbGFzc1NvdXJjZS5pbmRleE9mKCIoIiwgaW5kZXgpOwotCQlpZiAoY2xhc3NTb3VyY2Uuc3Vic3RyaW5nKGluZGV4ICsgbmFtZS5sZW5ndGgoKSwgcGFyYW50ZXNlc1N0YXJ0KS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJaW50IHBhcmFudGVzZXNFbmQgPSBjbGFzc1NvdXJjZS5pbmRleE9mKCIpIiwgcGFyYW50ZXNlc1N0YXJ0KTsKLSAJCQlwYXJhbXMgPSBjbGFzc1NvdXJjZS5zdWJzdHJpbmcocGFyYW50ZXNlc1N0YXJ0ICsgMSwgcGFyYW50ZXNlc0VuZCk7Ci0gCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW25fYXJnc107Ci0JU3RyaW5nVG9rZW5pemVyIHRrID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXJhbXMsICIsIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQlTdHJpbmcgcyA9IHRrLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRrMSA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocywgIiAiKTsKLQkJU3RyaW5nIHMxID0gbnVsbDsKLQkJd2hpbGUgKHRrMS5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCXMxID0gdGsxLm5leHRUb2tlbigpOwotCQl9Ci0JCW5hbWVzW2ldID0gczEudHJpbSgpOwotCX0KLQlyZXR1cm4gbmFtZXM7CQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShDbGFzcyBjbGF6eikgewotCXVudXNlZENvdW50ID0gdXNlZENvdW50ID0gMDsKLQlzdXBlci5nZW5lcmF0ZShjbGF6eik7Ci0JTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCWdlbmVyYXRlKG1ldGhvZHMpOwotCW91dHB1dCgidXNlZD0iICsgdXNlZENvdW50ICsgIiB1bnVzZWQ9IiArIHVudXNlZENvdW50ICsgIiB0b3RhbD0iICsgKHVudXNlZENvdW50ICsgdXNlZENvdW50KSk7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKE1ldGhvZFtdIG1ldGhvZHMpIHsKLQlzb3J0KG1ldGhvZHMpOwkKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSBjb250aW51ZTsKLQkJZ2VuZXJhdGUobWV0aG9kKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKE1ldGhvZCBtZXRob2QpIHsKLQlTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0JRW51bWVyYXRpb24ga2V5cyA9IGZpbGVzLmtleXMoKTsKLQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlPYmplY3Qga2V5ID0ga2V5cy5uZXh0RWxlbWVudCgpOwotCQlTdHJpbmcgc3RyID0gKFN0cmluZylmaWxlcy5nZXQoa2V5KTsKLQkJaWYgKHN0ci5pbmRleE9mKG5hbWUpICE9IC0xKSB7Ci0JCQlpbnQgbW9kaWZpZXJzID0gbWV0aG9kLmdldE1vZGlmaWVycygpOwotCQkJQ2xhc3MgY2xhenogPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQkJCVN0cmluZyBtb2RpZmllcnNTdHIgPSBNb2RpZmllci50b1N0cmluZyhtb2RpZmllcnMpOwotCQkJb3V0cHV0KG1vZGlmaWVyc1N0cik7Ci0JCQlpZiAobW9kaWZpZXJzU3RyLmxlbmd0aCgpID4gMCkgb3V0cHV0KCIgIik7Ci0JCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTMobWV0aG9kLmdldFJldHVyblR5cGUoKSkpOwotCQkJb3V0cHV0KCIgIiApOwotCQkJb3V0cHV0KG1ldGhvZC5nZXROYW1lKCkpOwotCQkJb3V0cHV0KCIoIik7Ci0JCQlDbGFzc1tdIHBhcmFtVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCVN0cmluZ1tdIHBhcmFtTmFtZXMgPSBnZXRBcmdOYW1lcyhtZXRob2QpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJCQlpZiAoaSAhPSAwKSBvdXRwdXQoIiwgIik7Ci0JCQkJU3RyaW5nIHNpZyA9IGdldFR5cGVTaWduYXR1cmUzKHBhcmFtVHlwZSk7Ci0JCQkJaWYgKGNsYXp6LmdldFBhY2thZ2UoKS5lcXVhbHMocGFyYW1UeXBlLmdldFBhY2thZ2UoKSkpIHNpZyA9IGdldENsYXNzTmFtZShwYXJhbVR5cGUpOwotCQkJCW91dHB1dChzaWcpOwotCQkJCW91dHB1dCgiICIpOwotCQkJCW91dHB1dChwYXJhbU5hbWVzW2ldKTsKLQkJCX0KLQkJCW91dHB1dGxuKCIpOyIpOwotCQkJdXNlZENvdW50Kys7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JdW51c2VkQ291bnQrKzsKLS8vCW91dHB1dCgiTk9UIFVTRUQ9IiArIG1ldGhvZC50b1N0cmluZygpICsgIlxuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlpZiAoYXJncy5sZW5ndGggPCAyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGphdmEgQ2xlYW51cE5hdGl2ZXMgPE9TIGNsYXNzTmFtZT4gPHNyYyBwYXRoPiA8Y2xhc3Mgc291cmNlPiIpOwotCQlyZXR1cm47Ci0JfQotCXRyeSB7Ci0JCUNsZWFudXBOYXRpdmVzIGdlbiA9IG5ldyBDbGVhbnVwTmF0aXZlcygpOwotCQlTdHJpbmcgY2xhenpOYW1lID0gYXJnc1swXTsKLQkJU3RyaW5nW10gc291cmNlUGF0aCA9IG5ldyBTdHJpbmdbXXthcmdzWzFdfTsKLQkJU3RyaW5nIGNsYXNzU291cmNlID0gYXJnc1syXTsgCi0JCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGF6ek5hbWUpOwotCQlnZW4uc2V0U291cmNlUGF0aChzb3VyY2VQYXRoKTsKLQkJZ2VuLnNldENsYXNzU291cmNlUGF0aChjbGFzc1NvdXJjZSk7Ci0JCWdlbi5nZW5lcmF0ZShjbGF6eik7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NvbnN0YW50c0dlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NvbnN0YW50c0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmYzZDEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9Db25zdGFudHNHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1wdWJsaWMgY2xhc3MgQ29uc3RhbnRzR2VuZXJhdG9yIGV4dGVuZHMgSk5JR2VuZXJhdG9yIHsKLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoQ2xhc3MgY2xhenopIHsKLQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JZ2VuZXJhdGUoZmllbGRzKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoRmllbGRbXSBmaWVsZHMpIHsKLQlzb3J0KGZpZWxkcyk7Ci0Jb3V0cHV0bG4oImludCBtYWluKCkgeyIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwotCQlpZiAoKGZpZWxkLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuRklOQUwpID09IDApIGNvbnRpbnVlOwotCQlnZW5lcmF0ZShmaWVsZCk7Ci0JfQotCW91dHB1dGxuKCJ9Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEZpZWxkIGZpZWxkKSB7Ci0JQ2xhc3MgdHlwZSA9IGZpZWxkLmdldFR5cGUoKTsKLQlvdXRwdXQoIlx0cHJpbnRmKFwicHVibGljIHN0YXRpYyBmaW5hbCAiKTsKLQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTMoZmllbGQuZ2V0VHlwZSgpKSk7Ci0Jb3V0cHV0KCIgIik7Ci0Jb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0Jb3V0cHV0KCIgPSAiKTsKLQlpZiAodHlwZSA9PSBTdHJpbmcuY2xhc3MgfHwgdHlwZSA9PSBieXRlW10uY2xhc3MpIG91dHB1dCgiXCIlc1wiIik7Ci0JZWxzZSBvdXRwdXQoIjB4JXgiKTsKLQlvdXRwdXQoIjtcXG5cIiwgIik7Ci0Jb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0Jb3V0cHV0bG4oIik7Iik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlpZiAoYXJncy5sZW5ndGggPCAxKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGphdmEgQ29uc3RhbnRzR2VuZXJhdG9yIDxjbGFzc05hbWUxPiA8Y2xhc3NOYW1lMj4iKTsKLQkJcmV0dXJuOwotCX0KLQl0cnkgewotCQlDb25zdGFudHNHZW5lcmF0b3IgZ2VuID0gbmV3IENvbnN0YW50c0dlbmVyYXRvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBjbGF6ek5hbWUgPSBhcmdzW2ldOwotCQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXp6TmFtZSk7Ci0JCQlnZW4uZ2VuZXJhdGUoY2xhenopOwotCQl9Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0ZpZWxkRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0ZpZWxkRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjI4ODU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9GaWVsZERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLQotcHVibGljIGNsYXNzIEZpZWxkRGF0YSBleHRlbmRzIEl0ZW1EYXRhIHsKLQkKLQlGaWVsZCBmaWVsZDsKLQkKLXB1YmxpYyBGaWVsZERhdGEoRmllbGQgZmllbGQsIFN0cmluZyBzdHIpIHsKLQlzdXBlcihzdHIpOwotCXRoaXMuZmllbGQgPSBmaWVsZDsKLX0KLQotcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRBbGxGbGFncygpIHsKLQlyZXR1cm4gbmV3IFN0cmluZ1tdeyJub19nZW4iLCAibm9fd2luY2UifTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRBY2Nlc3NvcigpIHsKLQlyZXR1cm4gKFN0cmluZylnZXRQYXJhbSgiYWNjZXNzb3IiKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXN0KCkgewotCVN0cmluZyBjYXN0ID0gKChTdHJpbmcpZ2V0UGFyYW0oImNhc3QiKSkudHJpbSgpOwotCWlmIChjYXN0Lmxlbmd0aCgpID4gMCkgewotCQlpZiAoIWNhc3Quc3RhcnRzV2l0aCgiKCIpKSBjYXN0ID0gIigiICsgY2FzdDsKLQkJaWYgKCFjYXN0LmVuZHNXaXRoKCIpIikpIGNhc3QgPSBjYXN0ICsgIikiOwotCX0KLQlyZXR1cm4gY2FzdDsKLX0KLQotcHVibGljIFN0cmluZyBnZXRFeGNsdWRlKCkgewotCXJldHVybiAoU3RyaW5nKWdldFBhcmFtKCJleGNsdWRlIik7Ci19Ci0KLXB1YmxpYyBGaWVsZCBnZXRGaWVsZCgpIHsKLQlyZXR1cm4gZmllbGQ7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEFjY2Vzc29yKFN0cmluZyBzdHIpIHsgCi0Jc2V0UGFyYW0oImFjY2Vzc29yIiwgc3RyKTsKLX0KLQotcHVibGljIHZvaWQgc2V0Q2FzdChTdHJpbmcgc3RyKSB7Ci0Jc2V0UGFyYW0oImNhc3QiLCBzdHIpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRFeGNsdWRlKFN0cmluZyBzdHIpIHsgCi0Jc2V0UGFyYW0oImV4Y2x1ZGUiLCBzdHIpOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvSXRlbURhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9JdGVtRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODcwNDA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9JdGVtRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSXRlbURhdGEgewotCi0JSGFzaE1hcCBwYXJhbXM7Ci0KLXB1YmxpYyBJdGVtRGF0YShTdHJpbmcgc3RyKSB7Ci0JcGFyc2Uoc3RyKTsKLX0KLQotc3RhdGljIFN0cmluZ1tdIHNwbGl0KFN0cmluZyBzdHIsIFN0cmluZyBzZXBhcmF0b3IpIHsKLQlTdHJpbmdUb2tlbml6ZXIgdGsgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0ciwgc2VwYXJhdG9yKTsKLQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCXdoaWxlICh0ay5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlyZXN1bHQuYWRkKHRrLm5leHRFbGVtZW50KCkpOwotCX0KLQlyZXR1cm4gKFN0cmluZ1tdKXJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOwotfQotCi1wdWJsaWMgU3RyaW5nW10gZ2V0RmxhZ3MoKSB7Ci0JT2JqZWN0IGZsYWdzID0gZ2V0UGFyYW0oImZsYWdzIik7Ci0JaWYgKGZsYWdzID09IG51bGwpIHJldHVybiBuZXcgU3RyaW5nWzBdOwotCWlmIChmbGFncyBpbnN0YW5jZW9mIFN0cmluZ1tdKSByZXR1cm4gKFN0cmluZ1tdKWZsYWdzOwotCVN0cmluZ1tdIHJlc3VsdCA9IHNwbGl0KChTdHJpbmcpZmxhZ3MsICIgIik7Ci0JcGFyYW1zLnB1dCgiZmxhZ3MiLCByZXN1bHQpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGdldEZsYWcoU3RyaW5nIGZsYWcpIHsKLQlTdHJpbmdbXSBmbGFncyA9IGdldEZsYWdzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgewotCQlpZiAoZmxhZ3NbaV0uZXF1YWxzKGZsYWcpKSByZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1wdWJsaWMgT2JqZWN0IGdldFBhcmFtKFN0cmluZyBrZXkpIHsKLQlPYmplY3QgdmFsdWUgPSBwYXJhbXMuZ2V0KGtleSk7Ci0JcmV0dXJuIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlOwotfQotCi1wdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZSgpIHsKLQlyZXR1cm4gIWdldEZsYWcoIm5vX2dlbiIpOwotfQotCi1wdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgc3RyKSB7Ci0JdGhpcy5wYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCWlmIChzdHIubGVuZ3RoKCkgPT0gMCkgcmV0dXJuOwotCVN0cmluZ1tdIHBhcmFtcyA9IHNwbGl0KHN0ciwgIiwiKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotCQlTdHJpbmcgcGFyYW0gPSBwYXJhbXNbaV07Ci0JCWludCBlcXVhbHMgPSBwYXJhbS5pbmRleE9mKCc9Jyk7Ci0JCWlmIChlcXVhbHMgPT0gIC0xKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiAiICsgc3RyICsgIiBwYXJhbSAiICsgcGFyYW0pOwotCQl9Ci0JCVN0cmluZyBrZXkgPSBwYXJhbS5zdWJzdHJpbmcoMCwgZXF1YWxzKS50cmltKCk7Ci0JCVN0cmluZyB2YWx1ZSA9IHBhcmFtLnN1YnN0cmluZyhlcXVhbHMgKyAxKS50cmltKCk7Ci0JCXNldFBhcmFtKGtleSwgdmFsdWUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgc2V0RmxhZ3MoU3RyaW5nW10gZmxhZ3MpIHsgCi0Jc2V0UGFyYW0oImZsYWdzIiwgZmxhZ3MpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRGbGFnKFN0cmluZyBmbGFnLCBib29sZWFuIHZhbHVlKSB7Ci0JU3RyaW5nW10gZmxhZ3MgPSBnZXRGbGFncygpOwotCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChmbGFncykpOwotCWlmICh2YWx1ZSkgewotCQlzZXQuYWRkKGZsYWcpOwotCX0gZWxzZSB7Ci0JCXNldC5yZW1vdmUoZmxhZyk7Ci0JfQotCXNldEZsYWdzKChTdHJpbmdbXSlzZXQudG9BcnJheShuZXcgU3RyaW5nW3NldC5zaXplKCldKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlKGJvb2xlYW4gdmFsdWUpIHsKLQlzZXRGbGFnKCJub19nZW4iLCAhdmFsdWUpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRQYXJhbShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLQlwYXJhbXMucHV0KGtleSwgdmFsdWUpOwotfQotCi1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JU2V0IHNldCA9IHBhcmFtcy5rZXlTZXQoKTsKLQlTdHJpbmdbXSBrZXlzID0gKFN0cmluZ1tdKXNldC50b0FycmF5KG5ldyBTdHJpbmdbc2V0LnNpemUoKV0pOwotCUFycmF5cy5zb3J0KGtleXMpOwotCWZvciAoaW50IGogPSAwOyBqIDwga2V5cy5sZW5ndGg7IGorKykgewotCQlTdHJpbmcga2V5ID0ga2V5c1tqXTsKLQkJT2JqZWN0IHZhbHVlID0gcGFyYW1zLmdldChrZXkpOwotCQlTdHJpbmcgdmFsdWVTdHIgPSAiIjsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQl2YWx1ZVN0ciA9IChTdHJpbmcpdmFsdWU7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmdbXSkgewotCQkJU3RyaW5nW10gdmFsdWVzID0gKFN0cmluZ1tdKXZhbHVlOwotCQkJU3RyaW5nQnVmZmVyIHZhbHVlQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKSB2YWx1ZUJ1ZmZlci5hcHBlbmQoIiAiKTsKLQkJCQl2YWx1ZUJ1ZmZlci5hcHBlbmQodmFsdWVzW2ldKTsKLQkJCX0KLQkJCXZhbHVlU3RyID0gdmFsdWVCdWZmZXIudG9TdHJpbmcoKTsKLQkJfSBlbHNlIHsKLQkJCXZhbHVlU3RyID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAodmFsdWVTdHIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAoYnVmZmVyLmxlbmd0aCgpICE9IDApIGJ1ZmZlci5hcHBlbmQoIiwiKTsKLQkJCWJ1ZmZlci5hcHBlbmQoa2V5KTsKLQkJCWJ1ZmZlci5hcHBlbmQoIj0iKTsKLQkJCWJ1ZmZlci5hcHBlbmQodmFsdWVTdHIpOwotCQl9Ci0JfQotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmZjMGUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSk5JR2VuZXJhdG9yIHsKLQotCUNsYXNzIG1haW5DbGFzczsKLQlDbGFzc1tdIGNsYXNzZXM7Ci0JTWV0YURhdGEgbWV0YURhdGE7Ci0JYm9vbGVhbiBpc0NQUDsKLQlTdHJpbmcgZGVsaW1pdGVyOwotCVByaW50U3RyZWFtIG91dHB1dDsKLQlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3M7Ci0KLXB1YmxpYyBKTklHZW5lcmF0b3IoKSB7Ci0JZGVsaW1pdGVyID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCW91dHB1dCA9IFN5c3RlbS5vdXQ7Ci0JbWV0YURhdGEgPSBuZXcgTWV0YURhdGEobmV3IFByb3BlcnRpZXMoKSk7Ci19Ci0KLVN0cmluZyBmaXhEZWxpbWl0ZXIoU3RyaW5nIHN0cikgewotCWlmIChkZWxpbWl0ZXIuZXF1YWxzKCJcbiIpKSByZXR1cm4gc3RyOwotCWludCBpbmRleCA9IDAsIGxlbmd0aCA9IHN0ci5sZW5ndGgoKTsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQlpbnQgc3RhcnQgPSBpbmRleDsKLQkJaW5kZXggPSBzdHIuaW5kZXhPZignXG4nLCBzdGFydCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJYnVmZmVyLmFwcGVuZChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBsZW5ndGgpKTsKLQkJfSBlbHNlIHsKLQkJCWJ1ZmZlci5hcHBlbmQoc3RyLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW1pdGVyKTsKLQkJCWluZGV4Kys7Ci0JCX0KLQl9Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotCi1zdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZShDbGFzcyBjbGF6eikgewotCVN0cmluZyBuYW1lID0gY2xhenouZ2V0TmFtZSgpOwotCWludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKSArIDE7Ci0JcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGluZGV4LCBuYW1lLmxlbmd0aCgpKTsKLX0KLQotc3RhdGljIFN0cmluZyBnZXRGdW5jdGlvbk5hbWUoTWV0aG9kIG1ldGhvZCkgewotCXJldHVybiBnZXRGdW5jdGlvbk5hbWUobWV0aG9kLCBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci19Ci0KLXN0YXRpYyBTdHJpbmcgZ2V0RnVuY3Rpb25OYW1lKE1ldGhvZCBtZXRob2QsIENsYXNzW10gcGFyYW1UeXBlcykgewotCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSByZXR1cm4gbWV0aG9kLmdldE5hbWUoKTsKLQlTdHJpbmcgZnVuY3Rpb24gPSB0b0MobWV0aG9kLmdldE5hbWUoKSk7Ci0JaWYgKCFpc05hdGl2ZVVuaXF1ZShtZXRob2QpKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZnVuY3Rpb24pOwotCQlidWZmZXIuYXBwZW5kKCJfXyIpOwotCQlpZiAocGFyYW1UeXBlcy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQkJCWJ1ZmZlci5hcHBlbmQodG9DKGdldFR5cGVTaWduYXR1cmUocGFyYW1UeXBlKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JcmV0dXJuIGZ1bmN0aW9uOwotfQotCi1zdGF0aWMgaW50IGdldEJ5dGVDb3VudChDbGFzcyBjbGF6eikgewotCWlmIChjbGF6eiA9PSBJbnRlZ2VyLlRZUEUpIHJldHVybiA0OwotCWlmIChjbGF6eiA9PSBCb29sZWFuLlRZUEUpIHJldHVybiA0OwotCWlmIChjbGF6eiA9PSBMb25nLlRZUEUpIHJldHVybiA4OwotCWlmIChjbGF6eiA9PSBTaG9ydC5UWVBFKSByZXR1cm4gMjsKLQlpZiAoY2xhenogPT0gQ2hhcmFjdGVyLlRZUEUpIHJldHVybiAyOwotCWlmIChjbGF6eiA9PSBCeXRlLlRZUEUpIHJldHVybiAxOwotCWlmIChjbGF6eiA9PSBGbG9hdC5UWVBFKSByZXR1cm4gNDsKLQlpZiAoY2xhenogPT0gRG91YmxlLlRZUEUpIHJldHVybiA4OwotCXJldHVybiA0OwotfQotCi1zdGF0aWMgU3RyaW5nIGdldFR5cGVTaWduYXR1cmUoQ2xhc3MgY2xhenopIHsKLQlpZiAoY2xhenogPT0gVm9pZC5UWVBFKSByZXR1cm4gIlYiOwotCWlmIChjbGF6eiA9PSBJbnRlZ2VyLlRZUEUpIHJldHVybiAiSSI7Ci0JaWYgKGNsYXp6ID09IEJvb2xlYW4uVFlQRSkgcmV0dXJuICJaIjsKLQlpZiAoY2xhenogPT0gTG9uZy5UWVBFKSByZXR1cm4gIkoiOwotCWlmIChjbGF6eiA9PSBTaG9ydC5UWVBFKSByZXR1cm4gIlMiOwotCWlmIChjbGF6eiA9PSBDaGFyYWN0ZXIuVFlQRSkgcmV0dXJuICJDIjsKLQlpZiAoY2xhenogPT0gQnl0ZS5UWVBFKSByZXR1cm4gIkIiOwotCWlmIChjbGF6eiA9PSBGbG9hdC5UWVBFKSByZXR1cm4gIkYiOwotCWlmIChjbGF6eiA9PSBEb3VibGUuVFlQRSkgcmV0dXJuICJEIjsKLQlpZiAoY2xhenogPT0gU3RyaW5nLmNsYXNzKSByZXR1cm4gIkxqYXZhL2xhbmcvU3RyaW5nOyI7Ci0JaWYgKGNsYXp6LmlzQXJyYXkoKSkgewotCQlDbGFzcyBjb21wb25lbnRUeXBlID0gY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpOwotCQlyZXR1cm4gIlsiICsgZ2V0VHlwZVNpZ25hdHVyZShjb21wb25lbnRUeXBlKTsKLQl9Ci0JcmV0dXJuICJMIiArIGNsYXp6LmdldE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICI7IjsKLX0KLQotc3RhdGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlMShDbGFzcyBjbGF6eikgewotCWlmIChjbGF6eiA9PSBWb2lkLlRZUEUpIHJldHVybiAiVm9pZCI7Ci0JaWYgKGNsYXp6ID09IEludGVnZXIuVFlQRSkgcmV0dXJuICJJbnQiOwotCWlmIChjbGF6eiA9PSBCb29sZWFuLlRZUEUpIHJldHVybiAiQm9vbGVhbiI7Ci0JaWYgKGNsYXp6ID09IExvbmcuVFlQRSkgcmV0dXJuICJMb25nIjsKLQlpZiAoY2xhenogPT0gU2hvcnQuVFlQRSkgcmV0dXJuICJTaG9ydCI7Ci0JaWYgKGNsYXp6ID09IENoYXJhY3Rlci5UWVBFKSByZXR1cm4gIkNoYXIiOwotCWlmIChjbGF6eiA9PSBCeXRlLlRZUEUpIHJldHVybiAiQnl0ZSI7Ci0JaWYgKGNsYXp6ID09IEZsb2F0LlRZUEUpIHJldHVybiAiRmxvYXQiOwotCWlmIChjbGF6eiA9PSBEb3VibGUuVFlQRSkgcmV0dXJuICJEb3VibGUiOwotCWlmIChjbGF6eiA9PSBTdHJpbmcuY2xhc3MpIHJldHVybiAiU3RyaW5nIjsKLQlyZXR1cm4gIk9iamVjdCI7Ci19Ci0KLXN0YXRpYyBTdHJpbmcgZ2V0VHlwZVNpZ25hdHVyZTIoQ2xhc3MgY2xhenopIHsKLQlpZiAoY2xhenogPT0gVm9pZC5UWVBFKSByZXR1cm4gInZvaWQiOwotCWlmIChjbGF6eiA9PSBJbnRlZ2VyLlRZUEUpIHJldHVybiAiamludCI7Ci0JaWYgKGNsYXp6ID09IEJvb2xlYW4uVFlQRSkgcmV0dXJuICJqYm9vbGVhbiI7Ci0JaWYgKGNsYXp6ID09IExvbmcuVFlQRSkgcmV0dXJuICJqbG9uZyI7Ci0JaWYgKGNsYXp6ID09IFNob3J0LlRZUEUpIHJldHVybiAianNob3J0IjsKLQlpZiAoY2xhenogPT0gQ2hhcmFjdGVyLlRZUEUpIHJldHVybiAiamNoYXIiOwotCWlmIChjbGF6eiA9PSBCeXRlLlRZUEUpIHJldHVybiAiamJ5dGUiOwotCWlmIChjbGF6eiA9PSBGbG9hdC5UWVBFKSByZXR1cm4gImpmbG9hdCI7Ci0JaWYgKGNsYXp6ID09IERvdWJsZS5UWVBFKSByZXR1cm4gImpkb3VibGUiOwotCWlmIChjbGF6eiA9PSBTdHJpbmcuY2xhc3MpIHJldHVybiAianN0cmluZyI7Ci0JaWYgKGNsYXp6ID09IENsYXNzLmNsYXNzKSByZXR1cm4gImpjbGFzcyI7Ci0JaWYgKGNsYXp6LmlzQXJyYXkoKSkgewotCQlDbGFzcyBjb21wb25lbnRUeXBlID0gY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpOwotCQlyZXR1cm4gZ2V0VHlwZVNpZ25hdHVyZTIoY29tcG9uZW50VHlwZSkgKyAiQXJyYXkiOwotCX0KLQlyZXR1cm4gImpvYmplY3QiOwotfQotCi1zdGF0aWMgU3RyaW5nIGdldFR5cGVTaWduYXR1cmUzKENsYXNzIGNsYXp6KSB7Ci0JaWYgKGNsYXp6ID09IFZvaWQuVFlQRSkgcmV0dXJuICJ2b2lkIjsKLQlpZiAoY2xhenogPT0gSW50ZWdlci5UWVBFKSByZXR1cm4gImludCI7Ci0JaWYgKGNsYXp6ID09IEJvb2xlYW4uVFlQRSkgcmV0dXJuICJib29sZWFuIjsKLQlpZiAoY2xhenogPT0gTG9uZy5UWVBFKSByZXR1cm4gImxvbmciOwotCWlmIChjbGF6eiA9PSBTaG9ydC5UWVBFKSByZXR1cm4gInNob3J0IjsKLQlpZiAoY2xhenogPT0gQ2hhcmFjdGVyLlRZUEUpIHJldHVybiAiY2hhciI7Ci0JaWYgKGNsYXp6ID09IEJ5dGUuVFlQRSkgcmV0dXJuICJieXRlIjsKLQlpZiAoY2xhenogPT0gRmxvYXQuVFlQRSkgcmV0dXJuICJmbG9hdCI7Ci0JaWYgKGNsYXp6ID09IERvdWJsZS5UWVBFKSByZXR1cm4gImRvdWJsZSI7Ci0JaWYgKGNsYXp6ID09IFN0cmluZy5jbGFzcykgcmV0dXJuICJTdHJpbmciOwotCWlmIChjbGF6ei5pc0FycmF5KCkpIHsKLQkJQ2xhc3MgY29tcG9uZW50VHlwZSA9IGNsYXp6LmdldENvbXBvbmVudFR5cGUoKTsKLQkJcmV0dXJuIGdldFR5cGVTaWduYXR1cmUzKGNvbXBvbmVudFR5cGUpICsgIltdIjsKLQl9Ci0JcmV0dXJuIGNsYXp6LmdldE5hbWUoKTsKLX0KLQotc3RhdGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlNChDbGFzcyBjbGF6eikgewotCWlmIChjbGF6eiA9PSBWb2lkLlRZUEUpIHJldHVybiAidm9pZCI7Ci0JaWYgKGNsYXp6ID09IEludGVnZXIuVFlQRSkgcmV0dXJuICJqaW50IjsKLQlpZiAoY2xhenogPT0gQm9vbGVhbi5UWVBFKSByZXR1cm4gImpib29sZWFuIjsKLQlpZiAoY2xhenogPT0gTG9uZy5UWVBFKSByZXR1cm4gImpsb25nIjsKLQlpZiAoY2xhenogPT0gU2hvcnQuVFlQRSkgcmV0dXJuICJqc2hvcnQiOwotCWlmIChjbGF6eiA9PSBDaGFyYWN0ZXIuVFlQRSkgcmV0dXJuICJqY2hhciI7Ci0JaWYgKGNsYXp6ID09IEJ5dGUuVFlQRSkgcmV0dXJuICJqYnl0ZSI7Ci0JaWYgKGNsYXp6ID09IEZsb2F0LlRZUEUpIHJldHVybiAiamZsb2F0IjsKLQlpZiAoY2xhenogPT0gRG91YmxlLlRZUEUpIHJldHVybiAiamRvdWJsZSI7Ci0JaWYgKGNsYXp6ID09IFN0cmluZy5jbGFzcykgcmV0dXJuICJqc3RyaW5nIjsKLQlpZiAoY2xhenouaXNBcnJheSgpKSB7Ci0JCUNsYXNzIGNvbXBvbmVudFR5cGUgPSBjbGF6ei5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCXJldHVybiBnZXRUeXBlU2lnbmF0dXJlNChjb21wb25lbnRUeXBlKSArICIgKiI7Ci0JfQotCXJldHVybiBnZXRDbGFzc05hbWUoY2xhenopICsgIiAqIjsKLX0KLQotc3RhdGljIEhhc2hNYXAgdW5pcXVlQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotc3RhdGljIENsYXNzIHVuaXF1ZUNsYXNzQ2FjaGU7Ci1zdGF0aWMgTWV0aG9kW10gdW5pcXVlTWV0aG9kc0NhY2hlOwotc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzTmF0aXZlVW5pcXVlKE1ldGhvZCBtZXRob2QpIHsKLQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgPT0gMCkgcmV0dXJuIGZhbHNlOwotCU9iamVjdCB1bmlxdWUgPSB1bmlxdWVDYWNoZS5nZXQobWV0aG9kKTsKLQlpZiAodW5pcXVlICE9IG51bGwpIHJldHVybiAoKEJvb2xlYW4pdW5pcXVlKS5ib29sZWFuVmFsdWUoKTsKLQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JTWV0aG9kW10gbWV0aG9kczsKLQlTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0JQ2xhc3MgY2xhenogPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQlpZiAoY2xhenouZXF1YWxzKHVuaXF1ZUNsYXNzQ2FjaGUpKSB7Ci0JCW1ldGhvZHMgPSB1bmlxdWVNZXRob2RzQ2FjaGU7Ci0JfSBlbHNlIHsKLQkJbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCQl1bmlxdWVDbGFzc0NhY2hlID0gY2xheno7Ci0JCXVuaXF1ZU1ldGhvZHNDYWNoZSA9IG1ldGhvZHM7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQlNZXRob2QgbXRoID0gbWV0aG9kc1tpXTsKLQkJaWYgKChtdGguZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpICE9IDAgJiYKLQkJCW1ldGhvZCAhPSBtdGggJiYgIW1ldGhvZC5lcXVhbHMobXRoKSAmJgotCQkJbmFtZS5lcXVhbHMobXRoLmdldE5hbWUoKSkpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JfQotCXVuaXF1ZUNhY2hlLnB1dChtZXRob2QsIG5ldyBCb29sZWFuKHJlc3VsdCkpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHNvcnQoTWV0aG9kW10gbWV0aG9kcykgewotCUFycmF5cy5zb3J0KG1ldGhvZHMsIG5ldyBDb21wYXJhdG9yKCkgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQlNZXRob2QgbXRoMSA9IChNZXRob2QpYTsKLQkJCU1ldGhvZCBtdGgyID0gKE1ldGhvZCliOwotCQkJaW50IHJlc3VsdCA9IG10aDEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhtdGgyLmdldE5hbWUoKSk7Ci0JCQlyZXR1cm4gcmVzdWx0ICE9IDAgPyByZXN1bHQgOiBnZXRGdW5jdGlvbk5hbWUobXRoMSkuY29tcGFyZVRvKGdldEZ1bmN0aW9uTmFtZShtdGgyKSk7Ci0JCX0KLQl9KTsKLX0KLQotc3RhdGljIHZvaWQgc29ydChGaWVsZFtdIGZpZWxkcykgewotCUFycmF5cy5zb3J0KGZpZWxkcywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCXJldHVybiAoKEZpZWxkKWEpLmdldE5hbWUoKS5jb21wYXJlVG8oKChGaWVsZCliKS5nZXROYW1lKCkpOwotCQl9Ci0JfSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNvcnQoQ2xhc3NbXSBjbGFzc2VzKSB7Ci0JQXJyYXlzLnNvcnQoY2xhc3NlcywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCXJldHVybiAoKENsYXNzKWEpLmdldE5hbWUoKS5jb21wYXJlVG8oKChDbGFzcyliKS5nZXROYW1lKCkpOwotCQl9Ci0JfSk7CQotfQotCi1zdGF0aWMgU3RyaW5nIHRvQyhTdHJpbmcgc3RyKSB7Ci0JaW50IGxlbmd0aCA9IHN0ci5sZW5ndGgoKTsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKiAyKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCWNoYXIgYyA9IHN0ci5jaGFyQXQoaSk7Ci0JCXN3aXRjaCAoYykgewotCQkJY2FzZSAnXyc6IGJ1ZmZlci5hcHBlbmQoIl8xIik7IGJyZWFrOwotCQkJY2FzZSAnOyc6IGJ1ZmZlci5hcHBlbmQoIl8yIik7IGJyZWFrOwotCQkJY2FzZSAnWyc6IGJ1ZmZlci5hcHBlbmQoIl8zIik7IGJyZWFrOwotCQkJY2FzZSAnLic6IGJ1ZmZlci5hcHBlbmQoIl8iKTsgYnJlYWs7Ci0JCQljYXNlICcvJzogYnVmZmVyLmFwcGVuZCgiXyIpOyBicmVhazsKLQkJCWRlZmF1bHQ6IGJ1ZmZlci5hcHBlbmQoYyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZShDbGFzcyBjbGF6eik7Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29weXJpZ2h0KCkgewotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZUluY2x1ZGVzKCkgewotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHsKLQlpZiAoY2xhc3NlcyA9PSBudWxsKSByZXR1cm47Ci0JZ2VuZXJhdGVDb3B5cmlnaHQoKTsKLQlnZW5lcmF0ZUluY2x1ZGVzKCk7Ci0Jc29ydChjbGFzc2VzKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJQ2xhc3MgY2xhenogPSBjbGFzc2VzW2ldOwotCQlDbGFzc0RhdGEgZGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEoY2xhenopOwotCQlpZiAoZGF0YS5nZXRGbGFnKCJjcHAiKSkgewotCQkJaXNDUFAgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCUNsYXNzIGNsYXp6ID0gY2xhc3Nlc1tpXTsKLQkJaWYgKGdldEdlbmVyYXRlKGNsYXp6KSkgZ2VuZXJhdGUoY2xhenopOwotCQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgcHJvZ3Jlc3Muc3RlcCgpOwotCX0KLQlvdXRwdXQuZmx1c2goKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGVNZXRhRGF0YShTdHJpbmcga2V5KSB7Ci0JTWV0YURhdGEgbXQgPSBnZXRNZXRhRGF0YSgpOwotCVN0cmluZyBkYXRhID0gbXQuZ2V0TWV0YURhdGEoa2V5LCBudWxsKTsKLQlpZiAoZGF0YSA9PSBudWxsKSByZXR1cm47Ci0JaWYgKGRhdGEubGVuZ3RoKCkgPT0gMCkgcmV0dXJuOwotCW91dHB1dGxuKGZpeERlbGltaXRlcihkYXRhKSk7Ci19Ci0KLXB1YmxpYyBDbGFzc1tdIGdldENsYXNzZXMoKSB7Ci0JcmV0dXJuIGNsYXNzZXM7Ci19Ci0KLXByb3RlY3RlZCBib29sZWFuIGdldEdlbmVyYXRlKENsYXNzIGNsYXp6KSB7Ci0JQ2xhc3NEYXRhIGRhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKGNsYXp6KTsKLQlyZXR1cm4gIWRhdGEuZ2V0RmxhZygibm9fZ2VuIik7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGdldENQUCgpIHsKLQlyZXR1cm4gaXNDUFA7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVsaW1pdGVyKCkgewotCXJldHVybiBkZWxpbWl0ZXI7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCXJldHVybiBnZXRDUFAoKSA/ICIuY3BwIiA6ICIuYyI7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JcmV0dXJuIGdldE91dHB1dE5hbWUoKSArIGdldFN1ZmZpeCgpICsgZ2V0RXh0ZW5zaW9uKCk7Ci19Ci0KLXB1YmxpYyBQcmludFN0cmVhbSBnZXRPdXRwdXQoKSB7Ci0JcmV0dXJuIG91dHB1dDsKLX0KLQotcHVibGljIFN0cmluZyBnZXRPdXRwdXROYW1lKCkgewotCXJldHVybiBnZXRDbGFzc05hbWUoZ2V0TWFpbkNsYXNzKCkpLnRvTG93ZXJDYXNlKCk7Ci19Ci0KLXB1YmxpYyBDbGFzcyBnZXRNYWluQ2xhc3MoKSB7Ci0JcmV0dXJuIG1haW5DbGFzczsKLX0KLQotcHVibGljIE1ldGFEYXRhIGdldE1ldGFEYXRhKCkgewotCXJldHVybiBtZXRhRGF0YTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRQbGF0Zm9ybSgpIHsKLQlyZXR1cm4gU1dULmdldFBsYXRmb3JtKCk7Ci19Ci0KLXB1YmxpYyBQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCXJldHVybiBwcm9ncmVzczsKLX0KLQotcHVibGljIFN0cmluZyBnZXRTdWZmaXgoKSB7Ci0JcmV0dXJuICIiOwotfQotCi1wdWJsaWMgdm9pZCBvdXRwdXQoU3RyaW5nIHN0cikgewotCW91dHB1dC5wcmludChzdHIpOwotfQotCi1wdWJsaWMgdm9pZCBvdXRwdXRsbigpIHsKLQlvdXRwdXQoZ2V0RGVsaW1pdGVyKCkpOwotfQotCi1wdWJsaWMgdm9pZCBvdXRwdXRsbihTdHJpbmcgc3RyKSB7Ci0Jb3V0cHV0KHN0cik7Ci0Jb3V0cHV0KGdldERlbGltaXRlcigpKTsKLX0KLQotcHVibGljIHZvaWQgc2V0Q2xhc3NlcyhDbGFzc1tdIGNsYXNzZXMpIHsKLQl0aGlzLmNsYXNzZXMgPSBjbGFzc2VzOwotfQotCi1wdWJsaWMgdm9pZCBzZXREZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcikgewotCXRoaXMuZGVsaW1pdGVyID0gZGVsaW1pdGVyOwotfQotCi1wdWJsaWMgdm9pZCBzZXRNYWluQ2xhc3MoQ2xhc3MgbWFpbkNsYXNzKSB7Ci0JdGhpcy5tYWluQ2xhc3MgPSBtYWluQ2xhc3M7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKE1ldGFEYXRhIGRhdGEpIHsKLQltZXRhRGF0YSA9IGRhdGE7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE91dHB1dChQcmludFN0cmVhbSBvdXRwdXQpIHsKLQl0aGlzLm91dHB1dCA9IG91dHB1dDsKLX0KLQotcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKFByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgewotCXRoaXMucHJvZ3Jlc3MgPSBwcm9ncmVzczsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUdlbmVyYXRvckFwcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUdlbmVyYXRvckFwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTAyODNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklHZW5lcmF0b3JBcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1wdWJsaWMgY2xhc3MgSk5JR2VuZXJhdG9yQXBwIHsKLQotCUNsYXNzIG1haW5DbGFzczsKLQlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3M7Ci0JU3RyaW5nIG1haW5DbGFzc05hbWUsIG91dHB1dERpciwgY2xhc3NwYXRoOwotCU1ldGFEYXRhIG1ldGFEYXRhOwotCi1wdWJsaWMgSk5JR2VuZXJhdG9yQXBwKCkgewotfQotCi1wdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aCgpIHsKLQlyZXR1cm4gY2xhc3NwYXRoOwotfQotCi1wdWJsaWMgQ2xhc3MgZ2V0TWFpbkNsYXNzKCkgewotCXJldHVybiBtYWluQ2xhc3M7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0TWFpbkNsYXNzTmFtZSgpIHsKLQlyZXR1cm4gbWFpbkNsYXNzTmFtZTsKLX0KLQotcHVibGljIE1ldGFEYXRhIGdldE1ldGFEYXRhKCkgewotCXJldHVybiBtZXRhRGF0YTsKLX0KLQotU3RyaW5nIGdldE1ldGFEYXRhRGlyKCkgewotCXJldHVybiAiLi9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvIjsKLX0KLQotcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXIoKSB7Ci0JcmV0dXJuIG91dHB1dERpcjsKLX0KLQotdm9pZCBnZW5lcmF0ZVNUQVRTX0MoQ2xhc3NbXSBjbGFzc2VzKSB7Ci0JdHJ5IHsKLQkJU3RhdHNHZW5lcmF0b3IgZ2VuID0gbmV3IFN0YXRzR2VuZXJhdG9yKGZhbHNlKTsKLQkJZ2VuLnNldE1haW5DbGFzcyhtYWluQ2xhc3MpOwotCQlnZW4uc2V0Q2xhc3NlcyhjbGFzc2VzKTsKLQkJZ2VuLnNldE1ldGFEYXRhKG1ldGFEYXRhKTsKLQkJZ2VuLnNldFByb2dyZXNzTW9uaXRvcihwcm9ncmVzcyk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWdlbi5zZXRPdXRwdXQobmV3IFByaW50U3RyZWFtKG91dCkpOwotCQlnZW4uZ2VuZXJhdGUoKTsKLQkJaWYgKG91dC5zaXplKCkgPiAwKSBvdXRwdXQob3V0LnRvQnl0ZUFycmF5KCksIG91dHB1dERpciArIGdlbi5nZXRGaWxlTmFtZSgpKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlU1RBVFNfSChDbGFzc1tdIGNsYXNzZXMpIHsKLQl0cnkgewotCQlTdGF0c0dlbmVyYXRvciBnZW4gPSBuZXcgU3RhdHNHZW5lcmF0b3IodHJ1ZSk7Ci0JCWdlbi5zZXRNYWluQ2xhc3MobWFpbkNsYXNzKTsKLQkJZ2VuLnNldENsYXNzZXMoY2xhc3Nlcyk7Ci0JCWdlbi5zZXRNZXRhRGF0YShtZXRhRGF0YSk7Ci0JCWdlbi5zZXRQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3MpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlnZW4uc2V0T3V0cHV0KG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQkJZ2VuLmdlbmVyYXRlKCk7Ci0JCWlmIChvdXQuc2l6ZSgpID4gMCkgb3V0cHV0KG91dC50b0J5dGVBcnJheSgpLCBvdXRwdXREaXIgKyBnZW4uZ2V0RmlsZU5hbWUoKSk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZVNUUlVDVFNfSChDbGFzc1tdIGNsYXNzZXMpIHsKLQl0cnkgewotCQlTdHJ1Y3RzR2VuZXJhdG9yIGdlbiA9IG5ldyBTdHJ1Y3RzR2VuZXJhdG9yKHRydWUpOwotCQlnZW4uc2V0TWFpbkNsYXNzKG1haW5DbGFzcyk7Ci0JCWdlbi5zZXRDbGFzc2VzKGNsYXNzZXMpOwotCQlnZW4uc2V0TWV0YURhdGEobWV0YURhdGEpOwotCQlnZW4uc2V0UHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJZ2VuLnNldE91dHB1dChuZXcgUHJpbnRTdHJlYW0ob3V0KSk7Ci0JCWdlbi5nZW5lcmF0ZSgpOwotCQlpZiAob3V0LnNpemUoKSA+IDApIG91dHB1dChvdXQudG9CeXRlQXJyYXkoKSwgb3V0cHV0RGlyICsgZ2VuLmdldEZpbGVOYW1lKCkpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSIpOwotCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQl9Ci0KLX0KLQotdm9pZCBnZW5lcmF0ZVNUUlVDVFNfQyhDbGFzc1tdIGNsYXNzZXMpIHsKLQl0cnkgewotCQlTdHJ1Y3RzR2VuZXJhdG9yIGdlbiA9IG5ldyBTdHJ1Y3RzR2VuZXJhdG9yKGZhbHNlKTsKLQkJZ2VuLnNldE1haW5DbGFzcyhtYWluQ2xhc3MpOwotCQlnZW4uc2V0Q2xhc3NlcyhjbGFzc2VzKTsKLQkJZ2VuLnNldE1ldGFEYXRhKG1ldGFEYXRhKTsKLQkJZ2VuLnNldFByb2dyZXNzTW9uaXRvcihwcm9ncmVzcyk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWdlbi5zZXRPdXRwdXQobmV3IFByaW50U3RyZWFtKG91dCkpOwotCQlnZW4uZ2VuZXJhdGUoKTsKLQkJaWYgKG91dC5zaXplKCkgPiAwKSBvdXRwdXQob3V0LnRvQnl0ZUFycmF5KCksIG91dHB1dERpciArIGdlbi5nZXRGaWxlTmFtZSgpKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotCi19Ci0KLXZvaWQgZ2VuZXJhdGVTV1RfQyhDbGFzc1tdIGNsYXNzZXMpIHsKLQl0cnkgewotCQlOYXRpdmVzR2VuZXJhdG9yIGdlbiA9IG5ldyBOYXRpdmVzR2VuZXJhdG9yKCk7Ci0JCWdlbi5zZXRNYWluQ2xhc3MobWFpbkNsYXNzKTsKLQkJZ2VuLnNldENsYXNzZXMoY2xhc3Nlcyk7Ci0JCWdlbi5zZXRNZXRhRGF0YShtZXRhRGF0YSk7Ci0JCWdlbi5zZXRQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3MpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlnZW4uc2V0T3V0cHV0KG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQkJZ2VuLmdlbmVyYXRlKCk7Ci0JCWlmIChvdXQuc2l6ZSgpID4gMCkgb3V0cHV0KG91dC50b0J5dGVBcnJheSgpLCBvdXRwdXREaXIgKyBnZW4uZ2V0RmlsZU5hbWUoKSk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLX0KLQotCi12b2lkIGdlbmVyYXRlTWV0YURhdGEoQ2xhc3NbXSBjbGFzc2VzKSB7Ci0JdHJ5IHsKLQkJTWV0YURhdGFHZW5lcmF0b3IgZ2VuID0gbmV3IE1ldGFEYXRhR2VuZXJhdG9yKCk7Ci0JCWdlbi5zZXRNYWluQ2xhc3MobWFpbkNsYXNzKTsKLQkJZ2VuLnNldENsYXNzZXMoY2xhc3Nlcyk7Ci0JCWdlbi5zZXRNZXRhRGF0YShtZXRhRGF0YSk7Ci0JCWdlbi5zZXRQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3MpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlnZW4uc2V0T3V0cHV0KG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQkJZ2VuLmdlbmVyYXRlKCk7Ci0JCWlmICghbmV3IEZpbGUoZ2V0TWV0YURhdGFEaXIoKSkuZXhpc3RzKCkpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogTWV0YSBkYXRhIG91dHB1dCBkaXIgZG9lcyBub3QgZXhpc3QiKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAob3V0LnNpemUoKSA+IDApIG91dHB1dChvdXQudG9CeXRlQXJyYXkoKSwgZ2V0TWV0YURhdGFEaXIoKSArIGdlbi5nZXRGaWxlTmFtZSgpKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHsKLQlnZW5lcmF0ZShudWxsKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB7Ci0JaWYgKG1haW5DbGFzc05hbWUgPT0gbnVsbCkgcmV0dXJuOwotCWlmIChwcm9ncmVzcyAhPSBudWxsKSBwcm9ncmVzcy5zZXRNZXNzYWdlKCJJbml0aWFsaXppbmcuLi4iKTsKLQlDbGFzc1tdIGNsYXNzZXMgPSBnZXRDbGFzc2VzKCk7Ci0JQ2xhc3NbXSBuYXRpdmVzID0gZ2V0TmF0aXZlc0NsYXNzZXMoKTsKLQlDbGFzc1tdIHN0cnVjdHMgPSBnZXRTdHJ1Y3R1cmVDbGFzc2VzKCk7Ci0JdGhpcy5wcm9ncmVzcyA9IHByb2dyZXNzOwotCWlmIChwcm9ncmVzcyAhPSBudWxsKSB7Ci0JCWludCBuYXRpdmVDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmF0aXZlcy5sZW5ndGg7IGkrKykgewotCQkJQ2xhc3MgY2xhenogPSBuYXRpdmVzW2ldOwotCQkJTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZXRob2RzLmxlbmd0aDsgaisrKSB7Ci0JCQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbal07Ci0JCQkJaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpID09IDApIGNvbnRpbnVlOwotCQkJCW5hdGl2ZUNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJaW50IHRvdGFsID0gbmF0aXZlQ291bnQgKiA0OwotCQl0b3RhbCArPSBjbGFzc2VzLmxlbmd0aDsKLQkJdG90YWwgKz0gbmF0aXZlcy5sZW5ndGggKiAzOwotCQl0b3RhbCArPSBzdHJ1Y3RzLmxlbmd0aCAqIDI7Ci0JCXByb2dyZXNzLnNldFRvdGFsKHRvdGFsKTsKLQkJcHJvZ3Jlc3Muc2V0TWVzc2FnZSgiR2VuZXJhdGluZyBzdHJ1Y3RzLmggLi4uIik7Ci0JfQotCWdlbmVyYXRlU1RSVUNUU19IKHN0cnVjdHMpOwotCWlmIChwcm9ncmVzcyAhPSBudWxsKSBwcm9ncmVzcy5zZXRNZXNzYWdlKCJHZW5lcmF0aW5nIHN0cnVjdHMuYyAuLi4iKTsKLQlnZW5lcmF0ZVNUUlVDVFNfQyhzdHJ1Y3RzKTsKLQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgcHJvZ3Jlc3Muc2V0TWVzc2FnZSgiR2VuZXJhdGluZyBuYXRpdmVzIC4uLiIpOwotCWdlbmVyYXRlU1dUX0MobmF0aXZlcyk7Ci0JaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnNldE1lc3NhZ2UoIkdlbmVyYXRpbmcgc3RhdHMuaCAuLi4iKTsKLQlnZW5lcmF0ZVNUQVRTX0gobmF0aXZlcyk7Ci0JaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnNldE1lc3NhZ2UoIkdlbmVyYXRpbmcgc3RhdHMuYyAuLi4iKTsKLQlnZW5lcmF0ZVNUQVRTX0MobmF0aXZlcyk7Ci0JaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnNldE1lc3NhZ2UoIkdlbmVyYXRpbmcgbWV0YSBkYXRhIC4uLiIpOwotCWdlbmVyYXRlTWV0YURhdGEoY2xhc3Nlcyk7Ci0JaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnNldE1lc3NhZ2UoIkRvbmUuIik7Ci0JdGhpcy5wcm9ncmVzcyA9IG51bGw7Ci19Ci0KLWJvb2xlYW4gY29tcGFyZShJbnB1dFN0cmVhbSBpczEsIElucHV0U3RyZWFtIGlzMikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQl3aGlsZSAodHJ1ZSkgewotCQlpbnQgYzEgPSBpczEucmVhZCgpOwotCQlpbnQgYzIgPSBpczIucmVhZCgpOwotCQlpZiAoYzEgIT0gYzIpIHJldHVybiBmYWxzZTsKLQkJaWYgKGMxID09IC0xKSBicmVhazsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgb3V0cHV0KGJ5dGVbXSBieXRlcywgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCUZpbGVJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JdHJ5IHsKLQkJaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJaWYgKGNvbXBhcmUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKSwgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaXMpKSkgcmV0dXJuOwotCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCWlmIChpcyAhPSBudWxsKSBpcy5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCX0KLQlGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLQlvdXQud3JpdGUoYnl0ZXMpOwotCW91dC5jbG9zZSgpOwotfQotCi1TdHJpbmcgZ2V0UGFja2FnZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCWludCBkb3QgPSBtYWluQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JaWYgKGRvdCA9PSAtMSkgcmV0dXJuICIiOwotCXJldHVybiBtYWluQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBkb3QpOwotfQotCi1TdHJpbmdbXSBnZXRDbGFzc05hbWVzKFN0cmluZyBtYWluQ2xhc3NOYW1lKSB7Ci0JU3RyaW5nIHBrZ05hbWUgPSBnZXRQYWNrYWdlTmFtZShtYWluQ2xhc3NOYW1lKTsKLQlTdHJpbmcgY2xhc3NwYXRoID0gZ2V0Q2xhc3NwYXRoKCk7Ci0JaWYgKGNsYXNzcGF0aCA9PSBudWxsKSBjbGFzc3BhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpOwotCVN0cmluZyBwa2dQYXRoID0gcGtnTmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQlTdHJpbmcgcGtnWmlwUGF0aCA9IHBrZ05hbWUucmVwbGFjZSgnLicsICcvJyk7Ci0JQXJyYXlMaXN0IGNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7CQotCWludCBzdGFydCA9IDA7Ci0JaW50IGluZGV4ID0gMDsKLQl3aGlsZSAoaW5kZXggPCBjbGFzc3BhdGgubGVuZ3RoKCkpIHsKLQkJaW5kZXggPSBjbGFzc3BhdGguaW5kZXhPZihGaWxlLnBhdGhTZXBhcmF0b3JDaGFyLCBzdGFydCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgaW5kZXggPSBjbGFzc3BhdGgubGVuZ3RoKCk7Ci0JCVN0cmluZyBwYXRoID0gY2xhc3NwYXRoLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwotCQlpZiAocGF0aC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamFyIikpIHsKLQkJCVppcEZpbGUgemlwRmlsZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXppcEZpbGUgPSBuZXcgWmlwRmlsZShwYXRoKTsKLQkJCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gemlwRmlsZS5lbnRyaWVzKCk7Ci0JCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLQkJCQkJaWYgKG5hbWUuc3RhcnRzV2l0aChwa2daaXBQYXRoKSAmJiBuYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSkgewotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IG5hbWUuc3Vic3RyaW5nKHBrZ1ppcFBhdGgubGVuZ3RoKCkgKyAxLCBuYW1lLmxlbmd0aCgpIC0gNik7Ci0JCQkJCQljbGFzc05hbWUucmVwbGFjZSgnLycsICcuJyk7Ci0JCQkJCQljbGFzc2VzLmFkZChjbGFzc05hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpZiAoemlwRmlsZSAhPSBudWxsKSB6aXBGaWxlLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHt9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBwa2dQYXRoKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJU3RyaW5nW10gZW50cmllcyA9IGZpbGUubGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShmaWxlLCBlbnRyeSk7Ci0JCQkJCWlmICghZi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCQlpZiAoZi5nZXRBYnNvbHV0ZVBhdGgoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKLQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gZW50cnkuc3Vic3RyaW5nKDAsIGVudHJ5Lmxlbmd0aCgpIC0gNik7Ci0JCQkJCQkJY2xhc3Nlcy5hZGQoY2xhc3NOYW1lKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRocm93IG5ldyBFcnJvcigiU1VCRElSIE5PVCBET05FPSIgKyBmKTsKLQkJCQkJfQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCXN0YXJ0ID0gaW5kZXggKyAxOwotCX0KLQlyZXR1cm4gKFN0cmluZ1tdKWNsYXNzZXMudG9BcnJheShuZXcgU3RyaW5nW2NsYXNzZXMuc2l6ZSgpXSk7Ci19Ci0KLXB1YmxpYyBDbGFzc1tdIGdldENsYXNzZXMoKSB7Ci0JaWYgKG1haW5DbGFzc05hbWUgPT0gbnVsbCkgcmV0dXJuIG5ldyBDbGFzc1swXTsKLQlTdHJpbmdbXSBjbGFzc05hbWVzID0gZ2V0Q2xhc3NOYW1lcyhtYWluQ2xhc3NOYW1lKTsKLQlBcnJheXMuc29ydChjbGFzc05hbWVzKTsKLQlTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZShtYWluQ2xhc3NOYW1lKTsKLQlDbGFzc1tdIGNsYXNzZXMgPSBuZXcgQ2xhc3NbY2xhc3NOYW1lcy5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NOYW1lc1tpXTsKLQkJdHJ5IHsKLQkJCWNsYXNzZXNbaV0gPSBDbGFzcy5mb3JOYW1lKHBhY2thZ2VOYW1lICsgIi4iICsgY2xhc3NOYW1lLCBmYWxzZSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGNsYXNzZXM7Ci19Ci0KLXB1YmxpYyBDbGFzc1tdIGdldE5hdGl2ZXNDbGFzc2VzKCkgewotCWlmIChtYWluQ2xhc3NOYW1lID09IG51bGwpIHJldHVybiBuZXcgQ2xhc3NbMF07Ci0JQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlDbGFzc1tdIGNsYXNzZXMgPSBnZXRDbGFzc2VzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCUNsYXNzIGNsYXp6ID0gY2xhc3Nlc1tpXTsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IG1ldGhvZHMubGVuZ3RoOyBqKyspIHsKLQkJCU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2pdOwotCQkJaW50IG1vZHMgPSBtZXRob2QuZ2V0TW9kaWZpZXJzKCk7Ci0JCQlpZiAoKG1vZHMgJiBNb2RpZmllci5OQVRJVkUpICE9IDApIHsKLQkJCQlyZXN1bHQuYWRkKGNsYXp6KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gKENsYXNzW10pcmVzdWx0LnRvQXJyYXkobmV3IENsYXNzW3Jlc3VsdC5zaXplKCldKTsKLX0KLQotcHVibGljIENsYXNzW10gZ2V0U3RydWN0dXJlQ2xhc3NlcygpIHsKLQlpZiAobWFpbkNsYXNzTmFtZSA9PSBudWxsKSByZXR1cm4gbmV3IENsYXNzWzBdOwotCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JQ2xhc3NbXSBjbGFzc2VzID0gZ2V0Q2xhc3NlcygpOwotCW91dGVyOgotCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQlDbGFzcyBjbGF6eiA9IGNsYXNzZXNbaV07Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZXRob2RzLmxlbmd0aDsgaisrKSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tqXTsKLQkJCWludCBtb2RzID0gbWV0aG9kLmdldE1vZGlmaWVycygpOwotCQkJaWYgKChtb2RzICYgTW9kaWZpZXIuTkFUSVZFKSAhPSAwKSBjb250aW51ZSBvdXRlcjsKLQkJfQotCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOwotCQlib29sZWFuIGhhc1B1YmxpY0ZpZWxkcyA9IGZhbHNlOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGZpZWxkcy5sZW5ndGg7IGorKykgewotCQkJRmllbGQgZmllbGQgPSBmaWVsZHNbal07Ci0JCQlpbnQgbW9kcyA9IGZpZWxkLmdldE1vZGlmaWVycygpOwotCQkJaWYgKChtb2RzICYgTW9kaWZpZXIuUFVCTElDKSAhPSAwICYmIChtb2RzICYgTW9kaWZpZXIuU1RBVElDKSA9PSAwKSB7Ci0JCQkJaGFzUHVibGljRmllbGRzID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoIWhhc1B1YmxpY0ZpZWxkcykgY29udGludWU7Ci0JCXJlc3VsdC5hZGQoY2xhenopOwotCX0KLQlyZXR1cm4gKENsYXNzW10pcmVzdWx0LnRvQXJyYXkobmV3IENsYXNzW3Jlc3VsdC5zaXplKCldKTsKLX0KLQotcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFN0cmluZyBjbGFzc3BhdGgpIHsKLQl0aGlzLmNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKLX0KLQotcHVibGljIHZvaWQgc2V0TWFpbkNsYXNzTmFtZShTdHJpbmcgc3RyKSB7Ci0JbWFpbkNsYXNzTmFtZSA9IHN0cjsKLQltZXRhRGF0YSA9IG5ldyBNZXRhRGF0YShtYWluQ2xhc3NOYW1lKTsKLQlTdHJpbmcgbWFpbkNsYXNzZXMgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKCJzd3RfbWFpbl9jbGFzc2VzIiwgbnVsbCk7Ci0JaWYgKG1haW5DbGFzc2VzICE9IG51bGwpIHsKLQkJU3RyaW5nW10gbGlzdCA9IEl0ZW1EYXRhLnNwbGl0KG1haW5DbGFzc2VzLCAiLCIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDIpIHsKLQkJCWlmIChtYWluQ2xhc3NOYW1lLmVxdWFscyhsaXN0W2ldLnRyaW0oKSkpIHsKLQkJCQlzZXRPdXRwdXREaXIobGlzdFtpICsgMV0udHJpbSgpKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAobWFpbkNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCXRyeSB7Ci0JCQltYWluQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKG1haW5DbGFzc05hbWUsIGZhbHNlLCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyKFN0cmluZyBzdHIpIHsKLQlpZiAoc3RyICE9IG51bGwpIHsKLQkJaWYgKCFzdHIuZW5kc1dpdGgoIlxcIikgJiYgIXN0ci5lbmRzV2l0aCgiLyIpICkgewotCQkJc3RyICs9IEZpbGUuc2VwYXJhdG9yOwotCQl9Ci0JfQotCW91dHB1dERpciA9IHN0cjsKLX0KLQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdE1haW5DbGFzcygpIHsKLQlyZXR1cm4gIm9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC4iICsgZ2V0RGVmYXVsdFBsYXRmb3JtKCkgKyAiLk9TIjsKLX0KLQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFBsYXRmb3JtKCkgewotCXJldHVybiBTV1QuZ2V0UGxhdGZvcm0oKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCUpOSUdlbmVyYXRvckFwcCBnZW4gPSBuZXcgSk5JR2VuZXJhdG9yQXBwICgpOwotCWlmIChhcmdzLmxlbmd0aCA+IDApIHsKLQkJZ2VuLnNldE1haW5DbGFzc05hbWUoYXJnc1swXSk7Ci0JCWlmIChhcmdzLmxlbmd0aCA+IDEpIGdlbi5zZXRPdXRwdXREaXIoYXJnc1sxXSk7Ci0JCWlmIChhcmdzLmxlbmd0aCA+IDIpIGdlbi5zZXRDbGFzc3BhdGgoYXJnc1syXSk7Ci0JfSBlbHNlIHsKLQkJZ2VuLnNldE1haW5DbGFzc05hbWUoZ2V0RGVmYXVsdE1haW5DbGFzcygpKTsKLQl9Ci0JZ2VuLmdlbmVyYXRlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklHZW5lcmF0b3JBcHBVSS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUdlbmVyYXRvckFwcFVJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NDEzODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUdlbmVyYXRvckFwcFVJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIEpOSUdlbmVyYXRvckFwcFVJIHsKLQotCURpc3BsYXkgZGlzcGxheTsKLQlTaGVsbCBzaGVsbDsKLQkKLQlDb21wb3NpdGUgYWN0aW9uc1BhbmVsOwotCUNvbWJvIG1haW5DbGFzc0NiLCBvdXRwdXREaXJDYjsKLQlUYWJsZSBjbGFzc2VzTHQsIG1lbWJlcnNMdCwgcGFyYW1zTHQ7Ci0JUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NCYXI7Ci0JTGFiZWwgcHJvZ3Jlc3NMYWJlbDsKLQlGaWxlRGlhbG9nIGZpbGVEaWFsb2c7Ci0JCi0JVGFibGVFZGl0b3IgcGFyYW1UZXh0RWRpdG9yLCBtZW1iZXJUZXh0RWRpdG9yLCBjbGFzc1RleHRFZGl0b3I7Ci0JRmxhZ3NFZGl0b3IgcGFyYW1MaXN0RWRpdG9yLCBtZW1iZXJMaXN0RWRpdG9yLCBjbGFzc0xpc3RFZGl0b3I7Ci0JVGV4dCBwYXJhbUVkaXRvclR4LCBtZW1iZXJFZGl0b3JUeCwgY2xhc3NFZGl0b3JUeDsKLQlMaXN0IHBhcmFtRWRpdG9yTHQsIG1lbWJlckVkaXRvckx0LCBjbGFzc0VkaXRvckx0OwotCQotCXN0YXRpYyBjbGFzcyBGbGFnc0VkaXRvciB7Ci0JCVRhYmxlIHBhcmVudDsKLQkJaW50IGNvbHVtbiA9IC0xOwotCQlUYWJsZUl0ZW0gaXRlbTsKLQkJCi0JCXB1YmxpYyBGbGFnc0VkaXRvcihUYWJsZSBwYXJlbnQpIHsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGdldENvbHVtbigpIHsKLQkJCXJldHVybiBjb2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBUYWJsZUl0ZW0gZ2V0SXRlbSgpIHsKLQkJCXJldHVybiBpdGVtOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRDb2x1bW4oaW50IGNvbHVtbikgewotCQkJdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldEl0ZW0oVGFibGVJdGVtIGl0ZW0pIHsKLQkJCXRoaXMuaXRlbSA9IGl0ZW07Ci0JCX0KLQl9Ci0JCi0JSk5JR2VuZXJhdG9yQXBwIGFwcDsKLQotCXN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfTkFNRV9DT0xVTU4gPSAwOwotCXN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfRkxBR1NfQ09MVU1OID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IENMQVNTX0VYQ0xVREVfQ09MVU1OID0gMjsKLQkKLQlzdGF0aWMgZmluYWwgaW50IEZJRUxEX05BTUVfQ09MVU1OID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IEZJRUxEX0ZMQUdTX0NPTFVNTiA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBGSUVMRF9DQVNUX0NPTFVNTiA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBGSUVMRF9BQ0NFU1NPUl9DT0xVTU4gPSAzOwotCXN0YXRpYyBmaW5hbCBpbnQgRklFTERfRVhDTFVERV9DT0xVTU4gPSA0OwotCQotCXN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX05BTUVfQ09MVU1OID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9GTEFHU19DT0xVTU4gPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0FDQ0VTU09SX0NPTFVNTiA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBNRVRIT0RfRVhDTFVERV9DT0xVTU4gPSAzOwotCQotCXN0YXRpYyBmaW5hbCBpbnQgUEFSQU1fSU5ERVhfQ09MVU1OID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IFBBUkFNX1RZUEVfQ09MVU1OID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IFBBUkFNX0ZMQUdTX0NPTFVNTiA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBQQVJBTV9DQVNUX0NPTFVNTiA9IDM7Ci0JCi1wdWJsaWMgSk5JR2VuZXJhdG9yQXBwVUkoKSB7Ci0JdGhpcyAobmV3IEpOSUdlbmVyYXRvckFwcCgpKTsKLX0KLQotcHVibGljIEpOSUdlbmVyYXRvckFwcFVJKEpOSUdlbmVyYXRvckFwcCBhcHApIHsKLQl0aGlzLmFwcCA9IGFwcDsKLX0KLQotdm9pZCBjbGVhbnVwKCkgewotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi12b2lkIGdlbmVyYXRlU3RydWN0c0hlYWRlciAoKSB7Ci0JU3RydWN0c0dlbmVyYXRvciBnZW4gPSBuZXcgU3RydWN0c0dlbmVyYXRvcih0cnVlKTsKLQlnZW4uc2V0TWFpbkNsYXNzKGFwcC5nZXRNYWluQ2xhc3MoKSk7Ci0JZ2VuLnNldE1ldGFEYXRhKGFwcC5nZXRNZXRhRGF0YSgpKTsKLQlnZW4uc2V0Q2xhc3NlcyhnZXRTZWxlY3RlZENsYXNzZXMoKSk7Ci0JZ2VuLmdlbmVyYXRlKCk7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTdHJ1Y3RzICgpIHsKLQlTdHJ1Y3RzR2VuZXJhdG9yIGdlbiA9IG5ldyBTdHJ1Y3RzR2VuZXJhdG9yKGZhbHNlKTsKLQlnZW4uc2V0TWFpbkNsYXNzKGFwcC5nZXRNYWluQ2xhc3MoKSk7Ci0JZ2VuLnNldE1ldGFEYXRhKGFwcC5nZXRNZXRhRGF0YSgpKTsKLQlnZW4uc2V0Q2xhc3NlcyhnZXRTZWxlY3RlZENsYXNzZXMoKSk7Ci0JZ2VuLmdlbmVyYXRlKCk7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTaXplb2YgKCkgewotCVNpemVvZkdlbmVyYXRvciBnZW4gPSBuZXcgU2l6ZW9mR2VuZXJhdG9yKCk7Ci0JZ2VuLnNldE1haW5DbGFzcyhhcHAuZ2V0TWFpbkNsYXNzKCkpOwotCWdlbi5zZXRNZXRhRGF0YShhcHAuZ2V0TWV0YURhdGEoKSk7Ci0JZ2VuLnNldENsYXNzZXMoZ2V0U2VsZWN0ZWRDbGFzc2VzKCkpOwotCWdlbi5nZW5lcmF0ZSgpOwotfQotCi12b2lkIGdlbmVyYXRlTWV0YURhdGEgKCkgewotCU1ldGFEYXRhR2VuZXJhdG9yIGdlbiA9IG5ldyBNZXRhRGF0YUdlbmVyYXRvcigpOwotCWdlbi5zZXRNYWluQ2xhc3MoYXBwLmdldE1haW5DbGFzcygpKTsKLQlnZW4uc2V0TWV0YURhdGEoYXBwLmdldE1ldGFEYXRhKCkpOwotCU1ldGhvZFtdIG1ldGhvZHMgPSBnZXRTZWxlY3RlZE1ldGhvZHMoKTsKLQlpZiAobWV0aG9kcy5sZW5ndGggIT0gMCkgewotCQlnZW4uZ2VuZXJhdGUobWV0aG9kcyk7Ci0JfSBlbHNlIHsKLQkJZ2VuLnNldENsYXNzZXMoZ2V0U2VsZWN0ZWRDbGFzc2VzKCkpOwotCQlnZW4uZ2VuZXJhdGUoKTsKLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVOYXRpdmVzICgpIHsKLQlOYXRpdmVzR2VuZXJhdG9yIGdlbiA9IG5ldyBOYXRpdmVzR2VuZXJhdG9yKCk7Ci0JZ2VuLnNldE1haW5DbGFzcyhhcHAuZ2V0TWFpbkNsYXNzKCkpOwotCWdlbi5zZXRNZXRhRGF0YShhcHAuZ2V0TWV0YURhdGEoKSk7Ci0JTWV0aG9kW10gbWV0aG9kcyA9IGdldFNlbGVjdGVkTWV0aG9kcygpOwotCWlmIChtZXRob2RzLmxlbmd0aCAhPSAwKSB7Ci0JCWdlbi5nZW5lcmF0ZShtZXRob2RzKTsKLQl9IGVsc2UgewotCQlnZW4uc2V0Q2xhc3NlcyhnZXRTZWxlY3RlZENsYXNzZXMoKSk7Ci0JCWdlbi5nZW5lcmF0ZSgpOwotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZUFsbCgpIHsKLQlpZiAoIXVwZGF0ZU91dHB1dERpcigpKSByZXR1cm47Ci0JQ3Vyc29yIGN1cnNvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ3Vyc29yKFNXVC5DVVJTT1JfV0FJVCk7Ci0Jc2hlbGwuc2V0Q3Vyc29yKGN1cnNvcik7Ci0Jc2hlbGwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JQ29udHJvbFtdIGNoaWxkcmVuID0gYWN0aW9uc1BhbmVsLmdldENoaWxkcmVuKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIEJ1dHRvbikgY2hpbGQuc2V0RW5hYmxlZChmYWxzZSk7CQkJCQotCX0KLQlmaW5hbCBib29sZWFuIHNob3dQcm9ncmVzcyA9IHRydWU7Ci0JaWYgKHNob3dQcm9ncmVzcykgewotCQlwcm9ncmVzc0xhYmVsLnNldFRleHQoIiIpOwotCQlwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24oMCk7Ci0JCXByb2dyZXNzTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJcHJvZ3Jlc3NCYXIuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0JZmluYWwgYm9vbGVhbltdIGRvbmUgPSBuZXcgYm9vbGVhblsxXTsKLQluZXcgVGhyZWFkKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCWFwcC5nZW5lcmF0ZSghc2hvd1Byb2dyZXNzID8gbnVsbCA6IG5ldyBQcm9ncmVzc01vbml0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNldFRvdGFsKGZpbmFsIGludCB0b3RhbCkgewotCQkJCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlwcm9ncmVzc0Jhci5zZXRNYXhpbXVtKHRvdGFsKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCQlwdWJsaWMgdm9pZCBzdGVwKCkgewotCQkJCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24ocHJvZ3Jlc3NCYXIuZ2V0U2VsZWN0aW9uKCkgKyAxKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsJCQkJCQotCQkJCQl9Ci0JCQkJCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJcHJvZ3Jlc3NMYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotCQkJCQkJCQlwcm9ncmVzc0xhYmVsLnVwZGF0ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWRvbmVbMF0gPSB0cnVlOwotCQkJCWRpc3BsYXkud2FrZSgpOwotCQkJfQotCQl9Ci0JfS5zdGFydCgpOwotCXdoaWxlICghZG9uZVswXSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIEJ1dHRvbikgY2hpbGQuc2V0RW5hYmxlZCh0cnVlKTsJCQkJCi0JfQotCWlmIChzaG93UHJvZ3Jlc3MpIHsKLQkJcHJvZ3Jlc3NCYXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXByb2dyZXNzTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JfQotCXNoZWxsLnNldEVuYWJsZWQodHJ1ZSk7Ci0Jc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotfQotCi12b2lkIGdlbmVyYXRlQ29uc3RhbnRzICgpIHsKLQlDb25zdGFudHNHZW5lcmF0b3IgZ2VuID0gbmV3IENvbnN0YW50c0dlbmVyYXRvcigpOwotCWdlbi5zZXRNYWluQ2xhc3MoYXBwLmdldE1haW5DbGFzcygpKTsKLQlnZW4uc2V0TWV0YURhdGEoYXBwLmdldE1ldGFEYXRhKCkpOwotCUZpZWxkW10gZmllbGRzID0gZ2V0U2VsZWN0ZWRGaWVsZHMoKTsKLQlpZiAoZmllbGRzLmxlbmd0aCAhPSAwKSB7Ci0JCWdlbi5nZW5lcmF0ZShmaWVsZHMpOwotCX0gZWxzZSB7Ci0JCWdlbi5zZXRDbGFzc2VzKGdldFNlbGVjdGVkQ2xhc3NlcygpKTsKLQkJZ2VuLmdlbmVyYXRlKCk7Ci0JfQotfQotCi1DbGFzc1tdIGdldFNlbGVjdGVkQ2xhc3NlcygpIHsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGNsYXNzZXNMdC5nZXRTZWxlY3Rpb24oKTsKLQlDbGFzc1tdIGNsYXNzZXMgPSBuZXcgQ2xhc3NbaXRlbXMubGVuZ3RoXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCWNsYXNzZXNbaV0gPSAoKENsYXNzRGF0YSlpdGVtLmdldERhdGEoKSkuZ2V0Q2xhenooKTsKLQl9Ci0JcmV0dXJuIGNsYXNzZXM7Ci19Ci0KLU1ldGhvZFtdIGdldFNlbGVjdGVkTWV0aG9kcygpIHsKLQlUYWJsZUl0ZW1bXSBzZWxlY3Rpb24gPSBtZW1iZXJzTHQuZ2V0U2VsZWN0aW9uKCk7Ci0JTWV0aG9kW10gbWV0aG9kcyA9IG5ldyBNZXRob2Rbc2VsZWN0aW9uLmxlbmd0aF07Ci0JaW50IGNvdW50ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IHNlbGVjdGlvbiBbaV07Ci0JCU9iamVjdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgTWV0aG9kRGF0YSkgewotCQkJTWV0aG9kIG1ldGhvZCA9ICgoTWV0aG9kRGF0YSlkYXRhKS5nZXRNZXRob2QoKTsKLQkJCW1ldGhvZHNbY291bnQrK10gPSBtZXRob2Q7Ci0JCX0KLQl9Ci0JaWYgKGNvdW50ICE9IG1ldGhvZHMubGVuZ3RoKSB7Ci0JCU1ldGhvZFtdIHJlc3VsdCA9IG5ldyBNZXRob2RbY291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG1ldGhvZHMsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQltZXRob2RzID0gcmVzdWx0OwotCX0KLQlyZXR1cm4gbWV0aG9kczsKLX0KLQotRmllbGRbXSBnZXRTZWxlY3RlZEZpZWxkcygpIHsKLQlUYWJsZUl0ZW1bXSBzZWxlY3Rpb24gPSBtZW1iZXJzTHQuZ2V0U2VsZWN0aW9uKCk7Ci0JRmllbGRbXSBmaWVsZHMgPSBuZXcgRmllbGRbc2VsZWN0aW9uLmxlbmd0aF07Ci0JaW50IGNvdW50ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IHNlbGVjdGlvbiBbaV07Ci0JCU9iamVjdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgRmllbGREYXRhKSB7Ci0JCQlGaWVsZCBmaWVsZCA9ICgoRmllbGREYXRhKWRhdGEpLmdldEZpZWxkKCk7Ci0JCQlmaWVsZHNbY291bnQrK10gPSBmaWVsZDsKLQkJfQotCX0KLQlpZiAoY291bnQgIT0gZmllbGRzLmxlbmd0aCkgewotCQlGaWVsZFtdIHJlc3VsdCA9IG5ldyBGaWVsZFtjb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoZmllbGRzLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJZmllbGRzID0gcmVzdWx0OwotCX0KLQlyZXR1cm4gZmllbGRzOwotfQotCi1wdWJsaWMgdm9pZCBvcGVuICgpIHsKLQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJKTkkgR2VuZXJhdG9yIik7Ci0KLQlHcmlkRGF0YSBkYXRhOwotCUdyaWRMYXlvdXQgc2hlbGxMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCXNoZWxsTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCXNoZWxsLnNldExheW91dChzaGVsbExheW91dCk7Ci0JCi0JQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQlwYW5lbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCUdyaWRMYXlvdXQgcGFuZWxMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCXBhbmVsTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCXBhbmVsLnNldExheW91dChwYW5lbExheW91dCk7Ci0JCi0JTGlzdGVuZXIgdXBkYXRlTWFpbkNsYXNzTGlzdGVuZXIgPSAgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQl1cGRhdGVNYWluQ2xhc3MoKTsKLQkJCWlmICghdXBkYXRlT3V0cHV0RGlyKCkpIHJldHVybjsKLQkJCXVwZGF0ZUNsYXNzZXMoKTsKLQkJCXVwZGF0ZU1lbWJlcnMoKTsKLQkJCXVwZGF0ZVBhcmFtZXRlcnMoKTsKLQkJfQotCX07CQotCWNyZWF0ZU1haW5DbGFzc1BhbmVsKHBhbmVsLCB1cGRhdGVNYWluQ2xhc3NMaXN0ZW5lcik7Ci0JY3JlYXRlQ2xhc3Nlc1BhbmVsKHBhbmVsKTsKLQljcmVhdGVNZW1iZXJzUGFuZWwocGFuZWwpOwotCWNyZWF0ZVBhcmFtZXRlcnNQYW5lbChwYW5lbCk7Ci0JY3JlYXRlQWN0aW9uQnV0dG9ucyhzaGVsbCk7Ci0KLQlQb2ludCBwcmVmZXJyZWRTaXplID0gc2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQlzaGVsbC5zZXRTaXplKHNoZWxsLmdldFNpemUoKS54LCBwcmVmZXJyZWRTaXplLnkpOwotCQotCXVwZGF0ZU1haW5DbGFzcygpOwotCXVwZGF0ZUNsYXNzZXMoKTsKLQl1cGRhdGVNZW1iZXJzKCk7Ci0JdXBkYXRlUGFyYW1ldGVycygpOwotfQotCi12b2lkIGNyZWF0ZU1haW5DbGFzc1BhbmVsKENvbXBvc2l0ZSBwYW5lbCwgTGlzdGVuZXIgdXBkYXRlTGlzdGVuZXIpIHsKLQlMYWJlbCBtYWluQ2xhc3NMYiA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5PTkUpOwotCW1haW5DbGFzc0xiLnNldFRleHQoIiZNYWluIENsYXNzOiIpOwotCi0JR3JpZERhdGEgZGF0YTsKLQltYWluQ2xhc3NDYiA9IG5ldyBDb21ibyhwYW5lbCwgU1dULkRST1BfRE9XTik7Ci0JU3RyaW5nIG1haW5DbGFzcyA9IGFwcC5nZXRNYWluQ2xhc3NOYW1lKCk7Ci0JbWFpbkNsYXNzQ2Iuc2V0VGV4dChtYWluQ2xhc3MgPT0gbnVsbCA/ICIiIDogbWFpbkNsYXNzKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JbWFpbkNsYXNzQ2Iuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQltYWluQ2xhc3NDYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB1cGRhdGVMaXN0ZW5lcik7Ci0JbWFpbkNsYXNzQ2IuYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIHVwZGF0ZUxpc3RlbmVyKTsKLQotCUxhYmVsIG91dHB1dERpckxiID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTk9ORSk7Ci0Jb3V0cHV0RGlyTGIuc2V0VGV4dCgiJk91dHB1dCBEaXI6Iik7Ci0JCi0Jb3V0cHV0RGlyQ2IgPSBuZXcgQ29tYm8ocGFuZWwsIFNXVC5EUk9QX0RPV04pOwotCVN0cmluZyBvdXRwdXREaXIgPSBhcHAuZ2V0T3V0cHV0RGlyKCk7Ci0Jb3V0cHV0RGlyQ2Iuc2V0VGV4dChvdXRwdXREaXIgPT0gbnVsbCA/ICIiIDogb3V0cHV0RGlyKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0Jb3V0cHV0RGlyQ2Iuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlvdXRwdXREaXJDYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB1cGRhdGVMaXN0ZW5lcik7Ci0Jb3V0cHV0RGlyQ2IuYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIHVwZGF0ZUxpc3RlbmVyKTsKLQotCVN0cmluZyBtYWluQ2xhc3NlcyA9IGFwcC5nZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKCJzd3RfbWFpbl9jbGFzc2VzIiwgbnVsbCk7Ci0JaWYgKG1haW5DbGFzc2VzICE9IG51bGwpIHsKLQkJU3RyaW5nW10gbGlzdCA9IEl0ZW1EYXRhLnNwbGl0KG1haW5DbGFzc2VzLCAiLCIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDIpIHsKLQkJCW1haW5DbGFzc0NiLmFkZChsaXN0W2ldLnRyaW0oKSk7Ci0JCQlvdXRwdXREaXJDYi5hZGQobGlzdFtpICsgMV0udHJpbSgpKTsKLQkJfQotCX0KLX0KLQotdm9pZCBjcmVhdGVDbGFzc2VzUGFuZWwoQ29tcG9zaXRlIHBhbmVsKSB7Ci0JTGFiZWwgY2xhc3Nlc0xiID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTk9ORSk7Ci0JY2xhc3Nlc0xiLnNldFRleHQoIiZDbGFzc2VzOiIpOwotCi0JR3JpZERhdGEgZGF0YTsKLQljbGFzc2VzTHQgPSBuZXcgVGFibGUocGFuZWwsIFNXVC5DSEVDSyB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBjbGFzc2VzTHQuZ2V0SXRlbUhlaWdodCgpICogNjsKLQljbGFzc2VzTHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQljbGFzc2VzTHQuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQljbGFzc2VzTHQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0JCQkJdXBkYXRlR2VuZXJhdGUoKFRhYmxlSXRlbSllLml0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl1cGRhdGVNZW1iZXJzKCk7Ci0JCQkJdXBkYXRlUGFyYW1ldGVycygpOwotCQkJfQotCQl9Ci0JfSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uOwotCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihjbGFzc2VzTHQsIFNXVC5OT05FLCBDTEFTU19OQU1FX0NPTFVNTik7Ci0JY29sdW1uLnNldFRleHQoIkNsYXNzIik7Ci0JY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKGNsYXNzZXNMdCwgU1dULk5PTkUsIENMQVNTX0ZMQUdTX0NPTFVNTik7Ci0JY29sdW1uLnNldFRleHQoIkZsYWdzIik7Ci0JLyoKLQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oY2xhc3Nlc0x0LCBTV1QuTk9ORSwgQ0xBU1NfRVhDTFVERV9DT0xVTU4pOwotCWNvbHVtbi5zZXRUZXh0KCJFeGNsdWRlIik7Ci0JKi8KLQkKLQljbGFzc1RleHRFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IoY2xhc3Nlc0x0KTsKLQljbGFzc1RleHRFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCWNsYXNzRWRpdG9yVHggPSBuZXcgVGV4dChjbGFzc2VzTHQsIFNXVC5TSU5HTEUpOwotCWNsYXNzVGV4dEVkaXRvci5zZXRFZGl0b3IoY2xhc3NFZGl0b3JUeCk7Ci0JTGlzdGVuZXIgY2xhc3NUZXh0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULlRyYXZlcnNlKSB7Ci0JCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCQljbGFzc1RleHRFZGl0b3Iuc2V0SXRlbShudWxsKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWNsYXNzRWRpdG9yVHguc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IGNsYXNzVGV4dEVkaXRvci5nZXRJdGVtKCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgY29sdW1uID0gY2xhc3NUZXh0RWRpdG9yLmdldENvbHVtbigpOwotCQkJQ2xhc3NEYXRhIGNsYXNzRGF0YSA9IChDbGFzc0RhdGEpaXRlbS5nZXREYXRhKCk7Ci0JCQlpZiAoY29sdW1uID09IENMQVNTX0VYQ0xVREVfQ09MVU1OKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBjbGFzc0VkaXRvclR4LmdldFRleHQoKTsKLQkJCQljbGFzc0RhdGEuc2V0RXhjbHVkZSh0ZXh0KTsKLQkJCQlpdGVtLnNldFRleHQoY29sdW1uLCBjbGFzc0RhdGEuZ2V0RXhjbHVkZSgpKTsKLQkJCQlNZXRhRGF0YSBtZXRhRGF0YSA9IGFwcC5nZXRNZXRhRGF0YSgpOwotCQkJCW1ldGFEYXRhLnNldE1ldGFEYXRhKGNsYXNzRGF0YS5nZXRDbGF6eigpLCBjbGFzc0RhdGEpOwotCQkJCWNsYXNzZXNMdC5nZXRDb2x1bW4oY29sdW1uKS5wYWNrKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCWNsYXNzRWRpdG9yVHguYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIGNsYXNzVGV4dExpc3RlbmVyKTsKLQljbGFzc0VkaXRvclR4LmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgY2xhc3NUZXh0TGlzdGVuZXIpOwotCWNsYXNzRWRpdG9yVHguYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBjbGFzc1RleHRMaXN0ZW5lcik7Ci0JCi0JZmluYWwgU2hlbGwgZmxvYXRlciA9IG5ldyBTaGVsbChzaGVsbCwgU1dULk5PX1RSSU0pOwotCWZsb2F0ZXIuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWNsYXNzTGlzdEVkaXRvciA9IG5ldyBGbGFnc0VkaXRvcihjbGFzc2VzTHQpOwotCWNsYXNzRWRpdG9yTHQgPSBuZXcgTGlzdChmbG9hdGVyLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQljbGFzc0VkaXRvckx0LnNldEl0ZW1zKENsYXNzRGF0YS5nZXRBbGxGbGFncygpKTsKLQlmbG9hdGVyLnBhY2soKTsKLQlmbG9hdGVyLmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQljbGFzc0xpc3RFZGl0b3Iuc2V0SXRlbShudWxsKTsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJZmxvYXRlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCX0pOwotCUxpc3RlbmVyIGNsYXNzZXNMaXN0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULlRyYXZlcnNlKSB7Ci0JCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlmbG9hdGVyLnNldFZpc2libGUoZmFsc2UpOwotCQkJVGFibGVJdGVtIGl0ZW0gPSBjbGFzc0xpc3RFZGl0b3IuZ2V0SXRlbSgpOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQkJaW50IGNvbHVtbiA9IGNsYXNzTGlzdEVkaXRvci5nZXRDb2x1bW4oKTsKLQkJCUNsYXNzRGF0YSBjbGFzc0RhdGEgPSAoQ2xhc3NEYXRhKWl0ZW0uZ2V0RGF0YSgpOwotCQkJaWYgKGNvbHVtbiA9PSBDTEFTU19GTEFHU19DT0xVTU4pIHsKLQkJCQlTdHJpbmdbXSBmbGFncyA9IGNsYXNzRWRpdG9yTHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJY2xhc3NEYXRhLnNldEZsYWdzKGZsYWdzKTsKLQkJCQlpdGVtLnNldFRleHQoY29sdW1uLCBnZXRGbGFnc1N0cmluZyhjbGFzc0RhdGEuZ2V0RmxhZ3MoKSkpOwotCQkJCWl0ZW0uc2V0Q2hlY2tlZChjbGFzc0RhdGEuZ2V0R2VuZXJhdGUoKSk7Ci0JCQkJTWV0YURhdGEgbWV0YURhdGEgPSBhcHAuZ2V0TWV0YURhdGEoKTsKLQkJCQltZXRhRGF0YS5zZXRNZXRhRGF0YShjbGFzc0RhdGEuZ2V0Q2xhenooKSwgY2xhc3NEYXRhKTsKLQkJCQljbGFzc2VzTHQuZ2V0Q29sdW1uKGNvbHVtbikucGFjaygpOwotCQkJfQotCQl9Ci0JfTsKLQljbGFzc0VkaXRvckx0LmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBjbGFzc2VzTGlzdExpc3RlbmVyKTsKLQljbGFzc0VkaXRvckx0LmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgY2xhc3Nlc0xpc3RMaXN0ZW5lcik7Ci0JY2xhc3NFZGl0b3JMdC5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIGNsYXNzZXNMaXN0TGlzdGVuZXIpOwotCi0JY2xhc3Nlc0x0LmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGUuYnV0dG9uICE9IDEpIHJldHVybjsKLQkJCVBvaW50IHB0ID0gbmV3IFBvaW50KGUueCwgZS55KTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gY2xhc3Nlc0x0LmdldEl0ZW0ocHQpOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQkJaW50IGNvbHVtbiA9IC0xOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzTHQuZ2V0Q29sdW1uQ291bnQoKTsgaSsrKSB7Ci0JCQkJaWYgKGl0ZW0uZ2V0Qm91bmRzKGkpLmNvbnRhaW5zKHB0KSkgewotCQkJCQljb2x1bW4gPSBpOwotCQkJCQlicmVhazsKLQkJCQl9CQkJCQotCQkJfQotCQkJaWYgKGNvbHVtbiA9PSAtMSkgcmV0dXJuOwotCQkJQ2xhc3NEYXRhIGRhdGEgPSAoQ2xhc3NEYXRhKWl0ZW0uZ2V0RGF0YSgpOwotCQkJaWYgKGNvbHVtbiA9PSBDTEFTU19FWENMVURFX0NPTFVNTikgewotCQkJCWNsYXNzVGV4dEVkaXRvci5zZXRDb2x1bW4oY29sdW1uKTsKLQkJCQljbGFzc1RleHRFZGl0b3Iuc2V0SXRlbShpdGVtKTsKLQkJCQljbGFzc0VkaXRvclR4LnNldFRleHQoZGF0YS5nZXRFeGNsdWRlKCkpOwotCQkJCWNsYXNzRWRpdG9yVHguc2VsZWN0QWxsKCk7Ci0JCQkJY2xhc3NFZGl0b3JUeC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCWNsYXNzRWRpdG9yVHguc2V0Rm9jdXMoKTsKLQkJCX0gZWxzZSBpZiAoY29sdW1uID09IENMQVNTX0ZMQUdTX0NPTFVNTikgewotCQkJCWNsYXNzTGlzdEVkaXRvci5zZXRDb2x1bW4oY29sdW1uKTsKLQkJCQljbGFzc0xpc3RFZGl0b3Iuc2V0SXRlbShpdGVtKTsKLQkJCQljbGFzc0VkaXRvckx0LnNldFNlbGVjdGlvbihkYXRhLmdldEZsYWdzKCkpOwotCQkJCWZsb2F0ZXIuc2V0TG9jYXRpb24oY2xhc3Nlc0x0LnRvRGlzcGxheShlLngsIGUueSkpOwotCQkJCWZsb2F0ZXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQljbGFzc0VkaXRvckx0LnNldEZvY3VzKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLX0KLQotdm9pZCBjcmVhdGVNZW1iZXJzUGFuZWwoQ29tcG9zaXRlIHBhbmVsKSB7Ci0JTGFiZWwgbWVtYmVyc0xiID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTk9ORSk7Ci0JbWVtYmVyc0xiLnNldFRleHQoIk1lbSZiZXJzOiIpOwotCi0JR3JpZERhdGEgZGF0YTsKLQltZW1iZXJzTHQgPSBuZXcgVGFibGUocGFuZWwsIFNXVC5DSEVDSyB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBtZW1iZXJzTHQuZ2V0SXRlbUhlaWdodCgpICogNjsKLQltZW1iZXJzTHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQltZW1iZXJzTHQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0JCQkJdXBkYXRlR2VuZXJhdGUoKFRhYmxlSXRlbSllLml0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl1cGRhdGVQYXJhbWV0ZXJzKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQltZW1iZXJUZXh0RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yKG1lbWJlcnNMdCk7Ci0JbWVtYmVyVGV4dEVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JbWVtYmVyRWRpdG9yVHggPSBuZXcgVGV4dChtZW1iZXJzTHQsIFNXVC5TSU5HTEUpOwotCW1lbWJlclRleHRFZGl0b3Iuc2V0RWRpdG9yKG1lbWJlckVkaXRvclR4KTsKLQlMaXN0ZW5lciBtZW1iZXJUZXh0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULlRyYXZlcnNlKSB7Ci0JCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCQltZW1iZXJUZXh0RWRpdG9yLnNldEl0ZW0obnVsbCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQltZW1iZXJFZGl0b3JUeC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbWVtYmVyVGV4dEVkaXRvci5nZXRJdGVtKCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgY29sdW1uID0gbWVtYmVyVGV4dEVkaXRvci5nZXRDb2x1bW4oKTsKLQkJCUl0ZW1EYXRhIG1lbWJlckRhdGEgPSAoSXRlbURhdGEpaXRlbS5nZXREYXRhKCk7Ci0JCQlTdHJpbmcgdGV4dCA9IG1lbWJlckVkaXRvclR4LmdldFRleHQoKTsKLQkJCU1ldGFEYXRhIG1ldGFEYXRhID0gYXBwLmdldE1ldGFEYXRhKCk7Ci0JCQlpZiAobWVtYmVyRGF0YSBpbnN0YW5jZW9mIEZpZWxkRGF0YSkgewotCQkJCUZpZWxkRGF0YSBmaWVsZERhdGEgPSAoRmllbGREYXRhKW1lbWJlckRhdGE7Ci0JCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQkJY2FzZSBGSUVMRF9DQVNUX0NPTFVNTjogewotCQkJCQkJZmllbGREYXRhLnNldENhc3QodGV4dCk7Ci0JCQkJCQlpdGVtLnNldFRleHQoY29sdW1uLCBmaWVsZERhdGEuZ2V0Q2FzdCgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgRklFTERfQUNDRVNTT1JfQ09MVU1OOiB7Ci0JCQkJCQlmaWVsZERhdGEuc2V0QWNjZXNzb3IodGV4dCk7Ci0JCQkJCQlpdGVtLnNldFRleHQoY29sdW1uLCBmaWVsZERhdGEuZ2V0QWNjZXNzb3IoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIEZJRUxEX0VYQ0xVREVfQ09MVU1OOiB7Ci0JCQkJCQlmaWVsZERhdGEuc2V0RXhjbHVkZSh0ZXh0KTsKLQkJCQkJCWl0ZW0uc2V0VGV4dChjb2x1bW4sIGZpZWxkRGF0YS5nZXRFeGNsdWRlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbWV0YURhdGEuc2V0TWV0YURhdGEoZmllbGREYXRhLmdldEZpZWxkKCksIGZpZWxkRGF0YSk7Ci0JCQkJbWVtYmVyc0x0LmdldENvbHVtbihjb2x1bW4pLnBhY2soKTsKLQkJCX0gZWxzZSBpZiAobWVtYmVyRGF0YSBpbnN0YW5jZW9mIE1ldGhvZERhdGEpIHsKLQkJCQlNZXRob2REYXRhIG1ldGhvZERhdGEgPSAoTWV0aG9kRGF0YSltZW1iZXJEYXRhOwotCQkJCXN3aXRjaCAoY29sdW1uKSB7Ci0JCQkJCWNhc2UgTUVUSE9EX0FDQ0VTU09SX0NPTFVNTjogewotCQkJCQkJbWV0aG9kRGF0YS5zZXRBY2Nlc3Nvcih0ZXh0KTsKLQkJCQkJCWl0ZW0uc2V0VGV4dChjb2x1bW4sIG1ldGhvZERhdGEuZ2V0QWNjZXNzb3IoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIE1FVEhPRF9FWENMVURFX0NPTFVNTjogewotCQkJCQkJbWV0aG9kRGF0YS5zZXRFeGNsdWRlKHRleHQpOwotCQkJCQkJaXRlbS5zZXRUZXh0KGNvbHVtbiwgbWV0aG9kRGF0YS5nZXRFeGNsdWRlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbWV0YURhdGEuc2V0TWV0YURhdGEobWV0aG9kRGF0YS5nZXRNZXRob2QoKSwgbWV0aG9kRGF0YSk7Ci0JCQkJbWVtYmVyc0x0LmdldENvbHVtbihjb2x1bW4pLnBhY2soKTsKLQkJCX0KLQkJfQotCX07Ci0JbWVtYmVyRWRpdG9yVHguYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG1lbWJlclRleHRMaXN0ZW5lcik7Ci0JbWVtYmVyRWRpdG9yVHguYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBtZW1iZXJUZXh0TGlzdGVuZXIpOwotCW1lbWJlckVkaXRvclR4LmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgbWVtYmVyVGV4dExpc3RlbmVyKTsKLQkKLQlmaW5hbCBTaGVsbCBmbG9hdGVyID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuTk9fVFJJTSk7Ci0JZmxvYXRlci5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JbWVtYmVyTGlzdEVkaXRvciA9IG5ldyBGbGFnc0VkaXRvcihtZW1iZXJzTHQpOwotCW1lbWJlckVkaXRvckx0ID0gbmV3IExpc3QoZmxvYXRlciwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JZmxvYXRlci5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJbWVtYmVyTGlzdEVkaXRvci5zZXRJdGVtKG51bGwpOwotCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQlmbG9hdGVyLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JfSk7Ci0JTGlzdGVuZXIgbWVtYmVyTGlzdExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS50eXBlID09IFNXVC5UcmF2ZXJzZSkgewotCQkJCXN3aXRjaCAoZS5kZXRhaWwpIHsKLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOgotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZmxvYXRlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbWVtYmVyTGlzdEVkaXRvci5nZXRJdGVtKCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgY29sdW1uID0gbWVtYmVyTGlzdEVkaXRvci5nZXRDb2x1bW4oKTsKLQkJCUl0ZW1EYXRhIGRhdGEgPSAoSXRlbURhdGEpaXRlbS5nZXREYXRhKCk7Ci0JCQlTdHJpbmdbXSBmbGFncyA9IG1lbWJlckVkaXRvckx0LmdldFNlbGVjdGlvbigpOwotCQkJZGF0YS5zZXRGbGFncyhmbGFncyk7Ci0JCQlpdGVtLnNldFRleHQoY29sdW1uLCBnZXRGbGFnc1N0cmluZyhkYXRhLmdldEZsYWdzKCkpKTsKLQkJCWl0ZW0uc2V0Q2hlY2tlZChkYXRhLmdldEdlbmVyYXRlKCkpOwotCQkJTWV0YURhdGEgbWV0YURhdGEgPSBhcHAuZ2V0TWV0YURhdGEoKTsKLQkJCWlmIChkYXRhIGluc3RhbmNlb2YgRmllbGREYXRhKSB7Ci0JCQkJRmllbGREYXRhIGZpZWxkRGF0YSA9IChGaWVsZERhdGEpZGF0YTsKLQkJCQltZXRhRGF0YS5zZXRNZXRhRGF0YShmaWVsZERhdGEuZ2V0RmllbGQoKSwgZmllbGREYXRhKTsKLQkJCQltZW1iZXJzTHQuZ2V0Q29sdW1uKGNvbHVtbikucGFjaygpOwotCQkJfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgTWV0aG9kRGF0YSkgewotCQkJCU1ldGhvZERhdGEgbWV0aG9kRGF0YSA9IChNZXRob2REYXRhKWRhdGE7Ci0JCQkJbWV0YURhdGEuc2V0TWV0YURhdGEobWV0aG9kRGF0YS5nZXRNZXRob2QoKSwgbWV0aG9kRGF0YSk7Ci0JCQkJbWVtYmVyc0x0LmdldENvbHVtbihjb2x1bW4pLnBhY2soKTsKLQkJCX0KLQkJfQotCX07Ci0JbWVtYmVyRWRpdG9yTHQuYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG1lbWJlckxpc3RMaXN0ZW5lcik7Ci0JbWVtYmVyRWRpdG9yTHQuYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBtZW1iZXJMaXN0TGlzdGVuZXIpOwotCW1lbWJlckVkaXRvckx0LmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgbWVtYmVyTGlzdExpc3RlbmVyKTsKLQkKLQltZW1iZXJzTHQuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS5idXR0b24gIT0gMSkgcmV0dXJuOwotCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQoZS54LCBlLnkpOwotCQkJVGFibGVJdGVtIGl0ZW0gPSBtZW1iZXJzTHQuZ2V0SXRlbShwdCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgY29sdW1uID0gLTE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnNMdC5nZXRDb2x1bW5Db3VudCgpOyBpKyspIHsKLQkJCQlpZiAoaXRlbS5nZXRCb3VuZHMoaSkuY29udGFpbnMocHQpKSB7Ci0JCQkJCWNvbHVtbiA9IGk7Ci0JCQkJCWJyZWFrOwotCQkJCX0JCQkJCi0JCQl9Ci0JCQlpZiAoY29sdW1uID09IC0xKSByZXR1cm47Ci0JCQlJdGVtRGF0YSBpdGVtRGF0YSA9IChJdGVtRGF0YSlpdGVtLmdldERhdGEoKTsKLQkJCWlmIChpdGVtRGF0YSBpbnN0YW5jZW9mIEZpZWxkRGF0YSkgewotCQkJCUZpZWxkRGF0YSBkYXRhID0gKEZpZWxkRGF0YSlpdGVtRGF0YTsKLQkJCQlpZiAoY29sdW1uID09IEZJRUxEX0NBU1RfQ09MVU1OIHx8IGNvbHVtbiA9PSBGSUVMRF9BQ0NFU1NPUl9DT0xVTU4gfHwgY29sdW1uID09IEZJRUxEX0VYQ0xVREVfQ09MVU1OKSB7Ci0JCQkJCW1lbWJlclRleHRFZGl0b3Iuc2V0Q29sdW1uKGNvbHVtbik7Ci0JCQkJCW1lbWJlclRleHRFZGl0b3Iuc2V0SXRlbShpdGVtKTsKLQkJCQkJU3RyaW5nIHRleHQgPSAiIjsKLQkJCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQkJCWNhc2UgRklFTERfQ0FTVF9DT0xVTU46IHRleHQgPSBkYXRhLmdldENhc3QoKTsgYnJlYWs7Ci0JCQkJCQljYXNlIEZJRUxEX0FDQ0VTU09SX0NPTFVNTjogdGV4dCA9IGRhdGEuZ2V0QWNjZXNzb3IoKTsgYnJlYWs7Ci0JCQkJCQljYXNlIEZJRUxEX0VYQ0xVREVfQ09MVU1OOiB0ZXh0ID0gZGF0YS5nZXRFeGNsdWRlKCk7IGJyZWFrOwotCQkJCQl9Ci0JCQkJCW1lbWJlckVkaXRvclR4LnNldFRleHQodGV4dCk7Ci0JCQkJCW1lbWJlckVkaXRvclR4LnNlbGVjdEFsbCgpOwotCQkJCQltZW1iZXJFZGl0b3JUeC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQltZW1iZXJFZGl0b3JUeC5zZXRGb2N1cygpOwotCQkJCX0gZWxzZSBpZiAoY29sdW1uID09IEZJRUxEX0ZMQUdTX0NPTFVNTikgewotCQkJCQltZW1iZXJMaXN0RWRpdG9yLnNldENvbHVtbihjb2x1bW4pOwotCQkJCQltZW1iZXJMaXN0RWRpdG9yLnNldEl0ZW0oaXRlbSk7Ci0JCQkJCW1lbWJlckVkaXRvckx0LnNldEl0ZW1zKEZpZWxkRGF0YS5nZXRBbGxGbGFncygpKTsKLQkJCQkJbWVtYmVyRWRpdG9yTHQuc2V0U2VsZWN0aW9uKGRhdGEuZ2V0RmxhZ3MoKSk7Ci0JCQkJCWZsb2F0ZXIuc2V0TG9jYXRpb24obWVtYmVyc0x0LnRvRGlzcGxheShlLngsIGUueSkpOwotCQkJCQlmbG9hdGVyLnBhY2soKTsKLQkJCQkJZmxvYXRlci5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQltZW1iZXJFZGl0b3JMdC5zZXRGb2N1cygpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoaXRlbURhdGEgaW5zdGFuY2VvZiBNZXRob2REYXRhKSB7Ci0JCQkJTWV0aG9kRGF0YSBkYXRhID0gKE1ldGhvZERhdGEpaXRlbURhdGE7Ci0JCQkJaWYgKGNvbHVtbiA9PSBNRVRIT0RfRVhDTFVERV9DT0xVTU4gfHwgY29sdW1uID09IE1FVEhPRF9BQ0NFU1NPUl9DT0xVTU4pIHsKLQkJCQkJbWVtYmVyVGV4dEVkaXRvci5zZXRDb2x1bW4oY29sdW1uKTsKLQkJCQkJbWVtYmVyVGV4dEVkaXRvci5zZXRJdGVtKGl0ZW0pOwotCQkJCQlTdHJpbmcgdGV4dCA9ICIiOwotCQkJCQlzd2l0Y2ggKGNvbHVtbikgewotCQkJCQkJY2FzZSBNRVRIT0RfQUNDRVNTT1JfQ09MVU1OOiB0ZXh0ID0gZGF0YS5nZXRBY2Nlc3NvcigpOyBicmVhazsKLQkJCQkJCWNhc2UgTUVUSE9EX0VYQ0xVREVfQ09MVU1OOiB0ZXh0ID0gZGF0YS5nZXRFeGNsdWRlKCk7IGJyZWFrOwotCQkJCQl9Ci0JCQkJCW1lbWJlckVkaXRvclR4LnNldFRleHQodGV4dCk7Ci0JCQkJCW1lbWJlckVkaXRvclR4LnNlbGVjdEFsbCgpOwotCQkJCQltZW1iZXJFZGl0b3JUeC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQltZW1iZXJFZGl0b3JUeC5zZXRGb2N1cygpOwotCQkJCX0gZWxzZSBpZiAoY29sdW1uID09IE1FVEhPRF9GTEFHU19DT0xVTU4pIHsKLQkJCQkJbWVtYmVyTGlzdEVkaXRvci5zZXRDb2x1bW4oY29sdW1uKTsKLQkJCQkJbWVtYmVyTGlzdEVkaXRvci5zZXRJdGVtKGl0ZW0pOwotCQkJCQltZW1iZXJFZGl0b3JMdC5zZXRJdGVtcyhNZXRob2REYXRhLmdldEFsbEZsYWdzKCkpOwotCQkJCQltZW1iZXJFZGl0b3JMdC5zZXRTZWxlY3Rpb24oZGF0YS5nZXRGbGFncygpKTsKLQkJCQkJZmxvYXRlci5zZXRMb2NhdGlvbihtZW1iZXJzTHQudG9EaXNwbGF5KGUueCwgZS55KSk7Ci0JCQkJCWZsb2F0ZXIucGFjaygpOwotCQkJCQlmbG9hdGVyLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCW1lbWJlckVkaXRvckx0LnNldEZvY3VzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci19Ci0KLXZvaWQgY3JlYXRlUGFyYW1ldGVyc1BhbmVsKENvbXBvc2l0ZSBwYW5lbCkgewotCUxhYmVsIHBhcmFtc0xiID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTk9ORSk7Ci0JcGFyYW1zTGIuc2V0VGV4dCgiJlBhcmFtZXRlcnM6Iik7Ci0JCi0JR3JpZERhdGEgZGF0YTsKLQlwYXJhbXNMdCA9IG5ldyBUYWJsZShwYW5lbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCWludCBpdGVtSGVpZ2h0ID0gcGFyYW1zTHQuZ2V0SXRlbUhlaWdodCgpOwotCWRhdGEuaGVpZ2h0SGludCA9IGl0ZW1IZWlnaHQgKiA2OwotCXBhcmFtc0x0LnNldExheW91dERhdGEoZGF0YSk7Ci0JcGFyYW1zTHQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0JCQkJdXBkYXRlR2VuZXJhdGUoKFRhYmxlSXRlbSllLml0ZW0pOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQlUYWJsZUNvbHVtbiBjb2x1bW47Ci0JY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHBhcmFtc0x0LCBTV1QuTk9ORSwgUEFSQU1fSU5ERVhfQ09MVU1OKTsKLQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4ocGFyYW1zTHQsIFNXVC5OT05FLCBQQVJBTV9UWVBFX0NPTFVNTik7Ci0JY29sdW1uLnNldFRleHQoIlR5cGUiKTsKLQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4ocGFyYW1zTHQsIFNXVC5OT05FLCBQQVJBTV9GTEFHU19DT0xVTU4pOwotCWNvbHVtbi5zZXRUZXh0KCJGbGFncyIpOwotCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihwYXJhbXNMdCwgU1dULk5PTkUsIFBBUkFNX0NBU1RfQ09MVU1OKTsKLQljb2x1bW4uc2V0VGV4dCgiQ2FzdCIpOwotCQotCXBhcmFtVGV4dEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvcihwYXJhbXNMdCk7Ci0JcGFyYW1UZXh0RWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQlwYXJhbUVkaXRvclR4ID0gbmV3IFRleHQocGFyYW1zTHQsIFNXVC5TSU5HTEUpOwotCXBhcmFtVGV4dEVkaXRvci5zZXRFZGl0b3IocGFyYW1FZGl0b3JUeCk7Ci0JTGlzdGVuZXIgcGFyYW1UZXh0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULlRyYXZlcnNlKSB7Ci0JCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCQlwYXJhbVRleHRFZGl0b3Iuc2V0SXRlbShudWxsKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXBhcmFtRWRpdG9yVHguc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IHBhcmFtVGV4dEVkaXRvci5nZXRJdGVtKCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgY29sdW1uID0gcGFyYW1UZXh0RWRpdG9yLmdldENvbHVtbigpOwotCQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSAoUGFyYW1ldGVyRGF0YSlpdGVtLmdldERhdGEoKTsKLQkJCWlmIChjb2x1bW4gPT0gUEFSQU1fQ0FTVF9DT0xVTU4pIHsKLQkJCQlTdHJpbmcgdGV4dCA9IHBhcmFtRWRpdG9yVHguZ2V0VGV4dCgpOwotCQkJCXBhcmFtRGF0YS5zZXRDYXN0KHRleHQpOwotCQkJCWl0ZW0uc2V0VGV4dChjb2x1bW4sIHBhcmFtRGF0YS5nZXRDYXN0KCkpOwotCQkJCU1ldGFEYXRhIG1ldGFEYXRhID0gYXBwLmdldE1ldGFEYXRhKCk7Ci0JCQkJbWV0YURhdGEuc2V0TWV0YURhdGEocGFyYW1EYXRhLmdldE1ldGhvZCgpLCBwYXJhbURhdGEuZ2V0UGFyYW1ldGVyKCksIHBhcmFtRGF0YSk7Ci0JCQkJcGFyYW1zTHQuZ2V0Q29sdW1uKGNvbHVtbikucGFjaygpOwotCQkJfQotCQl9Ci0JfTsKLQlwYXJhbUVkaXRvclR4LmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBwYXJhbVRleHRMaXN0ZW5lcik7Ci0JcGFyYW1FZGl0b3JUeC5hZGRMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIHBhcmFtVGV4dExpc3RlbmVyKTsKLQlwYXJhbUVkaXRvclR4LmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgcGFyYW1UZXh0TGlzdGVuZXIpOwotCQotCWZpbmFsIFNoZWxsIGZsb2F0ZXIgPSBuZXcgU2hlbGwoc2hlbGwsIFNXVC5OT19UUklNKTsKLQlmbG9hdGVyLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlwYXJhbUxpc3RFZGl0b3IgPSBuZXcgRmxhZ3NFZGl0b3IocGFyYW1zTHQpOwotCXBhcmFtRWRpdG9yTHQgPSBuZXcgTGlzdChmbG9hdGVyLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQlwYXJhbUVkaXRvckx0LnNldEl0ZW1zKFBhcmFtZXRlckRhdGEuZ2V0QWxsRmxhZ3MoKSk7Ci0JZmxvYXRlci5wYWNrKCk7Ci0JZmxvYXRlci5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJcGFyYW1MaXN0RWRpdG9yLnNldEl0ZW0obnVsbCk7Ci0JCQllLmRvaXQgPSBmYWxzZTsKLQkJCWZsb2F0ZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQl9KTsKLQlMaXN0ZW5lciBwYXJhbUxpc3RMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGUudHlwZSA9PSBTV1QuVHJhdmVyc2UpIHsKLQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWZsb2F0ZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IHBhcmFtTGlzdEVkaXRvci5nZXRJdGVtKCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgY29sdW1uID0gcGFyYW1MaXN0RWRpdG9yLmdldENvbHVtbigpOwotCQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSAoUGFyYW1ldGVyRGF0YSlpdGVtLmdldERhdGEoKTsKLQkJCWlmIChjb2x1bW4gPT0gUEFSQU1fRkxBR1NfQ09MVU1OKSB7Ci0JCQkJU3RyaW5nW10gZmxhZ3MgPSBwYXJhbUVkaXRvckx0LmdldFNlbGVjdGlvbigpOwotCQkJCXBhcmFtRGF0YS5zZXRGbGFncyhmbGFncyk7Ci0JCQkJaXRlbS5zZXRUZXh0KGNvbHVtbiwgZ2V0RmxhZ3NTdHJpbmcocGFyYW1EYXRhLmdldEZsYWdzKCkpKTsKLQkJCQlNZXRhRGF0YSBtZXRhRGF0YSA9IGFwcC5nZXRNZXRhRGF0YSgpOwotCQkJCW1ldGFEYXRhLnNldE1ldGFEYXRhKHBhcmFtRGF0YS5nZXRNZXRob2QoKSwgcGFyYW1EYXRhLmdldFBhcmFtZXRlcigpLCBwYXJhbURhdGEpOwotCQkJCXBhcmFtc0x0LmdldENvbHVtbihjb2x1bW4pLnBhY2soKTsKLQkJCX0KLQkJfQotCX07Ci0JcGFyYW1FZGl0b3JMdC5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgcGFyYW1MaXN0TGlzdGVuZXIpOwotCXBhcmFtRWRpdG9yTHQuYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBwYXJhbUxpc3RMaXN0ZW5lcik7Ci0JcGFyYW1FZGl0b3JMdC5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIHBhcmFtTGlzdExpc3RlbmVyKTsKLQotCXBhcmFtc0x0LmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoZmluYWwgRXZlbnQgZSkgewotCQkJZS5kaXNwbGF5LmFzeW5jRXhlYyAobmV3IFJ1bm5hYmxlICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJCQlpZiAocGFyYW1zTHQuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQkJCQlpZiAoZS5idXR0b24gIT0gMSkgcmV0dXJuOwotCQkJCQlQb2ludCBwdCA9IG5ldyBQb2ludChlLngsIGUueSk7Ci0JCQkJCVRhYmxlSXRlbSBpdGVtID0gcGFyYW1zTHQuZ2V0SXRlbShwdCk7Ci0JCQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCQkJaW50IGNvbHVtbiA9IC0xOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtc0x0LmdldENvbHVtbkNvdW50KCk7IGkrKykgewotCQkJCQkJaWYgKGl0ZW0uZ2V0Qm91bmRzKGkpLmNvbnRhaW5zKHB0KSkgewotCQkJCQkJCWNvbHVtbiA9IGk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9CQkJCQotCQkJCQl9Ci0JCQkJCWlmIChjb2x1bW4gPT0gLTEpIHJldHVybjsKLQkJCQkJUGFyYW1ldGVyRGF0YSBkYXRhID0gKFBhcmFtZXRlckRhdGEpaXRlbS5nZXREYXRhKCk7Ci0JCQkJCWlmIChjb2x1bW4gPT0gUEFSQU1fQ0FTVF9DT0xVTU4pIHsKLQkJCQkJCXBhcmFtVGV4dEVkaXRvci5zZXRDb2x1bW4oY29sdW1uKTsKLQkJCQkJCXBhcmFtVGV4dEVkaXRvci5zZXRJdGVtKGl0ZW0pOwotCQkJCQkJcGFyYW1FZGl0b3JUeC5zZXRUZXh0KGRhdGEuZ2V0Q2FzdCgpKTsKLQkJCQkJCXBhcmFtRWRpdG9yVHguc2VsZWN0QWxsKCk7Ci0JCQkJCQlwYXJhbUVkaXRvclR4LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCQlwYXJhbUVkaXRvclR4LnNldEZvY3VzKCk7Ci0JCQkJCX0gZWxzZSBpZiAoY29sdW1uID09IFBBUkFNX0ZMQUdTX0NPTFVNTikgewotCQkJCQkJcGFyYW1MaXN0RWRpdG9yLnNldENvbHVtbihjb2x1bW4pOwotCQkJCQkJcGFyYW1MaXN0RWRpdG9yLnNldEl0ZW0oaXRlbSk7Ci0JCQkJCQlwYXJhbUVkaXRvckx0LnNldFNlbGVjdGlvbihkYXRhLmdldEZsYWdzKCkpOwotCQkJCQkJZmxvYXRlci5zZXRMb2NhdGlvbihwYXJhbXNMdC50b0Rpc3BsYXkoZS54LCBlLnkpKTsKLQkJCQkJCWZsb2F0ZXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCXBhcmFtRWRpdG9yTHQuc2V0Rm9jdXMoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfSk7Ci19Ci0KLUJ1dHRvbiBjcmVhdGVBY3Rpb25CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JQnV0dG9uIGFjdGlvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYWN0aW9uLnNldFRleHQodGV4dCk7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWFjdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCWFjdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JcmV0dXJuIGFjdGlvbjsKLX0KLQotdm9pZCBjcmVhdGVBY3Rpb25CdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpIHsJCQotCWFjdGlvbnNQYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCWFjdGlvbnNQYW5lbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQlHcmlkTGF5b3V0IGFjdGlvbnNMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWFjdGlvbnNMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JYWN0aW9uc1BhbmVsLnNldExheW91dChhY3Rpb25zTGF5b3V0KTsKLQkKLQljcmVhdGVBY3Rpb25CdXR0b24oYWN0aW9uc1BhbmVsLCAiR2VuZXJhdGUgJkFsbCIsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZ2VuZXJhdGVBbGwoKTsKLQkJfQotCX0pOwotCQotCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChhY3Rpb25zUGFuZWwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCXNlcGFyYXRvciA9IG5ldyBMYWJlbChhY3Rpb25zUGFuZWwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWNyZWF0ZUFjdGlvbkJ1dHRvbihhY3Rpb25zUGFuZWwsICJHZW5lcmF0ZSBTdHJ1Y3RzICZIZWFkZXIiLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWdlbmVyYXRlU3RydWN0c0hlYWRlcigpOwotCQl9Ci0JfSk7Ci0JY3JlYXRlQWN0aW9uQnV0dG9uKGFjdGlvbnNQYW5lbCwgIkdlbmVyYXRlICZTdHJ1Y3RzIiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlnZW5lcmF0ZVN0cnVjdHMoKTsKLQkJfQotCX0pOwotCWNyZWF0ZUFjdGlvbkJ1dHRvbihhY3Rpb25zUGFuZWwsICJHZW5lcmF0ZSAmTmF0aXZlcyIsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZ2VuZXJhdGVOYXRpdmVzKCk7Ci0JCX0KLQl9KTsKLQljcmVhdGVBY3Rpb25CdXR0b24oYWN0aW9uc1BhbmVsLCAiR2VuZXJhdGUgTWV0YSAmRGF0YSIsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZ2VuZXJhdGVNZXRhRGF0YSgpOwotCQl9Ci0JfSk7Ci0JY3JlYXRlQWN0aW9uQnV0dG9uKGFjdGlvbnNQYW5lbCwgIkdlbmVyYXRlIENvbnMmdGFudHMiLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWdlbmVyYXRlQ29uc3RhbnRzKCk7Ci0JCX0KLQl9KTsJCi0JY3JlYXRlQWN0aW9uQnV0dG9uKGFjdGlvbnNQYW5lbCwgIkdlbmVyYXRlIFNpJnplb2YiLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWdlbmVyYXRlU2l6ZW9mKCk7Ci0JCX0KLQl9KTsKLQotCUNvbXBvc2l0ZSBmaWxsZXIgPSBuZXcgQ29tcG9zaXRlKGFjdGlvbnNQYW5lbCwgU1dULk5PTkUpOwotCWZpbGxlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkKLQlwcm9ncmVzc0xhYmVsID0gbmV3IExhYmVsKGFjdGlvbnNQYW5lbCwgU1dULk5PTkUpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlwcm9ncmVzc0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JcHJvZ3Jlc3NMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkKLQlwcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0JhcihhY3Rpb25zUGFuZWwsIFNXVC5OT05FKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JcHJvZ3Jlc3NCYXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlwcm9ncmVzc0Jhci5zZXRWaXNpYmxlKGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgcnVuKCkgewotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWNsZWFudXAoKTsKLX0KLQotU3RyaW5nIGdldFBhY2thZ2VTdHJpbmcoU3RyaW5nIGNsYXNzTmFtZSkgewotCWludCBkb3QgPSBhcHAuZ2V0TWFpbkNsYXNzTmFtZSgpLmxhc3RJbmRleE9mKCcuJyk7Ci0JaWYgKGRvdCA9PSAtMSkgcmV0dXJuICIiOwotCXJldHVybiBhcHAuZ2V0TWFpbkNsYXNzTmFtZSgpLnN1YnN0cmluZygwLCBkb3QpOwotfQotCi1TdHJpbmcgZ2V0Q2xhc3NTdHJpbmcoQ2xhc3MgY2xhenopIHsKLQlTdHJpbmcgbmFtZSA9IEpOSUdlbmVyYXRvci5nZXRUeXBlU2lnbmF0dXJlMyhjbGF6eik7Ci0JaW50IGluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuIG5hbWU7Ci0JcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSwgbmFtZS5sZW5ndGgoKSk7Ci19Ci0KLVN0cmluZyBnZXRGbGFnc1N0cmluZyhTdHJpbmdbXSBmbGFncykgewotCWlmIChmbGFncy5sZW5ndGggPT0gMCkgcmV0dXJuICIiOwotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBmbGFncy5sZW5ndGg7IGorKykgewotCQlTdHJpbmcgZmxhZyA9IGZsYWdzW2pdOwotCQlpZiAoYnVmZmVyLmxlbmd0aCgpICE9IDApIGJ1ZmZlci5hcHBlbmQoIiwgIik7Ci0JCWJ1ZmZlci5hcHBlbmQoZmxhZyk7Ci0JfQotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLQotU3RyaW5nIGdldE1ldGhvZFN0cmluZyhNZXRob2QgbWV0aG9kKSB7Ci0JU3RyaW5nIHBrZ05hbWUgPSBnZXRQYWNrYWdlU3RyaW5nKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSk7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlidWZmZXIuYXBwZW5kKG1ldGhvZC5nZXROYW1lKCkpOwotCWJ1ZmZlci5hcHBlbmQoIigiKTsKLQlDbGFzc1tdIHBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7Ci0JCUNsYXNzIHBhcmFtID0gcGFyYW1zW2ldOwotCQlpZiAoaSAhPSAwKSBidWZmZXIuYXBwZW5kKCIsIik7Ci0JCVN0cmluZyBzdHJpbmcgPSBKTklHZW5lcmF0b3IuZ2V0VHlwZVNpZ25hdHVyZTMocGFyYW0pOwotCQlpZiAoc3RyaW5nLnN0YXJ0c1dpdGgocGtnTmFtZSkpIHN0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcocGtnTmFtZS5sZW5ndGgoKSArIDEpOwotCQlidWZmZXIuYXBwZW5kKHN0cmluZyk7Ci0JfQotCWJ1ZmZlci5hcHBlbmQoIikiKTsKLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci0KLVN0cmluZyBnZXRGaWVsZFN0cmluZyhGaWVsZCBmaWVsZCkgewotCXJldHVybiBmaWVsZC5nZXROYW1lKCk7Ci19Ci0KLXZvaWQgdXBkYXRlQ2xhc3NlcygpIHsKLQljbGFzc2VzTHQucmVtb3ZlQWxsKCk7Ci0JTWV0YURhdGEgbWV0YURhdGEgPSBhcHAuZ2V0TWV0YURhdGEoKTsKLQlDbGFzc1tdIGNsYXNzZXMgPSBhcHAuZ2V0Q2xhc3NlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQlDbGFzcyBjbGF6eiA9IGNsYXNzZXNbaV07Ci0JCUNsYXNzRGF0YSBjbGFzc0RhdGEgPSBtZXRhRGF0YS5nZXRNZXRhRGF0YShjbGF6eik7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShjbGFzc2VzTHQsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXREYXRhKGNsYXNzRGF0YSk7Ci0JCWl0ZW0uc2V0VGV4dChDTEFTU19OQU1FX0NPTFVNTiwgZ2V0Q2xhc3NTdHJpbmcoY2xhenopKTsKLQkJaXRlbS5zZXRUZXh0KENMQVNTX0ZMQUdTX0NPTFVNTiwgZ2V0RmxhZ3NTdHJpbmcoY2xhc3NEYXRhLmdldEZsYWdzKCkpKTsKLQkJaXRlbS5zZXRDaGVja2VkKGNsYXNzRGF0YS5nZXRHZW5lcmF0ZSgpKTsKLQl9Ci0JVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gY2xhc3Nlc0x0LmdldENvbHVtbnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gY29sdW1uc1tpXTsKLQkJY29sdW1uLnBhY2soKTsKLQl9Ci19Ci0KLXZvaWQgdXBkYXRlTWVtYmVycygpIHsKLQltZW1iZXJzTHQucmVtb3ZlQWxsKCk7Ci0JTWV0YURhdGEgbWV0YURhdGEgPSBhcHAuZ2V0TWV0YURhdGEoKTsKLQltZW1iZXJzTHQuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gbWVtYmVyc0x0LmdldENvbHVtbnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gY29sdW1uc1tpXTsKLQkJY29sdW1uLmRpc3Bvc2UoKTsKLQl9Ci0JaW50W10gaW5kaWNlcyA9IGNsYXNzZXNMdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0JaWYgKGluZGljZXMubGVuZ3RoICE9IDEpIHJldHVybjsKLQlUYWJsZUl0ZW0gY2xhc3NJdGVtID0gY2xhc3Nlc0x0LmdldEl0ZW0oaW5kaWNlc1swXSk7Ci0JQ2xhc3NEYXRhIGNsYXNzRGF0YSA9IChDbGFzc0RhdGEpY2xhc3NJdGVtLmdldERhdGEoKTsKLQlDbGFzcyBjbGF6eiA9IGNsYXNzRGF0YS5nZXRDbGF6eigpOwotCWJvb2xlYW4gaGFzTmF0aXZlcyA9IGZhbHNlOwotCU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWludCBtb2RzID0gbWV0aG9kLmdldE1vZGlmaWVycygpOwotCQlpZiAoaGFzTmF0aXZlcyA9KChtb2RzICYgTW9kaWZpZXIuTkFUSVZFKSAhPSAwKSkgYnJlYWs7Ci0JfQotCW1lbWJlcnNMdC5zZXRSZWRyYXcoZmFsc2UpOwotCWlmIChoYXNOYXRpdmVzKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbjsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1lbWJlcnNMdCwgU1dULk5PTkUsIE1FVEhPRF9OQU1FX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJNZXRob2QiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1lbWJlcnNMdCwgU1dULk5PTkUsIE1FVEhPRF9GTEFHU19DT0xVTU4pOwotCQljb2x1bW4uc2V0VGV4dCgiRmxhZ3MiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1lbWJlcnNMdCwgU1dULk5PTkUsIE1FVEhPRF9BQ0NFU1NPUl9DT0xVTU4pOwotCQljb2x1bW4uc2V0VGV4dCgiQWNjZXNzb3IiKTsKLQkJLyoKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1lbWJlcnNMdCwgU1dULk5PTkUsIE1FVEhPRF9FWENMVURFX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJFeGNsdWRlIik7Ci0JCSovCi0JCUpOSUdlbmVyYXRvci5zb3J0KG1ldGhvZHMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQkJaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpID09IDApIGNvbnRpbnVlOwotCQkJTWV0aG9kRGF0YSBtZXRob2REYXRhID0gbWV0YURhdGEuZ2V0TWV0YURhdGEobWV0aG9kKTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShtZW1iZXJzTHQsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0RGF0YShtZXRob2REYXRhKTsKLQkJCWl0ZW0uc2V0VGV4dChNRVRIT0RfTkFNRV9DT0xVTU4sIGdldE1ldGhvZFN0cmluZyhtZXRob2QpKTsKLQkJCWl0ZW0uc2V0Q2hlY2tlZChtZXRob2REYXRhLmdldEdlbmVyYXRlKCkpOwotCQkJaXRlbS5zZXRUZXh0KE1FVEhPRF9GTEFHU19DT0xVTU4sIGdldEZsYWdzU3RyaW5nKG1ldGhvZERhdGEuZ2V0RmxhZ3MoKSkpOwotCQkJaXRlbS5zZXRUZXh0KE1FVEhPRF9BQ0NFU1NPUl9DT0xVTU4sIG1ldGhvZERhdGEuZ2V0QWNjZXNzb3IoKSk7Ci0JCQkvKgotCQkJaXRlbS5zZXRUZXh0KE1FVEhPRF9FWENMVURFX0NPTFVNTiwgbWV0aG9kRGF0YS5nZXRFeGNsdWRlKCkpOwotCQkJKi8KLQkJfQotCX0gZWxzZSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbjsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1lbWJlcnNMdCwgU1dULk5PTkUsIEZJRUxEX05BTUVfQ09MVU1OKTsKLQkJY29sdW1uLnNldFRleHQoIkZpZWxkIik7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihtZW1iZXJzTHQsIFNXVC5OT05FLCBGSUVMRF9GTEFHU19DT0xVTU4pOwotCQljb2x1bW4uc2V0VGV4dCgiRmxhZ3MiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1lbWJlcnNMdCwgU1dULk5PTkUsIEZJRUxEX0NBU1RfQ09MVU1OKTsKLQkJY29sdW1uLnNldFRleHQoIkNhc3QiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1lbWJlcnNMdCwgU1dULk5PTkUsIEZJRUxEX0FDQ0VTU09SX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJBY2Nlc3NvciIpOwotCQkvKgotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4obWVtYmVyc0x0LCBTV1QuTk9ORSwgRklFTERfRVhDTFVERV9DT0xVTU4pOwotCQljb2x1bW4uc2V0VGV4dCgiRXhjbHVkZSIpOwotCQkqLwotCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7CQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJRmllbGQgZmllbGQgPSBmaWVsZHNbaV07Ci0JCQlpbnQgbW9kcyA9IGZpZWxkLmdldE1vZGlmaWVycygpOyAKLQkJCWlmICgoKG1vZHMgJiBNb2RpZmllci5QVUJMSUMpID09IDApIHx8Ci0JCQkJKChtb2RzICYgTW9kaWZpZXIuRklOQUwpICE9IDApIHx8Ci0JCQkJKChtb2RzICYgTW9kaWZpZXIuU1RBVElDKSAhPSAwKSkgY29udGludWU7Ci0JCQlGaWVsZERhdGEgZmllbGREYXRhID0gbWV0YURhdGEuZ2V0TWV0YURhdGEoZmllbGQpOwotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKG1lbWJlcnNMdCwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXREYXRhKGZpZWxkRGF0YSk7Ci0JCQlpdGVtLnNldFRleHQoRklFTERfTkFNRV9DT0xVTU4sIGdldEZpZWxkU3RyaW5nKGZpZWxkKSk7Ci0JCQlpdGVtLnNldENoZWNrZWQoZmllbGREYXRhLmdldEdlbmVyYXRlKCkpOwotCQkJaXRlbS5zZXRUZXh0KEZJRUxEX0NBU1RfQ09MVU1OLCBmaWVsZERhdGEuZ2V0Q2FzdCgpKTsKLQkJCWl0ZW0uc2V0VGV4dChGSUVMRF9GTEFHU19DT0xVTU4sIGdldEZsYWdzU3RyaW5nKGZpZWxkRGF0YS5nZXRGbGFncygpKSk7Ci0JCQlpdGVtLnNldFRleHQoRklFTERfQUNDRVNTT1JfQ09MVU1OLCBmaWVsZERhdGEuZ2V0QWNjZXNzb3IoKSk7Ci0JCQkvKgotCQkJaXRlbS5zZXRUZXh0KEZJRUxEX0VYQ0xVREVfQ09MVU1OLCBmaWVsZERhdGEuZ2V0RXhjbHVkZSgpKTsKLQkJCSovCi0JCX0KLQl9Ci0JY29sdW1ucyA9IG1lbWJlcnNMdC5nZXRDb2x1bW5zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IGNvbHVtbnNbaV07Ci0JCWNvbHVtbi5wYWNrKCk7Ci0JfQotCW1lbWJlcnNMdC5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCW1lbWJlcnNMdC5zZXRSZWRyYXcodHJ1ZSk7Ci19Ci0KLXZvaWQgdXBkYXRlUGFyYW1ldGVycygpIHsKLQlwYXJhbXNMdC5yZW1vdmVBbGwoKTsKLQlNZXRhRGF0YSBtZXRhRGF0YSA9IGFwcC5nZXRNZXRhRGF0YSgpOwotCWludFtdIGluZGljZXMgPSBtZW1iZXJzTHQuZ2V0U2VsZWN0aW9uSW5kaWNlcygpOwotCWlmIChpbmRpY2VzLmxlbmd0aCAhPSAxKSB7Ci0JCXBhcmFtc0x0LnNldEhlYWRlclZpc2libGUoZmFsc2UpOwotCQlyZXR1cm47Ci0JfQotCVRhYmxlSXRlbSBtZW1iZXJJdGVtID0gbWVtYmVyc0x0LmdldEl0ZW0oaW5kaWNlc1swXSk7Ci0JT2JqZWN0IGRhdGEgPSBtZW1iZXJJdGVtLmdldERhdGEoKTsKLQlpZiAoIShkYXRhIGluc3RhbmNlb2YgTWV0aG9kRGF0YSkpIHJldHVybjsKLQlwYXJhbXNMdC5zZXRSZWRyYXcoZmFsc2UpOwotCU1ldGhvZERhdGEgbWV0aG9kRGF0YSA9IChNZXRob2REYXRhKW1lbWJlckl0ZW0uZ2V0RGF0YSgpOwotCU1ldGhvZCBtZXRob2QgPSBtZXRob2REYXRhLmdldE1ldGhvZCgpOwotCUNsYXNzW10gcGFyYW1zID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLQkJQ2xhc3MgcGFyYW0gPSBwYXJhbXNbaV07Ci0JCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gbWV0YURhdGEuZ2V0TWV0YURhdGEobWV0aG9kLCBpKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHBhcmFtc0x0LCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0RGF0YShwYXJhbURhdGEpOwotCQlpdGVtLnNldFRleHQoUEFSQU1fSU5ERVhfQ09MVU1OLCBTdHJpbmcudmFsdWVPZihpKSk7Ci0JCWl0ZW0uc2V0VGV4dChQQVJBTV9UWVBFX0NPTFVNTiwgZ2V0Q2xhc3NTdHJpbmcocGFyYW0pKTsKLQkJaXRlbS5zZXRUZXh0KFBBUkFNX0NBU1RfQ09MVU1OLCBwYXJhbURhdGEuZ2V0Q2FzdCgpKTsKLQkJaXRlbS5zZXRUZXh0KFBBUkFNX0ZMQUdTX0NPTFVNTiwgZ2V0RmxhZ3NTdHJpbmcocGFyYW1EYXRhLmdldEZsYWdzKCkpKTsKLQl9Ci0JVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gcGFyYW1zTHQuZ2V0Q29sdW1ucygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zW2ldOwotCQljb2x1bW4ucGFjaygpOwotCX0KLQlwYXJhbXNMdC5zZXRSZWRyYXcodHJ1ZSk7Ci0JcGFyYW1zTHQuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLX0KLQotdm9pZCB1cGRhdGVHZW5lcmF0ZShUYWJsZUl0ZW0gaXRlbSkgewotCU1ldGFEYXRhIG1ldGFEYXRhID0gYXBwLmdldE1ldGFEYXRhKCk7Ci0JSXRlbURhdGEgaXRlbURhdGEgPSAoSXRlbURhdGEpaXRlbS5nZXREYXRhKCk7Ci0JaXRlbURhdGEuc2V0R2VuZXJhdGUoaXRlbS5nZXRDaGVja2VkKCkpOwotCWlmIChpdGVtRGF0YSBpbnN0YW5jZW9mIENsYXNzRGF0YSkgewotCQlDbGFzc0RhdGEgZGF0YSA9IChDbGFzc0RhdGEpaXRlbURhdGE7Ci0JCW1ldGFEYXRhLnNldE1ldGFEYXRhKGRhdGEuZ2V0Q2xhenooKSwgZGF0YSk7Ci0JfSBlbHNlIGlmIChpdGVtRGF0YSBpbnN0YW5jZW9mIEZpZWxkRGF0YSkgewotCQlGaWVsZERhdGEgZGF0YSA9IChGaWVsZERhdGEpaXRlbURhdGE7Ci0JCWl0ZW0uc2V0VGV4dChGSUVMRF9GTEFHU19DT0xVTU4sIGdldEZsYWdzU3RyaW5nKGRhdGEuZ2V0RmxhZ3MoKSkpOwotCQltZXRhRGF0YS5zZXRNZXRhRGF0YShkYXRhLmdldEZpZWxkKCksIGRhdGEpOwotCX0gZWxzZSBpZiAoaXRlbURhdGEgaW5zdGFuY2VvZiBNZXRob2REYXRhKSB7Ci0JCU1ldGhvZERhdGEgZGF0YSA9IChNZXRob2REYXRhKWl0ZW1EYXRhOwotCQlpdGVtLnNldFRleHQoTUVUSE9EX0ZMQUdTX0NPTFVNTiwgZ2V0RmxhZ3NTdHJpbmcoZGF0YS5nZXRGbGFncygpKSk7Ci0JCW1ldGFEYXRhLnNldE1ldGFEYXRhKGRhdGEuZ2V0TWV0aG9kKCksIGRhdGEpOwotCX0gZWxzZSBpZiAoaXRlbURhdGEgaW5zdGFuY2VvZiBQYXJhbWV0ZXJEYXRhKSB7Ci0JCVBhcmFtZXRlckRhdGEgZGF0YSA9IChQYXJhbWV0ZXJEYXRhKWl0ZW1EYXRhOwotCQlpdGVtLnNldFRleHQoUEFSQU1fRkxBR1NfQ09MVU1OLCBnZXRGbGFnc1N0cmluZyhkYXRhLmdldEZsYWdzKCkpKTsKLQkJbWV0YURhdGEuc2V0TWV0YURhdGEoZGF0YS5nZXRNZXRob2QoKSwgZGF0YS5nZXRQYXJhbWV0ZXIoKSwgZGF0YSk7Ci0JfQotfQotCi1ib29sZWFuIHVwZGF0ZU91dHB1dERpcigpIHsKLQlTdHJpbmcgb3V0cHV0RGlyU3RyID0gb3V0cHV0RGlyQ2IuZ2V0VGV4dCgpOwotCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG91dHB1dERpclN0cik7Ci0JaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5PSyB8IFNXVC5JQ09OX0VSUk9SKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoIk91dHB1dCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuIik7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JaWYgKCFmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJTWVzc2FnZUJveCBkaWFsb2cgPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULk9LIHwgU1dULklDT05fRVJST1IpOwotCQlkaWFsb2cuc2V0TWVzc2FnZSgiT3V0cHV0IGRpcmVjdG9yeSBpcyBub3QgYSBkaXJlY3RvcnkuIik7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JaWYgKG91dHB1dERpclN0ci5sZW5ndGgoKSA+IDApIHsKLQkJaWYgKCFvdXRwdXREaXJTdHIuZXF1YWxzKGFwcC5nZXRPdXRwdXREaXIoKSkpIHsKLQkJCWFwcC5zZXRPdXRwdXREaXIob3V0cHV0RGlyU3RyKTsKLQkJfQotCQlpZiAob3V0cHV0RGlyQ2IuaW5kZXhPZihvdXRwdXREaXJTdHIpID09IC0xKSB7Ci0JCQlvdXRwdXREaXJDYi5hZGQob3V0cHV0RGlyU3RyKTsKLQkJfQotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCB1cGRhdGVNYWluQ2xhc3MoKSB7Ci0JU3RyaW5nIG1haW5DbGFzc1N0ciA9IG1haW5DbGFzc0NiLmdldFRleHQoKTsKLQlpZiAobWFpbkNsYXNzU3RyLmxlbmd0aCgpID4gMCkgewotCQlpZiAoIW1haW5DbGFzc1N0ci5lcXVhbHMoYXBwLmdldE1haW5DbGFzc05hbWUoKSkpIHsKLQkJCWFwcC5zZXRNYWluQ2xhc3NOYW1lKG1haW5DbGFzc1N0cik7Ci0JCX0KLQkJaWYgKG1haW5DbGFzc0NiLmluZGV4T2YobWFpbkNsYXNzU3RyKSA9PSAtMSkgewotCQkJbWFpbkNsYXNzQ2IuYWRkKG1haW5DbGFzc1N0cik7Ci0JCX0KLQkJaWYgKGFwcC5nZXRPdXRwdXREaXIoKSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBvdXRwdXREaXJDYi5pbmRleE9mKGFwcC5nZXRPdXRwdXREaXIoKSk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIG91dHB1dERpckNiLnNlbGVjdChpbmRleCk7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlKTklHZW5lcmF0b3JBcHAgZ2VuID0gbmV3IEpOSUdlbmVyYXRvckFwcCAoKTsKLQlpZiAoYXJncy5sZW5ndGggPiAwKSB7Ci0JCWdlbi5zZXRNYWluQ2xhc3NOYW1lKGFyZ3NbMF0pOwotCQlpZiAoYXJncy5sZW5ndGggPiAxKSBnZW4uc2V0T3V0cHV0RGlyKGFyZ3NbMV0pOwotCX0gZWxzZSB7Ci0JCWdlbi5zZXRNYWluQ2xhc3NOYW1lKEpOSUdlbmVyYXRvckFwcC5nZXREZWZhdWx0TWFpbkNsYXNzKCkpOwotCX0KLQlKTklHZW5lcmF0b3JBcHBVSSB1aSA9IG5ldyBKTklHZW5lcmF0b3JBcHBVSShnZW4pOwotCXVpLm9wZW4oKTsKLQl1aS5ydW4oKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL01ldGFEYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTWV0YURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4OWU4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTWV0YURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotcHVibGljIGNsYXNzIE1ldGFEYXRhIHsKLQkKLQlQcm9wZXJ0aWVzIGRhdGE7Ci0KLXB1YmxpYyBNZXRhRGF0YShTdHJpbmcgbWFpbkNsYXNzKSB7Ci0JZGF0YSA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JaW50IGluZGV4ID0gMDsKLQlDbGFzcyBjbGF6eiA9IGdldENsYXNzKCk7Ci0JaW50IGxlbmd0aCA9IG1haW5DbGFzcy5sZW5ndGgoKTsKLQl3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHsKLQkJaW5kZXggPSBtYWluQ2xhc3MuaW5kZXhPZignLicsIGluZGV4KTsKLQkJaWYgKGluZGV4ID09IC0xKSBpbmRleCA9IGxlbmd0aDsKLQkJSW5wdXRTdHJlYW0gaXMgPSBjbGF6ei5nZXRSZXNvdXJjZUFzU3RyZWFtKG1haW5DbGFzcy5zdWJzdHJpbmcoMCwgaW5kZXgpICsgIi5wcm9wZXJ0aWVzIik7Ci0JCWlmIChpcyAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWRhdGEubG9hZChpcyk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQkJCX0KLQkJCQotCQl9Ci0JCWluZGV4Kys7Ci0JfQotfQotCi1wdWJsaWMgTWV0YURhdGEoUHJvcGVydGllcyBkYXRhKSB7Ci0JdGhpcy5kYXRhID0gZGF0YTsKLX0KLQotcHVibGljIENsYXNzRGF0YSBnZXRNZXRhRGF0YShDbGFzcyBjbGF6eikgewotCVN0cmluZyBrZXkgPSBKTklHZW5lcmF0b3IudG9DKGNsYXp6LmdldE5hbWUoKSk7Ci0JU3RyaW5nIHZhbHVlID0gZ2V0TWV0YURhdGEoa2V5LCAiIik7Ci0JcmV0dXJuIG5ldyBDbGFzc0RhdGEoY2xhenosIHZhbHVlKTsKLX0KLQotcHVibGljIEZpZWxkRGF0YSBnZXRNZXRhRGF0YShGaWVsZCBmaWVsZCkgewotCVN0cmluZyBjbGFzc05hbWUgPSBKTklHZW5lcmF0b3IuZ2V0Q2xhc3NOYW1lKGZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkpOwotCVN0cmluZyBrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBmaWVsZC5nZXROYW1lKCk7Ci0JU3RyaW5nIHZhbHVlID0gZ2V0TWV0YURhdGEoa2V5LCAiIik7Ci0JcmV0dXJuIG5ldyBGaWVsZERhdGEoZmllbGQsIHZhbHVlKTsKLX0KLQotYm9vbGVhbiBjb252ZXJ0VG8zMkJpdChDbGFzc1tdIHBhcmFtVHlwZXMpIHsKLQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJaWYgKHBhcmFtVHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCXBhcmFtVHlwZXNbaV0gPSBJbnRlZ2VyLlRZUEU7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlpZiAocGFyYW1UeXBlID09IGxvbmdbXS5jbGFzcykgewotCQkJcGFyYW1UeXBlc1tpXSA9IGludFtdLmNsYXNzOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGNoYW5nZWQ7CQotfQotCi1wdWJsaWMgTWV0aG9kRGF0YSBnZXRNZXRhRGF0YShNZXRob2QgbWV0aG9kKSB7Ci0JU3RyaW5nIGNsYXNzTmFtZSA9IEpOSUdlbmVyYXRvci5nZXRDbGFzc05hbWUobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkpOwotCVN0cmluZyBrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBKTklHZW5lcmF0b3IuZ2V0RnVuY3Rpb25OYW1lKG1ldGhvZCk7Ci0JU3RyaW5nIHZhbHVlID0gZ2V0TWV0YURhdGEoa2V5LCBudWxsKTsKLQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQlrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBtZXRob2QuZ2V0TmFtZSgpOwotCQl2YWx1ZSA9IGdldE1ldGFEYXRhKGtleSwgbnVsbCk7Ci0JfQotCS8qCi0JKiBTdXBwb3J0IGZvciA2NCBiaXQgcG9ydC4KLQkqLwotCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCUNsYXNzW10gcGFyYW1UeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlpZiAoY29udmVydFRvMzJCaXQocGFyYW1UeXBlcykpIHsKLQkJCWtleSA9IGNsYXNzTmFtZSArICJfIiArIEpOSUdlbmVyYXRvci5nZXRGdW5jdGlvbk5hbWUobWV0aG9kLCBwYXJhbVR5cGVzKTsKLQkJCXZhbHVlID0gZ2V0TWV0YURhdGEoa2V5LCBudWxsKTsKLQkJfQotCX0JCi0JaWYgKHZhbHVlID09IG51bGwpIHZhbHVlID0gIiI7CQotCXJldHVybiBuZXcgTWV0aG9kRGF0YShtZXRob2QsIHZhbHVlKTsKLX0KLQotcHVibGljIFBhcmFtZXRlckRhdGEgZ2V0TWV0YURhdGEoTWV0aG9kIG1ldGhvZCwgaW50IHBhcmFtZXRlcikgewotCVN0cmluZyBjbGFzc05hbWUgPSBKTklHZW5lcmF0b3IuZ2V0Q2xhc3NOYW1lKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKTsKLQlTdHJpbmcga2V5ID0gY2xhc3NOYW1lICsgIl8iICsgSk5JR2VuZXJhdG9yLmdldEZ1bmN0aW9uTmFtZShtZXRob2QpICsgIl8iICsgcGFyYW1ldGVyOwotCVN0cmluZyB2YWx1ZSA9IGdldE1ldGFEYXRhKGtleSwgbnVsbCk7Ci0JaWYgKHZhbHVlID09IG51bGwpIHsKLQkJa2V5ID0gY2xhc3NOYW1lICsgIl8iICsgbWV0aG9kLmdldE5hbWUoKSArICJfIiArIHBhcmFtZXRlcjsKLQkJdmFsdWUgPSBnZXRNZXRhRGF0YShrZXksIG51bGwpOwotCX0JCi0JLyoKLQkqIFN1cHBvcnQgZm9yIDY0IGJpdCBwb3J0LgotCSovCi0JaWYgKHZhbHVlID09IG51bGwpIHsKLQkJQ2xhc3NbXSBwYXJhbVR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCWlmIChjb252ZXJ0VG8zMkJpdChwYXJhbVR5cGVzKSkgewotCQkJa2V5ID0gY2xhc3NOYW1lICsgIl8iICsgSk5JR2VuZXJhdG9yLmdldEZ1bmN0aW9uTmFtZShtZXRob2QsIHBhcmFtVHlwZXMpICsgIl8iICsgcGFyYW1ldGVyOwotCQkJdmFsdWUgPSBnZXRNZXRhRGF0YShrZXksIG51bGwpOwotCQl9Ci0JfQkKLQlpZiAodmFsdWUgPT0gbnVsbCkgdmFsdWUgPSAiIjsJCi0JcmV0dXJuIG5ldyBQYXJhbWV0ZXJEYXRhKG1ldGhvZCwgcGFyYW1ldGVyLCB2YWx1ZSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGEoU3RyaW5nIGtleSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCXJldHVybiBkYXRhLmdldFByb3BlcnR5KGtleSwgZGVmYXVsdFZhbHVlKTsKLX0KLQotcHVibGljIHZvaWQgc2V0TWV0YURhdGEoQ2xhc3MgY2xhenosIENsYXNzRGF0YSB2YWx1ZSkgewotCVN0cmluZyBrZXkgPSBKTklHZW5lcmF0b3IudG9DKGNsYXp6LmdldE5hbWUoKSk7Ci0Jc2V0TWV0YURhdGEoa2V5LCB2YWx1ZS50b1N0cmluZygpKTsKLX0KLQotcHVibGljIHZvaWQgc2V0TWV0YURhdGEoRmllbGQgZmllbGQsIEZpZWxkRGF0YSB2YWx1ZSkgewotCVN0cmluZyBjbGFzc05hbWUgPSBKTklHZW5lcmF0b3IuZ2V0Q2xhc3NOYW1lKGZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkpOwotCVN0cmluZyBrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBmaWVsZC5nZXROYW1lKCk7Ci0Jc2V0TWV0YURhdGEoa2V5LCB2YWx1ZS50b1N0cmluZygpKTsKLX0KLQotcHVibGljIHZvaWQgc2V0TWV0YURhdGEoTWV0aG9kIG1ldGhvZCwgTWV0aG9kRGF0YSB2YWx1ZSkgewotCVN0cmluZyBrZXk7Ci0JU3RyaW5nIGNsYXNzTmFtZSA9IEpOSUdlbmVyYXRvci5nZXRDbGFzc05hbWUobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkpOwotCWlmIChKTklHZW5lcmF0b3IuaXNOYXRpdmVVbmlxdWUobWV0aG9kKSkgewotCQlrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBtZXRob2QuZ2V0TmFtZSAoKTsKLQl9IGVsc2UgewotCQlrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBKTklHZW5lcmF0b3IuZ2V0RnVuY3Rpb25OYW1lKG1ldGhvZCk7Ci0JfQotCXNldE1ldGFEYXRhKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKE1ldGhvZCBtZXRob2QsIGludCBhcmcsIFBhcmFtZXRlckRhdGEgdmFsdWUpIHsKLQlTdHJpbmcga2V5OwotCVN0cmluZyBjbGFzc05hbWUgPSBKTklHZW5lcmF0b3IuZ2V0Q2xhc3NOYW1lKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKTsKLQlpZiAoSk5JR2VuZXJhdG9yLmlzTmF0aXZlVW5pcXVlKG1ldGhvZCkpIHsKLQkJa2V5ID0gY2xhc3NOYW1lICsgIl8iICsgbWV0aG9kLmdldE5hbWUgKCkgKyAiXyIgKyBhcmc7Ci0JfSBlbHNlIHsKLQkJa2V5ID0gY2xhc3NOYW1lICsgIl8iICsgSk5JR2VuZXJhdG9yLmdldEZ1bmN0aW9uTmFtZShtZXRob2QpICsgIl8iICsgYXJnOwotCX0KLQlzZXRNZXRhRGF0YShrZXksIHZhbHVlLnRvU3RyaW5nKCkpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRNZXRhRGF0YShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQlkYXRhLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTWV0YURhdGFHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9NZXRhRGF0YUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzA3N2RmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9NZXRhRGF0YUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1wdWJsaWMgY2xhc3MgTWV0YURhdGFHZW5lcmF0b3IgZXh0ZW5kcyBKTklHZW5lcmF0b3IgewotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZUNvcHlyaWdodCgpIHsKLQlnZW5lcmF0ZU1ldGFEYXRhKCJzd3RfcHJvcGVydGllc19jb3B5cmlnaHQiKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoQ2xhc3MgY2xhenopIHsKLQlvdXRwdXQodG9DKGNsYXp6LmdldE5hbWUoKSkpOwotCW91dHB1dCgiPSIpOwotCUNsYXNzRGF0YSBkYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShjbGF6eik7Ci0JaWYgKGRhdGEgIT0gbnVsbCkgb3V0cHV0KGRhdGEudG9TdHJpbmcoKSk7Ci0Jb3V0cHV0bG4oKTsKLQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JZ2VuZXJhdGUoZmllbGRzKTsKLQlNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JZ2VuZXJhdGUobWV0aG9kcyk7Ci0Jb3V0cHV0bG4oKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoRmllbGRbXSBmaWVsZHMpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQlGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJaW50IG1vZHMgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsKLQkJaWYgKChtb2RzICYgTW9kaWZpZXIuUFVCTElDKSA9PSAwKSBjb250aW51ZTsKLQkJaWYgKChtb2RzICYgTW9kaWZpZXIuRklOQUwpICE9IDApIGNvbnRpbnVlOwotCQlpZiAoKG1vZHMgJiBNb2RpZmllci5TVEFUSUMpICE9IDApIGNvbnRpbnVlOwotCQlnZW5lcmF0ZShmaWVsZCk7Ci0JCW91dHB1dGxuKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShGaWVsZCBmaWVsZCkgewotCW91dHB1dChnZXRDbGFzc05hbWUoZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKSkpOwotCW91dHB1dCgiXyIpOwotCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCW91dHB1dCgiPSIpOwotCUZpZWxkRGF0YSBkYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShmaWVsZCk7Ci0JaWYgKGRhdGEgIT0gbnVsbCkgb3V0cHV0KGRhdGEudG9TdHJpbmcoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKE1ldGhvZFtdIG1ldGhvZHMpIHsKLQlzb3J0KG1ldGhvZHMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpID09IDApIGNvbnRpbnVlOwotCQlnZW5lcmF0ZShtZXRob2QpOwotCQlvdXRwdXRsbigpOwotCQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgcHJvZ3Jlc3Muc3RlcCgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoTWV0aG9kIG1ldGhvZCkgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JYnVmZmVyLmFwcGVuZChnZXRDbGFzc05hbWUobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkpKTsKLQlidWZmZXIuYXBwZW5kKCJfIik7Ci0JaWYgKGlzTmF0aXZlVW5pcXVlKG1ldGhvZCkpIHsKLQkJYnVmZmVyLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpKTsKLQl9IGVsc2UgewotCQlidWZmZXIuYXBwZW5kKGdldEZ1bmN0aW9uTmFtZShtZXRob2QpKTsKLQl9Ci0JU3RyaW5nIGtleSA9IGJ1ZmZlci50b1N0cmluZygpOwotCW91dHB1dChrZXkpOwotCW91dHB1dCgiPSIpOwotCU1ldGhvZERhdGEgbWV0aG9kRGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEobWV0aG9kKTsKLQlpZiAobWV0aG9kRGF0YSAhPSBudWxsKSBvdXRwdXQobWV0aG9kRGF0YS50b1N0cmluZygpKTsKLQlvdXRwdXRsbigpOwotCWludCBsZW5ndGggPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGg7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQlvdXRwdXQoa2V5KTsKLQkJb3V0cHV0KCJfIik7Ci0JCW91dHB1dChpICsgIj0iKTsKLQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCwgaSk7Ci0JCWlmIChwYXJhbURhdGEgIT0gbnVsbCkgb3V0cHV0KHBhcmFtRGF0YS50b1N0cmluZygpKTsKLQkJb3V0cHV0bG4oKTsJCQotCX0KLX0KLQotcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0JcmV0dXJuICIucHJvcGVydGllcyI7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0TmFtZSgpIHsKLQlyZXR1cm4gZ2V0TWFpbkNsYXNzKCkuZ2V0TmFtZSgpOwotfQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBnZXRHZW5lcmF0ZShDbGFzcyBjbGF6eikgewotCXJldHVybiB0cnVlOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTWV0aG9kRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL01ldGhvZERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyZDY5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTWV0aG9kRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotcHVibGljIGNsYXNzIE1ldGhvZERhdGEgZXh0ZW5kcyBJdGVtRGF0YSB7Ci0JCi0JTWV0aG9kIG1ldGhvZDsKLQotcHVibGljIE1ldGhvZERhdGEoTWV0aG9kIG1ldGhvZCwgU3RyaW5nIHN0cikgewotCXN1cGVyKHN0cik7Ci0JdGhpcy5tZXRob2QgPSBtZXRob2Q7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QWxsRmxhZ3MoKSB7Ci0JcmV0dXJuIG5ldyBTdHJpbmdbXXsibm9fZ2VuIiwgImFkZHJlc3MiLCAiY29uc3QiLCAiZHluYW1pYyIsICJqbmkiLCAiY3BwIiwgIm5ldyIsICJkZWxldGUifTsKLX0KLQotcHVibGljIE1ldGhvZCBnZXRNZXRob2QoKSB7Ci0JcmV0dXJuIG1ldGhvZDsKLX0KLQotcHVibGljIFN0cmluZyBnZXRBY2Nlc3NvcigpIHsKLQlyZXR1cm4gKFN0cmluZylnZXRQYXJhbSgiYWNjZXNzb3IiKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRFeGNsdWRlKCkgewotCXJldHVybiAoU3RyaW5nKWdldFBhcmFtKCJleGNsdWRlIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEFjY2Vzc29yKFN0cmluZyBzdHIpIHsgCi0Jc2V0UGFyYW0oImFjY2Vzc29yIiwgc3RyKTsKLX0KLQotcHVibGljIHZvaWQgc2V0RXhjbHVkZShTdHJpbmcgc3RyKSB7IAotCXNldFBhcmFtKCJleGNsdWRlIiwgc3RyKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL05hdGl2ZXNHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9OYXRpdmVzR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNTg5ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL05hdGl2ZXNHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBOYXRpdmVzR2VuZXJhdG9yIGV4dGVuZHMgSk5JR2VuZXJhdG9yIHsKLQotYm9vbGVhbiBlbnRlckV4aXRNYWNybzsKLQotcHVibGljIE5hdGl2ZXNHZW5lcmF0b3IoKSB7Ci0JZW50ZXJFeGl0TWFjcm8gPSB0cnVlOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZUNvcHlyaWdodCgpIHsKLQlnZW5lcmF0ZU1ldGFEYXRhKCJzd3RfY29weXJpZ2h0Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlSW5jbHVkZXMoKSB7Ci0JU3RyaW5nIG91dHB1dE5hbWUgPSBnZXRPdXRwdXROYW1lKCk7Ci0Jb3V0cHV0bG4oIiNpbmNsdWRlIFwic3d0LmhcIiIpOwotCW91dHB1dCgiI2luY2x1ZGUgXCIiKTsKLQlvdXRwdXQob3V0cHV0TmFtZSk7Ci0Jb3V0cHV0bG4oIl9zdHJ1Y3RzLmhcIiIpOwotCW91dHB1dCgiI2luY2x1ZGUgXCIiKTsKLQlvdXRwdXQob3V0cHV0TmFtZSk7Ci0Jb3V0cHV0bG4oIl9zdGF0cy5oXCIiKTsKLQlvdXRwdXRsbigpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShDbGFzcyBjbGF6eiwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQlNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JaW50IGNvdW50ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKG1ldGhvZHNbaV0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgobWV0aG9kTmFtZSkpIGNvdW50Kys7Ci0JfQotCU1ldGhvZFtdIHJlc3VsdCA9IG5ldyBNZXRob2RbY291bnRdOwotCWNvdW50ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKG1ldGhvZHNbaV0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgobWV0aG9kTmFtZSkpIHJlc3VsdFtjb3VudCsrXSA9IG1ldGhvZHNbaV07Ci0JfQotCWdlbmVyYXRlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKENsYXNzIGNsYXp6KSB7Ci0JTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCWludCBpID0gMDsKLQlmb3IgKDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSAhPSAwKSBicmVhazsKLQl9Ci0JaWYgKGkgPT0gbWV0aG9kcy5sZW5ndGgpIHJldHVybjsKLQlzb3J0KG1ldGhvZHMpOwotCWlmIChpc0NQUCkgewotCQlvdXRwdXRsbigiZXh0ZXJuIFwiQ1wiIHsiKTsKLQkJb3V0cHV0bG4oKTsKLQl9Ci0JZ2VuZXJhdGVOYXRpdmVNYWNybyhjbGF6eik7Ci0JZ2VuZXJhdGVFeGNsdWRlcyhtZXRob2RzKTsKLQlnZW5lcmF0ZShtZXRob2RzKTsKLQlpZiAoaXNDUFApIHsKLQkJb3V0cHV0bG4oIn0iKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKE1ldGhvZFtdIG1ldGhvZHMpIHsKLQlzb3J0KG1ldGhvZHMpOwkKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSBjb250aW51ZTsKLQkJZ2VuZXJhdGUobWV0aG9kKTsKLQkJaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnN0ZXAoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKE1ldGhvZCBtZXRob2QpIHsKLQlNZXRob2REYXRhIG1ldGhvZERhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCk7Ci0JaWYgKG1ldGhvZERhdGEuZ2V0RmxhZygibm9fZ2VuIikpIHJldHVybjsKLQlDbGFzcyByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQlDbGFzc1tdIHBhcmFtVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQlTdHJpbmcgZnVuY3Rpb24gPSBnZXRGdW5jdGlvbk5hbWUobWV0aG9kKTsKLQkKLQlpZiAoIShyZXR1cm5UeXBlID09IFZvaWQuVFlQRSB8fCByZXR1cm5UeXBlLmlzUHJpbWl0aXZlKCkgfHwgaXNTeXN0ZW1DbGFzcyhyZXR1cm5UeXBlKSB8fCByZXR1cm5UeXBlID09IFN0cmluZy5jbGFzcykpIHsKLQkJb3V0cHV0KCJXYXJuaW5nOiBiYWQgcmV0dXJuIHR5cGUuIDoiKTsKLQkJb3V0cHV0bG4obWV0aG9kLnRvU3RyaW5nKCkpOwotCQlyZXR1cm47Ci0JfQotCQotCWdlbmVyYXRlU291cmNlU3RhcnQoZnVuY3Rpb24pOwotCWdlbmVyYXRlRnVuY3Rpb25Qcm90b3R5cGUobWV0aG9kLCBmdW5jdGlvbiwgcGFyYW1UeXBlcywgcmV0dXJuVHlwZSk7Ci0JZ2VuZXJhdGVGdW5jdGlvbkJvZHkobWV0aG9kLCBtZXRob2REYXRhLCBmdW5jdGlvbiwgcGFyYW1UeXBlcywgcmV0dXJuVHlwZSk7Ci0JZ2VuZXJhdGVTb3VyY2VFbmQoZnVuY3Rpb24pOwotCW91dHB1dGxuKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEVudGVyRXhpdE1hY3JvKGJvb2xlYW4gZW50ZXJFeGl0TWFjcm8pIHsKLQl0aGlzLmVudGVyRXhpdE1hY3JvID0gZW50ZXJFeGl0TWFjcm87Ci19Ci0KLXZvaWQgZ2VuZXJhdGVFeGNsdWRlcyhNZXRob2RbXSBtZXRob2RzKSB7Ci0JSGFzaFNldCBleGNsdWRlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgPT0gMCkgY29udGludWU7Ci0JCU1ldGhvZERhdGEgbWV0aG9kRGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEobWV0aG9kKTsKLQkJU3RyaW5nIGV4Y2x1ZGUgPSBtZXRob2REYXRhLmdldEV4Y2x1ZGUoKTsKLQkJaWYgKGV4Y2x1ZGUubGVuZ3RoKCkgIT0gMCkgewotCQkJZXhjbHVkZXMuYWRkKGV4Y2x1ZGUpOwotCQl9Ci0JfQotCWZvciAoSXRlcmF0b3IgaXRlciA9IGV4Y2x1ZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQlTdHJpbmcgZXhjbHVkZSA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0JCW91dHB1dGxuKGV4Y2x1ZGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQkJaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpID09IDApIGNvbnRpbnVlOwotCQkJTWV0aG9kRGF0YSBtZXRob2REYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QpOwotCQkJU3RyaW5nIG1ldGhvZEV4Y2x1ZGUgPSBtZXRob2REYXRhLmdldEV4Y2x1ZGUoKTsKLQkJCWlmIChleGNsdWRlLmVxdWFscyhtZXRob2RFeGNsdWRlKSkgewotCQkJCW91dHB1dCgiI2RlZmluZSBOT18iKTsKLQkJCQlvdXRwdXRsbihnZXRGdW5jdGlvbk5hbWUobWV0aG9kKSk7Ci0JCQl9Ci0JCX0KLQkJb3V0cHV0bG4oIiNlbmRpZiIpOwotCQlvdXRwdXRsbigpOwotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZU5hdGl2ZU1hY3JvKENsYXNzIGNsYXp6KSB7Ci0Jb3V0cHV0KCIjZGVmaW5lICIpOwotCW91dHB1dChnZXRDbGFzc05hbWUoY2xhenopKTsKLQlvdXRwdXQoIl9OQVRJVkUoZnVuYykgSmF2YV8iKTsKLQlvdXRwdXQodG9DKGNsYXp6LmdldE5hbWUoKSkpOwotCW91dHB1dGxuKCJfIyNmdW5jIik7Ci0Jb3V0cHV0bG4oKTsKLX0KLQotYm9vbGVhbiBnZW5lcmF0ZUdldFBhcmFtZXRlcihNZXRob2QgbWV0aG9kLCBpbnQgaSwgQ2xhc3MgcGFyYW1UeXBlLCBQYXJhbWV0ZXJEYXRhIHBhcmFtRGF0YSwgYm9vbGVhbiBjcml0aWNhbCwgaW50IGluZGVudCkgewotCWlmIChwYXJhbVR5cGUuaXNQcmltaXRpdmUoKSB8fCBpc1N5c3RlbUNsYXNzKHBhcmFtVHlwZSkpIHJldHVybiBmYWxzZTsKLQlTdHJpbmcgaVN0ciA9IFN0cmluZy52YWx1ZU9mKGkpOwotCWZvciAoaW50IGogPSAwOyBqIDwgaW5kZW50OyBqKyspIG91dHB1dCgiXHQiKTsKLQlvdXRwdXQoImlmIChhcmciKTsKLQlvdXRwdXQoaVN0cik7Ci0Jb3V0cHV0KCIpIGlmICgobHBhcmciKTsKLQlvdXRwdXQoaVN0cik7Ci0Jb3V0cHV0KCIgPSAiKTsKLQlpZiAocGFyYW1UeXBlLmlzQXJyYXkoKSkgewotCQlDbGFzcyBjb21wb25lbnRUeXBlID0gcGFyYW1UeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLQkJaWYgKGNvbXBvbmVudFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJaWYgKGNyaXRpY2FsKSB7Ci0JCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJCW91dHB1dCgiZW52LT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGFyZyIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW91dHB1dCgiKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnIik7Ci0JCQkJfQotCQkJCW91dHB1dChpU3RyKTsKLQkJCQlvdXRwdXQoIiwgTlVMTCkiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJCW91dHB1dCgiZW52LT5HZXQiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIigqZW52KS0+R2V0Iik7Ci0JCQkJfQotCQkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMShjb21wb25lbnRUeXBlKSk7Ci0JCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJCW91dHB1dCgiQXJyYXlFbGVtZW50cyhhcmciKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIkFycmF5RWxlbWVudHMoZW52LCBhcmciKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KGlTdHIpOwotCQkJCW91dHB1dCgiLCBOVUxMKSIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IEVycm9yKCJub3QgZG9uZSIpOwotCQl9Ci0JfSBlbHNlIGlmIChwYXJhbVR5cGUgPT0gU3RyaW5nLmNsYXNzKSB7Ci0JCWlmIChwYXJhbURhdGEuZ2V0RmxhZygidW5pY29kZSIpKSB7Ci0JCQlpZiAoaXNDUFApIHsKLQkJCQlvdXRwdXQoImVudi0+R2V0U3RyaW5nQ2hhcnMoYXJnIik7Ci0JCQl9IGVsc2UgewotCQkJCW91dHB1dCgiKCplbnYpLT5HZXRTdHJpbmdDaGFycyhlbnYsIGFyZyIpOwotCQkJfQotCQkJb3V0cHV0KGlTdHIpOwotCQkJb3V0cHV0KCIsIE5VTEwpIik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoaXNDUFApIHsKLQkJCQlvdXRwdXQoImVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoYXJnIik7Ci0JCQl9IGVsc2UgewotCQkJCW91dHB1dCgiKCplbnYpLT5HZXRTdHJpbmdVVEZDaGFycyhlbnYsIGFyZyIpOwotCQkJfQotCQkJb3V0cHV0KGlTdHIpOwotCQkJb3V0cHV0KCIsIE5VTEwpIik7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAocGFyYW1EYXRhLmdldEZsYWcoIm5vX2luIikpIHsKLQkJCW91dHB1dCgiJl9hcmciKTsKLQkJCW91dHB1dChpU3RyKTsKLQkJfSBlbHNlIHsKLQkJCW91dHB1dCgiZ2V0Iik7Ci0JCQlvdXRwdXQoZ2V0Q2xhc3NOYW1lKHBhcmFtVHlwZSkpOwotCQkJb3V0cHV0KCJGaWVsZHMoZW52LCBhcmciKTsKLQkJCW91dHB1dChpU3RyKTsKLQkJCW91dHB1dCgiLCAmX2FyZyIpOwotCQkJb3V0cHV0KGlTdHIpOwotCQkJb3V0cHV0KCIpIik7Ci0JCX0KLQl9CQotCW91dHB1dGxuKCIpID09IE5VTEwpIGdvdG8gZmFpbDsiKTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBnZW5lcmF0ZVNldFBhcmFtZXRlcihpbnQgaSwgQ2xhc3MgcGFyYW1UeXBlLCBQYXJhbWV0ZXJEYXRhIHBhcmFtRGF0YSwgYm9vbGVhbiBjcml0aWNhbCkgewotCWlmIChwYXJhbVR5cGUuaXNQcmltaXRpdmUoKSB8fCBpc1N5c3RlbUNsYXNzKHBhcmFtVHlwZSkpIHJldHVybjsKLQlTdHJpbmcgaVN0ciA9IFN0cmluZy52YWx1ZU9mKGkpOwotCWlmIChwYXJhbVR5cGUuaXNBcnJheSgpKSB7Ci0JCW91dHB1dCgiXHRpZiAoYXJnIik7Ci0JCW91dHB1dChpU3RyKTsKLQkJb3V0cHV0KCIgJiYgbHBhcmciKTsKLQkJb3V0cHV0KGlTdHIpOwotCQlvdXRwdXQoIikgIik7Ci0JCUNsYXNzIGNvbXBvbmVudFR5cGUgPSBwYXJhbVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQlpZiAoY29tcG9uZW50VHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQlpZiAoY3JpdGljYWwpIHsKLQkJCQlpZiAoaXNDUFApIHsKLQkJCQkJb3V0cHV0KCJlbnYtPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGFyZyIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW91dHB1dCgiKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZyIpOwotCQkJCX0KLQkJCQlvdXRwdXQoaVN0cik7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoImVudi0+UmVsZWFzZSIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW91dHB1dCgiKCplbnYpLT5SZWxlYXNlIik7Ci0JCQkJfQotCQkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMShjb21wb25lbnRUeXBlKSk7Ci0JCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJCW91dHB1dCgiQXJyYXlFbGVtZW50cyhhcmciKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIkFycmF5RWxlbWVudHMoZW52LCBhcmciKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KGlTdHIpOwotCQkJfQotCQkJb3V0cHV0KCIsIGxwYXJnIik7Ci0JCQlvdXRwdXQoaVN0cik7Ci0JCQlvdXRwdXQoIiwgIik7Ci0JCQlpZiAocGFyYW1EYXRhLmdldEZsYWcoIm5vX291dCIpKSB7Ci0JCQkJb3V0cHV0KCJKTklfQUJPUlQiKTsKLQkJCX0gZWxzZSB7CQkJCQotCQkJCW91dHB1dCgiMCIpOwotCQkJfQotCQkJb3V0cHV0KCIpOyIpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IEVycm9yKCJub3QgZG9uZSIpOwotCQl9Ci0JCW91dHB1dGxuKCk7Ci0JfSBlbHNlIGlmIChwYXJhbVR5cGUgPT0gU3RyaW5nLmNsYXNzKSB7Ci0JCW91dHB1dCgiXHRpZiAoYXJnIik7Ci0JCW91dHB1dChpU3RyKTsKLQkJb3V0cHV0KCIgJiYgbHBhcmciKTsKLQkJb3V0cHV0KGlTdHIpOwotCQlvdXRwdXQoIikgIik7Ci0JCWlmIChwYXJhbURhdGEuZ2V0RmxhZygidW5pY29kZSIpKSB7Ci0JCQlpZiAoaXNDUFApIHsKLQkJCQlvdXRwdXQoImVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKGFyZyIpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoIigqZW52KS0+UmVsZWFzZVN0cmluZ0NoYXJzKGVudiwgYXJnIik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoaXNDUFApIHsKLQkJCQlvdXRwdXQoImVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGFyZyIpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoIigqZW52KS0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGVudiwgYXJnIik7Ci0JCQl9Ci0JCX0KLQkJb3V0cHV0KGlTdHIpOwotCQlvdXRwdXQoIiwgbHBhcmciKTsKLQkJb3V0cHV0KGlTdHIpOwotCQlvdXRwdXRsbigiKTsiKTsKLQl9IGVsc2UgewotCQlpZiAoIXBhcmFtRGF0YS5nZXRGbGFnKCJub19vdXQiKSkgewotCQkJb3V0cHV0KCJcdGlmIChhcmciKTsKLQkJCW91dHB1dChpU3RyKTsKLQkJCW91dHB1dCgiICYmIGxwYXJnIik7Ci0JCQlvdXRwdXQoaVN0cik7Ci0JCQlvdXRwdXQoIikgIik7Ci0JCQlvdXRwdXQoInNldCIpOwotCQkJb3V0cHV0KGdldENsYXNzTmFtZShwYXJhbVR5cGUpKTsKLQkJCW91dHB1dCgiRmllbGRzKGVudiwgYXJnIik7Ci0JCQlvdXRwdXQoaVN0cik7Ci0JCQlvdXRwdXQoIiwgbHBhcmciKTsKLQkJCW91dHB1dChpU3RyKTsKLQkJCW91dHB1dGxuKCIpOyIpOwotCQl9Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlRXhpdE1hY3JvKE1ldGhvZCBtZXRob2QsIFN0cmluZyBmdW5jdGlvbikgewotCWlmICghZW50ZXJFeGl0TWFjcm8pIHJldHVybjsKLQlvdXRwdXQoIlx0Iik7Ci0Jb3V0cHV0KGdldENsYXNzTmFtZShtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSkpOwotCW91dHB1dCgiX05BVElWRV9FWElUKGVudiwgdGhhdCwgIik7Ci0Jb3V0cHV0KGZ1bmN0aW9uKTsKLQlvdXRwdXRsbigiX0ZVTkMpOyIpOwotfQotCi12b2lkIGdlbmVyYXRlRW50ZXJNYWNybyhNZXRob2QgbWV0aG9kLCBTdHJpbmcgZnVuY3Rpb24pIHsKLQlpZiAoIWVudGVyRXhpdE1hY3JvKSByZXR1cm47Ci0Jb3V0cHV0KCJcdCIpOwotCW91dHB1dChnZXRDbGFzc05hbWUobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkpKTsKLQlvdXRwdXQoIl9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCAiKTsKLQlvdXRwdXQoZnVuY3Rpb24pOwotCW91dHB1dGxuKCJfRlVOQyk7Iik7Ci19Ci0KLWJvb2xlYW4gZ2VuZXJhdGVMb2NhbFZhcnMoTWV0aG9kIG1ldGhvZCwgQ2xhc3NbXSBwYXJhbVR5cGVzLCBDbGFzcyByZXR1cm5UeXBlKSB7Ci0JYm9vbGVhbiBuZWVkc1JldHVybiA9IGVudGVyRXhpdE1hY3JvOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotCQlDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQlpZiAocGFyYW1UeXBlLmlzUHJpbWl0aXZlKCkgfHwgaXNTeXN0ZW1DbGFzcyhwYXJhbVR5cGUpKSBjb250aW51ZTsKLQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCwgaSk7Ci0JCW91dHB1dCgiXHQiKTsKLQkJaWYgKHBhcmFtVHlwZS5pc0FycmF5KCkpIHsKLQkJCUNsYXNzIGNvbXBvbmVudFR5cGUgPSBwYXJhbVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJaWYgKGNvbXBvbmVudFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMihjb21wb25lbnRUeXBlKSk7Ci0JCQkJb3V0cHV0KCIgKmxwYXJnIiArIGkpOwotCQkJCW91dHB1dCgiPU5VTEw7Iik7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBFcnJvcigibm90IGRvbmUiKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwYXJhbVR5cGUgPT0gU3RyaW5nLmNsYXNzKSB7Ci0JCQlpZiAocGFyYW1EYXRhLmdldEZsYWcoInVuaWNvZGUiKSkgewotCQkJCW91dHB1dCgiY29uc3QgamNoYXIgKmxwYXJnIiArIGkpOwkJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KCJjb25zdCBjaGFyICpscGFyZyIgKyBpKTsKLQkJCX0KLQkJCW91dHB1dCgiPSBOVUxMOyIpOwotCQl9IGVsc2UgewotCQkJb3V0cHV0KGdldENsYXNzTmFtZShwYXJhbVR5cGUpKTsKLQkJCW91dHB1dCgiIF9hcmciICsgaSk7Ci0JCQlpZiAocGFyYW1EYXRhLmdldEZsYWcoImluaXQiKSkgb3V0cHV0KCI9ezB9Iik7Ci0JCQlvdXRwdXQoIiwgKmxwYXJnIiArIGkpOwotCQkJb3V0cHV0KCI9TlVMTDsiKTsKLQkJfQotCQlvdXRwdXRsbigpOwotCQluZWVkc1JldHVybiA9IHRydWU7Ci0JfQotCWlmIChuZWVkc1JldHVybikgewotCQlpZiAocmV0dXJuVHlwZSAhPSBWb2lkLlRZUEUpIHsKLQkJCW91dHB1dCgiXHQiKTsKLQkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMihyZXR1cm5UeXBlKSk7Ci0JCQlvdXRwdXRsbigiIHJjID0gMDsiKTsKLQkJfQotCX0KLQlyZXR1cm4gbmVlZHNSZXR1cm47Ci19Ci0KLWJvb2xlYW4gZ2VuZXJhdGVHZXR0ZXJzKE1ldGhvZCBtZXRob2QsIENsYXNzW10gcGFyYW1UeXBlcykgewotCWJvb2xlYW4gZ2VuRmFpbFRhZyA9IGZhbHNlOwotCWludCBjcml0aWNhbENvdW50ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCwgaSk7Ci0JCWlmICghaXNDcml0aWNhbChwYXJhbVR5cGUsIHBhcmFtRGF0YSkpIHsKLQkJCWdlbkZhaWxUYWcgfD0gZ2VuZXJhdGVHZXRQYXJhbWV0ZXIobWV0aG9kLCBpLCBwYXJhbVR5cGUsIHBhcmFtRGF0YSwgZmFsc2UsIDEpOwotCQl9IGVsc2UgewotCQkJY3JpdGljYWxDb3VudCsrOwotCQl9Ci0JfQotCWlmIChjcml0aWNhbENvdW50ICE9IDApIHsKLQkJb3V0cHV0bG4oIiNpZmRlZiBKTklfVkVSU0lPTl8xXzIiKTsKLQkJb3V0cHV0bG4oIlx0aWYgKElTX0pOSV8xXzIpIHsiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCwgaSk7Ci0JCQlpZiAoaXNDcml0aWNhbChwYXJhbVR5cGUsIHBhcmFtRGF0YSkpIHsKLQkJCQlnZW5GYWlsVGFnIHw9IGdlbmVyYXRlR2V0UGFyYW1ldGVyKG1ldGhvZCwgaSwgcGFyYW1UeXBlLCBwYXJhbURhdGEsIHRydWUsIDIpOwotCQkJfQotCQl9Ci0JCW91dHB1dGxuKCJcdH0gZWxzZSIpOwotCQlvdXRwdXRsbigiI2VuZGlmIik7Ci0JCW91dHB1dGxuKCJcdHsiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCwgaSk7Ci0JCQlpZiAoaXNDcml0aWNhbChwYXJhbVR5cGUsIHBhcmFtRGF0YSkpIHsKLQkJCQlnZW5GYWlsVGFnIHw9IGdlbmVyYXRlR2V0UGFyYW1ldGVyKG1ldGhvZCwgaSwgcGFyYW1UeXBlLCBwYXJhbURhdGEsIGZhbHNlLCAyKTsKLQkJCX0KLQkJfQotCQlvdXRwdXRsbigiXHR9Iik7Ci0JfQotCXJldHVybiBnZW5GYWlsVGFnOwotfQotCi12b2lkIGdlbmVyYXRlU2V0dGVycyhNZXRob2QgbWV0aG9kLCBDbGFzc1tdIHBhcmFtVHlwZXMpIHsKLQlpbnQgY3JpdGljYWxDb3VudCA9IDA7Ci0JZm9yIChpbnQgaSA9IHBhcmFtVHlwZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCwgaSk7Ci0JCWlmIChpc0NyaXRpY2FsKHBhcmFtVHlwZSwgcGFyYW1EYXRhKSkgewotCQkJY3JpdGljYWxDb3VudCsrOwotCQl9Ci0JfQotCWlmIChjcml0aWNhbENvdW50ICE9IDApIHsKLQkJb3V0cHV0bG4oIiNpZmRlZiBKTklfVkVSU0lPTl8xXzIiKTsKLQkJb3V0cHV0bG4oIlx0aWYgKElTX0pOSV8xXzIpIHsiKTsKLQkJZm9yIChpbnQgaSA9IHBhcmFtVHlwZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCUNsYXNzIHBhcmFtVHlwZSA9IHBhcmFtVHlwZXNbaV07Ci0JCQlQYXJhbWV0ZXJEYXRhIHBhcmFtRGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEobWV0aG9kLCBpKTsKLQkJCWlmIChpc0NyaXRpY2FsKHBhcmFtVHlwZSwgcGFyYW1EYXRhKSkgewotCQkJCW91dHB1dCgiXHQiKTsKLQkJCQlnZW5lcmF0ZVNldFBhcmFtZXRlcihpLCBwYXJhbVR5cGUsIHBhcmFtRGF0YSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJb3V0cHV0bG4oIlx0fSBlbHNlIik7Ci0JCW91dHB1dGxuKCIjZW5kaWYiKTsKLQkJb3V0cHV0bG4oIlx0eyIpOwotCQlmb3IgKGludCBpID0gcGFyYW1UeXBlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIGkpOwotCQkJaWYgKGlzQ3JpdGljYWwocGFyYW1UeXBlLCBwYXJhbURhdGEpKSB7Ci0JCQkJb3V0cHV0KCJcdCIpOwotCQkJCWdlbmVyYXRlU2V0UGFyYW1ldGVyKGksIHBhcmFtVHlwZSwgcGFyYW1EYXRhLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJb3V0cHV0bG4oIlx0fSIpOwotCX0KLQlmb3IgKGludCBpID0gcGFyYW1UeXBlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQlDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQlQYXJhbWV0ZXJEYXRhIHBhcmFtRGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEobWV0aG9kLCBpKTsKLQkJaWYgKCFpc0NyaXRpY2FsKHBhcmFtVHlwZSwgcGFyYW1EYXRhKSkgewotCQkJZ2VuZXJhdGVTZXRQYXJhbWV0ZXIoaSwgcGFyYW1UeXBlLCBwYXJhbURhdGEsIGZhbHNlKTsKLQkJfQotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZUR5bmFtaWNGdW5jdGlvbkNhbGwoTWV0aG9kIG1ldGhvZCwgTWV0aG9kRGF0YSBtZXRob2REYXRhLCBDbGFzc1tdIHBhcmFtVHlwZXMsIENsYXNzIHJldHVyblR5cGUsIGJvb2xlYW4gbmVlZHNSZXR1cm4pIHsKLQlvdXRwdXRsbigiLyoiKTsKLQlnZW5lcmF0ZUZ1bmN0aW9uQ2FsbChtZXRob2QsIG1ldGhvZERhdGEsIHBhcmFtVHlwZXMsIHJldHVyblR5cGUsIG5lZWRzUmV0dXJuKTsKLQlvdXRwdXRsbigiKi8iKTsKLQlvdXRwdXRsbigiXHR7Iik7Ci0KLQlTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0JaWYgKG5hbWUuc3RhcnRzV2l0aCgiXyIpKSBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0JaWYgKGdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpKSB7Ci0JCW91dHB1dGxuKCJcdFx0c3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7Iik7Ci0JCW91dHB1dGxuKCJcdFx0c3RhdGljIEhNT0RVTEUgaG0gPSBOVUxMOyIpOwotCQlvdXRwdXRsbigiXHRcdHN0YXRpYyBGQVJQUk9DIGZwID0gTlVMTDsiKTsKLQkJaWYgKHJldHVyblR5cGUgIT0gVm9pZC5UWVBFKSB7Ci0JCQlpZiAobmVlZHNSZXR1cm4pIHsKLQkJCQlvdXRwdXRsbigiXHRcdHJjID0gMDsiKTsKLQkJCX0KLQkJfQotCQlvdXRwdXRsbigiXHRcdGlmICghaW5pdGlhbGl6ZWQpIHsiKTsKLQkJb3V0cHV0KCJcdFx0XHRpZiAoIWhtKSBobSA9IExvYWRMaWJyYXJ5KCIpOwotCQlvdXRwdXQobmFtZSk7Ci0JCW91dHB1dGxuKCJfTElCKTsiKTsKLQkJb3V0cHV0KCJcdFx0XHRpZiAoaG0pIGZwID0gR2V0UHJvY0FkZHJlc3MoaG0sIFwiIik7Ci0JCW91dHB1dChuYW1lKTsKLQkJb3V0cHV0bG4oIlwiKTsiKTsKLQkJb3V0cHV0bG4oIlx0XHRcdGluaXRpYWxpemVkID0gMTsiKTsKLQkJb3V0cHV0bG4oIlx0XHR9Iik7Ci0JCW91dHB1dGxuKCJcdFx0aWYgKGZwKSB7Iik7Ci0JCW91dHB1dCgiXHRcdCIpOwotCQlnZW5lcmF0ZUZ1bmN0aW9uQ2FsbExlZnRTaWRlKG1ldGhvZCwgbWV0aG9kRGF0YSwgcmV0dXJuVHlwZSwgbmVlZHNSZXR1cm4pOwotCQlvdXRwdXQoImZwIik7Ci0JCWdlbmVyYXRlRnVuY3Rpb25DYWxsUmlnaHRTaWRlKG1ldGhvZCwgbWV0aG9kRGF0YSwgcGFyYW1UeXBlcywgMCk7Ci0JCW91dHB1dGxuKCk7Ci0JCW91dHB1dGxuKCJcdFx0fSIpOwotCX0gZWxzZSBpZiAoZ2V0UGxhdGZvcm0oKS5lcXVhbHMoImNhcmJvbiIpKSB7Ci0JCW91dHB1dGxuKCJcdFx0c3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7Iik7Ci0JCW91dHB1dGxuKCJcdFx0c3RhdGljIENGQnVuZGxlUmVmIGJ1bmRsZSA9IE5VTEw7Iik7Ci0JCW91dHB1dCgiXHRcdHR5cGVkZWYgIik7Ci0JCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMihyZXR1cm5UeXBlKSk7Ci0JCW91dHB1dCgiICgqRlBUUikoIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCkgb3V0cHV0KCIsICIpOwotCQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIGkpOwotCQkJU3RyaW5nIGNhc3QgPSBwYXJhbURhdGEuZ2V0Q2FzdCgpOwotCQkJaWYgKGNhc3QubGVuZ3RoKCkgPiAyKSB7Ci0JCQkJb3V0cHV0KGNhc3Quc3Vic3RyaW5nKDEsIGNhc3QubGVuZ3RoKCkgLSAxKSk7Ci0JCQl9IGVsc2UgewotCQkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlNChwYXJhbVR5cGUpKTsKLQkJCX0KLQkJfQotCQlvdXRwdXRsbigiKTsiKTsKLQkJb3V0cHV0bG4oIlx0XHRzdGF0aWMgRlBUUiBmcHRyOyIpOwotCQlpZiAocmV0dXJuVHlwZSAhPSBWb2lkLlRZUEUpIHsKLQkJCWlmIChuZWVkc1JldHVybikgewotCQkJCW91dHB1dGxuKCJcdFx0cmMgPSAwOyIpOwotCQkJfQotCQl9Ci0JCW91dHB1dGxuKCJcdFx0aWYgKCFpbml0aWFsaXplZCkgeyIpOwotCQlvdXRwdXQoIlx0XHRcdGlmICghYnVuZGxlKSBidW5kbGUgPSBDRkJ1bmRsZUdldEJ1bmRsZVdpdGhJZGVudGlmaWVyKENGU1RSKCIpOwotCQlvdXRwdXQobmFtZSk7Ci0JCW91dHB1dGxuKCJfTElCKSk7Iik7Ci0JCW91dHB1dCgiXHRcdFx0aWYgKGJ1bmRsZSkgZnB0ciA9IChGUFRSKUNGQnVuZGxlR2V0RnVuY3Rpb25Qb2ludGVyRm9yTmFtZShidW5kbGUsIENGU1RSKFwiIik7Ci0JCW91dHB1dChuYW1lKTsKLQkJb3V0cHV0bG4oIlwiKSk7Iik7Ci0JCW91dHB1dGxuKCJcdFx0XHRpbml0aWFsaXplZCA9IDE7Iik7Ci0JCW91dHB1dGxuKCJcdFx0fSIpOwotCQlvdXRwdXRsbigiXHRcdGlmIChmcHRyKSB7Iik7Ci0JCW91dHB1dCgiXHRcdCIpOwotCQlnZW5lcmF0ZUZ1bmN0aW9uQ2FsbExlZnRTaWRlKG1ldGhvZCwgbWV0aG9kRGF0YSwgcmV0dXJuVHlwZSwgbmVlZHNSZXR1cm4pOwotCQlvdXRwdXQoIigqZnB0cikiKTsKLQkJZ2VuZXJhdGVGdW5jdGlvbkNhbGxSaWdodFNpZGUobWV0aG9kLCBtZXRob2REYXRhLCBwYXJhbVR5cGVzLCAwKTsKLQkJb3V0cHV0bG4oKTsKLQkJb3V0cHV0bG4oIlx0XHR9Iik7Ci0JfSBlbHNlIHsKLQkJb3V0cHV0bG4oIlx0XHRzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsiKTsKLQkJb3V0cHV0bG4oIlx0XHRzdGF0aWMgdm9pZCAqaGFuZGxlID0gTlVMTDsiKTsKLQkJb3V0cHV0KCJcdFx0dHlwZWRlZiAiKTsKLQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUyKHJldHVyblR5cGUpKTsKLQkJb3V0cHV0KCIgKCpGUFRSKSgiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKSBvdXRwdXQoIiwgIik7Ci0JCQlDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCwgaSk7Ci0JCQlTdHJpbmcgY2FzdCA9IHBhcmFtRGF0YS5nZXRDYXN0KCk7Ci0JCQlpZiAoY2FzdC5sZW5ndGgoKSA+IDIpIHsKLQkJCQlvdXRwdXQoY2FzdC5zdWJzdHJpbmcoMSwgY2FzdC5sZW5ndGgoKSAtIDEpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmU0KHBhcmFtVHlwZSkpOwotCQkJfQotCQl9Ci0JCW91dHB1dGxuKCIpOyIpOwotCQlvdXRwdXRsbigiXHRcdHN0YXRpYyBGUFRSIGZwdHI7Iik7Ci0JCWlmIChyZXR1cm5UeXBlICE9IFZvaWQuVFlQRSkgewotCQkJaWYgKG5lZWRzUmV0dXJuKSB7Ci0JCQkJb3V0cHV0bG4oIlx0XHRyYyA9IDA7Iik7Ci0JCQl9Ci0JCX0KLQkJb3V0cHV0bG4oIlx0XHRpZiAoIWluaXRpYWxpemVkKSB7Iik7Ci0JCW91dHB1dCgiXHRcdFx0aWYgKCFoYW5kbGUpIGhhbmRsZSA9IGRsb3BlbigiKTsKLQkJb3V0cHV0KG5hbWUpOwotCQlvdXRwdXRsbigiX0xJQiwgUlRMRF9MQVpZKTsiKTsKLQkJb3V0cHV0KCJcdFx0XHRpZiAoaGFuZGxlKSBmcHRyID0gKEZQVFIpZGxzeW0oaGFuZGxlLCBcIiIpOwotCQlvdXRwdXQobmFtZSk7Ci0JCW91dHB1dGxuKCJcIik7Iik7Ci0JCW91dHB1dGxuKCJcdFx0XHRpbml0aWFsaXplZCA9IDE7Iik7Ci0JCW91dHB1dGxuKCJcdFx0fSIpOwotCQlvdXRwdXRsbigiXHRcdGlmIChmcHRyKSB7Iik7Ci0JCW91dHB1dCgiXHRcdCIpOwotCQlnZW5lcmF0ZUZ1bmN0aW9uQ2FsbExlZnRTaWRlKG1ldGhvZCwgbWV0aG9kRGF0YSwgcmV0dXJuVHlwZSwgbmVlZHNSZXR1cm4pOwotCQlvdXRwdXQoIigqZnB0cikiKTsKLQkJZ2VuZXJhdGVGdW5jdGlvbkNhbGxSaWdodFNpZGUobWV0aG9kLCBtZXRob2REYXRhLCBwYXJhbVR5cGVzLCAwKTsKLQkJb3V0cHV0bG4oKTsKLQkJb3V0cHV0bG4oIlx0XHR9Iik7Ci0JfQotCi0Jb3V0cHV0bG4oIlx0fSIpOwotfQotCi12b2lkIGdlbmVyYXRlRnVuY3Rpb25DYWxsTGVmdFNpZGUoTWV0aG9kIG1ldGhvZCwgTWV0aG9kRGF0YSBtZXRob2REYXRhLCBDbGFzcyByZXR1cm5UeXBlLCBib29sZWFuIG5lZWRzUmV0dXJuKSB7Ci0Jb3V0cHV0KCJcdCIpOwotCWlmIChyZXR1cm5UeXBlICE9IFZvaWQuVFlQRSkgewotCQlpZiAobmVlZHNSZXR1cm4pIHsKLQkJCW91dHB1dCgicmMgPSAiKTsKLQkJfSBlbHNlIHsKLQkJCW91dHB1dCgicmV0dXJuICIpOwotCQl9Ci0JCW91dHB1dCgiKCIpOwotCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTIocmV0dXJuVHlwZSkpOwotCQlvdXRwdXQoIikiKTsKLQl9Ci0JaWYgKG1ldGhvZERhdGEuZ2V0RmxhZygiYWRkcmVzcyIpKSB7Ci0JCW91dHB1dCgiJiIpOwotCX0JCi0JaWYgKG1ldGhvZERhdGEuZ2V0RmxhZygiam5pIikpIHsKLQkJb3V0cHV0KGlzQ1BQID8gImVudi0+IiA6ICIoKmVudiktPiIpOwotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbFJpZ2h0U2lkZShNZXRob2QgbWV0aG9kLCBNZXRob2REYXRhIG1ldGhvZERhdGEsIENsYXNzW10gcGFyYW1UeXBlcywgaW50IHBhcmFtU3RhcnQpIHsKLQlpZiAoIW1ldGhvZERhdGEuZ2V0RmxhZygiY29uc3QiKSkgewotCQlvdXRwdXQoIigiKTsKLQkJaWYgKG1ldGhvZERhdGEuZ2V0RmxhZygiam5pIikpIHsKLQkJCWlmICghaXNDUFApIG91dHB1dCgiZW52LCAiKTsKLQkJfQotCQlmb3IgKGludCBpID0gcGFyYW1TdGFydDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCUNsYXNzIHBhcmFtVHlwZSA9IHBhcmFtVHlwZXNbaV07Ci0JCQlQYXJhbWV0ZXJEYXRhIHBhcmFtRGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEobWV0aG9kLCBpKTsKLQkJCWlmIChpICE9IHBhcmFtU3RhcnQpIG91dHB1dCgiLCAiKTsKLQkJCWlmIChwYXJhbURhdGEuZ2V0RmxhZygic3RydWN0IikpIG91dHB1dCgiKiIpOwotCQkJb3V0cHV0KHBhcmFtRGF0YS5nZXRDYXN0KCkpOwotCQkJaWYgKCFwYXJhbVR5cGUuaXNQcmltaXRpdmUoKSAmJiAhaXNTeXN0ZW1DbGFzcyhwYXJhbVR5cGUpKSBvdXRwdXQoImxwIik7Ci0JCQlvdXRwdXQoImFyZyIgKyBpKTsKLQkJfQotCQlvdXRwdXQoIikiKTsKLQl9Ci0Jb3V0cHV0KCI7Iik7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVGdW5jdGlvbkNhbGwoTWV0aG9kIG1ldGhvZCwgTWV0aG9kRGF0YSBtZXRob2REYXRhLCBDbGFzc1tdIHBhcmFtVHlwZXMsIENsYXNzIHJldHVyblR5cGUsIGJvb2xlYW4gbmVlZHNSZXR1cm4pIHsKLQlTdHJpbmcgY29weSA9IChTdHJpbmcpbWV0aG9kRGF0YS5nZXRQYXJhbSgiY29weSIpOwotCWJvb2xlYW4gbWFrZUNvcHkgPSBjb3B5Lmxlbmd0aCgpICE9IDAgJiYgaXNDUFAgJiYgcmV0dXJuVHlwZSAhPSBWb2lkLlRZUEU7Ci0JaWYgKG1ha2VDb3B5KSB7Ci0JCW91dHB1dCgiXHQiKTsKLQkJb3V0cHV0KGNvcHkpOwotCQlvdXRwdXQoIiB0ZW1wID0gIik7Ci0JfSBlbHNlIHsKLQkJZ2VuZXJhdGVGdW5jdGlvbkNhbGxMZWZ0U2lkZShtZXRob2QsIG1ldGhvZERhdGEsIHJldHVyblR5cGUsIG5lZWRzUmV0dXJuKTsKLQl9Ci0JaW50IHBhcmFtU3RhcnQgPSAwOwotCVN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQlpZiAobmFtZS5zdGFydHNXaXRoKCJfIikpIG5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsKLQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJjYWxsIikpIHsKLQkJb3V0cHV0KCIoIik7Ci0JCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIDApOwotCQlTdHJpbmcgY2FzdCA9IHBhcmFtRGF0YS5nZXRDYXN0KCk7IAotCQlpZiAoY2FzdC5sZW5ndGgoKSAhPSAwICYmICFjYXN0LmVxdWFscygiKCkiKSkgewotCQkJb3V0cHV0KGNhc3QpOwotCQl9IGVsc2UgewotCQkJb3V0cHV0KCIoIik7Ci0JCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTIocmV0dXJuVHlwZSkpOwotCQkJb3V0cHV0KCIgKCopKCkpIik7Ci0JCX0KLQkJb3V0cHV0KCJhcmcwKSIpOwotCQlwYXJhbVN0YXJ0ID0gMTsKLQl9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgiVnRibENhbGwiKSkgewotCQlvdXRwdXQoIigoIik7Ci0JCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMihyZXR1cm5UeXBlKSk7Ci0JCW91dHB1dCgiIChTVERNRVRIT0RDQUxMVFlQRSAqKSgiKTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAxKSBvdXRwdXQoIiwgIik7Ci0JCQlDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmU0KHBhcmFtVHlwZSkpOwotCQl9Ci0JCW91dHB1dCgiKSkoKigiKTsKLQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmU0KHBhcmFtVHlwZXNbMV0pKTsKLQkJb3V0cHV0KCIgKiopYXJnMSlbYXJnMF0pIik7Ci0JCXBhcmFtU3RhcnQgPSAxOwotCX0gZWxzZSBpZiAobWV0aG9kRGF0YS5nZXRGbGFnKCJjcHAiKSkgewotCQlvdXRwdXQoIigiKTsKLQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCwgMCk7Ci0JCWlmIChwYXJhbURhdGEuZ2V0RmxhZygic3RydWN0IikpIG91dHB1dCgiKiIpOwotCQlTdHJpbmcgY2FzdCA9IHBhcmFtRGF0YS5nZXRDYXN0KCk7IAotCQlpZiAoY2FzdC5sZW5ndGgoKSAhPSAwICYmICFjYXN0LmVxdWFscygiKCkiKSkgewotCQkJb3V0cHV0KGNhc3QpOwotCQl9Ci0JCW91dHB1dCgiYXJnMCktPiIpOwotCQlTdHJpbmcgYWNjZXNzb3IgPSBtZXRob2REYXRhLmdldEFjY2Vzc29yKCk7Ci0JCWlmIChhY2Nlc3Nvci5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlvdXRwdXQoYWNjZXNzb3IpOwotCQl9IGVsc2UgewotCQkJaW50IGluZGV4ID0gLTE7Ci0JCQlpZiAoKGluZGV4ID0gbmFtZS5pbmRleE9mKCdfJykpICE9IC0xKSB7Ci0JCQkJb3V0cHV0KG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSwgbmFtZS5sZW5ndGgoKSkpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQobmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcGFyYW1TdGFydCA9IDE7Ci0JfSBlbHNlIGlmIChtZXRob2REYXRhLmdldEZsYWcoIm5ldyIpKSB7Ci0JCW91dHB1dCgibmV3ICIpOwotCQlTdHJpbmcgYWNjZXNzb3IgPSBtZXRob2REYXRhLmdldEFjY2Vzc29yKCk7Ci0JCWlmIChhY2Nlc3Nvci5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlvdXRwdXQoYWNjZXNzb3IpOwotCQl9IGVsc2UgewotCQkJaW50IGluZGV4ID0gLTE7Ci0JCQlpZiAoKGluZGV4ID0gbmFtZS5pbmRleE9mKCdfJykpICE9IC0xKSB7Ci0JCQkJb3V0cHV0KG5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KSk7Ci0JCQl9IGVsc2UgewotCQkJCW91dHB1dChuYW1lKTsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAobWV0aG9kRGF0YS5nZXRGbGFnKCJkZWxldGUiKSkgewotCQlvdXRwdXQoImRlbGV0ZSAiKTsKLQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCwgMCk7Ci0JCVN0cmluZyBjYXN0ID0gcGFyYW1EYXRhLmdldENhc3QoKTsgCi0JCWlmIChjYXN0Lmxlbmd0aCgpICE9IDAgJiYgIWNhc3QuZXF1YWxzKCIoKSIpKSB7Ci0JCQlvdXRwdXQoY2FzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlvdXRwdXQoIigiKTsKLQkJCW91dHB1dChuYW1lLnN1YnN0cmluZygwLCBuYW1lLmluZGV4T2YoIl8iKSkpOwotCQkJb3V0cHV0KCIgKikiKTsKLQkJfQotCQlvdXRwdXRsbigiYXJnMDsiKTsKLQkJcmV0dXJuOwotCX0gZWxzZSB7Ci0JCVN0cmluZyBhY2Nlc3NvciA9IG1ldGhvZERhdGEuZ2V0QWNjZXNzb3IoKTsKLQkJaWYgKGFjY2Vzc29yLmxlbmd0aCgpICE9IDApIHsKLQkJCW91dHB1dChhY2Nlc3Nvcik7Ci0JCX0gZWxzZSB7Ci0JCQlvdXRwdXQobmFtZSk7Ci0JCX0KLQl9Ci0JZ2VuZXJhdGVGdW5jdGlvbkNhbGxSaWdodFNpZGUobWV0aG9kLCBtZXRob2REYXRhLCBwYXJhbVR5cGVzLCBwYXJhbVN0YXJ0KTsKLQlvdXRwdXRsbigpOwotCWlmIChtYWtlQ29weSkgewotCQlvdXRwdXRsbigiXHR7Iik7Ci0JCW91dHB1dCgiXHRcdCIpOwotCQlvdXRwdXQoY29weSk7Ci0JCW91dHB1dCgiKiBjb3B5ID0gbmV3ICIpOwotCQlvdXRwdXQoY29weSk7Ci0JCW91dHB1dGxuKCIoKTsiKTsKLQkJb3V0cHV0bG4oIlx0XHQqY29weSA9IHRlbXA7Iik7Ci0JCW91dHB1dCgiXHRcdHJjID0gIik7Ci0JCW91dHB1dCgiKCIpOwotCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTIocmV0dXJuVHlwZSkpOwotCQlvdXRwdXQoIikiKTsKLQkJb3V0cHV0bG4oImNvcHk7Iik7Ci0JCW91dHB1dGxuKCJcdH0iKTsKLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVSZXR1cm4oTWV0aG9kIG1ldGhvZCwgQ2xhc3MgcmV0dXJuVHlwZSwgYm9vbGVhbiBuZWVkc1JldHVybikgewotCWlmIChuZWVkc1JldHVybiAmJiByZXR1cm5UeXBlICE9IFZvaWQuVFlQRSkgewotCQlvdXRwdXRsbigiXHRyZXR1cm4gcmM7Iik7Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlR1RLbWVtbW92ZShNZXRob2QgbWV0aG9kLCBTdHJpbmcgZnVuY3Rpb24sIENsYXNzW10gcGFyYW1UeXBlcykgewotCWdlbmVyYXRlRW50ZXJNYWNybyhtZXRob2QsIGZ1bmN0aW9uKTsKLQlvdXRwdXQoIlx0Iik7Ci0JYm9vbGVhbiBnZXQgPSBwYXJhbVR5cGVzWzBdLmlzUHJpbWl0aXZlKCk7Ci0JU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZShwYXJhbVR5cGVzW2dldCA/IDEgOiAwXSk7Ci0Jb3V0cHV0KGdldCA/ICJpZiAoYXJnMSkgZ2V0IiA6ICJpZiAoYXJnMCkgc2V0Iik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0KGdldCA/ICJGaWVsZHMoZW52LCBhcmcxLCAoIiA6ICJGaWVsZHMoZW52LCBhcmcwLCAoIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0KGdldCA/ICIgKilhcmcwKSIgOiAiICopYXJnMSkiKTsKLQlvdXRwdXRsbigiOyIpOwotCWdlbmVyYXRlRXhpdE1hY3JvKG1ldGhvZCwgZnVuY3Rpb24pOwkKLX0KLQotdm9pZCBnZW5lcmF0ZUZ1bmN0aW9uQm9keShNZXRob2QgbWV0aG9kLCBNZXRob2REYXRhIG1ldGhvZERhdGEsIFN0cmluZyBmdW5jdGlvbiwgQ2xhc3NbXSBwYXJhbVR5cGVzLCBDbGFzcyByZXR1cm5UeXBlKSB7Ci0Jb3V0cHV0bG4oInsiKTsKLQkKLQkvKiBDdXN0b20gR1RLIG1lbW1vdmVzLiAqLwotCVN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQlpZiAobmFtZS5zdGFydHNXaXRoKCJfIikpIG5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsKLQlib29sZWFuIGlzR1RLbWVtb3ZlID0gbmFtZS5lcXVhbHMoIm1lbW1vdmUiKSAmJiBwYXJhbVR5cGVzLmxlbmd0aCA9PSAyICYmIHJldHVyblR5cGUgPT0gVm9pZC5UWVBFOwotCWlmIChpc0dUS21lbW92ZSkgewotCQlnZW5lcmF0ZUdUS21lbW1vdmUobWV0aG9kLCBmdW5jdGlvbiwgcGFyYW1UeXBlcyk7Ci0JfSBlbHNlIHsKLQkJYm9vbGVhbiBuZWVkc1JldHVybiA9IGdlbmVyYXRlTG9jYWxWYXJzKG1ldGhvZCwgcGFyYW1UeXBlcywgcmV0dXJuVHlwZSk7Ci0JCWdlbmVyYXRlRW50ZXJNYWNybyhtZXRob2QsIGZ1bmN0aW9uKTsKLQkJYm9vbGVhbiBnZW5GYWlsVGFnID0gZ2VuZXJhdGVHZXR0ZXJzKG1ldGhvZCwgcGFyYW1UeXBlcyk7Ci0JCWlmIChtZXRob2REYXRhLmdldEZsYWcoImR5bmFtaWMiKSkgewotCQkJZ2VuZXJhdGVEeW5hbWljRnVuY3Rpb25DYWxsKG1ldGhvZCwgbWV0aG9kRGF0YSwgcGFyYW1UeXBlcywgcmV0dXJuVHlwZSwgbmVlZHNSZXR1cm4pOwotCQl9IGVsc2UgewotCQkJZ2VuZXJhdGVGdW5jdGlvbkNhbGwobWV0aG9kLCBtZXRob2REYXRhLCBwYXJhbVR5cGVzLCByZXR1cm5UeXBlLCBuZWVkc1JldHVybik7Ci0JCX0KLQkJaWYgKGdlbkZhaWxUYWcpIG91dHB1dGxuKCJmYWlsOiIpOwotCQlnZW5lcmF0ZVNldHRlcnMobWV0aG9kLCBwYXJhbVR5cGVzKTsKLQkJZ2VuZXJhdGVFeGl0TWFjcm8obWV0aG9kLCBmdW5jdGlvbik7Ci0JCWdlbmVyYXRlUmV0dXJuKG1ldGhvZCwgcmV0dXJuVHlwZSwgbmVlZHNSZXR1cm4pOwotCX0KLQkKLQlvdXRwdXRsbigifSIpOwotfQotCi12b2lkIGdlbmVyYXRlRnVuY3Rpb25Qcm90b3R5cGUoTWV0aG9kIG1ldGhvZCwgU3RyaW5nIGZ1bmN0aW9uLCBDbGFzc1tdIHBhcmFtVHlwZXMsIENsYXNzIHJldHVyblR5cGUpIHsKLQlvdXRwdXQoIkpOSUVYUE9SVCAiKTsKLQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTIocmV0dXJuVHlwZSkpOwotCW91dHB1dCgiIEpOSUNBTEwgIik7Ci0Jb3V0cHV0KGdldENsYXNzTmFtZShtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSkpOwotCW91dHB1dCgiX05BVElWRSgiKTsKLQlvdXRwdXQoZnVuY3Rpb24pOwotCW91dHB1dGxuKCIpIik7Ci0Jb3V0cHV0KCJcdChKTklFbnYgKmVudiwgIik7Ci0JaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5TVEFUSUMpICE9IDApIHsKLQkJb3V0cHV0KCJqY2xhc3MiKTsKLQl9IGVsc2UgewotCQlvdXRwdXQoImpvYmplY3QiKTsKLQl9Ci0Jb3V0cHV0KCIgdGhhdCIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotCQlDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQlvdXRwdXQoIiwgIik7Ci0JCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMihwYXJhbVR5cGUpKTsKLQkJb3V0cHV0KCIgYXJnIiArIGkpOwotCX0KLQlvdXRwdXRsbigiKSIpOwotfQotCi12b2lkIGdlbmVyYXRlU291cmNlU3RhcnQoU3RyaW5nIGZ1bmN0aW9uKSB7Ci0Jb3V0cHV0KCIjaWZuZGVmIE5PXyIpOwotCW91dHB1dGxuKGZ1bmN0aW9uKTsKLX0KLQotdm9pZCBnZW5lcmF0ZVNvdXJjZUVuZChTdHJpbmcgZnVuY3Rpb24pIHsKLQlvdXRwdXRsbigiI2VuZGlmIik7Ci19Ci0KLWJvb2xlYW4gaXNDcml0aWNhbChDbGFzcyBwYXJhbVR5cGUsIFBhcmFtZXRlckRhdGEgcGFyYW1EYXRhKSB7Ci0JcmV0dXJuIHBhcmFtVHlwZS5pc0FycmF5KCkgJiYgcGFyYW1UeXBlLmdldENvbXBvbmVudFR5cGUoKS5pc1ByaW1pdGl2ZSgpICYmIHBhcmFtRGF0YS5nZXRGbGFnKCJjcml0aWNhbCIpOwotfQotCi1ib29sZWFuIGlzU3lzdGVtQ2xhc3MoQ2xhc3MgdHlwZSkgewotCXJldHVybiB0eXBlID09IE9iamVjdC5jbGFzcyB8fCB0eXBlID09IENsYXNzLmNsYXNzOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0vLwlhcmdzID0gbmV3IFN0cmluZ1tdeyJvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1MifTsKLQlpZiAoYXJncy5sZW5ndGggPCAxKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGphdmEgTmF0aXZlc0dlbmVyYXRvciA8Y2xhc3NOYW1lMT4gPGNsYXNzTmFtZTI+Iik7Ci0JCXJldHVybjsKLQl9Ci0JdHJ5IHsKLQkJTmF0aXZlc0dlbmVyYXRvciBnZW4gPSBuZXcgTmF0aXZlc0dlbmVyYXRvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBjbGF6ek5hbWUgPSBhcmdzW2ldOwotCQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXp6TmFtZSk7Ci0JCQlnZW4uZ2VuZXJhdGUoY2xhenopOwotLy8JCQlnZW4uZ2VuZXJhdGUoY2xhenosICJDb21tYW5kQmFyX0Rlc3Ryb3kiKTsKLQkJfQotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSIpOwotCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQl9Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9QYXJhbWV0ZXJEYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvUGFyYW1ldGVyRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjY4ZTY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9QYXJhbWV0ZXJEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyRGF0YSBleHRlbmRzIEl0ZW1EYXRhIHsKLQkKLQlNZXRob2QgbWV0aG9kOwotCWludCBwYXJhbWV0ZXI7Ci0KLXB1YmxpYyBQYXJhbWV0ZXJEYXRhKE1ldGhvZCBtZXRob2QsIGludCBwYXJhbWV0ZXIsIFN0cmluZyBzdHIpIHsKLQlzdXBlcihzdHIpOwotCXRoaXMubWV0aG9kID0gbWV0aG9kOwotCXRoaXMucGFyYW1ldGVyID0gcGFyYW1ldGVyOwotfQotCi1wdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEFsbEZsYWdzKCkgewotCXJldHVybiBuZXcgU3RyaW5nW117Im5vX2luIiwgIm5vX291dCIsICJjcml0aWNhbCIsICJpbml0IiwgInN0cnVjdCIsICJ1bmljb2RlIn07Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2FzdCgpIHsKLQlTdHJpbmcgY2FzdCA9ICgoU3RyaW5nKWdldFBhcmFtKCJjYXN0IikpLnRyaW0oKTsKLQlpZiAoY2FzdC5sZW5ndGgoKSA+IDApIHsKLQkJaWYgKCFjYXN0LnN0YXJ0c1dpdGgoIigiKSkgY2FzdCA9ICIoIiArIGNhc3Q7Ci0JCWlmICghY2FzdC5lbmRzV2l0aCgiKSIpKSBjYXN0ID0gY2FzdCArICIpIjsKLQl9Ci0JcmV0dXJuIGNhc3Q7Ci19Ci0KLXB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKCkgewotCXJldHVybiBtZXRob2Q7Ci19Ci0KLXB1YmxpYyBpbnQgZ2V0UGFyYW1ldGVyKCkgewotCXJldHVybiBwYXJhbWV0ZXI7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldENhc3QoU3RyaW5nIHN0cikgewotCXNldFBhcmFtKCJjYXN0Iiwgc3RyKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1Byb2dyZXNzTW9uaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1Byb2dyZXNzTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzRjZjc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9Qcm9ncmVzc01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvZ3Jlc3NNb25pdG9yIHsKLQotcHVibGljIHZvaWQgc2V0VG90YWwoaW50IHRvdGFsKTsKLXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpOwotcHVibGljIHZvaWQgc3RlcCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU2l6ZW9mR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU2l6ZW9mR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MjYwODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1NpemVvZkdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTaXplb2ZHZW5lcmF0b3IgZXh0ZW5kcyBKTklHZW5lcmF0b3IgewotCi0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKENsYXNzIGNsYXp6KSB7Ci0JU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0Jb3V0cHV0KCJcdHByaW50ZihcIiIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dCgiPSVkXFxuXCIsIHNpemVvZigiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXRsbigiKSk7Iik7Ci0vLwlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0vLwlnZW5lcmF0ZShmaWVsZHMpOwkKLX0KLQkKLXB1YmxpYyB2b2lkIGdlbmVyYXRlKCkgewotCW91dHB1dGxuKCJpbnQgbWFpbigpIHsiKTsKLQlzdXBlci5nZW5lcmF0ZSgpOwotCW91dHB1dGxuKCJ9Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEZpZWxkW10gZmllbGRzKSB7Ci0Jc29ydChmaWVsZHMpOwkKLQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQlGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJaWYgKChmaWVsZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLkZJTkFMKSA9PSAwKSBjb250aW51ZTsKLQkJZ2VuZXJhdGUoZmllbGQpOwotCX0KLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoRmllbGQgZmllbGQpIHsKLQlvdXRwdXQoIlx0cHJpbnRmKFwiIik7Ci0Jb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0Jb3V0cHV0KCI9JWRcXG5cIiwgc2l6ZW9mKCIpOwotCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCW91dHB1dGxuKCIpKTsiKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWlmIChhcmdzLmxlbmd0aCA8IDEpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogamF2YSBTaXplb2ZHZW5lcmF0b3IgPGNsYXNzTmFtZTE+IDxjbGFzc05hbWUyPiIpOwotCQlyZXR1cm47Ci0JfQotCXRyeSB7Ci0JCVNpemVvZkdlbmVyYXRvciBnZW4gPSBuZXcgU2l6ZW9mR2VuZXJhdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGNsYXp6TmFtZSA9IGFyZ3NbaV07Ci0JCQlDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhenpOYW1lKTsKLQkJCWdlbi5nZW5lcmF0ZShjbGF6eik7Ci0JCX0KLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU3RhdHNHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TdGF0c0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDUwY2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TdGF0c0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1wdWJsaWMgY2xhc3MgU3RhdHNHZW5lcmF0b3IgZXh0ZW5kcyBKTklHZW5lcmF0b3IgewotCi0JYm9vbGVhbiBoZWFkZXI7Ci0JCi1wdWJsaWMgU3RhdHNHZW5lcmF0b3IoYm9vbGVhbiBoZWFkZXIpIHsKLQl0aGlzLmhlYWRlciA9IGhlYWRlcjsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGVDb3B5cmlnaHQoKSB7Ci0JZ2VuZXJhdGVNZXRhRGF0YSgic3d0X2NvcHlyaWdodCIpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZUluY2x1ZGVzKCkgewotCWlmICghaGVhZGVyKSB7Ci0JCW91dHB1dGxuKCIjaW5jbHVkZSBcInN3dC5oXCIiKTsKLQkJb3V0cHV0KCIjaW5jbHVkZSBcIiIpOwotCQlvdXRwdXQoZ2V0T3V0cHV0TmFtZSgpKTsKLQkJb3V0cHV0bG4oIl9zdGF0cy5oXCIiKTsKLQkJb3V0cHV0bG4oKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKENsYXNzIGNsYXp6KSB7Ci0JaWYgKGhlYWRlcikgewotCQlnZW5lcmF0ZUhlYWRlckZpbGUoY2xhenopOwotCX0gZWxzZSB7Ci0JCWdlbmVyYXRlU291cmNlRmlsZShjbGF6eik7Ci0JfQotfQotCi1wdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQlyZXR1cm4gaGVhZGVyID8gIi5oIiA6IHN1cGVyLmdldEV4dGVuc2lvbigpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldFN1ZmZpeCgpIHsKLQlyZXR1cm4gIl9zdGF0cyI7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVIZWFkZXJGaWxlKENsYXNzIGNsYXp6KXsKLQlnZW5lcmF0ZU5BVElWRU1hY3JvcyhjbGF6eik7Ci0JTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCXNvcnQobWV0aG9kcyk7Ci0JZ2VuZXJhdGVGdW5jdGlvbkVudW0obWV0aG9kcyk7CQotfQotCi12b2lkIGdlbmVyYXRlTkFUSVZFTWFjcm9zKENsYXNzIGNsYXp6KSB7Ci0JU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0Jb3V0cHV0bG4oIiNpZmRlZiBOQVRJVkVfU1RBVFMiKTsKLQlvdXRwdXQoImV4dGVybiBpbnQgIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIl9uYXRpdmVGdW5jdGlvbkNvdW50OyIpOwotCW91dHB1dCgiZXh0ZXJuIGludCAiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXRsbigiX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50W107Iik7Ci0Jb3V0cHV0KCJleHRlcm4gY2hhciogIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIl9uYXRpdmVGdW5jdGlvbk5hbWVzW107Iik7Ci0Jb3V0cHV0KCIjZGVmaW5lICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dCgiX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGZ1bmMpICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbZnVuY10rKzsiKTsKLQlvdXRwdXQoIiNkZWZpbmUgIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIl9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpICIpOwotCW91dHB1dGxuKCIjZWxzZSIpOwotCW91dHB1dCgiI2RlZmluZSAiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXRsbigiX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGZ1bmMpICIpOwotCW91dHB1dCgiI2RlZmluZSAiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXRsbigiX05BVElWRV9FWElUKGVudiwgdGhhdCwgZnVuYykgIik7Ci0Jb3V0cHV0bG4oIiNlbmRpZiIpOwotCW91dHB1dGxuKCk7CQotfQotCi12b2lkIGdlbmVyYXRlU291cmNlRmlsZShDbGFzcyBjbGF6eikgewotCW91dHB1dGxuKCIjaWZkZWYgTkFUSVZFX1NUQVRTIik7Ci0Jb3V0cHV0bG4oKTsKLQlNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JaW50IG1ldGhvZENvdW50ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSBjb250aW51ZTsKLQkJbWV0aG9kQ291bnQrKzsKLQl9Ci0JU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0Jb3V0cHV0KCJpbnQgIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0KCJfbmF0aXZlRnVuY3Rpb25Db3VudCA9ICIpOwotCW91dHB1dChTdHJpbmcudmFsdWVPZihtZXRob2RDb3VudCkpOwotCW91dHB1dGxuKCI7Iik7Ci0Jb3V0cHV0KCJpbnQgIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0KCJfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbIik7Ci0Jb3V0cHV0KFN0cmluZy52YWx1ZU9mKG1ldGhvZENvdW50KSk7Ci0Jb3V0cHV0bG4oIl07Iik7Ci0Jb3V0cHV0KCJjaGFyICogIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIl9uYXRpdmVGdW5jdGlvbk5hbWVzW10gPSB7Iik7Ci0Jc29ydChtZXRob2RzKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSBjb250aW51ZTsKLQkJb3V0cHV0KCJcdFwiIik7Ci0JCW91dHB1dChnZXRGdW5jdGlvbk5hbWUobWV0aG9kKSk7Ci0JCW91dHB1dGxuKCJcIiwiKTsKLQkJaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnN0ZXAoKTsKLQl9Ci0Jb3V0cHV0bG4oIn07Iik7Ci0Jb3V0cHV0bG4oKTsKLQlnZW5lcmF0ZVN0YXRzTmF0aXZlcyhjbGFzc05hbWUpOwotCW91dHB1dGxuKCk7Ci0Jb3V0cHV0bG4oIiNlbmRpZiIpOwotfQotCi12b2lkIGdlbmVyYXRlU3RhdHNOYXRpdmVzKFN0cmluZyBjbGFzc05hbWUpIHsKLQlvdXRwdXRsbigiI2RlZmluZSBTVEFUU19OQVRJVkUoZnVuYykgSmF2YV9vcmdfZWNsaXBzZV9zd3RfdG9vbHNfaW50ZXJuYWxfTmF0aXZlU3RhdHNfIyNmdW5jIik7Ci0Jb3V0cHV0bG4oKTsKLQotCW91dHB1dCgiSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBTVEFUU19OQVRJVkUoIik7Ci0Jb3V0cHV0KHRvQyhjbGFzc05hbWUgKyAiX0dldEZ1bmN0aW9uQ291bnQiKSk7Ci0Jb3V0cHV0bG4oIikiKTsKLQlvdXRwdXRsbigiXHQoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KSIpOwotCW91dHB1dGxuKCJ7Iik7Ci0Jb3V0cHV0KCJcdHJldHVybiAiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXRsbigiX25hdGl2ZUZ1bmN0aW9uQ291bnQ7Iik7Ci0Jb3V0cHV0bG4oIn0iKTsKLQlvdXRwdXRsbigpOwotCi0Jb3V0cHV0KCJKTklFWFBPUlQganN0cmluZyBKTklDQUxMIFNUQVRTX05BVElWRSgiKTsKLQlvdXRwdXQodG9DKGNsYXNzTmFtZSArICJfR2V0RnVuY3Rpb25OYW1lIikpOwotCW91dHB1dGxuKCIpIik7Ci0Jb3V0cHV0bG4oIlx0KEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBpbmRleCkiKTsKLQlvdXRwdXRsbigieyIpOwotCW91dHB1dCgiXHRyZXR1cm4gIik7Ci0JaWYgKGlzQ1BQKSB7Ci0JCW91dHB1dCgiZW52LT5OZXdTdHJpbmdVVEYoIik7Ci0JfSBlbHNlIHsKLQkJb3V0cHV0KCIoKmVudiktPk5ld1N0cmluZ1VURihlbnYsICIpOwotCX0KLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXRsbigiX25hdGl2ZUZ1bmN0aW9uTmFtZXNbaW5kZXhdKTsiKTsKLQlvdXRwdXRsbigifSIpOwotCW91dHB1dGxuKCk7Ci0KLQlvdXRwdXQoIkpOSUVYUE9SVCBqaW50IEpOSUNBTEwgU1RBVFNfTkFUSVZFKCIpOwotCW91dHB1dCh0b0MoY2xhc3NOYW1lICsgIl9HZXRGdW5jdGlvbkNhbGxDb3VudCIpKTsKLQlvdXRwdXRsbigiKSIpOwotCW91dHB1dGxuKCJcdChKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaW5kZXgpIik7Ci0Jb3V0cHV0bG4oInsiKTsKLQlvdXRwdXQoIlx0cmV0dXJuICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbaW5kZXhdOyIpOwotCW91dHB1dGxuKCJ9Iik7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVGdW5jdGlvbkVudW0oTWV0aG9kW10gbWV0aG9kcykgewotCWlmIChtZXRob2RzLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0Jb3V0cHV0bG4oInR5cGVkZWYgZW51bSB7Iik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgPT0gMCkgY29udGludWU7Ci0JCW91dHB1dCgiXHQiKTsKLQkJb3V0cHV0KGdldEZ1bmN0aW9uTmFtZShtZXRob2QpKTsKLQkJb3V0cHV0bG4oIl9GVU5DLCIpOwotCQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgcHJvZ3Jlc3Muc3RlcCgpOwotCX0KLQlDbGFzcyBjbGF6eiA9IG1ldGhvZHNbMF0uZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQlvdXRwdXQoIn0gIik7Ci0Jb3V0cHV0KGdldENsYXNzTmFtZShjbGF6eikpOwotCW91dHB1dGxuKCJfRlVOQ1M7Iik7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TdHJ1Y3RzR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU3RydWN0c0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmM4YTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TdHJ1Y3RzR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0c0dlbmVyYXRvciBleHRlbmRzIEpOSUdlbmVyYXRvciB7Ci0KLWJvb2xlYW4gaGVhZGVyOwotCi1wdWJsaWMgU3RydWN0c0dlbmVyYXRvcihib29sZWFuIGhlYWRlcikgewotCXRoaXMuaGVhZGVyID0gaGVhZGVyOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZUNvcHlyaWdodCgpIHsKLQlnZW5lcmF0ZU1ldGFEYXRhKCJzd3RfY29weXJpZ2h0Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlSW5jbHVkZXMoKSB7Ci0JaWYgKGhlYWRlcikgewotCQlvdXRwdXQoIiNpbmNsdWRlIFwiIik7Ci0JCW91dHB1dChnZXRPdXRwdXROYW1lKCkpOwotCQlvdXRwdXRsbigiLmhcIiIpOwotCX0gZWxzZSB7Ci0JCW91dHB1dGxuKCIjaW5jbHVkZSBcInN3dC5oXCIiKTsKLQkJb3V0cHV0KCIjaW5jbHVkZSBcIiIpOwotCQlvdXRwdXQoZ2V0T3V0cHV0TmFtZSgpKTsKLQkJb3V0cHV0bG4oIl9zdHJ1Y3RzLmhcIiIpOwotCX0KLQlvdXRwdXRsbigpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShDbGFzcyBjbGF6eikgewotCWludCBqID0gMDsKLQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JZm9yICg7IGogPCBmaWVsZHMubGVuZ3RoOyBqKyspIHsKLQkJRmllbGQgZmllbGQgPSBmaWVsZHNbal07Ci0JCWludCBtb2RzID0gZmllbGQuZ2V0TW9kaWZpZXJzKCk7Ci0JCWlmICgobW9kcyAmIE1vZGlmaWVyLlBVQkxJQykgIT0gMCAmJiAobW9kcyAmIE1vZGlmaWVyLlNUQVRJQykgPT0gMCkgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGogPT0gZmllbGRzLmxlbmd0aCkgcmV0dXJuOwotCWlmIChoZWFkZXIpIHsKLQkJZ2VuZXJhdGVIZWFkZXJGaWxlKGNsYXp6KTsKLQl9IGVsc2UgewotCQlnZW5lcmF0ZVNvdXJjZUZpbGUoY2xhenopOwotCX0KLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoKSB7Ci0JaWYgKCFoZWFkZXIgJiYgZ2V0Q2xhc3NlcygpLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0Jc3VwZXIuZ2VuZXJhdGUoKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0JcmV0dXJuIGhlYWRlciA/ICIuaCIgOiBzdXBlci5nZXRFeHRlbnNpb24oKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRTdWZmaXgoKSB7Ci0JcmV0dXJuICJfc3RydWN0cyI7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVFeGNsdWRlcyhDbGFzc1tdIGNsYXNzZXMpIHsKLQlIYXNoU2V0IGV4Y2x1ZGVzID0gbmV3IEhhc2hTZXQoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJQ2xhc3MgY2xhenogPSBjbGFzc2VzW2ldOwotCQlDbGFzc0RhdGEgY2xhc3NEYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShjbGF6eik7Ci0JCVN0cmluZyBleGNsdWRlID0gY2xhc3NEYXRhLmdldEV4Y2x1ZGUoKTsKLQkJaWYgKGV4Y2x1ZGUubGVuZ3RoKCkgIT0gMCkgewotCQkJZXhjbHVkZXMuYWRkKGV4Y2x1ZGUpOwotCQl9Ci0JfQotCWZvciAoSXRlcmF0b3IgaXRlciA9IGV4Y2x1ZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQlTdHJpbmcgZXhjbHVkZSA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0JCW91dHB1dGxuKGV4Y2x1ZGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCUNsYXNzIGNsYXp6ID0gY2xhc3Nlc1tpXTsKLQkJCUNsYXNzRGF0YSBjbGFzc0RhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKGNsYXp6KTsKLQkJCVN0cmluZyBjbGFzc0V4Y2x1ZGUgPSBjbGFzc0RhdGEuZ2V0RXhjbHVkZSgpOwotCQkJaWYgKGV4Y2x1ZGUuZXF1YWxzKGNsYXNzRXhjbHVkZSkpIHsKLQkJCQlvdXRwdXQoIiNkZWZpbmUgTk9fIik7Ci0JCQkJb3V0cHV0bG4oZ2V0Q2xhc3NOYW1lKGNsYXp6KSk7Ci0JCQl9Ci0JCX0KLQkJb3V0cHV0bG4oIiNlbmRpZiIpOwotCQlvdXRwdXRsbigpOwotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZUhlYWRlckZpbGUoQ2xhc3MgY2xhenopIHsKLQlnZW5lcmF0ZVNvdXJjZVN0YXJ0KGNsYXp6KTsKLQlnZW5lcmF0ZVByb3RvdHlwZXMoY2xhenopOwotCWdlbmVyYXRlQmxhbmtNYWNyb3MoY2xhenopOwotCWdlbmVyYXRlU291cmNlRW5kKGNsYXp6KTsJCi0Jb3V0cHV0bG4oKTsKLX0KLQotdm9pZCBnZW5lcmF0ZVNvdXJjZUZpbGUoQ2xhc3MgY2xhenopIHsKLQlnZW5lcmF0ZVNvdXJjZVN0YXJ0KGNsYXp6KTsKLQlnZW5lcmF0ZUZJRHNTdHJ1Y3R1cmUoY2xhenopOwotCW91dHB1dGxuKCk7Ci0JZ2VuZXJhdGVHbG9iYWxWYXIoY2xhenopOwotCW91dHB1dGxuKCk7Ci0JZ2VuZXJhdGVGdW5jdGlvbnMoY2xhenopOwotCWdlbmVyYXRlU291cmNlRW5kKGNsYXp6KTsKLQlvdXRwdXRsbigpOwotfQotCi12b2lkIGdlbmVyYXRlU291cmNlU3RhcnQoQ2xhc3MgY2xhenopIHsKLQlTdHJpbmcgY2xhenpOYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQlvdXRwdXQoIiNpZm5kZWYgTk9fIik7Ci0Jb3V0cHV0bG4oY2xhenpOYW1lKTsKLX0KLQotdm9pZCBnZW5lcmF0ZVNvdXJjZUVuZChDbGFzcyBjbGF6eikgewotCW91dHB1dGxuKCIjZW5kaWYiKTsKLX0KLQotdm9pZCBnZW5lcmF0ZUdsb2JhbFZhcihDbGFzcyBjbGF6eikgewotCVN0cmluZyBjbGF6ek5hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dCgiX0ZJRF9DQUNIRSAiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiRmM7Iik7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVCbGFua01hY3JvcyhDbGFzcyBjbGF6eikgewotCVN0cmluZyBjbGF6ek5hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCW91dHB1dGxuKCIjZWxzZSIpOwotCW91dHB1dCgiI2RlZmluZSBjYWNoZSIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCJGaWVsZHMoYSxiKSIpOwotCW91dHB1dCgiI2RlZmluZSBnZXQiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiRmllbGRzKGEsYixjKSBOVUxMIik7Ci0Jb3V0cHV0KCIjZGVmaW5lIHNldCIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCJGaWVsZHMoYSxiLGMpIik7Ci0Jb3V0cHV0KCIjZGVmaW5lICIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCJfc2l6ZW9mKCkgMCIpOwotfQotCi12b2lkIGdlbmVyYXRlUHJvdG90eXBlcyhDbGFzcyBjbGF6eikgewotCVN0cmluZyBjbGF6ek5hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCW91dHB1dCgidm9pZCBjYWNoZSIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCJGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QpOyIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dCgiICpnZXQiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXQoIkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIiAqbHBTdHJ1Y3QpOyIpOwotCW91dHB1dCgidm9pZCBzZXQiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXQoIkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIiAqbHBTdHJ1Y3QpOyIpOwotCW91dHB1dCgiI2RlZmluZSAiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXQoIl9zaXplb2YoKSBzaXplb2YoIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIikiKTsKLX0KLQotdm9pZCBnZW5lcmF0ZUZJRHNTdHJ1Y3R1cmUoQ2xhc3MgY2xhenopIHsKLQlTdHJpbmcgY2xhenpOYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQlvdXRwdXQoInR5cGVkZWYgc3RydWN0ICIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCJfRklEX0NBQ0hFIHsiKTsKLQlvdXRwdXRsbigiXHRpbnQgY2FjaGVkOyIpOwotCW91dHB1dGxuKCJcdGpjbGFzcyBjbGF6ejsiKTsKLQlvdXRwdXQoIlx0amZpZWxkSUQgIik7Ci0JRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpOwotCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwotCQlpZiAoaWdub3JlRmllbGQoZmllbGQpKSBjb250aW51ZTsKLQkJaWYgKCFmaXJzdCkgb3V0cHV0KCIsICIpOwotCQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQkJZmlyc3QgPSBmYWxzZTsKLQl9Ci0Jb3V0cHV0bG4oIjsiKTsKLQlvdXRwdXQoIn0gIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIl9GSURfQ0FDSEU7Iik7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVDYWNoZUZ1bmN0aW9uKENsYXNzIGNsYXp6KSB7Ci0JU3RyaW5nIGNsYXp6TmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0Jb3V0cHV0KCJ2b2lkIGNhY2hlIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCkiKTsKLQlvdXRwdXRsbigieyIpOwotCW91dHB1dCgiXHRpZiAoIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIkZjLmNhY2hlZCkgcmV0dXJuOyIpOwotCUNsYXNzIHN1cGVyY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7Ci0JaWYgKHN1cGVyY2xhenogIT0gT2JqZWN0LmNsYXNzKSB7Ci0JCVN0cmluZyBzdXBlck5hbWUgPSBnZXRDbGFzc05hbWUoc3VwZXJjbGF6eik7Ci0JCW91dHB1dCgiXHRjYWNoZSIpOwotCQlvdXRwdXQoc3VwZXJOYW1lKTsKLQkJb3V0cHV0bG4oIkZpZWxkcyhlbnYsIGxwT2JqZWN0KTsiKTsKLQl9Ci0Jb3V0cHV0KCJcdCIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCWlmIChpc0NQUCkgewotCQlvdXRwdXQoIkZjLmNsYXp6ID0gZW52LT5HZXRPYmplY3RDbGFzcyhscE9iamVjdCk7Iik7Ci0JfSBlbHNlIHsKLQkJb3V0cHV0KCJGYy5jbGF6eiA9ICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBscE9iamVjdCk7Iik7Ci0JfQotCW91dHB1dGxuKCk7Ci0JRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwotCQlpZiAoaWdub3JlRmllbGQoZmllbGQpKSBjb250aW51ZTsKLQkJb3V0cHV0KCJcdCIpOwotCQlvdXRwdXQoY2xhenpOYW1lKTsKLQkJb3V0cHV0KCJGYy4iKTsKLQkJb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0JCWlmIChpc0NQUCkgewotCQkJb3V0cHV0KCIgPSBlbnYtPkdldEZpZWxkSUQoIik7Ci0JCX0gZWxzZSB7Ci0JCQlvdXRwdXQoIiA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsICIpOwotCQl9Ci0JCW91dHB1dChjbGF6ek5hbWUpOwotCQlvdXRwdXQoIkZjLmNsYXp6LCBcIiIpOwotCQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQkJb3V0cHV0KCJcIiwgXCIiKTsKLQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUoZmllbGQuZ2V0VHlwZSgpKSk7Ci0JCW91dHB1dGxuKCJcIik7Iik7Ci0JfQotCW91dHB1dCgiXHQiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiRmMuY2FjaGVkID0gMTsiKTsKLQlvdXRwdXRsbigifSIpOwotfQotCi12b2lkIGdlbmVyYXRlR2V0RmllbGRzKENsYXNzIGNsYXp6KSB7Ci0JQ2xhc3Mgc3VwZXJjbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKLQlTdHJpbmcgY2xhenpOYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQlTdHJpbmcgc3VwZXJOYW1lID0gZ2V0Q2xhc3NOYW1lKHN1cGVyY2xhenopOwotCWlmIChzdXBlcmNsYXp6ICE9IE9iamVjdC5jbGFzcykgewotCQkvKiBXaW5kb3dzIGV4Y2VwdGlvbiAtIGNhbm5vdCBjYWxsIGdldC9zZXQgZnVuY3Rpb24gb2Ygc3VwZXIgY2xhc3MgaW4gdGhpcyBjYXNlICovCi0JCWlmICghKGNsYXp6TmFtZS5lcXVhbHMoc3VwZXJOYW1lICsgIkEiKSB8fCBjbGF6ek5hbWUuZXF1YWxzKHN1cGVyTmFtZSArICJXIikpKSB7Ci0JCQlvdXRwdXQoIlx0Z2V0Iik7Ci0JCQlvdXRwdXQoc3VwZXJOYW1lKTsKLQkJCW91dHB1dCgiRmllbGRzKGVudiwgbHBPYmplY3QsICgiKTsKLQkJCW91dHB1dChzdXBlck5hbWUpOwotCQkJb3V0cHV0bG4oIiAqKWxwU3RydWN0KTsiKTsKLQkJfSBlbHNlIHsKLQkJCWdlbmVyYXRlR2V0RmllbGRzKHN1cGVyY2xhenopOwotCQl9Ci0JfQotCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQlGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJaWYgKGlnbm9yZUZpZWxkKGZpZWxkKSkgY29udGludWU7Ci0JCUZpZWxkRGF0YSBmaWVsZERhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKGZpZWxkKTsKLQkJU3RyaW5nIGV4Y2x1ZGUgPSBmaWVsZERhdGEuZ2V0RXhjbHVkZSgpOwotCQlpZiAoZXhjbHVkZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlvdXRwdXRsbihleGNsdWRlKTsKLQkJfQotCQlib29sZWFuIG5vV2luQ0UgPSBmaWVsZERhdGEuZ2V0RmxhZygibm9fd2luY2UiKTsKLQkJaWYgKG5vV2luQ0UpIHsKLQkJCW91dHB1dGxuKCIjaWZuZGVmIF9XSU4zMl9XQ0UiKTsKLQkJfQotCQlDbGFzcyB0eXBlID0gZmllbGQuZ2V0VHlwZSgpOwotCQlTdHJpbmcgdHlwZU5hbWUgPSBnZXRDbGFzc05hbWUodHlwZSk7Ci0JCVN0cmluZyBhY2Nlc3NvciA9IGZpZWxkRGF0YS5nZXRBY2Nlc3NvcigpOwotCQlpZiAoYWNjZXNzb3IgPT0gbnVsbCB8fCBhY2Nlc3Nvci5sZW5ndGgoKSA9PSAwKSBhY2Nlc3NvciA9IGZpZWxkLmdldE5hbWUoKTsKLQkJaWYgKHR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJb3V0cHV0KCJcdGxwU3RydWN0LT4iKTsKLQkJCW91dHB1dChhY2Nlc3Nvcik7Ci0JCQlvdXRwdXQoIiA9ICIpOwotCQkJb3V0cHV0KGZpZWxkRGF0YS5nZXRDYXN0KCkpOwotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJlbnYtPkdldCIpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoIigqZW52KS0+R2V0Iik7Ci0JCQl9Ci0JCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTEoZmllbGQuZ2V0VHlwZSgpKSk7Ci0JCQlpZiAoaXNDUFApIHsKLQkJCQlvdXRwdXQoIkZpZWxkKGxwT2JqZWN0LCAiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KCJGaWVsZChlbnYsIGxwT2JqZWN0LCAiKTsKLQkJCX0KLQkJCW91dHB1dChnZXRDbGFzc05hbWUoZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKSkpOwotCQkJb3V0cHV0KCJGYy4iKTsKLQkJCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCQkJb3V0cHV0KCIpOyIpOwotCQl9IGVsc2UgaWYgKHR5cGUuaXNBcnJheSgpKSB7Ci0JCQlDbGFzcyBjb21wb25lbnRUeXBlID0gdHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQlpZiAoY29tcG9uZW50VHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkJb3V0cHV0bG4oIlx0eyIpOwotCQkJCW91dHB1dCgiXHQiKTsJCQkJCi0JCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUyKGZpZWxkLmdldFR5cGUoKSkpOwotCQkJCW91dHB1dCgiIGxwT2JqZWN0MSA9ICgiKTsKLQkJCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTIoZmllbGQuZ2V0VHlwZSgpKSk7Ci0JCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJCW91dHB1dCgiKWVudi0+R2V0T2JqZWN0RmllbGQobHBPYmplY3QsICIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW91dHB1dCgiKSgqZW52KS0+R2V0T2JqZWN0RmllbGQoZW52LCBscE9iamVjdCwgIik7Ci0JCQkJfQotCQkJCW91dHB1dChnZXRDbGFzc05hbWUoZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKSkpOwotCQkJCW91dHB1dCgiRmMuIik7Ci0JCQkJb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0JCQkJb3V0cHV0bG4oIik7Iik7Ci0JCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJCW91dHB1dCgiXHRlbnYtPkdldCIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW91dHB1dCgiXHQoKmVudiktPkdldCIpOwotCQkJCX0KLQkJCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTEoY29tcG9uZW50VHlwZSkpOwotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIkFycmF5UmVnaW9uKGxwT2JqZWN0MSwgMCwgc2l6ZW9mKGxwU3RydWN0LT4iKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIkFycmF5UmVnaW9uKGVudiwgbHBPYmplY3QxLCAwLCBzaXplb2YobHBTdHJ1Y3QtPiIpOwotCQkJCX0KLQkJCQlvdXRwdXQoYWNjZXNzb3IpOwotCQkJCW91dHB1dCgiKSIpOwotCQkJCWludCBieXRlQ291bnQgPSBnZXRCeXRlQ291bnQoY29tcG9uZW50VHlwZSk7Ci0JCQkJaWYgKGJ5dGVDb3VudCA+IDEpIHsKLQkJCQkJb3V0cHV0KCIgLyAiKTsKLQkJCQkJb3V0cHV0KFN0cmluZy52YWx1ZU9mKGJ5dGVDb3VudCkpOwotCQkJCX0KLQkJCQlvdXRwdXQoIiwgKCIpOwotCQkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlNCh0eXBlKSk7CQkJCQotCQkJCW91dHB1dCgiKWxwU3RydWN0LT4iKTsKLQkJCQlvdXRwdXQoYWNjZXNzb3IpOwotCQkJCW91dHB1dGxuKCIpOyIpOwotCQkJCW91dHB1dCgiXHR9Iik7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBFcnJvcigibm90IGRvbmUiKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW91dHB1dGxuKCJcdHsiKTsKLQkJCWlmIChpc0NQUCkgewotCQkJCW91dHB1dCgiXHRqb2JqZWN0IGxwT2JqZWN0MSA9IGVudi0+R2V0T2JqZWN0RmllbGQobHBPYmplY3QsICIpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoIlx0am9iamVjdCBscE9iamVjdDEgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgbHBPYmplY3QsICIpOwotCQkJfQotCQkJb3V0cHV0KGdldENsYXNzTmFtZShmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpKSk7Ci0JCQlvdXRwdXQoIkZjLiIpOwotCQkJb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0JCQlvdXRwdXRsbigiKTsiKTsKLQkJCW91dHB1dCgiXHRpZiAobHBPYmplY3QxICE9IE5VTEwpIGdldCIpOwotCQkJb3V0cHV0KHR5cGVOYW1lKTsKLQkJCW91dHB1dCgiRmllbGRzKGVudiwgbHBPYmplY3QxLCAmbHBTdHJ1Y3QtPiIpOwotCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJCW91dHB1dGxuKCIpOyIpOwotCQkJb3V0cHV0KCJcdH0iKTsKLQkJfQotCQlvdXRwdXRsbigpOwotCQlpZiAobm9XaW5DRSkgewotCQkJb3V0cHV0bG4oIiNlbmRpZiIpOwotCQl9Ci0JCWlmIChleGNsdWRlLmxlbmd0aCgpICE9IDApIHsKLQkJCW91dHB1dGxuKCIjZW5kaWYiKTsKLQkJfQotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZUdldEZ1bmN0aW9uKENsYXNzIGNsYXp6KSB7Ci0JU3RyaW5nIGNsYXp6TmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0KCIgKmdldCIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dCgiRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCAiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiICpscFN0cnVjdCkiKTsKLQlvdXRwdXRsbigieyIpOwotCW91dHB1dCgiXHRpZiAoISIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dCgiRmMuY2FjaGVkKSBjYWNoZSIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCJGaWVsZHMoZW52LCBscE9iamVjdCk7Iik7Ci0JZ2VuZXJhdGVHZXRGaWVsZHMoY2xhenopOwotCW91dHB1dGxuKCJcdHJldHVybiBscFN0cnVjdDsiKTsKLQlvdXRwdXRsbigifSIpOwotfQotCi12b2lkIGdlbmVyYXRlU2V0RmllbGRzKENsYXNzIGNsYXp6KSB7Ci0JQ2xhc3Mgc3VwZXJjbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKLQlTdHJpbmcgY2xhenpOYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQlTdHJpbmcgc3VwZXJOYW1lID0gZ2V0Q2xhc3NOYW1lKHN1cGVyY2xhenopOwotCWlmIChzdXBlcmNsYXp6ICE9IE9iamVjdC5jbGFzcykgewotCQkvKiBXaW5kb3dzIGV4Y2VwdGlvbiAtIGNhbm5vdCBjYWxsIGdldC9zZXQgZnVuY3Rpb24gb2Ygc3VwZXIgY2xhc3MgaW4gdGhpcyBjYXNlICovCi0JCWlmICghKGNsYXp6TmFtZS5lcXVhbHMoc3VwZXJOYW1lICsgIkEiKSB8fCBjbGF6ek5hbWUuZXF1YWxzKHN1cGVyTmFtZSArICJXIikpKSB7Ci0JCQlvdXRwdXQoIlx0c2V0Iik7Ci0JCQlvdXRwdXQoc3VwZXJOYW1lKTsKLQkJCW91dHB1dCgiRmllbGRzKGVudiwgbHBPYmplY3QsICgiKTsKLQkJCW91dHB1dChzdXBlck5hbWUpOwotCQkJb3V0cHV0bG4oIiAqKWxwU3RydWN0KTsiKTsKLQkJfSBlbHNlIHsKLQkJCWdlbmVyYXRlU2V0RmllbGRzKHN1cGVyY2xhenopOwotCQl9Ci0JfQotCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQlGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJaWYgKGlnbm9yZUZpZWxkKGZpZWxkKSkgY29udGludWU7Ci0JCUZpZWxkRGF0YSBmaWVsZERhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKGZpZWxkKTsKLQkJU3RyaW5nIGV4Y2x1ZGUgPSBmaWVsZERhdGEuZ2V0RXhjbHVkZSgpOwotCQlpZiAoZXhjbHVkZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlvdXRwdXRsbihleGNsdWRlKTsKLQkJfQotCQlib29sZWFuIG5vV2luQ0UgPSBmaWVsZERhdGEuZ2V0RmxhZygibm9fd2luY2UiKTsKLQkJaWYgKG5vV2luQ0UpIHsKLQkJCW91dHB1dGxuKCIjaWZuZGVmIF9XSU4zMl9XQ0UiKTsKLQkJfQotCQlDbGFzcyB0eXBlID0gZmllbGQuZ2V0VHlwZSgpOwotCQlTdHJpbmcgdHlwZU5hbWUgPSBnZXRDbGFzc05hbWUodHlwZSk7Ci0JCVN0cmluZyBhY2Nlc3NvciA9IGZpZWxkRGF0YS5nZXRBY2Nlc3NvcigpOwotCQlpZiAoYWNjZXNzb3IgPT0gbnVsbCB8fCBhY2Nlc3Nvci5sZW5ndGgoKSA9PSAwKSBhY2Nlc3NvciA9IGZpZWxkLmdldE5hbWUoKTsKLQkJaWYgKHR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJcdGVudi0+U2V0Iik7Ci0JCQl9IGVsc2UgewotCQkJCW91dHB1dCgiXHQoKmVudiktPlNldCIpOwotCQkJfQotCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUxKGZpZWxkLmdldFR5cGUoKSkpOwotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJGaWVsZChscE9iamVjdCwgIik7Ci0JCQl9IGVsc2UgewotCQkJCW91dHB1dCgiRmllbGQoZW52LCBscE9iamVjdCwgIik7Ci0JCQl9Ci0JCQlvdXRwdXQoZ2V0Q2xhc3NOYW1lKGZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkpKTsKLQkJCW91dHB1dCgiRmMuIik7Ci0JCQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQkJCW91dHB1dCgiLCAoIik7Ci0JCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTIoZmllbGQuZ2V0VHlwZSgpKSk7Ci0JCQlvdXRwdXQoIilscFN0cnVjdC0+Iik7Ci0JCQlvdXRwdXQoYWNjZXNzb3IpOwotCQkJb3V0cHV0KCIpOyIpOwotCQl9IGVsc2UgaWYgKHR5cGUuaXNBcnJheSgpKSB7Ci0JCQlDbGFzcyBjb21wb25lbnRUeXBlID0gdHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQlpZiAoY29tcG9uZW50VHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkJb3V0cHV0bG4oIlx0eyIpOwotCQkJCW91dHB1dCgiXHQiKTsJCQkJCi0JCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUyKGZpZWxkLmdldFR5cGUoKSkpOwotCQkJCW91dHB1dCgiIGxwT2JqZWN0MSA9ICgiKTsKLQkJCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTIoZmllbGQuZ2V0VHlwZSgpKSk7Ci0JCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJCW91dHB1dCgiKWVudi0+R2V0T2JqZWN0RmllbGQobHBPYmplY3QsICIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW91dHB1dCgiKSgqZW52KS0+R2V0T2JqZWN0RmllbGQoZW52LCBscE9iamVjdCwgIik7Ci0JCQkJfQotCQkJCW91dHB1dChnZXRDbGFzc05hbWUoZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKSkpOwotCQkJCW91dHB1dCgiRmMuIik7Ci0JCQkJb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0JCQkJb3V0cHV0bG4oIik7Iik7Ci0JCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJCW91dHB1dCgiXHRlbnYtPlNldCIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW91dHB1dCgiXHQoKmVudiktPlNldCIpOwotCQkJCX0KLQkJCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTEoY29tcG9uZW50VHlwZSkpOwotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIkFycmF5UmVnaW9uKGxwT2JqZWN0MSwgMCwgc2l6ZW9mKGxwU3RydWN0LT4iKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIkFycmF5UmVnaW9uKGVudiwgbHBPYmplY3QxLCAwLCBzaXplb2YobHBTdHJ1Y3QtPiIpOwotCQkJCX0KLQkJCQlvdXRwdXQoYWNjZXNzb3IpOwotCQkJCW91dHB1dCgiKSIpOwotCQkJCWludCBieXRlQ291bnQgPSBnZXRCeXRlQ291bnQoY29tcG9uZW50VHlwZSk7Ci0JCQkJaWYgKGJ5dGVDb3VudCA+IDEpIHsKLQkJCQkJb3V0cHV0KCIgLyAiKTsKLQkJCQkJb3V0cHV0KFN0cmluZy52YWx1ZU9mKGJ5dGVDb3VudCkpOwotCQkJCX0KLQkJCQlvdXRwdXQoIiwgKCIpOwotCQkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlNCh0eXBlKSk7CQkJCQotCQkJCW91dHB1dCgiKWxwU3RydWN0LT4iKTsKLQkJCQlvdXRwdXQoYWNjZXNzb3IpOwotCQkJCW91dHB1dGxuKCIpOyIpOwotCQkJCW91dHB1dCgiXHR9Iik7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBFcnJvcigibm90IGRvbmUiKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW91dHB1dGxuKCJcdHsiKTsKLQkJCW91dHB1dCgiXHRqb2JqZWN0IGxwT2JqZWN0MSA9ICgqZW52KS0+R2V0T2JqZWN0RmllbGQoZW52LCBscE9iamVjdCwgIik7Ci0JCQlvdXRwdXQoZ2V0Q2xhc3NOYW1lKGZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkpKTsKLQkJCW91dHB1dCgiRmMuIik7Ci0JCQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQkJCW91dHB1dGxuKCIpOyIpOwotCQkJb3V0cHV0KCJcdGlmIChscE9iamVjdDEgIT0gTlVMTCkgc2V0Iik7Ci0JCQlvdXRwdXQodHlwZU5hbWUpOwotCQkJb3V0cHV0KCJGaWVsZHMoZW52LCBscE9iamVjdDEsICZscFN0cnVjdC0+Iik7Ci0JCQlvdXRwdXQoYWNjZXNzb3IpOwotCQkJb3V0cHV0bG4oIik7Iik7Ci0JCQlvdXRwdXQoIlx0fSIpOwotCQl9Ci0JCW91dHB1dGxuKCk7Ci0JCWlmIChub1dpbkNFKSB7Ci0JCQlvdXRwdXRsbigiI2VuZGlmIik7Ci0JCX0KLQkJaWYgKGV4Y2x1ZGUubGVuZ3RoKCkgIT0gMCkgewotCQkJb3V0cHV0bG4oIiNlbmRpZiIpOwotCQl9Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlU2V0RnVuY3Rpb24oQ2xhc3MgY2xhenopIHsKLQlTdHJpbmcgY2xhenpOYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQlvdXRwdXQoInZvaWQgc2V0Iik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0KCJGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsICIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCIgKmxwU3RydWN0KSIpOwotCW91dHB1dGxuKCJ7Iik7Ci0Jb3V0cHV0KCJcdGlmICghIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0KCJGYy5jYWNoZWQpIGNhY2hlIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIkZpZWxkcyhlbnYsIGxwT2JqZWN0KTsiKTsKLQlnZW5lcmF0ZVNldEZpZWxkcyhjbGF6eik7Ci0Jb3V0cHV0bG4oIn0iKTsKLX0KLQotdm9pZCBnZW5lcmF0ZUZ1bmN0aW9ucyhDbGFzcyBjbGF6eikgewotCWdlbmVyYXRlQ2FjaGVGdW5jdGlvbihjbGF6eik7Ci0Jb3V0cHV0bG4oKTsKLQlnZW5lcmF0ZUdldEZ1bmN0aW9uKGNsYXp6KTsKLQlvdXRwdXRsbigpOwotCWdlbmVyYXRlU2V0RnVuY3Rpb24oY2xhenopOwotfQotCi1ib29sZWFuIGlnbm9yZUZpZWxkKEZpZWxkIGZpZWxkKSB7Ci0JaW50IG1vZHMgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsKLQlyZXR1cm4KLQkJKChtb2RzICYgTW9kaWZpZXIuUFVCTElDKSA9PSAwKSB8fAotCQkoKG1vZHMgJiBNb2RpZmllci5GSU5BTCkgIT0gMCkgfHwKLQkJKChtb2RzICYgTW9kaWZpZXIuU1RBVElDKSAhPSAwKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5hY2Nlc3NpYmlsaXR5Lmd0ay5BVEsucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuYWNjZXNzaWJpbGl0eS5ndGsuQVRLLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTU4YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5hY2Nlc3NpYmlsaXR5Lmd0ay5BVEsucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQVRLPQotQVRLX0F0a09iamVjdEZhY3RvcnlDbGFzc19zaXplb2Y9Ci0KLUFUS19BdGtPYmplY3RGYWN0b3J5X3NpemVvZj0KLQotQVRLX19BVEtfQUNUSU9OX0dFVF9JRkFDRT0KLUFUS19fQVRLX0FDVElPTl9HRVRfSUZBQ0VfMD0KLQotQVRLX19BVEtfQ09NUE9ORU5UX0dFVF9JRkFDRT0KLUFUS19fQVRLX0NPTVBPTkVOVF9HRVRfSUZBQ0VfMD0KLQotQVRLX19BVEtfT0JKRUNUX0ZBQ1RPUllfQ0xBU1M9Ci1BVEtfX0FUS19PQkpFQ1RfRkFDVE9SWV9DTEFTU18wPQotCi1BVEtfX0FUS19TRUxFQ1RJT05fR0VUX0lGQUNFPQotQVRLX19BVEtfU0VMRUNUSU9OX0dFVF9JRkFDRV8wPQotCi1BVEtfX0FUS19URVhUX0dFVF9JRkFDRT0KLUFUS19fQVRLX1RFWFRfR0VUX0lGQUNFXzA9Ci0KLUFUS19fR1RLX0FDQ0VTU0lCTEU9Ci1BVEtfX0dUS19BQ0NFU1NJQkxFXzA9Ci0KLUFUS19fYXRrX2ZvY3VzX3RyYWNrZXJfbm90aWZ5PQotQVRLX19hdGtfZm9jdXNfdHJhY2tlcl9ub3RpZnlfMD1jYXN0PShBdGtPYmplY3QgKikKLQotQVRLX19hdGtfZ2V0X2RlZmF1bHRfcmVnaXN0cnk9Ci0KLUFUS19fYXRrX29iamVjdF9mYWN0b3J5X2NyZWF0ZV9hY2Nlc3NpYmxlPQotQVRLX19hdGtfb2JqZWN0X2ZhY3RvcnlfY3JlYXRlX2FjY2Vzc2libGVfMD1jYXN0PShBdGtPYmplY3RGYWN0b3J5ICopCi1BVEtfX2F0a19vYmplY3RfZmFjdG9yeV9jcmVhdGVfYWNjZXNzaWJsZV8xPWNhc3Q9KEdPYmplY3QgKikKLQotQVRLX19hdGtfb2JqZWN0X2ZhY3RvcnlfZ2V0X2FjY2Vzc2libGVfdHlwZT0KLUFUS19fYXRrX29iamVjdF9mYWN0b3J5X2dldF9hY2Nlc3NpYmxlX3R5cGVfMD1jYXN0PShBdGtPYmplY3RGYWN0b3J5ICopCi0KLUFUS19fYXRrX29iamVjdF9pbml0aWFsaXplPQotQVRLX19hdGtfb2JqZWN0X2luaXRpYWxpemVfMD1jYXN0PShBdGtPYmplY3QgKikKLUFUS19fYXRrX29iamVjdF9pbml0aWFsaXplXzE9Y2FzdD0oZ3BvaW50ZXIpCi0KLUFUS19fYXRrX29iamVjdF9yZWZfcmVsYXRpb25fc2V0PQotQVRLX19hdGtfb2JqZWN0X3JlZl9yZWxhdGlvbl9zZXRfMD1jYXN0PShBdGtPYmplY3QgKikKLQotQVRLX19hdGtfcmVnaXN0cnlfZ2V0X2ZhY3Rvcnk9Ci1BVEtfX2F0a19yZWdpc3RyeV9nZXRfZmFjdG9yeV8wPWNhc3Q9KEF0a1JlZ2lzdHJ5ICopCi1BVEtfX2F0a19yZWdpc3RyeV9nZXRfZmFjdG9yeV8xPWNhc3Q9KEdUeXBlKQotCi1BVEtfX2F0a19yZWdpc3RyeV9zZXRfZmFjdG9yeV90eXBlPQotQVRLX19hdGtfcmVnaXN0cnlfc2V0X2ZhY3RvcnlfdHlwZV8wPWNhc3Q9KEF0a1JlZ2lzdHJ5ICopCi1BVEtfX2F0a19yZWdpc3RyeV9zZXRfZmFjdG9yeV90eXBlXzE9Y2FzdD0oR1R5cGUpCi1BVEtfX2F0a19yZWdpc3RyeV9zZXRfZmFjdG9yeV90eXBlXzI9Y2FzdD0oR1R5cGUpCi0KLUFUS19fYXRrX3JlbGF0aW9uX3NldF9nZXRfbl9yZWxhdGlvbnM9Ci1BVEtfX2F0a19yZWxhdGlvbl9zZXRfZ2V0X25fcmVsYXRpb25zXzA9Y2FzdD0oQXRrUmVsYXRpb25TZXQgKikKLQotQVRLX19hdGtfcmVsYXRpb25fc2V0X2dldF9yZWxhdGlvbj0KLUFUS19fYXRrX3JlbGF0aW9uX3NldF9nZXRfcmVsYXRpb25fMD1jYXN0PShBdGtSZWxhdGlvblNldCAqKQotQVRLX19hdGtfcmVsYXRpb25fc2V0X2dldF9yZWxhdGlvbl8xPQotCi1BVEtfX2F0a19yZWxhdGlvbl9zZXRfcmVtb3ZlPQotQVRLX19hdGtfcmVsYXRpb25fc2V0X3JlbW92ZV8wPWNhc3Q9KEF0a1JlbGF0aW9uU2V0ICopCi1BVEtfX2F0a19yZWxhdGlvbl9zZXRfcmVtb3ZlXzE9Y2FzdD0oQXRrUmVsYXRpb24gKikKLQotQVRLX19hdGtfc3RhdGVfc2V0X2FkZF9zdGF0ZT0KLUFUS19fYXRrX3N0YXRlX3NldF9hZGRfc3RhdGVfMD1jYXN0PShBdGtTdGF0ZVNldCAqKQotQVRLX19hdGtfc3RhdGVfc2V0X2FkZF9zdGF0ZV8xPWNhc3Q9KEF0a1N0YXRlVHlwZSkKLQotQVRLX19hdGtfc3RhdGVfc2V0X25ldz0KLQotQVRLX18xY2FsbF9fSUk9Ci1BVEtfXzFjYWxsX19JSV8wPQotQVRLX18xY2FsbF9fSUlfMT0KLQotQVRLX18xY2FsbF9fSUlJPQotQVRLX18xY2FsbF9fSUlJXzA9Ci1BVEtfXzFjYWxsX19JSUlfMT0KLUFUS19fMWNhbGxfX0lJSV8yPQotCi1BVEtfXzFjYWxsX19JSUlJPQotQVRLX18xY2FsbF9fSUlJSV8wPQotQVRLX18xY2FsbF9fSUlJSV8xPQotQVRLX18xY2FsbF9fSUlJSV8yPQotQVRLX18xY2FsbF9fSUlJSV8zPQotCi1BVEtfXzFjYWxsX19JSUlJST0KLUFUS19fMWNhbGxfX0lJSUlJXzA9Ci1BVEtfXzFjYWxsX19JSUlJSV8xPQotQVRLX18xY2FsbF9fSUlJSUlfMj0KLUFUS19fMWNhbGxfX0lJSUlJXzM9Ci1BVEtfXzFjYWxsX19JSUlJSV80PQotCi1BVEtfXzFjYWxsX19JSUlJSUk9Ci1BVEtfXzFjYWxsX19JSUlJSUlfMD0KLUFUS19fMWNhbGxfX0lJSUlJSV8xPQotQVRLX18xY2FsbF9fSUlJSUlJXzI9Ci1BVEtfXzFjYWxsX19JSUlJSUlfMz0KLUFUS19fMWNhbGxfX0lJSUlJSV80PQotQVRLX18xY2FsbF9fSUlJSUlJXzU9Ci0KLUFUS19fMWNhbGxfX0lJSUlJSUk9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzA9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzE9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzI9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzM9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzQ9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzU9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzY9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtBY3Rpb25JZmFjZV8yPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0FjdGlvbklmYWNlXzJfMD0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtBY3Rpb25JZmFjZV8yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtDb21wb25lbnRJZmFjZV8yPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0NvbXBvbmVudElmYWNlXzJfMD0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtDb21wb25lbnRJZmFjZV8yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtIeXBlcnRleHRJZmFjZV8yPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0h5cGVydGV4dElmYWNlXzJfMD0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtIeXBlcnRleHRJZmFjZV8yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtPYmplY3RDbGFzc18yPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdENsYXNzXzJfMD0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtPYmplY3RDbGFzc18yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtPYmplY3RGYWN0b3J5Q2xhc3NfMj0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtPYmplY3RGYWN0b3J5Q2xhc3NfMl8wPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdEZhY3RvcnlDbGFzc18yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtTZWxlY3Rpb25JZmFjZV8yPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1NlbGVjdGlvbklmYWNlXzJfMD0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtTZWxlY3Rpb25JZmFjZV8yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtUZXh0SWZhY2VfMj0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtUZXh0SWZhY2VfMl8wPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1RleHRJZmFjZV8yXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0FjdGlvbklmYWNlXzJJPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrQWN0aW9uSWZhY2VfMklfMD0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0FjdGlvbklmYWNlXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0NvbXBvbmVudElmYWNlXzJJPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrQ29tcG9uZW50SWZhY2VfMklfMD0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0NvbXBvbmVudElmYWNlXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0h5cGVydGV4dElmYWNlXzJJPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrSHlwZXJ0ZXh0SWZhY2VfMklfMD0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0h5cGVydGV4dElmYWNlXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdENsYXNzXzJJPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrT2JqZWN0Q2xhc3NfMklfMD0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdENsYXNzXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdEZhY3RvcnlDbGFzc18yST0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdEZhY3RvcnlDbGFzc18ySV8wPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrT2JqZWN0RmFjdG9yeUNsYXNzXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1NlbGVjdGlvbklmYWNlXzJJPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrU2VsZWN0aW9uSWZhY2VfMklfMD0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1NlbGVjdGlvbklmYWNlXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1RleHRJZmFjZV8yST0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1RleHRJZmFjZV8ySV8wPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrVGV4dElmYWNlXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0d0a0FjY2Vzc2libGVfMkk9Ci1BVEtfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19HdGtBY2Nlc3NpYmxlXzJJXzA9Ci1BVEtfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19HdGtBY2Nlc3NpYmxlXzJJXzE9Ci0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0FjdGlvbklmYWNlPQotQXRrQWN0aW9uSWZhY2VfZG9fYWN0aW9uPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrQWN0aW9uSWZhY2VfZ2V0X25fYWN0aW9ucz1jYXN0PShnaW50ICgqKSgpKQotQXRrQWN0aW9uSWZhY2VfZ2V0X2Rlc2NyaXB0aW9uPWNhc3Q9KEdfQ09OU1RfUkVUVVJOIGdjaGFyICooKikoKSkKLUF0a0FjdGlvbklmYWNlX2dldF9uYW1lPWNhc3Q9KEdfQ09OU1RfUkVUVVJOIGdjaGFyICooKikoKSkKLUF0a0FjdGlvbklmYWNlX2dldF9rZXliaW5kaW5nPWNhc3Q9KEdfQ09OU1RfUkVUVVJOIGdjaGFyICooKikoKSkKLUF0a0FjdGlvbklmYWNlX3NldF9kZXNjcmlwdGlvbj1jYXN0PShnYm9vbGVhbiAoKikoKSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0NvbXBvbmVudElmYWNlPQotQXRrQ29tcG9uZW50SWZhY2VfYWRkX2ZvY3VzX2hhbmRsZXI9Y2FzdD0oZ3VpbnQgKCopKCkpCi1BdGtDb21wb25lbnRJZmFjZV9jb250YWlucz1jYXN0PShnYm9vbGVhbiAoKikoKSkKLUF0a0NvbXBvbmVudElmYWNlX3JlZl9hY2Nlc3NpYmxlX2F0X3BvaW50PWNhc3Q9KEF0a09iamVjdCAqKCopKCkpCi1BdGtDb21wb25lbnRJZmFjZV9nZXRfZXh0ZW50cz1jYXN0PSh2b2lkICgqKSgpKQotQXRrQ29tcG9uZW50SWZhY2VfZ2V0X3Bvc2l0aW9uPWNhc3Q9KHZvaWQgKCopKCkpCi1BdGtDb21wb25lbnRJZmFjZV9nZXRfc2l6ZT1jYXN0PSh2b2lkICgqKSgpKQotQXRrQ29tcG9uZW50SWZhY2VfZ3JhYl9mb2N1cz1jYXN0PShnYm9vbGVhbiAoKikoKSkKLUF0a0NvbXBvbmVudElmYWNlX3JlbW92ZV9mb2N1c19oYW5kbGVyPWNhc3Q9KHZvaWQgKCopKCkpCi1BdGtDb21wb25lbnRJZmFjZV9zZXRfZXh0ZW50cz1jYXN0PShnYm9vbGVhbiAoKikoKSkKLUF0a0NvbXBvbmVudElmYWNlX3NldF9wb3NpdGlvbj1jYXN0PShnYm9vbGVhbiAoKikoKSkKLUF0a0NvbXBvbmVudElmYWNlX3NldF9zaXplPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrQ29tcG9uZW50SWZhY2VfZ2V0X2xheWVyPWNhc3Q9KEF0a0xheWVyICgqKSgpKQotQXRrQ29tcG9uZW50SWZhY2VfZ2V0X21kaV96b3JkZXI9Y2FzdD0oZ2ludCAoKikoKSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0h5cGVydGV4dElmYWNlPQotQXRrSHlwZXJ0ZXh0SWZhY2VfZ2V0X2xpbms9Y2FzdD0oQXRrSHlwZXJsaW5rICooKikoKSkKLUF0a0h5cGVydGV4dElmYWNlX2dldF9uX2xpbmtzPWNhc3Q9KGdpbnQgKCopKCkpCi1BdGtIeXBlcnRleHRJZmFjZV9nZXRfbGlua19pbmRleD1jYXN0PShnaW50ICgqKSgpKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrT2JqZWN0Q2xhc3M9Ci1BdGtPYmplY3RDbGFzc19nZXRfbmFtZT1jYXN0PShHX0NPTlNUX1JFVFVSTiBnY2hhciAqKCopKCkpCi1BdGtPYmplY3RDbGFzc19nZXRfZGVzY3JpcHRpb249Y2FzdD0oR19DT05TVF9SRVRVUk4gZ2NoYXIgKigqKSgpKQotQXRrT2JqZWN0Q2xhc3NfZ2V0X3BhcmVudD1jYXN0PShBdGtPYmplY3QgKigqKSgpKQotQXRrT2JqZWN0Q2xhc3NfZ2V0X25fY2hpbGRyZW49Y2FzdD0oZ2ludCAoKikoKSkKLUF0a09iamVjdENsYXNzX3JlZl9jaGlsZD1jYXN0PShBdGtPYmplY3QgKigqKSgpKQotQXRrT2JqZWN0Q2xhc3NfZ2V0X2luZGV4X2luX3BhcmVudD1jYXN0PShnaW50ICgqKSgpKQotQXRrT2JqZWN0Q2xhc3NfcmVmX3JlbGF0aW9uX3NldD1jYXN0PShBdGtSZWxhdGlvblNldCAqKCopKCkpCi1BdGtPYmplY3RDbGFzc19nZXRfcm9sZT1jYXN0PShBdGtSb2xlICgqKSgpKQotQXRrT2JqZWN0Q2xhc3NfZ2V0X2xheWVyPWNhc3Q9KEF0a0xheWVyICgqKSgpKQotQXRrT2JqZWN0Q2xhc3NfZ2V0X21kaV96b3JkZXI9Y2FzdD0oZ2ludCAoKikoKSkKLUF0a09iamVjdENsYXNzX3JlZl9zdGF0ZV9zZXQ9Y2FzdD0oQXRrU3RhdGVTZXQgKigqKSgpKQotQXRrT2JqZWN0Q2xhc3Nfc2V0X25hbWU9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX3NldF9kZXNjcmlwdGlvbj1jYXN0PSh2b2lkICgqKSgpKQotQXRrT2JqZWN0Q2xhc3Nfc2V0X3BhcmVudD1jYXN0PSh2b2lkICgqKSgpKQotQXRrT2JqZWN0Q2xhc3Nfc2V0X3JvbGU9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX2Nvbm5lY3RfcHJvcGVydHlfY2hhbmdlX2hhbmRsZXI9Y2FzdD0oZ3VpbnQgKCopKCkpCi1BdGtPYmplY3RDbGFzc19yZW1vdmVfcHJvcGVydHlfY2hhbmdlX2hhbmRsZXI9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX2luaXRpYWxpemU9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX2NoaWxkcmVuX2NoYW5nZWQ9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX2ZvY3VzX2V2ZW50PWNhc3Q9KHZvaWQgKCopKCkpCi1BdGtPYmplY3RDbGFzc19wcm9wZXJ0eV9jaGFuZ2U9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX3N0YXRlX2NoYW5nZT1jYXN0PSh2b2lkICgqKSgpKQotQXRrT2JqZWN0Q2xhc3NfdmlzaWJsZV9kYXRhX2NoYW5nZWQ9Y2FzdD0odm9pZCAoKikoKSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdEZhY3RvcnlDbGFzcz0KLUF0a09iamVjdEZhY3RvcnlDbGFzc19jcmVhdGVfYWNjZXNzaWJsZT1jYXN0PShBdGtPYmplY3QgKigqKSgpKQotQXRrT2JqZWN0RmFjdG9yeUNsYXNzX2ludmFsaWRhdGU9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdEZhY3RvcnlDbGFzc19nZXRfYWNjZXNzaWJsZV90eXBlPWNhc3Q9KEdUeXBlICgqKSgpKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrU2VsZWN0aW9uSWZhY2U9Ci1BdGtTZWxlY3Rpb25JZmFjZV9hZGRfc2VsZWN0aW9uPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrU2VsZWN0aW9uSWZhY2VfY2xlYXJfc2VsZWN0aW9uPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrU2VsZWN0aW9uSWZhY2VfcmVmX3NlbGVjdGlvbj1jYXN0PShBdGtPYmplY3QgKigqKSgpKQotQXRrU2VsZWN0aW9uSWZhY2VfZ2V0X3NlbGVjdGlvbl9jb3VudD1jYXN0PShnaW50ICgqKSgpKQotQXRrU2VsZWN0aW9uSWZhY2VfaXNfY2hpbGRfc2VsZWN0ZWQ9Y2FzdD0oZ2Jvb2xlYW4gKCopKCkpCi1BdGtTZWxlY3Rpb25JZmFjZV9yZW1vdmVfc2VsZWN0aW9uPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrU2VsZWN0aW9uSWZhY2Vfc2VsZWN0X2FsbF9zZWxlY3Rpb249Y2FzdD0oZ2Jvb2xlYW4gKCopKCkpCi1BdGtTZWxlY3Rpb25JZmFjZV9zZWxlY3Rpb25fY2hhbmdlZD1jYXN0PSh2b2lkICgqKSgpKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrVGV4dElmYWNlPQotQXRrVGV4dElmYWNlX2dldF90ZXh0PWNhc3Q9KGdjaGFyICooKikoKSkKLUF0a1RleHRJZmFjZV9nZXRfdGV4dF9hZnRlcl9vZmZzZXQ9Y2FzdD0oZ2NoYXIgKigqKSgpKQotQXRrVGV4dElmYWNlX2dldF90ZXh0X2F0X29mZnNldD1jYXN0PShnY2hhciAqKCopKCkpCi1BdGtUZXh0SWZhY2VfZ2V0X2NoYXJhY3Rlcl9hdF9vZmZzZXQ9Y2FzdD0oZ3VuaWNoYXIgKCopKCkpCi1BdGtUZXh0SWZhY2VfZ2V0X3RleHRfYmVmb3JlX29mZnNldD1jYXN0PShnY2hhciAqKCopKCkpCi1BdGtUZXh0SWZhY2VfZ2V0X2NhcmV0X29mZnNldD1jYXN0PShnaW50ICgqKSgpKQotQXRrVGV4dElmYWNlX2dldF9ydW5fYXR0cmlidXRlcz1jYXN0PShBdGtBdHRyaWJ1dGVTZXQgKigqKSgpKQotQXRrVGV4dElmYWNlX2dldF9kZWZhdWx0X2F0dHJpYnV0ZXM9Y2FzdD0oQXRrQXR0cmlidXRlU2V0ICooKikoKSkKLUF0a1RleHRJZmFjZV9nZXRfY2hhcmFjdGVyX2V4dGVudHM9Y2FzdD0odm9pZCAoKikoKSkKLUF0a1RleHRJZmFjZV9nZXRfY2hhcmFjdGVyX2NvdW50PWNhc3Q9KGdpbnQgKCopKCkpCi1BdGtUZXh0SWZhY2VfZ2V0X29mZnNldF9hdF9wb2ludD1jYXN0PShnaW50ICgqKSgpKQotQXRrVGV4dElmYWNlX2dldF9uX3NlbGVjdGlvbnM9Y2FzdD0oZ2ludCAoKikoKSkKLUF0a1RleHRJZmFjZV9nZXRfc2VsZWN0aW9uPWNhc3Q9KGdjaGFyICooKikoKSkKLUF0a1RleHRJZmFjZV9hZGRfc2VsZWN0aW9uPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrVGV4dElmYWNlX3JlbW92ZV9zZWxlY3Rpb249Y2FzdD0oZ2Jvb2xlYW4gKCopKCkpCi1BdGtUZXh0SWZhY2Vfc2V0X3NlbGVjdGlvbj1jYXN0PShnYm9vbGVhbiAoKikoKSkKLUF0a1RleHRJZmFjZV9zZXRfY2FyZXRfb2Zmc2V0PWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrVGV4dElmYWNlX3RleHRfY2hhbmdlZD1jYXN0PSh2b2lkICgqKSgpKQotQXRrVGV4dElmYWNlX3RleHRfY2FyZXRfbW92ZWQ9Y2FzdD0odm9pZCAoKikoKSkKLUF0a1RleHRJZmFjZV90ZXh0X3NlbGVjdGlvbl9jaGFuZ2VkPWNhc3Q9KHZvaWQgKCopKCkpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19HdGtBY2Nlc3NpYmxlPQotR3RrQWNjZXNzaWJsZV93aWRnZXQ9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuYWNjZXNzaWJpbGl0eS5ndGsucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuYWNjZXNzaWJpbGl0eS5ndGsucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjYzVlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmFjY2Vzc2liaWxpdHkuZ3RrLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zd3RfY29weXJpZ2h0PS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi0gKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXNcblwKLSAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpIFZlcnNpb24gMi4xIHRoYXRcblwKLSAqIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIChsZ3BsLXYyMS50eHQpLiAgVGhlIExHUEwgaXMgYWxzb1xuXAotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9sZ3BsLmh0bWwuICBJZiB0aGUgdmVyc2lvblxuXAotICogb2YgdGhlIExHUEwgYXQgaHR0cDovL3d3dy5nbnUub3JnIGlzIGRpZmZlcmVudCB0byB0aGUgdmVyc2lvbiBvZlxuXAotICogdGhlIExHUEwgYWNjb21wYW55aW5nIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCB0aGVyZSBpcyBhbnkgY29uZmxpY3RcblwKLSAqIGJldHdlZW4gdGhlIHR3byBsaWNlbnNlIHZlcnNpb25zLCB0aGUgdGVybXMgb2YgdGhlIExHUEwgYWNjb21wYW55aW5nXG5cCi0gKiB0aGlzIGRpc3RyaWJ1dGlvbiBzaGFsbCBnb3Zlcm4uXG5cCi0gKiBcblwKLSAqIENvbnRyaWJ1dG9yczpcblwKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cblwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuCi0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYWlyby5DYWlyby5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYWlyby5DYWlyby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODFiZjQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2Fpcm8uQ2Fpcm8ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2Fpcm9fQ2Fpcm89Ci1DYWlyb19jYWlyb19hcHBlbmRfcGF0aD0KLUNhaXJvX2NhaXJvX2FwcGVuZF9wYXRoXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fYXBwZW5kX3BhdGhfMT1jYXN0PShjYWlyb19wYXRoX3QgKikKLQotQ2Fpcm9fY2Fpcm9fYXJjPQotQ2Fpcm9fY2Fpcm9fYXJjXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fYXJjXzE9Ci1DYWlyb19jYWlyb19hcmNfMj0KLUNhaXJvX2NhaXJvX2FyY18zPQotQ2Fpcm9fY2Fpcm9fYXJjXzQ9Ci1DYWlyb19jYWlyb19hcmNfNT0KLQotQ2Fpcm9fY2Fpcm9fYXJjX25lZ2F0aXZlPQotQ2Fpcm9fY2Fpcm9fYXJjX25lZ2F0aXZlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fYXJjX25lZ2F0aXZlXzE9Ci1DYWlyb19jYWlyb19hcmNfbmVnYXRpdmVfMj0KLUNhaXJvX2NhaXJvX2FyY19uZWdhdGl2ZV8zPQotQ2Fpcm9fY2Fpcm9fYXJjX25lZ2F0aXZlXzQ9Ci1DYWlyb19jYWlyb19hcmNfbmVnYXRpdmVfNT0KLQotQ2Fpcm9fY2Fpcm9fY2xpcD0KLUNhaXJvX2NhaXJvX2NsaXBfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2NsaXBfcHJlc2VydmU9Ci1DYWlyb19jYWlyb19jbGlwX3ByZXNlcnZlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19jbG9zZV9wYXRoPQotQ2Fpcm9fY2Fpcm9fY2xvc2VfcGF0aF8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fY29weV9wYWdlPQotQ2Fpcm9fY2Fpcm9fY29weV9wYWdlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19jb3B5X3BhdGg9Ci1DYWlyb19jYWlyb19jb3B5X3BhdGhfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2NvcHlfcGF0aF9mbGF0PQotQ2Fpcm9fY2Fpcm9fY29weV9wYXRoX2ZsYXRfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2NyZWF0ZT0KLUNhaXJvX2NhaXJvX2NyZWF0ZV8wPWNhc3Q9Y2Fpcm9fc3VyZmFjZV90ICoKLQotQ2Fpcm9fY2Fpcm9fY3VydmVfdG89Ci1DYWlyb19jYWlyb19jdXJ2ZV90b18wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX2N1cnZlX3RvXzE9Ci1DYWlyb19jYWlyb19jdXJ2ZV90b18yPQotQ2Fpcm9fY2Fpcm9fY3VydmVfdG9fMz0KLUNhaXJvX2NhaXJvX2N1cnZlX3RvXzQ9Ci1DYWlyb19jYWlyb19jdXJ2ZV90b181PQotQ2Fpcm9fY2Fpcm9fY3VydmVfdG9fNj0KLQotQ2Fpcm9fY2Fpcm9fZGVzdHJveT0KLUNhaXJvX2NhaXJvX2Rlc3Ryb3lfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2RldmljZV90b191c2VyPQotQ2Fpcm9fY2Fpcm9fZGV2aWNlX3RvX3VzZXJfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19kZXZpY2VfdG9fdXNlcl8xPQotQ2Fpcm9fY2Fpcm9fZGV2aWNlX3RvX3VzZXJfMj0KLQotQ2Fpcm9fY2Fpcm9fZGV2aWNlX3RvX3VzZXJfZGlzdGFuY2U9Ci1DYWlyb19jYWlyb19kZXZpY2VfdG9fdXNlcl9kaXN0YW5jZV8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX2RldmljZV90b191c2VyX2Rpc3RhbmNlXzE9Ci1DYWlyb19jYWlyb19kZXZpY2VfdG9fdXNlcl9kaXN0YW5jZV8yPQotCi1DYWlyb19jYWlyb19maWxsPQotQ2Fpcm9fY2Fpcm9fZmlsbF8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fZmlsbF9leHRlbnRzPQotQ2Fpcm9fY2Fpcm9fZmlsbF9leHRlbnRzXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fZmlsbF9leHRlbnRzXzE9Ci1DYWlyb19jYWlyb19maWxsX2V4dGVudHNfMj0KLUNhaXJvX2NhaXJvX2ZpbGxfZXh0ZW50c18zPQotQ2Fpcm9fY2Fpcm9fZmlsbF9leHRlbnRzXzQ9Ci0KLUNhaXJvX2NhaXJvX2ZpbGxfcHJlc2VydmU9Ci1DYWlyb19jYWlyb19maWxsX3ByZXNlcnZlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19mb250X2V4dGVudHM9Ci1DYWlyb19jYWlyb19mb250X2V4dGVudHNfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19mb250X2V4dGVudHNfMT0KLQotQ2Fpcm9fY2Fpcm9fZm9udF9leHRlbnRzX3Rfc2l6ZW9mPQotCi1DYWlyb19jYWlyb19mb250X29wdGlvbnNfY3JlYXRlPQotCi1DYWlyb19jYWlyb19mb250X29wdGlvbnNfZGVzdHJveT0KLUNhaXJvX2NhaXJvX2ZvbnRfb3B0aW9uc19kZXN0cm95XzA9Y2FzdD1jYWlyb19mb250X29wdGlvbnNfdCAqCi0KLUNhaXJvX2NhaXJvX2ZvbnRfb3B0aW9uc19nZXRfYW50aWFsaWFzPQotQ2Fpcm9fY2Fpcm9fZm9udF9vcHRpb25zX2dldF9hbnRpYWxpYXNfMD1jYXN0PWNhaXJvX2ZvbnRfb3B0aW9uc190ICoKLQotQ2Fpcm9fY2Fpcm9fZm9udF9vcHRpb25zX3NldF9hbnRpYWxpYXM9Ci1DYWlyb19jYWlyb19mb250X29wdGlvbnNfc2V0X2FudGlhbGlhc18wPWNhc3Q9Y2Fpcm9fZm9udF9vcHRpb25zX3QgKgotQ2Fpcm9fY2Fpcm9fZm9udF9vcHRpb25zX3NldF9hbnRpYWxpYXNfMT0KLQotQ2Fpcm9fY2Fpcm9fZ2V0X2FudGlhbGlhcz0KLUNhaXJvX2NhaXJvX2dldF9hbnRpYWxpYXNfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2dldF9jdXJyZW50X3BvaW50PQotQ2Fpcm9fY2Fpcm9fZ2V0X2N1cnJlbnRfcG9pbnRfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19nZXRfY3VycmVudF9wb2ludF8xPQotQ2Fpcm9fY2Fpcm9fZ2V0X2N1cnJlbnRfcG9pbnRfMj0KLQotQ2Fpcm9fY2Fpcm9fZ2V0X2ZpbGxfcnVsZT0KLUNhaXJvX2NhaXJvX2dldF9maWxsX3J1bGVfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2dldF9mb250X2ZhY2U9Ci1DYWlyb19jYWlyb19nZXRfZm9udF9mYWNlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19nZXRfZm9udF9tYXRyaXg9Ci1DYWlyb19jYWlyb19nZXRfZm9udF9tYXRyaXhfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19nZXRfZm9udF9tYXRyaXhfMT1jYXN0PWNhaXJvX21hdHJpeF90ICoKLQotQ2Fpcm9fY2Fpcm9fZ2V0X2ZvbnRfb3B0aW9ucz0KLUNhaXJvX2NhaXJvX2dldF9mb250X29wdGlvbnNfMD1jYXN0PWNhaXJvX3QgKgotQ2Fpcm9fY2Fpcm9fZ2V0X2ZvbnRfb3B0aW9uc18xPWNhc3Q9Y2Fpcm9fZm9udF9vcHRpb25zX3QgKgotCi1DYWlyb19jYWlyb19nZXRfbGluZV9jYXA9Ci1DYWlyb19jYWlyb19nZXRfbGluZV9jYXBfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2dldF9saW5lX2pvaW49Ci1DYWlyb19jYWlyb19nZXRfbGluZV9qb2luXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19nZXRfbGluZV93aWR0aD0KLUNhaXJvX2NhaXJvX2dldF9saW5lX3dpZHRoXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19nZXRfbWF0cml4PQotQ2Fpcm9fY2Fpcm9fZ2V0X21hdHJpeF8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX2dldF9tYXRyaXhfMT1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotCi1DYWlyb19jYWlyb19nZXRfbWl0ZXJfbGltaXQ9Ci1DYWlyb19jYWlyb19nZXRfbWl0ZXJfbGltaXRfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2dldF9vcGVyYXRvcj0KLUNhaXJvX2NhaXJvX2dldF9vcGVyYXRvcl8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fZ2V0X3NvdXJjZT0KLUNhaXJvX2NhaXJvX2dldF9zb3VyY2VfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2dldF90YXJnZXQ9Ci1DYWlyb19jYWlyb19nZXRfdGFyZ2V0XzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19nZXRfdG9sZXJhbmNlPQotQ2Fpcm9fY2Fpcm9fZ2V0X3RvbGVyYW5jZV8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fZ2x5cGhfZXh0ZW50cz0KLUNhaXJvX2NhaXJvX2dseXBoX2V4dGVudHNfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19nbHlwaF9leHRlbnRzXzE9Y2FzdD0oY2Fpcm9fZ2x5cGhfdCAqKQotQ2Fpcm9fY2Fpcm9fZ2x5cGhfZXh0ZW50c18yPQotQ2Fpcm9fY2Fpcm9fZ2x5cGhfZXh0ZW50c18zPWNhc3Q9Y2Fpcm9fdGV4dF9leHRlbnRzX3QgKgotCi1DYWlyb19jYWlyb19nbHlwaF9wYXRoPQotQ2Fpcm9fY2Fpcm9fZ2x5cGhfcGF0aF8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX2dseXBoX3BhdGhfMT1jYXN0PShjYWlyb19nbHlwaF90ICopCi1DYWlyb19jYWlyb19nbHlwaF9wYXRoXzI9Ci0KLUNhaXJvX2NhaXJvX2lkZW50aXR5X21hdHJpeD0KLUNhaXJvX2NhaXJvX2lkZW50aXR5X21hdHJpeF8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGU9Ci1DYWlyb19jYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZV8wPQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGVfMT0KLUNhaXJvX2NhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlXzI9Ci0KLUNhaXJvX2NhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlX2Zvcl9kYXRhPQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGVfZm9yX2RhdGFfMD1jYXN0PWNoYXIgKgotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGVfZm9yX2RhdGFfMT0KLUNhaXJvX2NhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlX2Zvcl9kYXRhXzI9Ci1DYWlyb19jYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZV9mb3JfZGF0YV8zPQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGVfZm9yX2RhdGFfND0KLQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfaGVpZ2h0PQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfaGVpZ2h0XzA9Y2FzdD0oY2Fpcm9fc3VyZmFjZV90ICopCi0KLUNhaXJvX2NhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X3dpZHRoPQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfd2lkdGhfMD1jYXN0PShjYWlyb19zdXJmYWNlX3QgKikKLQotQ2Fpcm9fY2Fpcm9faW5fZmlsbD0KLUNhaXJvX2NhaXJvX2luX2ZpbGxfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19pbl9maWxsXzE9Ci1DYWlyb19jYWlyb19pbl9maWxsXzI9Ci0KLUNhaXJvX2NhaXJvX2luX3N0cm9rZT0KLUNhaXJvX2NhaXJvX2luX3N0cm9rZV8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX2luX3N0cm9rZV8xPQotQ2Fpcm9fY2Fpcm9faW5fc3Ryb2tlXzI9Ci0KLUNhaXJvX2NhaXJvX2xpbmVfdG89Ci1DYWlyb19jYWlyb19saW5lX3RvXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fbGluZV90b18xPQotQ2Fpcm9fY2Fpcm9fbGluZV90b18yPQotCi1DYWlyb19jYWlyb19tYXNrPQotQ2Fpcm9fY2Fpcm9fbWFza18wPWNhc3Q9Y2Fpcm9fdCAqCi1DYWlyb19jYWlyb19tYXNrXzE9Y2FzdD1jYWlyb19wYXR0ZXJuX3QgKgotCi1DYWlyb19jYWlyb19tYXNrX3N1cmZhY2U9Ci1DYWlyb19jYWlyb19tYXNrX3N1cmZhY2VfMD1jYXN0PWNhaXJvX3QgKgotQ2Fpcm9fY2Fpcm9fbWFza19zdXJmYWNlXzE9Y2FzdD1jYWlyb19zdXJmYWNlX3QgKgotQ2Fpcm9fY2Fpcm9fbWFza19zdXJmYWNlXzI9Ci1DYWlyb19jYWlyb19tYXNrX3N1cmZhY2VfMz0KLQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXQ9Ci1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF8wPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF8xPQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfMj0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0XzM9Ci1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF80PQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfNT0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0XzY9Ci0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X2lkZW50aXR5PQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfaWRlbnRpdHlfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotCi1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF9yb3RhdGU9Ci1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF9yb3RhdGVfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfcm90YXRlXzE9Ci0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X3NjYWxlPQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfc2NhbGVfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfc2NhbGVfMT0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X3NjYWxlXzI9Ci0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X3RyYW5zbGF0ZT0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X3RyYW5zbGF0ZV8wPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF90cmFuc2xhdGVfMT0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X3RyYW5zbGF0ZV8yPQotCi1DYWlyb19jYWlyb19tYXRyaXhfaW52ZXJ0PQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2ludmVydF8wPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi0KLUNhaXJvX2NhaXJvX21hdHJpeF9tdWx0aXBseT0KLUNhaXJvX2NhaXJvX21hdHJpeF9tdWx0aXBseV8wPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi1DYWlyb19jYWlyb19tYXRyaXhfbXVsdGlwbHlfMT1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X211bHRpcGx5XzI9Y2FzdD0oY2Fpcm9fbWF0cml4X3QgKikKLQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3JvdGF0ZT0KLUNhaXJvX2NhaXJvX21hdHJpeF9yb3RhdGVfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3JvdGF0ZV8xPQotCi1DYWlyb19jYWlyb19tYXRyaXhfc2NhbGU9Ci1DYWlyb19jYWlyb19tYXRyaXhfc2NhbGVfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3NjYWxlXzE9Ci1DYWlyb19jYWlyb19tYXRyaXhfc2NhbGVfMj0KLQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3RyYW5zZm9ybV9kaXN0YW5jZT0KLUNhaXJvX2NhaXJvX21hdHJpeF90cmFuc2Zvcm1fZGlzdGFuY2VfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3RyYW5zZm9ybV9kaXN0YW5jZV8xPQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3RyYW5zZm9ybV9kaXN0YW5jZV8yPQotCi1DYWlyb19jYWlyb19tYXRyaXhfdHJhbnNmb3JtX3BvaW50PQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3RyYW5zZm9ybV9wb2ludF8wPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi1DYWlyb19jYWlyb19tYXRyaXhfdHJhbnNmb3JtX3BvaW50XzE9Ci1DYWlyb19jYWlyb19tYXRyaXhfdHJhbnNmb3JtX3BvaW50XzI9Ci0KLUNhaXJvX2NhaXJvX21hdHJpeF90cmFuc2xhdGU9Ci1DYWlyb19jYWlyb19tYXRyaXhfdHJhbnNsYXRlXzA9Y2FzdD0oY2Fpcm9fbWF0cml4X3QgKikKLUNhaXJvX2NhaXJvX21hdHJpeF90cmFuc2xhdGVfMT0KLUNhaXJvX2NhaXJvX21hdHJpeF90cmFuc2xhdGVfMj0KLQotQ2Fpcm9fY2Fpcm9fbW92ZV90bz0KLUNhaXJvX2NhaXJvX21vdmVfdG9fMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19tb3ZlX3RvXzE9Ci1DYWlyb19jYWlyb19tb3ZlX3RvXzI9Ci0KLUNhaXJvX2NhaXJvX25ld19wYXRoPQotQ2Fpcm9fY2Fpcm9fbmV3X3BhdGhfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX3BhaW50PQotQ2Fpcm9fY2Fpcm9fcGFpbnRfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX3BhaW50X3dpdGhfYWxwaGE9Ci1DYWlyb19jYWlyb19wYWludF93aXRoX2FscGhhXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fcGFpbnRfd2l0aF9hbHBoYV8xPQotCi1DYWlyb19jYWlyb19wYXRoX2RhdGFfdF9zaXplb2Y9Ci0KLUNhaXJvX2NhaXJvX3BhdGhfZGVzdHJveT0KLUNhaXJvX2NhaXJvX3BhdGhfZGVzdHJveV8wPWNhc3Q9Y2Fpcm9fcGF0aF90ICoKLQotQ2Fpcm9fY2Fpcm9fcGF0aF90X3NpemVvZj0KLQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2I9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYl8wPWNhc3Q9KGNhaXJvX3BhdHRlcm5fdCAqKQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2JfMT0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fYWRkX2NvbG9yX3N0b3BfcmdiXzI9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYl8zPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2JfND0KLQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2JhPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2JhXzA9Y2FzdD0oY2Fpcm9fcGF0dGVybl90ICopCi1DYWlyb19jYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYmFfMT0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fYWRkX2NvbG9yX3N0b3BfcmdiYV8yPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2JhXzM9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYmFfND0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fYWRkX2NvbG9yX3N0b3BfcmdiYV81PQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX2NyZWF0ZV9mb3Jfc3VyZmFjZT0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX2Zvcl9zdXJmYWNlXzA9Y2FzdD0oY2Fpcm9fc3VyZmFjZV90ICopCi0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX2xpbmVhcj0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX2xpbmVhcl8wPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9jcmVhdGVfbGluZWFyXzE9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2NyZWF0ZV9saW5lYXJfMj0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX2xpbmVhcl8zPQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX2NyZWF0ZV9yYWRpYWw9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2NyZWF0ZV9yYWRpYWxfMD0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX3JhZGlhbF8xPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9jcmVhdGVfcmFkaWFsXzI9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2NyZWF0ZV9yYWRpYWxfMz0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX3JhZGlhbF80PQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9jcmVhdGVfcmFkaWFsXzU9Ci0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fZGVzdHJveT0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fZGVzdHJveV8wPWNhc3Q9KGNhaXJvX3BhdHRlcm5fdCAqKQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX2dldF9leHRlbmQ9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2dldF9leHRlbmRfMD1jYXN0PShjYWlyb19wYXR0ZXJuX3QgKikKLQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9nZXRfZmlsdGVyPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9nZXRfZmlsdGVyXzA9Y2FzdD0oY2Fpcm9fcGF0dGVybl90ICopCi0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fZ2V0X21hdHJpeD0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fZ2V0X21hdHJpeF8wPWNhc3Q9KGNhaXJvX3BhdHRlcm5fdCAqKQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9nZXRfbWF0cml4XzE9Y2FzdD0oY2Fpcm9fbWF0cml4X3QgKikKLQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9yZWZlcmVuY2U9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX3JlZmVyZW5jZV8wPWNhc3Q9KGNhaXJvX3BhdHRlcm5fdCAqKQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9leHRlbmQ9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9leHRlbmRfMD1jYXN0PShjYWlyb19wYXR0ZXJuX3QgKikKLUNhaXJvX2NhaXJvX3BhdHRlcm5fc2V0X2V4dGVuZF8xPQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9maWx0ZXI9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9maWx0ZXJfMD1jYXN0PShjYWlyb19wYXR0ZXJuX3QgKikKLUNhaXJvX2NhaXJvX3BhdHRlcm5fc2V0X2ZpbHRlcl8xPQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9tYXRyaXg9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9tYXRyaXhfMD1jYXN0PShjYWlyb19wYXR0ZXJuX3QgKikKLUNhaXJvX2NhaXJvX3BhdHRlcm5fc2V0X21hdHJpeF8xPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi0KLUNhaXJvX2NhaXJvX3JlY3RhbmdsZT0KLUNhaXJvX2NhaXJvX3JlY3RhbmdsZV8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3JlY3RhbmdsZV8xPQotQ2Fpcm9fY2Fpcm9fcmVjdGFuZ2xlXzI9Ci1DYWlyb19jYWlyb19yZWN0YW5nbGVfMz0KLUNhaXJvX2NhaXJvX3JlY3RhbmdsZV80PQotCi1DYWlyb19jYWlyb19yZWZlcmVuY2U9Ci1DYWlyb19jYWlyb19yZWZlcmVuY2VfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX3JlbF9jdXJ2ZV90bz0KLUNhaXJvX2NhaXJvX3JlbF9jdXJ2ZV90b18wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3JlbF9jdXJ2ZV90b18xPQotQ2Fpcm9fY2Fpcm9fcmVsX2N1cnZlX3RvXzI9Ci1DYWlyb19jYWlyb19yZWxfY3VydmVfdG9fMz0KLUNhaXJvX2NhaXJvX3JlbF9jdXJ2ZV90b180PQotQ2Fpcm9fY2Fpcm9fcmVsX2N1cnZlX3RvXzU9Ci1DYWlyb19jYWlyb19yZWxfY3VydmVfdG9fNj0KLQotQ2Fpcm9fY2Fpcm9fcmVsX2xpbmVfdG89Ci1DYWlyb19jYWlyb19yZWxfbGluZV90b18wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3JlbF9saW5lX3RvXzE9Ci1DYWlyb19jYWlyb19yZWxfbGluZV90b18yPQotCi1DYWlyb19jYWlyb19yZWxfbW92ZV90bz0KLUNhaXJvX2NhaXJvX3JlbF9tb3ZlX3RvXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fcmVsX21vdmVfdG9fMT0KLUNhaXJvX2NhaXJvX3JlbF9tb3ZlX3RvXzI9Ci0KLUNhaXJvX2NhaXJvX3Jlc2V0X2NsaXA9Ci1DYWlyb19jYWlyb19yZXNldF9jbGlwXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19yZXN0b3JlPQotQ2Fpcm9fY2Fpcm9fcmVzdG9yZV8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fcm90YXRlPQotQ2Fpcm9fY2Fpcm9fcm90YXRlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fcm90YXRlXzE9Ci0KLUNhaXJvX2NhaXJvX3NhdmU9Ci1DYWlyb19jYWlyb19zYXZlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19zY2FsZT0KLUNhaXJvX2NhaXJvX3NjYWxlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2NhbGVfMT0KLUNhaXJvX2NhaXJvX3NjYWxlXzI9Ci0KLUNhaXJvX2NhaXJvX3NlbGVjdF9mb250X2ZhY2U9Ci1DYWlyb19jYWlyb19zZWxlY3RfZm9udF9mYWNlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2VsZWN0X2ZvbnRfZmFjZV8xPQotQ2Fpcm9fY2Fpcm9fc2VsZWN0X2ZvbnRfZmFjZV8yPQotQ2Fpcm9fY2Fpcm9fc2VsZWN0X2ZvbnRfZmFjZV8zPQotCi1DYWlyb19jYWlyb19zZXRfYW50aWFsaWFzPQotQ2Fpcm9fY2Fpcm9fc2V0X2FudGlhbGlhc18wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3NldF9hbnRpYWxpYXNfMT0KLQotQ2Fpcm9fY2Fpcm9fc2V0X2Rhc2g9Ci1DYWlyb19jYWlyb19zZXRfZGFzaF8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3NldF9kYXNoXzE9Ci1DYWlyb19jYWlyb19zZXRfZGFzaF8yPQotQ2Fpcm9fY2Fpcm9fc2V0X2Rhc2hfMz0KLQotQ2Fpcm9fY2Fpcm9fc2V0X2ZpbGxfcnVsZT0KLUNhaXJvX2NhaXJvX3NldF9maWxsX3J1bGVfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19zZXRfZmlsbF9ydWxlXzE9Ci0KLUNhaXJvX2NhaXJvX3NldF9mb250X2ZhY2U9Ci1DYWlyb19jYWlyb19zZXRfZm9udF9mYWNlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2V0X2ZvbnRfZmFjZV8xPWNhc3Q9Y2Fpcm9fZm9udF9mYWNlX3QgKgotCi1DYWlyb19jYWlyb19zZXRfZm9udF9tYXRyaXg9Ci1DYWlyb19jYWlyb19zZXRfZm9udF9tYXRyaXhfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19zZXRfZm9udF9tYXRyaXhfMT1jYXN0PWNhaXJvX21hdHJpeF90ICoKLQotQ2Fpcm9fY2Fpcm9fc2V0X2ZvbnRfb3B0aW9ucz0KLUNhaXJvX2NhaXJvX3NldF9mb250X29wdGlvbnNfMD1jYXN0PWNhaXJvX3QgKgotQ2Fpcm9fY2Fpcm9fc2V0X2ZvbnRfb3B0aW9uc18xPWNhc3Q9Y2Fpcm9fZm9udF9vcHRpb25zX3QgKgotCi1DYWlyb19jYWlyb19zZXRfZm9udF9zaXplPQotQ2Fpcm9fY2Fpcm9fc2V0X2ZvbnRfc2l6ZV8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3NldF9mb250X3NpemVfMT0KLQotQ2Fpcm9fY2Fpcm9fc2V0X2xpbmVfY2FwPQotQ2Fpcm9fY2Fpcm9fc2V0X2xpbmVfY2FwXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2V0X2xpbmVfY2FwXzE9Ci0KLUNhaXJvX2NhaXJvX3NldF9saW5lX2pvaW49Ci1DYWlyb19jYWlyb19zZXRfbGluZV9qb2luXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2V0X2xpbmVfam9pbl8xPQotCi1DYWlyb19jYWlyb19zZXRfbGluZV93aWR0aD0KLUNhaXJvX2NhaXJvX3NldF9saW5lX3dpZHRoXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2V0X2xpbmVfd2lkdGhfMT0KLQotQ2Fpcm9fY2Fpcm9fc2V0X21hdHJpeD0KLUNhaXJvX2NhaXJvX3NldF9tYXRyaXhfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19zZXRfbWF0cml4XzE9Y2FzdD1jYWlyb19tYXRyaXhfdCAqCi0KLUNhaXJvX2NhaXJvX3NldF9taXRlcl9saW1pdD0KLUNhaXJvX2NhaXJvX3NldF9taXRlcl9saW1pdF8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3NldF9taXRlcl9saW1pdF8xPQotCi1DYWlyb19jYWlyb19zZXRfb3BlcmF0b3I9Ci1DYWlyb19jYWlyb19zZXRfb3BlcmF0b3JfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19zZXRfb3BlcmF0b3JfMT0KLQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZT0KLUNhaXJvX2NhaXJvX3NldF9zb3VyY2VfMD1jYXN0PWNhaXJvX3QgKgotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV8xPWNhc3Q9Y2Fpcm9fcGF0dGVybl90ICoKLQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9yZ2I9Ci1DYWlyb19jYWlyb19zZXRfc291cmNlX3JnYl8wPWNhc3Q9Y2Fpcm9fdCAqCi1DYWlyb19jYWlyb19zZXRfc291cmNlX3JnYl8xPQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9yZ2JfMj0KLUNhaXJvX2NhaXJvX3NldF9zb3VyY2VfcmdiXzM9Ci0KLUNhaXJvX2NhaXJvX3NldF9zb3VyY2VfcmdiYT0KLUNhaXJvX2NhaXJvX3NldF9zb3VyY2VfcmdiYV8wPWNhc3Q9Y2Fpcm9fdCAqCi1DYWlyb19jYWlyb19zZXRfc291cmNlX3JnYmFfMT0KLUNhaXJvX2NhaXJvX3NldF9zb3VyY2VfcmdiYV8yPQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhXzM9Ci1DYWlyb19jYWlyb19zZXRfc291cmNlX3JnYmFfND0KLQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9zdXJmYWNlPQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9zdXJmYWNlXzA9Y2FzdD1jYWlyb190ICoKLUNhaXJvX2NhaXJvX3NldF9zb3VyY2Vfc3VyZmFjZV8xPWNhc3Q9Y2Fpcm9fc3VyZmFjZV90ICoKLUNhaXJvX2NhaXJvX3NldF9zb3VyY2Vfc3VyZmFjZV8yPQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9zdXJmYWNlXzM9Ci0KLUNhaXJvX2NhaXJvX3NldF90b2xlcmFuY2U9Ci1DYWlyb19jYWlyb19zZXRfdG9sZXJhbmNlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2V0X3RvbGVyYW5jZV8xPQotCi1DYWlyb19jYWlyb19zaG93X2dseXBocz0KLUNhaXJvX2NhaXJvX3Nob3dfZ2x5cGhzXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2hvd19nbHlwaHNfMT1jYXN0PShjYWlyb19nbHlwaF90ICopCi1DYWlyb19jYWlyb19zaG93X2dseXBoc18yPQotCi1DYWlyb19jYWlyb19zaG93X3BhZ2U9Ci1DYWlyb19jYWlyb19zaG93X3BhZ2VfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX3Nob3dfdGV4dD0KLUNhaXJvX2NhaXJvX3Nob3dfdGV4dF8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3Nob3dfdGV4dF8xPQotCi1DYWlyb19jYWlyb19zdGF0dXM9Ci1DYWlyb19jYWlyb19zdGF0dXNfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX3N0YXR1c190b19zdHJpbmc9Ci1DYWlyb19jYWlyb19zdGF0dXNfdG9fc3RyaW5nXzA9Ci0KLUNhaXJvX2NhaXJvX3N0cm9rZT0KLUNhaXJvX2NhaXJvX3N0cm9rZV8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fc3Ryb2tlX2V4dGVudHM9Ci1DYWlyb19jYWlyb19zdHJva2VfZXh0ZW50c18wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3N0cm9rZV9leHRlbnRzXzE9Ci1DYWlyb19jYWlyb19zdHJva2VfZXh0ZW50c18yPQotQ2Fpcm9fY2Fpcm9fc3Ryb2tlX2V4dGVudHNfMz0KLUNhaXJvX2NhaXJvX3N0cm9rZV9leHRlbnRzXzQ9Ci0KLUNhaXJvX2NhaXJvX3N0cm9rZV9wcmVzZXJ2ZT0KLUNhaXJvX2NhaXJvX3N0cm9rZV9wcmVzZXJ2ZV8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9jcmVhdGVfc2ltaWxhcj0KLUNhaXJvX2NhaXJvX3N1cmZhY2VfY3JlYXRlX3NpbWlsYXJfMD1jYXN0PShjYWlyb19zdXJmYWNlX3QgKikKLUNhaXJvX2NhaXJvX3N1cmZhY2VfY3JlYXRlX3NpbWlsYXJfMT0KLUNhaXJvX2NhaXJvX3N1cmZhY2VfY3JlYXRlX3NpbWlsYXJfMj0KLUNhaXJvX2NhaXJvX3N1cmZhY2VfY3JlYXRlX3NpbWlsYXJfMz0KLQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9kZXN0cm95PQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9kZXN0cm95XzA9Y2FzdD0oY2Fpcm9fc3VyZmFjZV90ICopCi0KLUNhaXJvX2NhaXJvX3N1cmZhY2VfZmluaXNoPQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9maW5pc2hfMD1jYXN0PShjYWlyb19zdXJmYWNlX3QgKikKLQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9nZXRfdXNlcl9kYXRhPQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9nZXRfdXNlcl9kYXRhXzA9Y2FzdD0oY2Fpcm9fc3VyZmFjZV90ICopCi1DYWlyb19jYWlyb19zdXJmYWNlX2dldF91c2VyX2RhdGFfMT1jYXN0PWNhaXJvX3VzZXJfZGF0YV9rZXlfdCAqCi0KLUNhaXJvX2NhaXJvX3N1cmZhY2VfcmVmZXJlbmNlPQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9yZWZlcmVuY2VfMD1jYXN0PShjYWlyb19zdXJmYWNlX3QgKikKLQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9zZXRfZGV2aWNlX29mZnNldD0KLUNhaXJvX2NhaXJvX3N1cmZhY2Vfc2V0X2RldmljZV9vZmZzZXRfMD1jYXN0PShjYWlyb19zdXJmYWNlX3QgKikKLUNhaXJvX2NhaXJvX3N1cmZhY2Vfc2V0X2RldmljZV9vZmZzZXRfMT0KLUNhaXJvX2NhaXJvX3N1cmZhY2Vfc2V0X2RldmljZV9vZmZzZXRfMj0KLQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9zZXRfdXNlcl9kYXRhPQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9zZXRfdXNlcl9kYXRhXzA9Y2FzdD0oY2Fpcm9fc3VyZmFjZV90ICopCi1DYWlyb19jYWlyb19zdXJmYWNlX3NldF91c2VyX2RhdGFfMT1jYXN0PWNhaXJvX3VzZXJfZGF0YV9rZXlfdCAqCi1DYWlyb19jYWlyb19zdXJmYWNlX3NldF91c2VyX2RhdGFfMj1jYXN0PXZvaWQgKgotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9zZXRfdXNlcl9kYXRhXzM9Y2FzdD1jYWlyb19kZXN0cm95X2Z1bmNfdAotCi1DYWlyb19jYWlyb190ZXh0X2V4dGVudHM9Ci1DYWlyb19jYWlyb190ZXh0X2V4dGVudHNfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb190ZXh0X2V4dGVudHNfMT0KLUNhaXJvX2NhaXJvX3RleHRfZXh0ZW50c18yPWNhc3Q9Y2Fpcm9fdGV4dF9leHRlbnRzX3QgKgotCi1DYWlyb19jYWlyb190ZXh0X3BhdGg9Ci1DYWlyb19jYWlyb190ZXh0X3BhdGhfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb190ZXh0X3BhdGhfMT0KLQotQ2Fpcm9fY2Fpcm9fdHJhbnNmb3JtPQotQ2Fpcm9fY2Fpcm9fdHJhbnNmb3JtXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fdHJhbnNmb3JtXzE9Y2FzdD0oY2Fpcm9fbWF0cml4X3QgKikKLQotQ2Fpcm9fY2Fpcm9fdHJhbnNsYXRlPQotQ2Fpcm9fY2Fpcm9fdHJhbnNsYXRlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fdHJhbnNsYXRlXzE9Ci1DYWlyb19jYWlyb190cmFuc2xhdGVfMj0KLQotQ2Fpcm9fY2Fpcm9fdXNlcl90b19kZXZpY2U9Ci1DYWlyb19jYWlyb191c2VyX3RvX2RldmljZV8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3VzZXJfdG9fZGV2aWNlXzE9Ci1DYWlyb19jYWlyb191c2VyX3RvX2RldmljZV8yPQotCi1DYWlyb19jYWlyb191c2VyX3RvX2RldmljZV9kaXN0YW5jZT0KLUNhaXJvX2NhaXJvX3VzZXJfdG9fZGV2aWNlX2Rpc3RhbmNlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fdXNlcl90b19kZXZpY2VfZGlzdGFuY2VfMT0KLUNhaXJvX2NhaXJvX3VzZXJfdG9fZGV2aWNlX2Rpc3RhbmNlXzI9Ci0KLUNhaXJvX2NhaXJvX3hsaWJfc3VyZmFjZV9jcmVhdGU9Ci1DYWlyb19jYWlyb194bGliX3N1cmZhY2VfY3JlYXRlXzA9Y2FzdD0oRGlzcGxheSAqKQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV8xPWNhc3Q9KERyYXdhYmxlKQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV8yPWNhc3Q9KFZpc3VhbCAqKQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV8zPQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV80PQotCi1DYWlyb19jYWlyb194bGliX3N1cmZhY2VfY3JlYXRlX2Zvcl9iaXRtYXA9Ci1DYWlyb19jYWlyb194bGliX3N1cmZhY2VfY3JlYXRlX2Zvcl9iaXRtYXBfMD1jYXN0PShEaXNwbGF5ICopCi1DYWlyb19jYWlyb194bGliX3N1cmZhY2VfY3JlYXRlX2Zvcl9iaXRtYXBfMT1jYXN0PVBpeG1hcAotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV9mb3JfYml0bWFwXzI9Y2FzdD0oU2NyZWVuICoKLUNhaXJvX2NhaXJvX3hsaWJfc3VyZmFjZV9jcmVhdGVfZm9yX2JpdG1hcF8zPQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV9mb3JfYml0bWFwXzQ9Ci0KLUNhaXJvX2NhaXJvX3hsaWJfc3VyZmFjZV9zZXRfc2l6ZT0KLUNhaXJvX2NhaXJvX3hsaWJfc3VyZmFjZV9zZXRfc2l6ZV8wPWNhc3Q9Y2Fpcm9fc3VyZmFjZV90ICoKLUNhaXJvX2NhaXJvX3hsaWJfc3VyZmFjZV9zZXRfc2l6ZV8xPQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX3NldF9zaXplXzI9Ci0KLUNhaXJvX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2Fpcm9fY2Fpcm9fMXBhdGhfMWRhdGFfMXRfMklJPQotQ2Fpcm9fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYWlyb19jYWlyb18xcGF0aF8xZGF0YV8xdF8ySUlfMD1jYXN0PXZvaWQgKgotQ2Fpcm9fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYWlyb19jYWlyb18xcGF0aF8xZGF0YV8xdF8ySUlfMT1jYXN0PWNvbnN0IHZvaWQgKgotQ2Fpcm9fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYWlyb19jYWlyb18xcGF0aF8xZGF0YV8xdF8ySUlfMj1jYXN0PXNpemVfdAotCi1DYWlyb19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhaXJvX2NhaXJvXzFwYXRoXzF0XzJJST0KLUNhaXJvX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2Fpcm9fY2Fpcm9fMXBhdGhfMXRfMklJXzA9Y2FzdD0odm9pZCAqKQotQ2Fpcm9fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYWlyb19jYWlyb18xcGF0aF8xdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1DYWlyb19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhaXJvX2NhaXJvXzFwYXRoXzF0XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotQ2Fpcm9fbWVtbW92ZV9fXzNESUk9Ci1DYWlyb19tZW1tb3ZlX19fM0RJSV8wPWNhc3Q9KHZvaWQgKikKLUNhaXJvX21lbW1vdmVfX18zRElJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotQ2Fpcm9fbWVtbW92ZV9fXzNESUlfMj1jYXN0PShzaXplX3QpCi0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhaXJvX2NhaXJvXzFmb250XzFleHRlbnRzXzF0PQotY2Fpcm9fZm9udF9leHRlbnRzX3RfYXNjZW50PQotY2Fpcm9fZm9udF9leHRlbnRzX3RfZGVzY2VudD0KLWNhaXJvX2ZvbnRfZXh0ZW50c190X2hlaWdodD0KLWNhaXJvX2ZvbnRfZXh0ZW50c190X21heF94X2FkdmFuY2U9Ci1jYWlyb19mb250X2V4dGVudHNfdF9tYXhfeV9hZHZhbmNlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2Fpcm9fY2Fpcm9fMXBhdGhfMWRhdGFfMXQ9Ci1jYWlyb19wYXRoX2RhdGFfdF90eXBlPWFjY2Vzc29yPWhlYWRlci50eXBlCi1jYWlyb19wYXRoX2RhdGFfdF9sZW5ndGg9YWNjZXNzb3I9aGVhZGVyLmxlbmd0aAotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2Fpcm9fY2Fpcm9fMXBhdGhfMXQ9Ci1jYWlyb19wYXRoX3Rfc3RhdHVzPQotY2Fpcm9fcGF0aF90X2RhdGE9Y2FzdD1jYWlyb19wYXRoX2RhdGFfdCAqCi1jYWlyb19wYXRoX3RfbnVtX2RhdGE9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2Fpcm8ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2Fpcm8ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJiZTdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhaXJvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zd3RfY29weXJpZ2h0PS8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKipcblwKLSAqIFZlcnNpb246IE1QTCAxLjFcblwKLSAqXG5cCi0gKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb25cblwKLSAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuXAotICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXAotICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvXG5cCi0gKlxuXAotICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcyxcblwKLSAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZVxuXAotICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGVcblwKLSAqIExpY2Vuc2UuXG5cCi0gKlxuXAotICogQ29udHJpYnV0b3Iocyk6XG5cCi0gKlxuXAotICogSUJNXG5cCi0gKiAtICBCaW5kaW5nIHRvIHBlcm1pdCBpbnRlcmZhY2luZyBiZXR3ZWVuIENhaXJvIGFuZCBTV1RcblwKLSAqIC0gIENvcHlyaWdodCAoQykgMjAwNSBJQk0gQ29ycC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi0gKlxuXAotICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi9cbgotIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2FyYm9uLk9TLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi5PUy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDg3ZDUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2FyYm9uLk9TLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQUVEZXNjPQotQUVEZXNjX2Rlc2NyaXB0b3JUeXBlPWNhc3Q9KERlc2NUeXBlKQotQUVEZXNjX2RhdGFIYW5kbGU9Y2FzdD0oQUVEYXRhU3RvcmFnZSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNMYXlvdXRSZWNvcmQ9Ci1BVFNMYXlvdXRSZWNvcmRfZ2x5cGhJRD0KLUFUU0xheW91dFJlY29yZF9mbGFncz0KLUFUU0xheW91dFJlY29yZF9vcmlnaW5hbE9mZnNldD0KLUFUU0xheW91dFJlY29yZF9yZWFsUG9zPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1RyYXBlem9pZD0KLUFUU1RyYXBlem9pZF91cHBlckxlZnRfeD1hY2Nlc3Nvcj11cHBlckxlZnQueAotQVRTVHJhcGV6b2lkX3VwcGVyTGVmdF95PWFjY2Vzc29yPXVwcGVyTGVmdC55Ci1BVFNUcmFwZXpvaWRfdXBwZXJSaWdodF94PWFjY2Vzc29yPXVwcGVyUmlnaHQueAotQVRTVHJhcGV6b2lkX3VwcGVyUmlnaHRfeT1hY2Nlc3Nvcj11cHBlclJpZ2h0LnkKLUFUU1RyYXBlem9pZF9sb3dlclJpZ2h0X3g9YWNjZXNzb3I9bG93ZXJSaWdodC54Ci1BVFNUcmFwZXpvaWRfbG93ZXJSaWdodF95PWFjY2Vzc29yPWxvd2VyUmlnaHQueQotQVRTVHJhcGV6b2lkX2xvd2VyTGVmdF94PWFjY2Vzc29yPWxvd2VyTGVmdC54Ci1BVFNUcmFwZXpvaWRfbG93ZXJMZWZ0X3k9YWNjZXNzb3I9bG93ZXJMZWZ0LnkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNVQ2FyZXQ9Ci1BVFNVQ2FyZXRfZlg9Ci1BVFNVQ2FyZXRfZlk9Ci1BVFNVQ2FyZXRfZkRlbHRhWD0KLUFUU1VDYXJldF9mRGVsdGFZPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1VUYWI9Ci1BVFNVVGFiX3RhYlBvc2l0aW9uPQotQVRTVVRhYl90YWJUeXBlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1VVbmhpZ2hsaWdodERhdGE9Ci1BVFNVVW5oaWdobGlnaHREYXRhX2RhdGFUeXBlPQotQVRTVVVuaGlnaGxpZ2h0RGF0YV9yZWQ9YWNjZXNzb3I9dW5oaWdobGlnaHREYXRhLmJhY2tncm91bmRDb2xvci5yZWQKLUFUU1VVbmhpZ2hsaWdodERhdGFfZ3JlZW49YWNjZXNzb3I9dW5oaWdobGlnaHREYXRhLmJhY2tncm91bmRDb2xvci5ncmVlbgotQVRTVVVuaGlnaGxpZ2h0RGF0YV9ibHVlPWFjY2Vzc29yPXVuaGlnaGxpZ2h0RGF0YS5iYWNrZ3JvdW5kQ29sb3IuYmx1ZQotQVRTVVVuaGlnaGxpZ2h0RGF0YV9hbHBoYT1hY2Nlc3Nvcj11bmhpZ2hsaWdodERhdGEuYmFja2dyb3VuZENvbG9yLmFscGhhCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWM9Ci1BbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVJlY192ZXJzaW9uPQotQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWNfbW92YWJsZT0KLUFsZXJ0U3RkQ0ZTdHJpbmdBbGVydFBhcmFtUmVjX2hlbHBCdXR0b249Ci1BbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVJlY19kZWZhdWx0VGV4dD1jYXN0PShDRlN0cmluZ1JlZikKLUFsZXJ0U3RkQ0ZTdHJpbmdBbGVydFBhcmFtUmVjX2NhbmNlbFRleHQ9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1BbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVJlY19vdGhlclRleHQ9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1BbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVJlY19kZWZhdWx0QnV0dG9uPQotQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWNfY2FuY2VsQnV0dG9uPQotQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWNfcG9zaXRpb249Ci1BbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVJlY19mbGFncz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9CaXRNYXA9Ci1CaXRNYXBfYmFzZUFkZHI9Y2FzdD0odm9pZCAqKQotQml0TWFwX3Jvd0J5dGVzPQotQml0TWFwX3RvcD1hY2Nlc3Nvcj1ib3VuZHMudG9wCi1CaXRNYXBfbGVmdD1hY2Nlc3Nvcj1ib3VuZHMubGVmdAotQml0TWFwX2JvdHRvbT1hY2Nlc3Nvcj1ib3VuZHMuYm90dG9tCi1CaXRNYXBfcmlnaHQ9YWNjZXNzb3I9Ym91bmRzLnJpZ2h0Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0ZSYW5nZT0KLUNGUmFuZ2VfbG9jYXRpb249Y2FzdD0oQ0ZJbmRleCkKLUNGUmFuZ2VfbGVuZ3RoPWNhc3Q9KENGSW5kZXgpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dGdW5jdGlvbkNhbGxiYWNrcz0KLUNHRnVuY3Rpb25DYWxsYmFja3NfdmVyc2lvbj0KLUNHRnVuY3Rpb25DYWxsYmFja3NfZXZhbHVhdGU9Y2FzdD1DR0Z1bmN0aW9uRXZhbHVhdGVDYWxsYmFjawotQ0dGdW5jdGlvbkNhbGxiYWNrc19yZWxlYXNlSW5mbz1jYXN0PUNHRnVuY3Rpb25SZWxlYXNlSW5mb0NhbGxiYWNrCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQYXRoRWxlbWVudD0KLUNHUGF0aEVsZW1lbnRfdHlwZT1jYXN0PUNHUGF0aEVsZW1lbnRUeXBlCi1DR1BhdGhFbGVtZW50X3BvaW50cz1jYXN0PUNHUG9pbnQgKgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUGF0dGVybkNhbGxiYWNrcz0KLUNHUGF0dGVybkNhbGxiYWNrc192ZXJzaW9uPQotQ0dQYXR0ZXJuQ2FsbGJhY2tzX2RyYXdQYXR0ZXJuPWNhc3Q9Q0dQYXR0ZXJuRHJhd1BhdHRlcm5DYWxsYmFjawotQ0dQYXR0ZXJuQ2FsbGJhY2tzX3JlbGVhc2VJbmZvPWNhc3Q9Q0dQYXR0ZXJuUmVsZWFzZUluZm9DYWxsYmFjawotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnQ9Ci1DR1BvaW50X3g9Y2FzdD0oZmxvYXQpCi1DR1BvaW50X3k9Y2FzdD0oZmxvYXQpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dSZWN0PQotQ0dSZWN0X3g9YWNjZXNzb3I9b3JpZ2luLngsY2FzdD0oZmxvYXQpCi1DR1JlY3RfeT1hY2Nlc3Nvcj1vcmlnaW4ueSxjYXN0PShmbG9hdCkKLUNHUmVjdF93aWR0aD1hY2Nlc3Nvcj1zaXplLndpZHRoLGNhc3Q9KGZsb2F0KQotQ0dSZWN0X2hlaWdodD1hY2Nlc3Nvcj1zaXplLmhlaWdodCxjYXN0PShmbG9hdCkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db2xvclBpY2tlckluZm89Ci1Db2xvclBpY2tlckluZm9fcHJvZmlsZT1hY2Nlc3Nvcj10aGVDb2xvci5wcm9maWxlLGNhc3Q9KENNUHJvZmlsZUhhbmRsZSkKLUNvbG9yUGlja2VySW5mb19yZWQ9YWNjZXNzb3I9dGhlQ29sb3IuY29sb3IucmdiLnJlZCxjYXN0PShVSW50MTYpCi1Db2xvclBpY2tlckluZm9fZ3JlZW49YWNjZXNzb3I9dGhlQ29sb3IuY29sb3IucmdiLmdyZWVuLGNhc3Q9KFVJbnQxNikKLUNvbG9yUGlja2VySW5mb19ibHVlPWFjY2Vzc29yPXRoZUNvbG9yLmNvbG9yLnJnYi5ibHVlLGNhc3Q9KFVJbnQxNikKLUNvbG9yUGlja2VySW5mb19kc3RQcm9maWxlPWNhc3Q9KENNUHJvZmlsZUhhbmRsZSkKLUNvbG9yUGlja2VySW5mb19mbGFncz1jYXN0PShVSW50MzIpCi1Db2xvclBpY2tlckluZm9fcGxhY2VXaGVyZT1jYXN0PShEaWFsb2dQbGFjZW1lbnRTcGVjKQotQ29sb3JQaWNrZXJJbmZvX2g9YWNjZXNzb3I9ZGlhbG9nT3JpZ2luLmgsY2FzdD0oc2hvcnQpCi1Db2xvclBpY2tlckluZm9fdj1hY2Nlc3Nvcj1kaWFsb2dPcmlnaW4udixjYXN0PShzaG9ydCkKLUNvbG9yUGlja2VySW5mb19waWNrZXJUeXBlPWNhc3Q9KE9TVHlwZSkKLUNvbG9yUGlja2VySW5mb19ldmVudFByb2M9Y2FzdD0oVXNlckV2ZW50VVBQKQotQ29sb3JQaWNrZXJJbmZvX2NvbG9yUHJvYz1jYXN0PShDb2xvckNoYW5nZWRVUFApCi1Db2xvclBpY2tlckluZm9fY29sb3JQcm9jRGF0YT1jYXN0PShVSW50MzIpCi1Db2xvclBpY2tlckluZm9fcHJvbXB0PWNhc3Q9KFN0cjI1NSkKLUNvbG9yUGlja2VySW5mb19lZGl0TWVudUlEPWFjY2Vzc29yPW1JbmZvLmVkaXRNZW51SUQsY2FzdD0oU0ludDE2KQotQ29sb3JQaWNrZXJJbmZvX2N1dEl0ZW09YWNjZXNzb3I9bUluZm8uY3V0SXRlbSxjYXN0PShTSW50MTYpCi1Db2xvclBpY2tlckluZm9fY29weUl0ZW09YWNjZXNzb3I9bUluZm8uY29weUl0ZW0sY2FzdD0oU0ludDE2KQotQ29sb3JQaWNrZXJJbmZvX3Bhc3RlSXRlbT1hY2Nlc3Nvcj1tSW5mby5wYXN0ZUl0ZW0sY2FzdD0oU0ludDE2KQotQ29sb3JQaWNrZXJJbmZvX2NsZWFySXRlbT1hY2Nlc3Nvcj1tSW5mby5jbGVhckl0ZW0sY2FzdD0oU0ludDE2KQotQ29sb3JQaWNrZXJJbmZvX3VuZG9JdGVtPWFjY2Vzc29yPW1JbmZvLnVuZG9JdGVtLGNhc3Q9KFNJbnQxNikKLUNvbG9yUGlja2VySW5mb19uZXdDb2xvckNob3Nlbj1jYXN0PShCb29sZWFuKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xCdXR0b25Db250ZW50SW5mbz0KLUNvbnRyb2xCdXR0b25Db250ZW50SW5mb19jb250ZW50VHlwZT1jYXN0PShDb250cm9sQ29udGVudFR5cGUpCi1Db250cm9sQnV0dG9uQ29udGVudEluZm9faWNvblJlZj1hY2Nlc3Nvcj11Lmljb25SZWYsY2FzdD0odm9pZCAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlYz0KLUNvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY19zZWxTdGFydD0KLUNvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY19zZWxFbmQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEZvbnRTdHlsZVJlYz0KLUNvbnRyb2xGb250U3R5bGVSZWNfZmxhZ3M9Ci1Db250cm9sRm9udFN0eWxlUmVjX2ZvbnQ9Ci1Db250cm9sRm9udFN0eWxlUmVjX3NpemU9Ci1Db250cm9sRm9udFN0eWxlUmVjX3N0eWxlPQotQ29udHJvbEZvbnRTdHlsZVJlY19tb2RlPQotQ29udHJvbEZvbnRTdHlsZVJlY19qdXN0PQotQ29udHJvbEZvbnRTdHlsZVJlY19mb3JlQ29sb3JfcmVkPWFjY2Vzc29yPWZvcmVDb2xvci5yZWQKLUNvbnRyb2xGb250U3R5bGVSZWNfZm9yZUNvbG9yX2dyZWVuPWFjY2Vzc29yPWZvcmVDb2xvci5ncmVlbgotQ29udHJvbEZvbnRTdHlsZVJlY19mb3JlQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1mb3JlQ29sb3IuYmx1ZQotQ29udHJvbEZvbnRTdHlsZVJlY19iYWNrQ29sb3JfcmVkPWFjY2Vzc29yPWJhY2tDb2xvci5yZWQKLUNvbnRyb2xGb250U3R5bGVSZWNfYmFja0NvbG9yX2dyZWVuPWFjY2Vzc29yPWJhY2tDb2xvci5ncmVlbgotQ29udHJvbEZvbnRTdHlsZVJlY19iYWNrQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1iYWNrQ29sb3IuYmx1ZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xLaW5kPQotQ29udHJvbEtpbmRfc2lnbmF0dXJlPQotQ29udHJvbEtpbmRfa2luZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sVGFiRW50cnk9Ci1Db250cm9sVGFiRW50cnlfaWNvbj1jYXN0PShDb250cm9sQnV0dG9uQ29udGVudEluZm8gKikKLUNvbnRyb2xUYWJFbnRyeV9uYW1lPWNhc3Q9KENGU3RyaW5nUmVmKQotQ29udHJvbFRhYkVudHJ5X2VuYWJsZWQ9Y2FzdD0oQm9vbGVhbikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sVGFiSW5mb1JlY1YxPQotQ29udHJvbFRhYkluZm9SZWNWMV92ZXJzaW9uPWNhc3Q9KFNJbnQxNikKLUNvbnRyb2xUYWJJbmZvUmVjVjFfaWNvblN1aXRlSUQ9Y2FzdD0oU0ludDE2KQotQ29udHJvbFRhYkluZm9SZWNWMV9uYW1lPWNhc3Q9KENGU3RyaW5nUmVmKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0N1cnNvcj0KLUN1cnNvcl9kYXRhPQotQ3Vyc29yX21hc2s9Ci1DdXJzb3JfaG90U3BvdF92PWFjY2Vzc29yPWhvdFNwb3QudgotQ3Vyc29yX2hvdFNwb3RfaD1hY2Nlc3Nvcj1ob3RTcG90LmgKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9EYXRhQnJvd3NlckNhbGxiYWNrcz0KLURhdGFCcm93c2VyQ2FsbGJhY2tzX3ZlcnNpb249Y2FzdD0oVUludDMyKQotRGF0YUJyb3dzZXJDYWxsYmFja3NfdjFfaXRlbURhdGFDYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLml0ZW1EYXRhQ2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJJdGVtRGF0YVVQUCkKLURhdGFCcm93c2VyQ2FsbGJhY2tzX3YxX2l0ZW1Db21wYXJlQ2FsbGJhY2s9YWNjZXNzb3I9dS52MS5pdGVtQ29tcGFyZUNhbGxiYWNrLGNhc3Q9KERhdGFCcm93c2VySXRlbUNvbXBhcmVVUFApCi1EYXRhQnJvd3NlckNhbGxiYWNrc192MV9pdGVtTm90aWZpY2F0aW9uQ2FsbGJhY2s9YWNjZXNzb3I9dS52MS5pdGVtTm90aWZpY2F0aW9uQ2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJJdGVtTm90aWZpY2F0aW9uVVBQKQotRGF0YUJyb3dzZXJDYWxsYmFja3NfdjFfYWRkRHJhZ0l0ZW1DYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLmFkZERyYWdJdGVtQ2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJBZGREcmFnSXRlbVVQUCkKLURhdGFCcm93c2VyQ2FsbGJhY2tzX3YxX2FjY2VwdERyYWdDYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLmFjY2VwdERyYWdDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlckFjY2VwdERyYWdVUFApCi1EYXRhQnJvd3NlckNhbGxiYWNrc192MV9yZWNlaXZlRHJhZ0NhbGxiYWNrPWFjY2Vzc29yPXUudjEucmVjZWl2ZURyYWdDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlclJlY2VpdmVEcmFnVVBQKQotRGF0YUJyb3dzZXJDYWxsYmFja3NfdjFfcG9zdFByb2Nlc3NEcmFnQ2FsbGJhY2s9YWNjZXNzb3I9dS52MS5wb3N0UHJvY2Vzc0RyYWdDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlclBvc3RQcm9jZXNzRHJhZ1VQUCkKLURhdGFCcm93c2VyQ2FsbGJhY2tzX3YxX2l0ZW1IZWxwQ29udGVudENhbGxiYWNrPWFjY2Vzc29yPXUudjEuaXRlbUhlbHBDb250ZW50Q2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJJdGVtSGVscENvbnRlbnRVUFApCi1EYXRhQnJvd3NlckNhbGxiYWNrc192MV9nZXRDb250ZXh0dWFsTWVudUNhbGxiYWNrPWFjY2Vzc29yPXUudjEuZ2V0Q29udGV4dHVhbE1lbnVDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlckdldENvbnRleHR1YWxNZW51VVBQKQotRGF0YUJyb3dzZXJDYWxsYmFja3NfdjFfc2VsZWN0Q29udGV4dHVhbE1lbnVDYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLnNlbGVjdENvbnRleHR1YWxNZW51Q2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJTZWxlY3RDb250ZXh0dWFsTWVudVVQUCkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9EYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrcz0KLURhdGFCcm93c2VyQ3VzdG9tQ2FsbGJhY2tzX3ZlcnNpb249Ci1EYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrc192MV9kcmF3SXRlbUNhbGxiYWNrPWFjY2Vzc29yPXUudjEuZHJhd0l0ZW1DYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlckRyYXdJdGVtVVBQKQotRGF0YUJyb3dzZXJDdXN0b21DYWxsYmFja3NfdjFfZWRpdFRleHRDYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLmVkaXRUZXh0Q2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJFZGl0SXRlbVVQUCkKLURhdGFCcm93c2VyQ3VzdG9tQ2FsbGJhY2tzX3YxX2hpdFRlc3RDYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLmhpdFRlc3RDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlckhpdFRlc3RVUFApCi1EYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrc192MV90cmFja2luZ0NhbGxiYWNrPWFjY2Vzc29yPXUudjEudHJhY2tpbmdDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlclRyYWNraW5nVVBQKQotRGF0YUJyb3dzZXJDdXN0b21DYWxsYmFja3NfdjFfZHJhZ1JlZ2lvbkNhbGxiYWNrPWFjY2Vzc29yPXUudjEuZHJhZ1JlZ2lvbkNhbGxiYWNrLGNhc3Q9KERhdGFCcm93c2VySXRlbURyYWdSZ25VUFApCi1EYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrc192MV9hY2NlcHREcmFnQ2FsbGJhY2s9YWNjZXNzb3I9dS52MS5hY2NlcHREcmFnQ2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJJdGVtQWNjZXB0RHJhZ1VQUCkKLURhdGFCcm93c2VyQ3VzdG9tQ2FsbGJhY2tzX3YxX3JlY2VpdmVEcmFnQ2FsbGJhY2s9YWNjZXNzb3I9dS52MS5yZWNlaXZlRHJhZ0NhbGxiYWNrLGNhc3Q9KERhdGFCcm93c2VySXRlbVJlY2VpdmVEcmFnVVBQKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0RhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjPQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfcHJvcGVydHlEZXNjX3Byb3BlcnR5SUQ9YWNjZXNzb3I9cHJvcGVydHlEZXNjLnByb3BlcnR5SUQsY2FzdD0oRGF0YUJyb3dzZXJQcm9wZXJ0eUlEKQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfcHJvcGVydHlEZXNjX3Byb3BlcnR5VHlwZT1hY2Nlc3Nvcj1wcm9wZXJ0eURlc2MucHJvcGVydHlUeXBlLGNhc3Q9KE9TVHlwZSkKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX3Byb3BlcnR5RGVzY19wcm9wZXJ0eUZsYWdzPWFjY2Vzc29yPXByb3BlcnR5RGVzYy5wcm9wZXJ0eUZsYWdzLGNhc3Q9KERhdGFCcm93c2VyUHJvcGVydHlGbGFncykKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfdmVyc2lvbj1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLnZlcnNpb24sY2FzdD0oVUludDMyKQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY19taW5pbXVtV2lkdGg9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5taW5pbXVtV2lkdGgsY2FzdD0oVUludDE2KQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY19tYXhpbXVtV2lkdGg9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5tYXhpbXVtV2lkdGgsY2FzdD0oVUludDE2KQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY190aXRsZU9mZnNldD1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLnRpdGxlT2Zmc2V0LGNhc3Q9KFNJbnQxNikKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfdGl0bGVTdHJpbmc9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy50aXRsZVN0cmluZyxjYXN0PShDRlN0cmluZ1JlZikKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfaW5pdGlhbE9yZGVyPWFjY2Vzc29yPWhlYWRlckJ0bkRlc2MuaW5pdGlhbE9yZGVyLGNhc3Q9KERhdGFCcm93c2VyU29ydE9yZGVyKQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY19idG5Gb250U3R5bGVfZmxhZ3M9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Gb250U3R5bGUuZmxhZ3MsY2FzdD0oU0ludDE2KQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY19idG5Gb250U3R5bGVfZm9udD1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5mb250LGNhc3Q9KFNJbnQxNikKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuRm9udFN0eWxlX3NpemU9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Gb250U3R5bGUuc2l6ZSxjYXN0PShTSW50MTYpCi1EYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19oZWFkZXJCdG5EZXNjX2J0bkZvbnRTdHlsZV9zdHlsZT1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5zdHlsZSxjYXN0PShTSW50MTYpCi1EYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19oZWFkZXJCdG5EZXNjX2J0bkZvbnRTdHlsZV9tb2RlPWFjY2Vzc29yPWhlYWRlckJ0bkRlc2MuYnRuRm9udFN0eWxlLm1vZGUsY2FzdD0oU0ludDE2KQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY19idG5Gb250U3R5bGVfanVzdD1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5qdXN0LGNhc3Q9KFNJbnQxNikKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuRm9udFN0eWxlX2ZvcmVDb2xvcl9yZWQ9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Gb250U3R5bGUuZm9yZUNvbG9yLnJlZCxjYXN0PSh1bnNpZ25lZCBzaG9ydCkKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuRm9udFN0eWxlX2ZvcmVDb2xvcl9ncmVlbj1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5mb3JlQ29sb3IuZ3JlZW4sY2FzdD0odW5zaWduZWQgc2hvcnQpCi1EYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19oZWFkZXJCdG5EZXNjX2J0bkZvbnRTdHlsZV9mb3JlQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5mb3JlQ29sb3IuYmx1ZSxjYXN0PSh1bnNpZ25lZCBzaG9ydCkKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuRm9udFN0eWxlX2JhY2tDb2xvcl9yZWQ9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Gb250U3R5bGUuYmFja0NvbG9yLnJlZCxjYXN0PSh1bnNpZ25lZCBzaG9ydCkKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuRm9udFN0eWxlX2JhY2tDb2xvcl9ncmVlbj1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5iYWNrQ29sb3IuZ3JlZW4sY2FzdD0odW5zaWduZWQgc2hvcnQpCi1EYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19oZWFkZXJCdG5EZXNjX2J0bkZvbnRTdHlsZV9iYWNrQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5iYWNrQ29sb3IuYmx1ZSxjYXN0PSh1bnNpZ25lZCBzaG9ydCkKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuQ29udGVudEluZm9fY29udGVudFR5cGU9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Db250ZW50SW5mby5jb250ZW50VHlwZSxjYXN0PShDb250cm9sQ29udGVudFR5cGUpCi1EYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19oZWFkZXJCdG5EZXNjX2J0bkNvbnRlbnRJbmZvX2ljb25SZWY9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Db250ZW50SW5mby51Lmljb25SZWYsY2FzdD0oSWNvblJlZikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzYz0KLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX3ZlcnNpb249Ci1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19taW5pbXVtV2lkdGg9Ci1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19tYXhpbXVtV2lkdGg9Ci1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY190aXRsZU9mZnNldD0KLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX3RpdGxlU3RyaW5nPWNhc3Q9KENGU3RyaW5nUmVmKQotRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfaW5pdGlhbE9yZGVyPQotRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfYnRuRm9udFN0eWxlX2ZsYWdzPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5mbGFncwotRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfYnRuRm9udFN0eWxlX2ZvbnQ9YWNjZXNzb3I9YnRuRm9udFN0eWxlLmZvbnQKLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkZvbnRTdHlsZV9zaXplPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5zaXplCi1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19idG5Gb250U3R5bGVfc3R5bGU9YWNjZXNzb3I9YnRuRm9udFN0eWxlLnN0eWxlCi1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19idG5Gb250U3R5bGVfbW9kZT1hY2Nlc3Nvcj1idG5Gb250U3R5bGUubW9kZQotRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfYnRuRm9udFN0eWxlX2p1c3Q9YWNjZXNzb3I9YnRuRm9udFN0eWxlLmp1c3QKLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkZvbnRTdHlsZV9mb3JlQ29sb3JfcmVkPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5mb3JlQ29sb3IucmVkCi1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19idG5Gb250U3R5bGVfZm9yZUNvbG9yX2dyZWVuPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5mb3JlQ29sb3IuZ3JlZW4KLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkZvbnRTdHlsZV9mb3JlQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1idG5Gb250U3R5bGUuZm9yZUNvbG9yLmJsdWUKLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkZvbnRTdHlsZV9iYWNrQ29sb3JfcmVkPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5iYWNrQ29sb3IucmVkCi1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19idG5Gb250U3R5bGVfYmFja0NvbG9yX2dyZWVuPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5iYWNrQ29sb3IuZ3JlZW4KLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkZvbnRTdHlsZV9iYWNrQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1idG5Gb250U3R5bGUuYmFja0NvbG9yLmJsdWUKLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkNvbnRlbnRJbmZvX2NvbnRlbnRUeXBlPWFjY2Vzc29yPWJ0bkNvbnRlbnRJbmZvLmNvbnRlbnRUeXBlCi1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19idG5Db250ZW50SW5mb19pY29uUmVmPWFjY2Vzc29yPWJ0bkNvbnRlbnRJbmZvLnUuaWNvblJlZixjYXN0PShJY29uUmVmKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0V2ZW50UmVjb3JkPQotRXZlbnRSZWNvcmRfd2hhdD1jYXN0PShFdmVudEtpbmQpCi1FdmVudFJlY29yZF9tZXNzYWdlPQotRXZlbnRSZWNvcmRfd2hlbj0KLUV2ZW50UmVjb3JkX3doZXJlX3Y9YWNjZXNzb3I9d2hlcmUudgotRXZlbnRSZWNvcmRfd2hlcmVfaD1hY2Nlc3Nvcj13aGVyZS5oCi1FdmVudFJlY29yZF9tb2RpZmllcnM9Y2FzdD0oRXZlbnRNb2RpZmllcnMpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fRm9udEluZm89Ci1Gb250SW5mb19hc2NlbnQ9Ci1Gb250SW5mb19kZXNjZW50PQotRm9udEluZm9fd2lkTWF4PQotRm9udEluZm9fbGVhZGluZz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Gb250U2VsZWN0aW9uUURTdHlsZT0KLUZvbnRTZWxlY3Rpb25RRFN0eWxlX3ZlcnNpb249Ci1Gb250U2VsZWN0aW9uUURTdHlsZV9pbnN0YW5jZV9mb250RmFtaWx5PWFjY2Vzc29yPWluc3RhbmNlLmZvbnRGYW1pbHkKLUZvbnRTZWxlY3Rpb25RRFN0eWxlX2luc3RhbmNlX2ZvbnRTdHlsZT1hY2Nlc3Nvcj1pbnN0YW5jZS5mb250U3R5bGUKLUZvbnRTZWxlY3Rpb25RRFN0eWxlX3NpemU9Ci1Gb250U2VsZWN0aW9uUURTdHlsZV9oYXNDb2xvcj0KLUZvbnRTZWxlY3Rpb25RRFN0eWxlX3Jlc2VydmVkPQotRm9udFNlbGVjdGlvblFEU3R5bGVfY29sb3JfcmVkPWFjY2Vzc29yPWNvbG9yLnJlZAotRm9udFNlbGVjdGlvblFEU3R5bGVfY29sb3JfZ3JlZW49YWNjZXNzb3I9Y29sb3IuZ3JlZW4KLUZvbnRTZWxlY3Rpb25RRFN0eWxlX2NvbG9yX2JsdWU9YWNjZXNzb3I9Y29sb3IuYmx1ZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0dEZXZpY2U9Ci1HRGV2aWNlX2dkUmVmTnVtPQotR0RldmljZV9nZElEPQotR0RldmljZV9nZFR5cGU9Ci1HRGV2aWNlX2dkSVRhYmxlPWNhc3Q9KElUYWJIYW5kbGUpCi1HRGV2aWNlX2dkUmVzUHJlZj0KLUdEZXZpY2VfZ2RTZWFyY2hQcm9jPWNhc3Q9KFNQcm9jSG5kbCkKLUdEZXZpY2VfZ2RDb21wUHJvYz1jYXN0PShDUHJvY0huZGwpCi1HRGV2aWNlX2dkRmxhZ3M9Ci1HRGV2aWNlX2dkUE1hcD1jYXN0PShQaXhNYXBIYW5kbGUpCi1HRGV2aWNlX2dkUmVmQ29uPQotR0RldmljZV9nZE5leHRHRD1jYXN0PShHREhhbmRsZSkKLUdEZXZpY2VfbGVmdD1hY2Nlc3Nvcj1nZFJlY3QubGVmdAotR0RldmljZV90b3A9YWNjZXNzb3I9Z2RSZWN0LnRvcAotR0RldmljZV9yaWdodD1hY2Nlc3Nvcj1nZFJlY3QucmlnaHQKLUdEZXZpY2VfYm90dG9tPWFjY2Vzc29yPWdkUmVjdC5ib3R0b20KLUdEZXZpY2VfZ2RNb2RlPQotR0RldmljZV9nZENDQnl0ZXM9Ci1HRGV2aWNlX2dkQ0NEZXB0aD0KLUdEZXZpY2VfZ2RDQ1hEYXRhPWNhc3Q9KEhhbmRsZSkKLUdEZXZpY2VfZ2RDQ1hNYXNrPWNhc3Q9KEhhbmRsZSkKLUdEZXZpY2VfZ2RFeHQ9Y2FzdD0oSGFuZGxlKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZD0KLUhJQ29tbWFuZF9hdHRyaWJ1dGVzPQotSElDb21tYW5kX2NvbW1hbmRJRD0KLUhJQ29tbWFuZF9tZW51X21lbnVSZWY9YWNjZXNzb3I9bWVudS5tZW51UmVmLGNhc3Q9KE1lbnVSZWYpCi1ISUNvbW1hbmRfbWVudV9tZW51SXRlbUluZGV4PWFjY2Vzc29yPW1lbnUubWVudUl0ZW1JbmRleCxjYXN0PShNZW51SXRlbUluZGV4KQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJU2Nyb2xsQmFyVHJhY2tJbmZvPQotSElTY3JvbGxCYXJUcmFja0luZm9fdmVyc2lvbj0KLUhJU2Nyb2xsQmFyVHJhY2tJbmZvX2VuYWJsZVN0YXRlPQotSElTY3JvbGxCYXJUcmFja0luZm9fcHJlc3NTdGF0ZT0KLUhJU2Nyb2xsQmFyVHJhY2tJbmZvX3ZpZXdzaXplPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVBbmltYXRpb25GcmFtZUluZm89Ci1ISVRoZW1lQW5pbWF0aW9uRnJhbWVJbmZvX2luZGV4PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVBbmltYXRpb25UaW1lSW5mbz0KLUhJVGhlbWVBbmltYXRpb25UaW1lSW5mb19zdGFydD0KLUhJVGhlbWVBbmltYXRpb25UaW1lSW5mb19jdXJyZW50PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVCYWNrZ3JvdW5kRHJhd0luZm89Ci1ISVRoZW1lQmFja2dyb3VuZERyYXdJbmZvX3ZlcnNpb249Ci1ISVRoZW1lQmFja2dyb3VuZERyYXdJbmZvX3N0YXRlPQotSElUaGVtZUJhY2tncm91bmREcmF3SW5mb19raW5kPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVCdXR0b25EcmF3SW5mbz0KLUhJVGhlbWVCdXR0b25EcmF3SW5mb192ZXJzaW9uPQotSElUaGVtZUJ1dHRvbkRyYXdJbmZvX3N0YXRlPQotSElUaGVtZUJ1dHRvbkRyYXdJbmZvX2tpbmQ9Ci1ISVRoZW1lQnV0dG9uRHJhd0luZm9fdmFsdWU9Ci1ISVRoZW1lQnV0dG9uRHJhd0luZm9fYWRvcm5tZW50PQotSElUaGVtZUJ1dHRvbkRyYXdJbmZvX3RpbWU9YWNjZXNzb3I9YW5pbWF0aW9uLnRpbWUKLUhJVGhlbWVCdXR0b25EcmF3SW5mb19mcmFtZT1hY2Nlc3Nvcj1hbmltYXRpb24uZnJhbWUKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISVRoZW1lRnJhbWVEcmF3SW5mbz0KLUhJVGhlbWVGcmFtZURyYXdJbmZvX3ZlcnNpb249Ci1ISVRoZW1lRnJhbWVEcmF3SW5mb19zdGF0ZT0KLUhJVGhlbWVGcmFtZURyYXdJbmZvX2tpbmQ9Ci1ISVRoZW1lRnJhbWVEcmF3SW5mb19pc0ZvY3VzZWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElUaGVtZUdyb3VwQm94RHJhd0luZm89Ci1ISVRoZW1lR3JvdXBCb3hEcmF3SW5mb192ZXJzaW9uPQotSElUaGVtZUdyb3VwQm94RHJhd0luZm9fc3RhdGU9Ci1ISVRoZW1lR3JvdXBCb3hEcmF3SW5mb19raW5kPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVHcm93Qm94RHJhd0luZm89Ci1ISVRoZW1lR3Jvd0JveERyYXdJbmZvX3ZlcnNpb249Ci1ISVRoZW1lR3Jvd0JveERyYXdJbmZvX2tpbmQ9Ci1ISVRoZW1lR3Jvd0JveERyYXdJbmZvX3N0YXRlPQotSElUaGVtZUdyb3dCb3hEcmF3SW5mb19kaXJlY3Rpb249Ci1ISVRoZW1lR3Jvd0JveERyYXdJbmZvX3NpemU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElUaGVtZVBvcHVwQXJyb3dEcmF3SW5mbz0KLUhJVGhlbWVQb3B1cEFycm93RHJhd0luZm9fdmVyc2lvbj0KLUhJVGhlbWVQb3B1cEFycm93RHJhd0luZm9fc3RhdGU9Ci1ISVRoZW1lUG9wdXBBcnJvd0RyYXdJbmZvX29yaWVudGF0aW9uPQotSElUaGVtZVBvcHVwQXJyb3dEcmF3SW5mb19zaXplPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVTZXBhcmF0b3JEcmF3SW5mbz0KLUhJVGhlbWVTZXBhcmF0b3JEcmF3SW5mb192ZXJzaW9uPQotSElUaGVtZVNlcGFyYXRvckRyYXdJbmZvX3N0YXRlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVUYWJEcmF3SW5mbz0KLUhJVGhlbWVUYWJEcmF3SW5mb192ZXJzaW9uPQotSElUaGVtZVRhYkRyYXdJbmZvX3N0eWxlPQotSElUaGVtZVRhYkRyYXdJbmZvX2RpcmVjdGlvbj0KLUhJVGhlbWVUYWJEcmF3SW5mb19zaXplPQotSElUaGVtZVRhYkRyYXdJbmZvX2Fkb3JubWVudD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISVRoZW1lVGFiUGFuZURyYXdJbmZvPQotSElUaGVtZVRhYlBhbmVEcmF3SW5mb192ZXJzaW9uPQotSElUaGVtZVRhYlBhbmVEcmF3SW5mb19zdGF0ZT0KLUhJVGhlbWVUYWJQYW5lRHJhd0luZm9fZGlyZWN0aW9uPQotSElUaGVtZVRhYlBhbmVEcmF3SW5mb19zaXplPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVUZXh0SW5mbz0KLUhJVGhlbWVUZXh0SW5mb192ZXJzaW9uPQotSElUaGVtZVRleHRJbmZvX3N0YXRlPQotSElUaGVtZVRleHRJbmZvX2ZvbnRJRD0KLUhJVGhlbWVUZXh0SW5mb19ob3Jpem9udGFsRmx1c2huZXNzPQotSElUaGVtZVRleHRJbmZvX3ZlcnRpY2FsRmx1c2huZXNzPQotSElUaGVtZVRleHRJbmZvX29wdGlvbnM9Ci1ISVRoZW1lVGV4dEluZm9fdHJ1bmNhdGlvblBvc2l0aW9uPQotSElUaGVtZVRleHRJbmZvX3RydW5jYXRpb25NYXhMaW5lcz0KLUhJVGhlbWVUZXh0SW5mb190cnVuY2F0aW9uSGFwcGVuZWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElUaGVtZVRyYWNrRHJhd0luZm89Ci1ISVRoZW1lVHJhY2tEcmF3SW5mb192ZXJzaW9uPQotSElUaGVtZVRyYWNrRHJhd0luZm9fa2luZD1jYXN0PVRoZW1lVHJhY2tLaW5kCi1ISVRoZW1lVHJhY2tEcmF3SW5mb19ib3VuZHNfeD1hY2Nlc3Nvcj1ib3VuZHMub3JpZ2luLngKLUhJVGhlbWVUcmFja0RyYXdJbmZvX2JvdW5kc195PWFjY2Vzc29yPWJvdW5kcy5vcmlnaW4ueQotSElUaGVtZVRyYWNrRHJhd0luZm9fYm91bmRzX3dpZHRoPWFjY2Vzc29yPWJvdW5kcy5zaXplLndpZHRoCi1ISVRoZW1lVHJhY2tEcmF3SW5mb19ib3VuZHNfaGVpZ2h0PWFjY2Vzc29yPWJvdW5kcy5zaXplLmhlaWdodAotSElUaGVtZVRyYWNrRHJhd0luZm9fbWluPQotSElUaGVtZVRyYWNrRHJhd0luZm9fbWF4PQotSElUaGVtZVRyYWNrRHJhd0luZm9fdmFsdWU9Ci1ISVRoZW1lVHJhY2tEcmF3SW5mb19yZXNlcnZlZD0KLUhJVGhlbWVUcmFja0RyYXdJbmZvX2F0dHJpYnV0ZXM9Y2FzdD1UaGVtZVRyYWNrQXR0cmlidXRlcwotSElUaGVtZVRyYWNrRHJhd0luZm9fZW5hYmxlU3RhdGU9Y2FzdD1UaGVtZVRyYWNrRW5hYmxlU3RhdGUKLUhJVGhlbWVUcmFja0RyYXdJbmZvX2ZpbGxlcjE9Ci1ISVRoZW1lVHJhY2tEcmF3SW5mb19zY3JvbGxiYXI9YWNjZXNzb3I9dHJhY2tJbmZvLnNjcm9sbGJhcgotSElUaGVtZVRyYWNrRHJhd0luZm9fc2xpZGVyPWFjY2Vzc29yPXRyYWNrSW5mby5zbGlkZXIKLUhJVGhlbWVUcmFja0RyYXdJbmZvX3Byb2dyZXNzPWFjY2Vzc29yPXRyYWNrSW5mby5wcm9ncmVzcwotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hNSGVscENvbnRlbnRSZWM9Ci1ITUhlbHBDb250ZW50UmVjX3ZlcnNpb249Ci1ITUhlbHBDb250ZW50UmVjX2Fic0hvdFJlY3RfdG9wPWFjY2Vzc29yPWFic0hvdFJlY3QudG9wCi1ITUhlbHBDb250ZW50UmVjX2Fic0hvdFJlY3RfbGVmdD1hY2Nlc3Nvcj1hYnNIb3RSZWN0LmxlZnQKLUhNSGVscENvbnRlbnRSZWNfYWJzSG90UmVjdF9ib3R0b209YWNjZXNzb3I9YWJzSG90UmVjdC5ib3R0b20KLUhNSGVscENvbnRlbnRSZWNfYWJzSG90UmVjdF9yaWdodD1hY2Nlc3Nvcj1hYnNIb3RSZWN0LnJpZ2h0Ci1ITUhlbHBDb250ZW50UmVjX3RhZ1NpZGU9Ci1ITUhlbHBDb250ZW50UmVjX2NvbnRlbnQwX2NvbnRlbnRUeXBlPWFjY2Vzc29yPWNvbnRlbnRbMF0uY29udGVudFR5cGUKLUhNSGVscENvbnRlbnRSZWNfY29udGVudDBfdGFnQ0ZTdHJpbmc9YWNjZXNzb3I9Y29udGVudFswXS51LnRhZ0NGU3RyaW5nLGNhc3Q9KENGU3RyaW5nUmVmKQotSE1IZWxwQ29udGVudFJlY19jb250ZW50MV9jb250ZW50VHlwZT1hY2Nlc3Nvcj1jb250ZW50WzFdLmNvbnRlbnRUeXBlCi1ITUhlbHBDb250ZW50UmVjX2NvbnRlbnQxX3RhZ0NGU3RyaW5nPWFjY2Vzc29yPWNvbnRlbnRbMV0udS50YWdDRlN0cmluZyxjYXN0PShDRlN0cmluZ1JlZikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9NZW51VHJhY2tpbmdEYXRhPQotTWVudVRyYWNraW5nRGF0YV9tZW51PWNhc3Q9KE1lbnVSZWYpCi1NZW51VHJhY2tpbmdEYXRhX2l0ZW1TZWxlY3RlZD0KLU1lbnVUcmFja2luZ0RhdGFfaXRlbVVuZGVyTW91c2U9Ci1NZW51VHJhY2tpbmdEYXRhX3RvcD1hY2Nlc3Nvcj1pdGVtUmVjdC50b3AKLU1lbnVUcmFja2luZ0RhdGFfbGVmdD1hY2Nlc3Nvcj1pdGVtUmVjdC5sZWZ0Ci1NZW51VHJhY2tpbmdEYXRhX2JvdHRvbT1hY2Nlc3Nvcj1pdGVtUmVjdC5ib3R0b20KLU1lbnVUcmFja2luZ0RhdGFfcmlnaHQ9YWNjZXNzb3I9aXRlbVJlY3QucmlnaHQKLU1lbnVUcmFja2luZ0RhdGFfdmlydHVhbE1lbnVUb3A9Ci1NZW51VHJhY2tpbmdEYXRhX3ZpcnR1YWxNZW51Qm90dG9tPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX05hdkRpYWxvZ0NyZWF0aW9uT3B0aW9ucz0KLU5hdkRpYWxvZ0NyZWF0aW9uT3B0aW9uc192ZXJzaW9uPQotTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zX29wdGlvbkZsYWdzPWNhc3Q9KE5hdkRpYWxvZ09wdGlvbkZsYWdzKQotTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zX2xvY2F0aW9uX2g9YWNjZXNzb3I9bG9jYXRpb24uaAotTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zX2xvY2F0aW9uX3Y9YWNjZXNzb3I9bG9jYXRpb24udgotTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zX2NsaWVudE5hbWU9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1OYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnNfd2luZG93VGl0bGU9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1OYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnNfYWN0aW9uQnV0dG9uTGFiZWw9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1OYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnNfY2FuY2VsQnV0dG9uTGFiZWw9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1OYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnNfc2F2ZUZpbGVOYW1lPWNhc3Q9KENGU3RyaW5nUmVmKQotTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zX21lc3NhZ2U9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1OYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnNfcHJlZmVyZW5jZUtleT0KLU5hdkRpYWxvZ0NyZWF0aW9uT3B0aW9uc19wb3B1cEV4dGVuc2lvbj1jYXN0PShDRkFycmF5UmVmKQotTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zX21vZGFsaXR5PWNhc3Q9KFdpbmRvd01vZGFsaXR5KQotTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zX3BhcmVudFdpbmRvdz1jYXN0PShXaW5kb3dSZWYpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fTmF2UmVwbHlSZWNvcmQ9Ci1OYXZSZXBseVJlY29yZF92ZXJzaW9uPWNhc3Q9KFVJbnQxNikKLU5hdlJlcGx5UmVjb3JkX3ZhbGlkUmVjb3JkPWNhc3Q9KEJvb2xlYW4pCi1OYXZSZXBseVJlY29yZF9yZXBsYWNpbmc9Y2FzdD0oQm9vbGVhbikKLU5hdlJlcGx5UmVjb3JkX2lzU3RhdGlvbmVyeT1jYXN0PShCb29sZWFuKQotTmF2UmVwbHlSZWNvcmRfdHJhbnNsYXRpb25OZWVkZWQ9Y2FzdD0oQm9vbGVhbikKLU5hdlJlcGx5UmVjb3JkX3NlbGVjdGlvbl9kZXNjcmlwdG9yVHlwZT1hY2Nlc3Nvcj1zZWxlY3Rpb24uZGVzY3JpcHRvclR5cGUsY2FzdD0oRGVzY1R5cGUpCi1OYXZSZXBseVJlY29yZF9zZWxlY3Rpb25fZGF0YUhhbmRsZT1hY2Nlc3Nvcj1zZWxlY3Rpb24uZGF0YUhhbmRsZSxjYXN0PShBRURhdGFTdG9yYWdlKQotTmF2UmVwbHlSZWNvcmRfa2V5U2NyaXB0PWNhc3Q9KFNjcmlwdENvZGUpCi1OYXZSZXBseVJlY29yZF9maWxlVHJhbnNsYXRpb249Y2FzdD0oRmlsZVRyYW5zbGF0aW9uU3BlY0FycmF5SGFuZGxlKQotTmF2UmVwbHlSZWNvcmRfcmVzZXJ2ZWQxPWNhc3Q9KFVJbnQzMikKLU5hdlJlcGx5UmVjb3JkX3NhdmVGaWxlTmFtZT1jYXN0PShDRlN0cmluZ1JlZikKLU5hdlJlcGx5UmVjb3JkX3NhdmVGaWxlRXh0ZW5zaW9uSGlkZGVuPWNhc3Q9KEJvb2xlYW4pCi1OYXZSZXBseVJlY29yZF9yZXNlcnZlZDI9Y2FzdD0oVUludDgpCi1OYXZSZXBseVJlY29yZF9yZXNlcnZlZD1jYXN0PShjaGFyW10pCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fT1M9Ci1PU19BRUNvdW50SXRlbXM9Ci1PU19BRUNvdW50SXRlbXNfMD1jYXN0PShjb25zdCBBRURlc2NMaXN0ICopCi1PU19BRUNvdW50SXRlbXNfMT1jYXN0PShsb25nICopCi0KLU9TX0FFR2V0TnRoUHRyPQotT1NfQUVHZXROdGhQdHJfMD1jYXN0PShjb25zdCBBRURlc2NMaXN0ICopCi1PU19BRUdldE50aFB0cl8xPQotT1NfQUVHZXROdGhQdHJfMj1jYXN0PShEZXNjVHlwZSkKLU9TX0FFR2V0TnRoUHRyXzM9Y2FzdD0oQUVLZXl3b3JkICopCi1PU19BRUdldE50aFB0cl80PWNhc3Q9KERlc2NUeXBlICopCi1PU19BRUdldE50aFB0cl81PWNhc3Q9KHZvaWQgKikKLU9TX0FFR2V0TnRoUHRyXzY9Y2FzdD0oU2l6ZSkKLU9TX0FFR2V0TnRoUHRyXzc9Y2FzdD0oU2l6ZSAqKQotCi1PU19BRUluc3RhbGxFdmVudEhhbmRsZXI9Ci1PU19BRUluc3RhbGxFdmVudEhhbmRsZXJfMD1jYXN0PUFFRXZlbnRDbGFzcwotT1NfQUVJbnN0YWxsRXZlbnRIYW5kbGVyXzE9Y2FzdD1BRUV2ZW50SUQKLU9TX0FFSW5zdGFsbEV2ZW50SGFuZGxlcl8yPWNhc3Q9KEFFRXZlbnRIYW5kbGVyVVBQKQotT1NfQUVJbnN0YWxsRXZlbnRIYW5kbGVyXzM9Y2FzdD0obG9uZykKLU9TX0FFSW5zdGFsbEV2ZW50SGFuZGxlcl80PQotCi1PU19BRVByb2Nlc3NBcHBsZUV2ZW50PQotT1NfQUVQcm9jZXNzQXBwbGVFdmVudF8wPWNhc3Q9KGNvbnN0IEV2ZW50UmVjb3JkICopCi0KLU9TX0FUU0ZvbnRHZXRQb3N0U2NyaXB0TmFtZT0KLU9TX0FUU0ZvbnRHZXRQb3N0U2NyaXB0TmFtZV8wPWNhc3Q9KEFUU0ZvbnRSZWYpCi1PU19BVFNGb250R2V0UG9zdFNjcmlwdE5hbWVfMT1jYXN0PShBVFNPcHRpb25GbGFncykKLU9TX0FUU0ZvbnRHZXRQb3N0U2NyaXB0TmFtZV8yPWNhc3Q9KENGU3RyaW5nUmVmICopCi0KLU9TX0FUU1VCYXRjaEJyZWFrTGluZXM9Ci1PU19BVFNVQmF0Y2hCcmVha0xpbmVzXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVQmF0Y2hCcmVha0xpbmVzXzE9Ci1PU19BVFNVQmF0Y2hCcmVha0xpbmVzXzI9Ci1PU19BVFNVQmF0Y2hCcmVha0xpbmVzXzM9Ci1PU19BVFNVQmF0Y2hCcmVha0xpbmVzXzQ9Y2FzdD0oSXRlbUNvdW50ICopCi0KLU9TX0FUU1VDcmVhdGVTdHlsZT0KLU9TX0FUU1VDcmVhdGVTdHlsZV8wPWNhc3Q9KEFUU1VTdHlsZSAqKQotCi1PU19BVFNVQ3JlYXRlVGV4dExheW91dD0KLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0XzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQgKikKLQotT1NfQVRTVUNyZWF0ZVRleHRMYXlvdXRXaXRoVGV4dFB0cj0KLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHJfMD1jYXN0PShDb25zdFVuaUNoYXJBcnJheVB0cikKLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHJfMT0KLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHJfMj0KLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHJfMz0KLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHJfND0KLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHJfNT1jYXN0PShjb25zdCBVbmlDaGFyQ291bnQgKikKLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHJfNj1jYXN0PShBVFNVU3R5bGUgKikKLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHJfNz1jYXN0PShBVFNVVGV4dExheW91dCAqKQotCi1PU19BVFNVRGlyZWN0R2V0TGF5b3V0RGF0YUFycmF5UHRyRnJvbVRleHRMYXlvdXQ9Ci1PU19BVFNVRGlyZWN0R2V0TGF5b3V0RGF0YUFycmF5UHRyRnJvbVRleHRMYXlvdXRfMD1jYXN0PUFUU1VUZXh0TGF5b3V0Ci1PU19BVFNVRGlyZWN0R2V0TGF5b3V0RGF0YUFycmF5UHRyRnJvbVRleHRMYXlvdXRfMT1jYXN0PVVuaUNoYXJBcnJheU9mZnNldAotT1NfQVRTVURpcmVjdEdldExheW91dERhdGFBcnJheVB0ckZyb21UZXh0TGF5b3V0XzI9Y2FzdD1BVFNVRGlyZWN0RGF0YVNlbGVjdG9yCi1PU19BVFNVRGlyZWN0R2V0TGF5b3V0RGF0YUFycmF5UHRyRnJvbVRleHRMYXlvdXRfMz1jYXN0PXZvaWQgKgotT1NfQVRTVURpcmVjdEdldExheW91dERhdGFBcnJheVB0ckZyb21UZXh0TGF5b3V0XzQ9Y2FzdD1JdGVtQ291bnQgKgotCi1PU19BVFNVRGlyZWN0UmVsZWFzZUxheW91dERhdGFBcnJheVB0cj0KLU9TX0FUU1VEaXJlY3RSZWxlYXNlTGF5b3V0RGF0YUFycmF5UHRyXzA9Y2FzdD1BVFNVTGluZVJlZgotT1NfQVRTVURpcmVjdFJlbGVhc2VMYXlvdXREYXRhQXJyYXlQdHJfMT1jYXN0PUFUU1VEaXJlY3REYXRhU2VsZWN0b3IKLU9TX0FUU1VEaXJlY3RSZWxlYXNlTGF5b3V0RGF0YUFycmF5UHRyXzI9Y2FzdD12b2lkICoKLQotT1NfQVRTVURpc3Bvc2VTdHlsZT0KLU9TX0FUU1VEaXNwb3NlU3R5bGVfMD1jYXN0PShBVFNVU3R5bGUpCi0KLU9TX0FUU1VEaXNwb3NlVGV4dExheW91dD0KLU9TX0FUU1VEaXNwb3NlVGV4dExheW91dF8wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotCi1PU19BVFNVRHJhd1RleHQ9Ci1PU19BVFNVRHJhd1RleHRfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VEcmF3VGV4dF8xPWNhc3Q9KFVuaUNoYXJBcnJheU9mZnNldCkKLU9TX0FUU1VEcmF3VGV4dF8yPWNhc3Q9KFVuaUNoYXJDb3VudCkKLU9TX0FUU1VEcmF3VGV4dF8zPWNhc3Q9KEFUU1VUZXh0TWVhc3VyZW1lbnQpCi1PU19BVFNVRHJhd1RleHRfND1jYXN0PShBVFNVVGV4dE1lYXN1cmVtZW50KQotCi1PU19BVFNVRmluZEZvbnRGcm9tTmFtZT0KLU9TX0FUU1VGaW5kRm9udEZyb21OYW1lXzA9Y2FzdD1jb25zdCB2b2lkICoKLU9TX0FUU1VGaW5kRm9udEZyb21OYW1lXzE9Ci1PU19BVFNVRmluZEZvbnRGcm9tTmFtZV8yPQotT1NfQVRTVUZpbmRGb250RnJvbU5hbWVfMz0KLU9TX0FUU1VGaW5kRm9udEZyb21OYW1lXzQ9Ci1PU19BVFNVRmluZEZvbnRGcm9tTmFtZV81PQotT1NfQVRTVUZpbmRGb250RnJvbU5hbWVfNj1jYXN0PUFUU1VGb250SUQgKgotCi1PU19BVFNVRmluZEZvbnROYW1lPQotT1NfQVRTVUZpbmRGb250TmFtZV8wPWNhc3Q9QVRTVUZvbnRJRAotT1NfQVRTVUZpbmRGb250TmFtZV8xPQotT1NfQVRTVUZpbmRGb250TmFtZV8yPQotT1NfQVRTVUZpbmRGb250TmFtZV8zPQotT1NfQVRTVUZpbmRGb250TmFtZV80PQotT1NfQVRTVUZpbmRGb250TmFtZV81PQotT1NfQVRTVUZpbmRGb250TmFtZV82PWNhc3Q9UHRyCi1PU19BVFNVRmluZEZvbnROYW1lXzc9Y2FzdD1CeXRlQ291bnQgKgotT1NfQVRTVUZpbmRGb250TmFtZV84PWNhc3Q9SXRlbUNvdW50ICoKLQotT1NfQVRTVUdldEZvbnRJRHM9Ci1PU19BVFNVR2V0Rm9udElEc18wPWNhc3Q9QVRTVUZvbnRJRCAqCi1PU19BVFNVR2V0Rm9udElEc18xPQotT1NfQVRTVUdldEZvbnRJRHNfMj1jYXN0PUl0ZW1Db3VudCAqCi0KLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUlfM0k9Ci1PU19BVFNVR2V0R2x5cGhCb3VuZHNfX0lJSUlJU0lJXzNJXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVR2V0R2x5cGhCb3VuZHNfX0lJSUlJU0lJXzNJXzE9Y2FzdD0oQVRTVVRleHRNZWFzdXJlbWVudCkKLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUlfM0lfMj1jYXN0PShBVFNVVGV4dE1lYXN1cmVtZW50KQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJSV8zSV8zPWNhc3Q9KFVuaUNoYXJBcnJheU9mZnNldCkKLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUlfM0lfND0KLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUlfM0lfNT0KLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUlfM0lfNj0KLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUlfM0lfNz1jYXN0PShBVFNUcmFwZXpvaWQgKikKLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUlfM0lfOD1jYXN0PShJdGVtQ291bnQgKikKLQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVHJhcGV6b2lkXzJfM0k9Ci1PU19BVFNVR2V0R2x5cGhCb3VuZHNfX0lJSUlJU0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNUcmFwZXpvaWRfMl8zSV8wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVHJhcGV6b2lkXzJfM0lfMT1jYXN0PShBVFNVVGV4dE1lYXN1cmVtZW50KQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVHJhcGV6b2lkXzJfM0lfMj1jYXN0PShBVFNVVGV4dE1lYXN1cmVtZW50KQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVHJhcGV6b2lkXzJfM0lfMz1jYXN0PShVbmlDaGFyQXJyYXlPZmZzZXQpCi1PU19BVFNVR2V0R2x5cGhCb3VuZHNfX0lJSUlJU0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNUcmFwZXpvaWRfMl8zSV80PQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVHJhcGV6b2lkXzJfM0lfNT0KLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1RyYXBlem9pZF8yXzNJXzY9Ci1PU19BVFNVR2V0R2x5cGhCb3VuZHNfX0lJSUlJU0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNUcmFwZXpvaWRfMl8zSV83PWNhc3Q9KEFUU1RyYXBlem9pZCAqKQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVHJhcGV6b2lkXzJfM0lfOD1jYXN0PShJdGVtQ291bnQgKikKLQotT1NfQVRTVUdldExheW91dENvbnRyb2w9Ci1PU19BVFNVR2V0TGF5b3V0Q29udHJvbF8wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVUdldExheW91dENvbnRyb2xfMT1jYXN0PUFUU1VBdHRyaWJ1dGVUYWcKLU9TX0FUU1VHZXRMYXlvdXRDb250cm9sXzI9Ci1PU19BVFNVR2V0TGF5b3V0Q29udHJvbF8zPWNhc3Q9QVRTVUF0dHJpYnV0ZVZhbHVlUHRyCi1PU19BVFNVR2V0TGF5b3V0Q29udHJvbF80PWNhc3Q9Qnl0ZUNvdW50ICoKLQotT1NfQVRTVUdldExpbmVDb250cm9sPQotT1NfQVRTVUdldExpbmVDb250cm9sXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVR2V0TGluZUNvbnRyb2xfMT1jYXN0PVVuaUNoYXJBcnJheU9mZnNldAotT1NfQVRTVUdldExpbmVDb250cm9sXzI9Y2FzdD1BVFNVQXR0cmlidXRlVGFnCi1PU19BVFNVR2V0TGluZUNvbnRyb2xfMz1jYXN0PUJ5dGVDb3VudAotT1NfQVRTVUdldExpbmVDb250cm9sXzQ9Y2FzdD1BVFNVQXR0cmlidXRlVmFsdWVQdHIKLU9TX0FUU1VHZXRMaW5lQ29udHJvbF81PWNhc3Q9Qnl0ZUNvdW50ICoKLQotT1NfQVRTVUdldFNvZnRMaW5lQnJlYWtzPQotT1NfQVRTVUdldFNvZnRMaW5lQnJlYWtzXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVR2V0U29mdExpbmVCcmVha3NfMT1jYXN0PShVbmlDaGFyQXJyYXlPZmZzZXQpCi1PU19BVFNVR2V0U29mdExpbmVCcmVha3NfMj1jYXN0PShVbmlDaGFyQ291bnQpCi1PU19BVFNVR2V0U29mdExpbmVCcmVha3NfMz1jYXN0PShJdGVtQ291bnQpCi1PU19BVFNVR2V0U29mdExpbmVCcmVha3NfND1jYXN0PShVbmlDaGFyQXJyYXlPZmZzZXQgKikKLU9TX0FUU1VHZXRTb2Z0TGluZUJyZWFrc181PWNhc3Q9KEl0ZW1Db3VudCAqKQotCi1PU19BVFNVR2V0VGV4dEhpZ2hsaWdodD0KLU9TX0FUU1VHZXRUZXh0SGlnaGxpZ2h0XzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVR2V0VGV4dEhpZ2hsaWdodF8xPQotT1NfQVRTVUdldFRleHRIaWdobGlnaHRfMj0KLU9TX0FUU1VHZXRUZXh0SGlnaGxpZ2h0XzM9Ci1PU19BVFNVR2V0VGV4dEhpZ2hsaWdodF80PQotT1NfQVRTVUdldFRleHRIaWdobGlnaHRfNT1jYXN0PVJnbkhhbmRsZQotCi1PU19BVFNVR2V0VW5qdXN0aWZpZWRCb3VuZHM9Ci1PU19BVFNVR2V0VW5qdXN0aWZpZWRCb3VuZHNfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VHZXRVbmp1c3RpZmllZEJvdW5kc18xPQotT1NfQVRTVUdldFVuanVzdGlmaWVkQm91bmRzXzI9Ci1PU19BVFNVR2V0VW5qdXN0aWZpZWRCb3VuZHNfMz1jYXN0PUFUU1VUZXh0TWVhc3VyZW1lbnQgKgotT1NfQVRTVUdldFVuanVzdGlmaWVkQm91bmRzXzQ9Y2FzdD1BVFNVVGV4dE1lYXN1cmVtZW50ICoKLU9TX0FUU1VHZXRVbmp1c3RpZmllZEJvdW5kc181PWNhc3Q9QVRTVVRleHRNZWFzdXJlbWVudCAqCi1PU19BVFNVR2V0VW5qdXN0aWZpZWRCb3VuZHNfNj1jYXN0PUFUU1VUZXh0TWVhc3VyZW1lbnQgKgotCi1PU19BVFNVR2x5cGhHZXRRdWFkcmF0aWNQYXRocz0KLU9TX0FUU1VHbHlwaEdldFF1YWRyYXRpY1BhdGhzXzA9Y2FzdD1BVFNVU3R5bGUKLU9TX0FUU1VHbHlwaEdldFF1YWRyYXRpY1BhdGhzXzE9Y2FzdD1HbHlwaElECi1PU19BVFNVR2x5cGhHZXRRdWFkcmF0aWNQYXRoc18yPWNhc3Q9QVRTUXVhZHJhdGljTmV3UGF0aFVQUAotT1NfQVRTVUdseXBoR2V0UXVhZHJhdGljUGF0aHNfMz1jYXN0PUFUU1F1YWRyYXRpY0xpbmVVUFAKLU9TX0FUU1VHbHlwaEdldFF1YWRyYXRpY1BhdGhzXzQ9Y2FzdD1BVFNRdWFkcmF0aWNDdXJ2ZVVQUAotT1NfQVRTVUdseXBoR2V0UXVhZHJhdGljUGF0aHNfNT1jYXN0PUFUU1F1YWRyYXRpY0Nsb3NlUGF0aFVQUAotT1NfQVRTVUdseXBoR2V0UXVhZHJhdGljUGF0aHNfNj1jYXN0PXZvaWQgKgotT1NfQVRTVUdseXBoR2V0UXVhZHJhdGljUGF0aHNfNz1jYXN0PU9TU3RhdHVzICoKLQotT1NfQVRTVUhpZ2hsaWdodFRleHQ9Ci1PU19BVFNVSGlnaGxpZ2h0VGV4dF8wPWNhc3Q9QVRTVVRleHRMYXlvdXQKLU9TX0FUU1VIaWdobGlnaHRUZXh0XzE9Y2FzdD1BVFNVVGV4dE1lYXN1cmVtZW50Ci1PU19BVFNVSGlnaGxpZ2h0VGV4dF8yPWNhc3Q9QVRTVVRleHRNZWFzdXJlbWVudAotT1NfQVRTVUhpZ2hsaWdodFRleHRfMz0KLU9TX0FUU1VIaWdobGlnaHRUZXh0XzQ9Ci0KLU9TX0FUU1VOZXh0Q3Vyc29yUG9zaXRpb249Ci1PU19BVFNVTmV4dEN1cnNvclBvc2l0aW9uXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVTmV4dEN1cnNvclBvc2l0aW9uXzE9Y2FzdD0oVW5pQ2hhckFycmF5T2Zmc2V0KQotT1NfQVRTVU5leHRDdXJzb3JQb3NpdGlvbl8yPWNhc3Q9KEFUU1VDdXJzb3JNb3ZlbWVudFR5cGUpCi1PU19BVFNVTmV4dEN1cnNvclBvc2l0aW9uXzM9Y2FzdD0oVW5pQ2hhckFycmF5T2Zmc2V0ICopCi0KLU9TX0FUU1VPZmZzZXRUb1Bvc2l0aW9uPQotT1NfQVRTVU9mZnNldFRvUG9zaXRpb25fMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VPZmZzZXRUb1Bvc2l0aW9uXzE9Ci1PU19BVFNVT2Zmc2V0VG9Qb3NpdGlvbl8yPQotT1NfQVRTVU9mZnNldFRvUG9zaXRpb25fMz0KLU9TX0FUU1VPZmZzZXRUb1Bvc2l0aW9uXzQ9Ci1PU19BVFNVT2Zmc2V0VG9Qb3NpdGlvbl81PWNhc3Q9Qm9vbGVhbiAqCi0KLU9TX0FUU1VQb3NpdGlvblRvT2Zmc2V0PQotT1NfQVRTVVBvc2l0aW9uVG9PZmZzZXRfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VQb3NpdGlvblRvT2Zmc2V0XzE9Ci1PU19BVFNVUG9zaXRpb25Ub09mZnNldF8yPQotT1NfQVRTVVBvc2l0aW9uVG9PZmZzZXRfMz1jYXN0PVVuaUNoYXJBcnJheU9mZnNldCAqCi1PU19BVFNVUG9zaXRpb25Ub09mZnNldF80PWNhc3Q9Qm9vbGVhbiAqCi1PU19BVFNVUG9zaXRpb25Ub09mZnNldF81PWNhc3Q9VW5pQ2hhckFycmF5T2Zmc2V0ICoKLQotT1NfQVRTVVByZXZpb3VzQ3Vyc29yUG9zaXRpb249Ci1PU19BVFNVUHJldmlvdXNDdXJzb3JQb3NpdGlvbl8wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVVByZXZpb3VzQ3Vyc29yUG9zaXRpb25fMT1jYXN0PShVbmlDaGFyQXJyYXlPZmZzZXQpCi1PU19BVFNVUHJldmlvdXNDdXJzb3JQb3NpdGlvbl8yPWNhc3Q9KEFUU1VDdXJzb3JNb3ZlbWVudFR5cGUpCi1PU19BVFNVUHJldmlvdXNDdXJzb3JQb3NpdGlvbl8zPWNhc3Q9KFVuaUNoYXJBcnJheU9mZnNldCAqKQotCi1PU19BVFNVU2V0QXR0cmlidXRlcz0KLU9TX0FUU1VTZXRBdHRyaWJ1dGVzXzA9Y2FzdD0oQVRTVVN0eWxlKQotT1NfQVRTVVNldEF0dHJpYnV0ZXNfMT1jYXN0PShJdGVtQ291bnQpCi1PU19BVFNVU2V0QXR0cmlidXRlc18yPWNhc3Q9KEFUU1VBdHRyaWJ1dGVUYWcgKikKLU9TX0FUU1VTZXRBdHRyaWJ1dGVzXzM9Y2FzdD0oQnl0ZUNvdW50ICopCi1PU19BVFNVU2V0QXR0cmlidXRlc180PWNhc3Q9KEFUU1VBdHRyaWJ1dGVWYWx1ZVB0ciAqKQotCi1PU19BVFNVU2V0Rm9udEZlYXR1cmVzPQotT1NfQVRTVVNldEZvbnRGZWF0dXJlc18wPWNhc3Q9KEFUU1VTdHlsZSkKLU9TX0FUU1VTZXRGb250RmVhdHVyZXNfMT1jYXN0PShJdGVtQ291bnQpCi1PU19BVFNVU2V0Rm9udEZlYXR1cmVzXzI9Y2FzdD0oY29uc3QgQVRTVUZvbnRGZWF0dXJlVHlwZSAqKQotT1NfQVRTVVNldEZvbnRGZWF0dXJlc18zPWNhc3Q9KGNvbnN0IEFUU1VGb250RmVhdHVyZVNlbGVjdG9yICopCi0KLU9TX0FUU1VTZXRIaWdobGlnaHRpbmdNZXRob2Q9Ci1PU19BVFNVU2V0SGlnaGxpZ2h0aW5nTWV0aG9kXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVU2V0SGlnaGxpZ2h0aW5nTWV0aG9kXzE9Ci1PU19BVFNVU2V0SGlnaGxpZ2h0aW5nTWV0aG9kXzI9Ci0KLU9TX0FUU1VTZXRMYXlvdXRDb250cm9scz0KLU9TX0FUU1VTZXRMYXlvdXRDb250cm9sc18wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVVNldExheW91dENvbnRyb2xzXzE9Y2FzdD0oSXRlbUNvdW50KQotT1NfQVRTVVNldExheW91dENvbnRyb2xzXzI9Y2FzdD0oQVRTVUF0dHJpYnV0ZVRhZyAqKQotT1NfQVRTVVNldExheW91dENvbnRyb2xzXzM9Y2FzdD0oQnl0ZUNvdW50ICopCi1PU19BVFNVU2V0TGF5b3V0Q29udHJvbHNfND1jYXN0PShBVFNVQXR0cmlidXRlVmFsdWVQdHIgKikKLQotT1NfQVRTVVNldExpbmVDb250cm9scz0KLU9TX0FUU1VTZXRMaW5lQ29udHJvbHNfMD1jYXN0PUFUU1VUZXh0TGF5b3V0Ci1PU19BVFNVU2V0TGluZUNvbnRyb2xzXzE9Y2FzdD1VbmlDaGFyQXJyYXlPZmZzZXQKLU9TX0FUU1VTZXRMaW5lQ29udHJvbHNfMj1jYXN0PUl0ZW1Db3VudAotT1NfQVRTVVNldExpbmVDb250cm9sc18zPWNhc3Q9Y29uc3QgQVRTVUF0dHJpYnV0ZVRhZyAqCi1PU19BVFNVU2V0TGluZUNvbnRyb2xzXzQ9Y2FzdD1jb25zdCBCeXRlQ291bnQgKgotT1NfQVRTVVNldExpbmVDb250cm9sc181PWNhc3Q9Y29uc3QgQVRTVUF0dHJpYnV0ZVZhbHVlUHRyICoKLQotT1NfQVRTVVNldFJ1blN0eWxlPQotT1NfQVRTVVNldFJ1blN0eWxlXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVU2V0UnVuU3R5bGVfMT1jYXN0PShBVFNVU3R5bGUpCi1PU19BVFNVU2V0UnVuU3R5bGVfMj1jYXN0PShVbmlDaGFyQXJyYXlPZmZzZXQpCi1PU19BVFNVU2V0UnVuU3R5bGVfMz1jYXN0PShVbmlDaGFyQ291bnQpCi0KLU9TX0FUU1VTZXRTb2Z0TGluZUJyZWFrPQotT1NfQVRTVVNldFNvZnRMaW5lQnJlYWtfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VTZXRTb2Z0TGluZUJyZWFrXzE9Ci0KLU9TX0FUU1VTZXRUYWJBcnJheT0KLU9TX0FUU1VTZXRUYWJBcnJheV8wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVVNldFRhYkFycmF5XzE9Y2FzdD1jb25zdCBBVFNVVGFiICoKLU9TX0FUU1VTZXRUYWJBcnJheV8yPQotCi1PU19BVFNVU2V0VGV4dFBvaW50ZXJMb2NhdGlvbj0KLU9TX0FUU1VTZXRUZXh0UG9pbnRlckxvY2F0aW9uXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVU2V0VGV4dFBvaW50ZXJMb2NhdGlvbl8xPWNhc3Q9KENvbnN0VW5pQ2hhckFycmF5UHRyKQotT1NfQVRTVVNldFRleHRQb2ludGVyTG9jYXRpb25fMj1jYXN0PShVbmlDaGFyQXJyYXlPZmZzZXQpCi1PU19BVFNVU2V0VGV4dFBvaW50ZXJMb2NhdGlvbl8zPWNhc3Q9KFVuaUNoYXJDb3VudCkKLU9TX0FUU1VTZXRUZXh0UG9pbnRlckxvY2F0aW9uXzQ9Y2FzdD0oVW5pQ2hhckNvdW50KQotCi1PU19BVFNVU2V0VHJhbnNpZW50Rm9udE1hdGNoaW5nPQotT1NfQVRTVVNldFRyYW5zaWVudEZvbnRNYXRjaGluZ18wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVVNldFRyYW5zaWVudEZvbnRNYXRjaGluZ18xPQotCi1PU19BVFNVVGV4dERlbGV0ZWQ9Ci1PU19BVFNVVGV4dERlbGV0ZWRfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VUZXh0RGVsZXRlZF8xPQotT1NfQVRTVVRleHREZWxldGVkXzI9Ci0KLU9TX0FUU1VUZXh0SW5zZXJ0ZWQ9Ci1PU19BVFNVVGV4dEluc2VydGVkXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVVGV4dEluc2VydGVkXzE9Ci1PU19BVFNVVGV4dEluc2VydGVkXzI9Ci0KLU9TX0FjdGl2ZU5vbkZsb2F0aW5nV2luZG93PQotCi1PU19BZGREYXRhQnJvd3Nlckl0ZW1zPQotT1NfQWRkRGF0YUJyb3dzZXJJdGVtc18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19BZGREYXRhQnJvd3Nlckl0ZW1zXzE9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtSUQpCi1PU19BZGREYXRhQnJvd3Nlckl0ZW1zXzI9Y2FzdD0oVUludDMyKQotT1NfQWRkRGF0YUJyb3dzZXJJdGVtc18zPWNhc3Q9KGNvbnN0IERhdGFCcm93c2VySXRlbUlEICopCi1PU19BZGREYXRhQnJvd3Nlckl0ZW1zXzQ9Y2FzdD0oRGF0YUJyb3dzZXJQcm9wZXJ0eUlEKQotCi1PU19BZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uPQotT1NfQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19BZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uXzE9Y2FzdD0oRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MgKiksZmxhZ3M9aW5pdAotT1NfQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbl8yPWNhc3Q9KERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uSW5kZXgpCi0KLU9TX0FkZERyYWdJdGVtRmxhdm9yPQotT1NfQWRkRHJhZ0l0ZW1GbGF2b3JfMD1jYXN0PShEcmFnUmVmKQotT1NfQWRkRHJhZ0l0ZW1GbGF2b3JfMT1jYXN0PShEcmFnSXRlbVJlZikKLU9TX0FkZERyYWdJdGVtRmxhdm9yXzI9Y2FzdD0oRmxhdm9yVHlwZSkKLU9TX0FkZERyYWdJdGVtRmxhdm9yXzM9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfQWRkRHJhZ0l0ZW1GbGF2b3JfND1jYXN0PShTaXplKQotT1NfQWRkRHJhZ0l0ZW1GbGF2b3JfNT1jYXN0PShGbGF2b3JGbGFncykKLQotT1NfQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nPQotT1NfQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nXzA9Y2FzdD0oTWVudVJlZikKLU9TX0FwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZ18xPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nXzI9Y2FzdD0oTWVudUl0ZW1BdHRyaWJ1dGVzKQotT1NfQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nXzM9Y2FzdD0oTWVudUNvbW1hbmQpCi1PU19BcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmdfND1jYXN0PShNZW51SXRlbUluZGV4ICopCi0KLU9TX0F1dG9TaXplRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbnM9Ci1PU19BdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zXzA9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfQmVnaW5VcGRhdGU9Ci1PU19CZWdpblVwZGF0ZV8wPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfQnJpbmdUb0Zyb250PQotT1NfQnJpbmdUb0Zyb250XzA9Y2FzdD0oV2luZG93UmVmKQotCi1PU19DRkFycmF5QXBwZW5kVmFsdWU9Ci1PU19DRkFycmF5QXBwZW5kVmFsdWVfMD1jYXN0PShDRk11dGFibGVBcnJheVJlZikKLU9TX0NGQXJyYXlBcHBlbmRWYWx1ZV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfQ0ZBcnJheUNyZWF0ZU11dGFibGU9Ci1PU19DRkFycmF5Q3JlYXRlTXV0YWJsZV8wPWNhc3Q9KENGQWxsb2NhdG9yUmVmKQotT1NfQ0ZBcnJheUNyZWF0ZU11dGFibGVfMT1jYXN0PShDRkluZGV4KQotT1NfQ0ZBcnJheUNyZWF0ZU11dGFibGVfMj1jYXN0PShjb25zdCBDRkFycmF5Q2FsbEJhY2tzICopCi0KLU9TX0NGQXJyYXlHZXRDb3VudD0KLU9TX0NGQXJyYXlHZXRDb3VudF8wPWNhc3Q9KENGQXJyYXlSZWYpCi0KLU9TX0NGQXJyYXlHZXRWYWx1ZUF0SW5kZXg9Ci1PU19DRkFycmF5R2V0VmFsdWVBdEluZGV4XzA9Y2FzdD0oQ0ZBcnJheVJlZikKLU9TX0NGQXJyYXlHZXRWYWx1ZUF0SW5kZXhfMT0KLQotT1NfQ0ZEYXRhR2V0Qnl0ZXM9Ci1PU19DRkRhdGFHZXRCeXRlc18wPWNhc3Q9KENGRGF0YVJlZikKLU9TX0NGRGF0YUdldEJ5dGVzXzE9ZmxhZ3M9c3RydWN0Ci1PU19DRkRhdGFHZXRCeXRlc18yPWNhc3Q9KFVJbnQ4ICopCi0KLU9TX0NGRGF0YUdldExlbmd0aD0KLU9TX0NGRGF0YUdldExlbmd0aF8wPWNhc3Q9KENGRGF0YVJlZikKLQotT1NfQ0ZMb2NhbGVDb3B5Q3VycmVudD0KLQotT1NfQ0ZOdW1iZXJGb3JtYXR0ZXJDb3B5UHJvcGVydHk9Ci1PU19DRk51bWJlckZvcm1hdHRlckNvcHlQcm9wZXJ0eV8wPWNhc3Q9Q0ZOdW1iZXJGb3JtYXR0ZXJSZWYKLU9TX0NGTnVtYmVyRm9ybWF0dGVyQ29weVByb3BlcnR5XzE9Y2FzdD1DRlN0cmluZ1JlZgotCi1PU19DRk51bWJlckZvcm1hdHRlckNyZWF0ZT0KLU9TX0NGTnVtYmVyRm9ybWF0dGVyQ3JlYXRlXzA9Y2FzdD1DRkFsbG9jYXRvclJlZgotT1NfQ0ZOdW1iZXJGb3JtYXR0ZXJDcmVhdGVfMT1jYXN0PUNGTG9jYWxlUmVmCi1PU19DRk51bWJlckZvcm1hdHRlckNyZWF0ZV8yPWNhc3Q9Q0ZOdW1iZXJGb3JtYXR0ZXJTdHlsZQotCi1PU19DRlJlbGVhc2U9Ci1PU19DRlJlbGVhc2VfMD1jYXN0PShDRlR5cGVSZWYpCi0KLU9TX0NGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzPQotT1NfQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXNfMD1jYXN0PShDRkFsbG9jYXRvclJlZikKLU9TX0NGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzXzE9Y2FzdD0oY29uc3QgVUludDggKikKLU9TX0NGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzXzI9Y2FzdD0oQ0ZJbmRleCkKLU9TX0NGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzXzM9Y2FzdD0oQ0ZTdHJpbmdFbmNvZGluZykKLU9TX0NGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzXzQ9Ci0KLU9TX0NGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNfX0lJST0KLU9TX0NGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNfX0lJSV8wPWNhc3Q9KENGQWxsb2NhdG9yUmVmKQotT1NfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc19fSUlJXzE9Y2FzdD0oY29uc3QgVW5pQ2hhciAqKQotT1NfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc19fSUlJXzI9Y2FzdD0oQ0ZJbmRleCkKLQotT1NfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc19fSV8zQ0k9Ci1PU19DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzX19JXzNDSV8wPWNhc3Q9KENGQWxsb2NhdG9yUmVmKQotT1NfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc19fSV8zQ0lfMT1jYXN0PShjb25zdCBVbmlDaGFyICopCi1PU19DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzX19JXzNDSV8yPWNhc3Q9KENGSW5kZXgpCi0KLU9TX0NGU3RyaW5nR2V0Qnl0ZXM9Ci1PU19DRlN0cmluZ0dldEJ5dGVzXzA9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19DRlN0cmluZ0dldEJ5dGVzXzE9Y2FzdD0oQ0ZSYW5nZSAqKSxmbGFncz1zdHJ1Y3QKLU9TX0NGU3RyaW5nR2V0Qnl0ZXNfMj1jYXN0PShDRlN0cmluZ0VuY29kaW5nKQotT1NfQ0ZTdHJpbmdHZXRCeXRlc18zPWNhc3Q9KFVJbnQ4KQotT1NfQ0ZTdHJpbmdHZXRCeXRlc180PWNhc3Q9KEJvb2xlYW4pCi1PU19DRlN0cmluZ0dldEJ5dGVzXzU9Y2FzdD0oVUludDggKikKLU9TX0NGU3RyaW5nR2V0Qnl0ZXNfNj1jYXN0PShDRkluZGV4KQotT1NfQ0ZTdHJpbmdHZXRCeXRlc183PWNhc3Q9KENGSW5kZXggKikKLQotT1NfQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzPQotT1NfQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzXzA9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19DRlN0cmluZ0dldENoYXJhY3RlcnNfMT1jYXN0PShDRlJhbmdlICopLGZsYWdzPXN0cnVjdAotT1NfQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzXzI9Y2FzdD0oVW5pQ2hhciAqKQotCi1PU19DRlN0cmluZ0dldExlbmd0aD0KLU9TX0NGU3RyaW5nR2V0TGVuZ3RoXzA9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi0KLU9TX0NGU3RyaW5nR2V0U3lzdGVtRW5jb2Rpbmc9Ci0KLU9TX0NGVVJMQ29weUZpbGVTeXN0ZW1QYXRoPQotT1NfQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGhfMD1jYXN0PShDRlVSTFJlZikKLU9TX0NGVVJMQ29weUZpbGVTeXN0ZW1QYXRoXzE9Y2FzdD0oQ0ZVUkxQYXRoU3R5bGUpCi0KLU9TX0NGVVJMQ29weUxhc3RQYXRoQ29tcG9uZW50PQotT1NfQ0ZVUkxDb3B5TGFzdFBhdGhDb21wb25lbnRfMD1jYXN0PShDRlVSTFJlZikKLQotT1NfQ0ZVUkxDb3B5UGF0aEV4dGVuc2lvbj0KLU9TX0NGVVJMQ29weVBhdGhFeHRlbnNpb25fMD1jYXN0PUNGVVJMUmVmCi0KLU9TX0NGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhDb21wb25lbnQ9Ci1PU19DRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50XzA9Y2FzdD0oQ0ZBbGxvY2F0b3JSZWYpCi1PU19DRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50XzE9Y2FzdD0oQ0ZVUkxSZWYpCi1PU19DRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50XzI9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19DRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50XzM9Y2FzdD0oQm9vbGVhbikKLQotT1NfQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudD0KLU9TX0NGVVJMQ3JlYXRlQ29weURlbGV0aW5nTGFzdFBhdGhDb21wb25lbnRfMD1jYXN0PShDRkFsbG9jYXRvclJlZikKLU9TX0NGVVJMQ3JlYXRlQ29weURlbGV0aW5nTGFzdFBhdGhDb21wb25lbnRfMT1jYXN0PShDRlVSTFJlZikKLQotT1NfQ0ZVUkxDcmVhdGVEYXRhPQotT1NfQ0ZVUkxDcmVhdGVEYXRhXzA9Y2FzdD0oQ0ZBbGxvY2F0b3JSZWYpCi1PU19DRlVSTENyZWF0ZURhdGFfMT1jYXN0PShDRlVSTFJlZikKLU9TX0NGVVJMQ3JlYXRlRGF0YV8yPWNhc3Q9KENGU3RyaW5nRW5jb2RpbmcpCi1PU19DRlVSTENyZWF0ZURhdGFfMz1jYXN0PShCb29sZWFuKQotCi1PU19DRlVSTENyZWF0ZUZyb21GU1JlZj0KLU9TX0NGVVJMQ3JlYXRlRnJvbUZTUmVmXzA9Y2FzdD0oQ0ZBbGxvY2F0b3JSZWYpCi1PU19DRlVSTENyZWF0ZUZyb21GU1JlZl8xPWNhc3Q9KGNvbnN0IHN0cnVjdCBGU1JlZiAqKQotCi1PU19DRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb249Ci1PU19DRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb25fMD1jYXN0PUNGQWxsb2NhdG9yUmVmCi1PU19DRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb25fMT1jYXN0PWNvbnN0IFVJbnQ4ICoKLU9TX0NGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbl8yPQotT1NfQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uXzM9Ci0KLU9TX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzPQotT1NfQ0ZVUkxDcmVhdGVXaXRoQnl0ZXNfMD1jYXN0PShDRkFsbG9jYXRvclJlZikKLU9TX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzXzE9Y2FzdD0oY29uc3QgVUludDggKikKLU9TX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzXzI9Y2FzdD0oQ0ZJbmRleCkKLU9TX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzXzM9Y2FzdD0oQ0ZTdHJpbmdFbmNvZGluZykKLU9TX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzXzQ9Y2FzdD0oQ0ZVUkxSZWYpCi0KLU9TX0NGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoPQotT1NfQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGhfMD1jYXN0PShDRkFsbG9jYXRvclJlZikKLU9TX0NGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19DRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aF8yPWNhc3Q9KENGVVJMUGF0aFN0eWxlKQotT1NfQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGhfMz0KLQotT1NfQ0ZVUkxHZXRGU1JlZj0KLU9TX0NGVVJMR2V0RlNSZWZfMD1jYXN0PShDRlVSTFJlZikKLU9TX0NGVVJMR2V0RlNSZWZfMT1jYXN0PShzdHJ1Y3QgRlNSZWYgKikKLQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQ9ZmxhZ3M9bm9fZ2VuCi1PU19DR0FmZmluZVRyYW5zZm9ybUNvbmNhdF8wPQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXRfMT0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtQ29uY2F0XzI9Ci0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtSW52ZXJ0PWZsYWdzPW5vX2dlbgotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1JbnZlcnRfMD0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtSW52ZXJ0XzE9Ci0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtTWFrZT1mbGFncz1ub19nZW4KLU9TX0NHQWZmaW5lVHJhbnNmb3JtTWFrZV8wPQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlXzE9Ci1PU19DR0FmZmluZVRyYW5zZm9ybU1ha2VfMj0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtTWFrZV8zPQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlXzQ9Ci1PU19DR0FmZmluZVRyYW5zZm9ybU1ha2VfNT0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtTWFrZV82PQotCi1PU19DR0FmZmluZVRyYW5zZm9ybVJvdGF0ZT1mbGFncz1ub19nZW4KLU9TX0NHQWZmaW5lVHJhbnNmb3JtUm90YXRlXzA9Ci1PU19DR0FmZmluZVRyYW5zZm9ybVJvdGF0ZV8xPQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1Sb3RhdGVfMj0KLQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1TY2FsZT1mbGFncz1ub19nZW4KLU9TX0NHQWZmaW5lVHJhbnNmb3JtU2NhbGVfMD0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtU2NhbGVfMT0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtU2NhbGVfMj0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtU2NhbGVfMz0KLQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1UcmFuc2xhdGU9ZmxhZ3M9bm9fZ2VuCi1PU19DR0FmZmluZVRyYW5zZm9ybVRyYW5zbGF0ZV8wPQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1UcmFuc2xhdGVfMT0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtVHJhbnNsYXRlXzI9Ci1PU19DR0FmZmluZVRyYW5zZm9ybVRyYW5zbGF0ZV8zPQotCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGU9Ci1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfMD1jYXN0PSh2b2lkICopCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfMT1jYXN0PShzaXplX3QpCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfMj1jYXN0PShzaXplX3QpCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfMz1jYXN0PShzaXplX3QpCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfND1jYXN0PShzaXplX3QpCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfNT1jYXN0PShDR0NvbG9yU3BhY2VSZWYpCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfNj1jYXN0PShDR0ltYWdlQWxwaGFJbmZvKQotCi1PU19DR0NvbG9yQ3JlYXRlPQotT1NfQ0dDb2xvckNyZWF0ZV8wPWNhc3Q9KENHQ29sb3JTcGFjZVJlZikKLU9TX0NHQ29sb3JDcmVhdGVfMT0KLQotT1NfQ0dDb2xvclJlbGVhc2U9Ci1PU19DR0NvbG9yUmVsZWFzZV8wPWNhc3Q9Q0dDb2xvclJlZgotCi1PU19DR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0I9Ci0KLU9TX0NHQ29sb3JTcGFjZUNyZWF0ZVBhdHRlcm49Ci1PU19DR0NvbG9yU3BhY2VDcmVhdGVQYXR0ZXJuXzA9Y2FzdD1DR0NvbG9yU3BhY2VSZWYKLQotT1NfQ0dDb2xvclNwYWNlUmVsZWFzZT0KLU9TX0NHQ29sb3JTcGFjZVJlbGVhc2VfMD1jYXN0PShDR0NvbG9yU3BhY2VSZWYpCi0KLU9TX0NHQ29udGV4dEFkZEFyYz0KLU9TX0NHQ29udGV4dEFkZEFyY18wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dEFkZEFyY18xPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0QWRkQXJjXzI9Y2FzdD0oZmxvYXQpCi1PU19DR0NvbnRleHRBZGRBcmNfMz1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dEFkZEFyY180PWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0QWRkQXJjXzU9Y2FzdD0oZmxvYXQpCi1PU19DR0NvbnRleHRBZGRBcmNfNj1jYXN0PShCb29sZWFuKQotCi1PU19DR0NvbnRleHRBZGRBcmNUb1BvaW50PQotT1NfQ0dDb250ZXh0QWRkQXJjVG9Qb2ludF8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dEFkZEFyY1RvUG9pbnRfMT0KLU9TX0NHQ29udGV4dEFkZEFyY1RvUG9pbnRfMj0KLU9TX0NHQ29udGV4dEFkZEFyY1RvUG9pbnRfMz0KLU9TX0NHQ29udGV4dEFkZEFyY1RvUG9pbnRfND0KLU9TX0NHQ29udGV4dEFkZEFyY1RvUG9pbnRfNT0KLQotT1NfQ0dDb250ZXh0QWRkTGluZVRvUG9pbnQ9Ci1PU19DR0NvbnRleHRBZGRMaW5lVG9Qb2ludF8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dEFkZExpbmVUb1BvaW50XzE9Ci1PU19DR0NvbnRleHRBZGRMaW5lVG9Qb2ludF8yPQotCi1PU19DR0NvbnRleHRBZGRMaW5lcz0KLU9TX0NHQ29udGV4dEFkZExpbmVzXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0QWRkTGluZXNfMT1jYXN0PShjb25zdCBDR1BvaW50ICopCi1PU19DR0NvbnRleHRBZGRMaW5lc18yPWNhc3Q9KHNpemVfdCkKLQotT1NfQ0dDb250ZXh0QWRkUGF0aD0KLU9TX0NHQ29udGV4dEFkZFBhdGhfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRBZGRQYXRoXzE9Y2FzdD1DR1BhdGhSZWYKLQotT1NfQ0dDb250ZXh0QmVnaW5QYXRoPQotT1NfQ0dDb250ZXh0QmVnaW5QYXRoXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotCi1PU19DR0NvbnRleHRDbGVhclJlY3Q9Ci1PU19DR0NvbnRleHRDbGVhclJlY3RfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRDbGVhclJlY3RfMT1jYXN0PShDR1JlY3QgKiksZmxhZ3M9c3RydWN0Ci0KLU9TX0NHQ29udGV4dENsaXA9Ci1PU19DR0NvbnRleHRDbGlwXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotCi1PU19DR0NvbnRleHRDbG9zZVBhdGg9Ci1PU19DR0NvbnRleHRDbG9zZVBhdGhfMD1jYXN0PShDR0NvbnRleHRSZWYpCi0KLU9TX0NHQ29udGV4dENvbmNhdENUTT0KLU9TX0NHQ29udGV4dENvbmNhdENUTV8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dENvbmNhdENUTV8xPWNhc3Q9KENHQWZmaW5lVHJhbnNmb3JtICopLGZsYWdzPXN0cnVjdAotCi1PU19DR0NvbnRleHREcmF3SW1hZ2U9Ci1PU19DR0NvbnRleHREcmF3SW1hZ2VfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHREcmF3SW1hZ2VfMT1jYXN0PShDR1JlY3QgKiksZmxhZ3M9c3RydWN0Ci1PU19DR0NvbnRleHREcmF3SW1hZ2VfMj1jYXN0PShDR0ltYWdlUmVmKQotCi1PU19DR0NvbnRleHREcmF3U2hhZGluZz0KLU9TX0NHQ29udGV4dERyYXdTaGFkaW5nXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0RHJhd1NoYWRpbmdfMT1jYXN0PUNHU2hhZGluZ1JlZgotCi1PU19DR0NvbnRleHRFT0NsaXA9Ci1PU19DR0NvbnRleHRFT0NsaXBfMD1jYXN0PShDR0NvbnRleHRSZWYpCi0KLU9TX0NHQ29udGV4dEVPRmlsbFBhdGg9Ci1PU19DR0NvbnRleHRFT0ZpbGxQYXRoXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotCi1PU19DR0NvbnRleHRGaWxsUGF0aD0KLU9TX0NHQ29udGV4dEZpbGxQYXRoXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotCi1PU19DR0NvbnRleHRGaWxsUmVjdD0KLU9TX0NHQ29udGV4dEZpbGxSZWN0XzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0RmlsbFJlY3RfMT1jYXN0PShDR1JlY3QgKiksZmxhZ3M9c3RydWN0Ci0KLU9TX0NHQ29udGV4dEZsdXNoPQotT1NfQ0dDb250ZXh0Rmx1c2hfMD1jYXN0PShDR0NvbnRleHRSZWYpCi0KLU9TX0NHQ29udGV4dEdldENUTT1mbGFncz1ub19nZW4KLU9TX0NHQ29udGV4dEdldENUTV8wPQotT1NfQ0dDb250ZXh0R2V0Q1RNXzE9Ci0KLU9TX0NHQ29udGV4dEdldEludGVycG9sYXRpb25RdWFsaXR5PQotT1NfQ0dDb250ZXh0R2V0SW50ZXJwb2xhdGlvblF1YWxpdHlfMD1jYXN0PShDR0NvbnRleHRSZWYpCi0KLU9TX0NHQ29udGV4dEdldFBhdGhCb3VuZGluZ0JveD1mbGFncz1ub19nZW4KLU9TX0NHQ29udGV4dEdldFBhdGhCb3VuZGluZ0JveF8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dEdldFBhdGhCb3VuZGluZ0JveF8xPQotCi1PU19DR0NvbnRleHRHZXRUZXh0UG9zaXRpb249ZmxhZ3M9bm9fZ2VuCi1PU19DR0NvbnRleHRHZXRUZXh0UG9zaXRpb25fMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRHZXRUZXh0UG9zaXRpb25fMT1jYXN0PShDR1BvaW50KQotCi1PU19DR0NvbnRleHRNb3ZlVG9Qb2ludD0KLU9TX0NHQ29udGV4dE1vdmVUb1BvaW50XzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0TW92ZVRvUG9pbnRfMT1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dE1vdmVUb1BvaW50XzI9Y2FzdD0oZmxvYXQpCi0KLU9TX0NHQ29udGV4dFJlbGVhc2U9Ci1PU19DR0NvbnRleHRSZWxlYXNlXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotCi1PU19DR0NvbnRleHRSZXN0b3JlR1N0YXRlPQotT1NfQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZV8wPWNhc3Q9KENHQ29udGV4dFJlZikKLQotT1NfQ0dDb250ZXh0U2F2ZUdTdGF0ZT0KLU9TX0NHQ29udGV4dFNhdmVHU3RhdGVfMD1jYXN0PShDR0NvbnRleHRSZWYpCi0KLU9TX0NHQ29udGV4dFNjYWxlQ1RNPQotT1NfQ0dDb250ZXh0U2NhbGVDVE1fMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTY2FsZUNUTV8xPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0U2NhbGVDVE1fMj1jYXN0PShmbG9hdCkKLQotT1NfQ0dDb250ZXh0U2VsZWN0Rm9udD0KLU9TX0NHQ29udGV4dFNlbGVjdEZvbnRfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZWxlY3RGb250XzE9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfQ0dDb250ZXh0U2VsZWN0Rm9udF8yPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0U2VsZWN0Rm9udF8zPWNhc3Q9KENHVGV4dEVuY29kaW5nKQotCi1PU19DR0NvbnRleHRTZXRBbHBoYT0KLU9TX0NHQ29udGV4dFNldEFscGhhXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0QWxwaGFfMT0KLQotT1NfQ0dDb250ZXh0U2V0RmlsbENvbG9yPQotT1NfQ0dDb250ZXh0U2V0RmlsbENvbG9yXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0RmlsbENvbG9yXzE9Y2FzdD0oY29uc3QgZmxvYXQgKikKLQotT1NfQ0dDb250ZXh0U2V0RmlsbENvbG9yU3BhY2U9Ci1PU19DR0NvbnRleHRTZXRGaWxsQ29sb3JTcGFjZV8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldEZpbGxDb2xvclNwYWNlXzE9Y2FzdD0oQ0dDb2xvclNwYWNlUmVmKQotCi1PU19DR0NvbnRleHRTZXRGaWxsUGF0dGVybj0KLU9TX0NHQ29udGV4dFNldEZpbGxQYXR0ZXJuXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0RmlsbFBhdHRlcm5fMT1jYXN0PUNHUGF0dGVyblJlZgotT1NfQ0dDb250ZXh0U2V0RmlsbFBhdHRlcm5fMj0KLQotT1NfQ0dDb250ZXh0U2V0Rm9udD0KLU9TX0NHQ29udGV4dFNldEZvbnRfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRGb250XzE9Y2FzdD0oQ0dGb250UmVmKQotCi1PU19DR0NvbnRleHRTZXRGb250U2l6ZT0KLU9TX0NHQ29udGV4dFNldEZvbnRTaXplXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0Rm9udFNpemVfMT1jYXN0PShmbG9hdCkKLQotT1NfQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHk9Ci1PU19DR0NvbnRleHRTZXRJbnRlcnBvbGF0aW9uUXVhbGl0eV8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldEludGVycG9sYXRpb25RdWFsaXR5XzE9Ci0KLU9TX0NHQ29udGV4dFNldExpbmVDYXA9Ci1PU19DR0NvbnRleHRTZXRMaW5lQ2FwXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0TGluZUNhcF8xPQotCi1PU19DR0NvbnRleHRTZXRMaW5lRGFzaD0KLU9TX0NHQ29udGV4dFNldExpbmVEYXNoXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0TGluZURhc2hfMT1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dFNldExpbmVEYXNoXzI9Y2FzdD0oY29uc3QgZmxvYXQgKikKLU9TX0NHQ29udGV4dFNldExpbmVEYXNoXzM9Y2FzdD0oc2l6ZV90KQotCi1PU19DR0NvbnRleHRTZXRMaW5lSm9pbj0KLU9TX0NHQ29udGV4dFNldExpbmVKb2luXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0TGluZUpvaW5fMT0KLQotT1NfQ0dDb250ZXh0U2V0TGluZVdpZHRoPQotT1NfQ0dDb250ZXh0U2V0TGluZVdpZHRoXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0TGluZVdpZHRoXzE9Y2FzdD0oZmxvYXQpCi0KLU9TX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvcj0KLU9TX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvcl8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvcl8xPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yXzI9Y2FzdD0oZmxvYXQpCi1PU19DR0NvbnRleHRTZXRSR0JGaWxsQ29sb3JfMz1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvcl80PWNhc3Q9KGZsb2F0KQotCi1PU19DR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvcj0KLU9TX0NHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3JfMT1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yXzI9Y2FzdD0oZmxvYXQpCi1PU19DR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvcl8zPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3JfND1jYXN0PShmbG9hdCkKLQotT1NfQ0dDb250ZXh0U2V0UmVuZGVyaW5nSW50ZW50PQotT1NfQ0dDb250ZXh0U2V0UmVuZGVyaW5nSW50ZW50XzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0UmVuZGVyaW5nSW50ZW50XzE9Ci0KLU9TX0NHQ29udGV4dFNldFNob3VsZEFudGlhbGlhcz0KLU9TX0NHQ29udGV4dFNldFNob3VsZEFudGlhbGlhc18wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldFNob3VsZEFudGlhbGlhc18xPQotCi1PU19DR0NvbnRleHRTZXRTaG91bGRTbW9vdGhGb250cz0KLU9TX0NHQ29udGV4dFNldFNob3VsZFNtb290aEZvbnRzXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0U2hvdWxkU21vb3RoRm9udHNfMT0KLQotT1NfQ0dDb250ZXh0U2V0U3Ryb2tlQ29sb3I9Ci1PU19DR0NvbnRleHRTZXRTdHJva2VDb2xvcl8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldFN0cm9rZUNvbG9yXzE9Y2FzdD0oY29uc3QgZmxvYXQgKikKLQotT1NfQ0dDb250ZXh0U2V0U3Ryb2tlQ29sb3JTcGFjZT0KLU9TX0NHQ29udGV4dFNldFN0cm9rZUNvbG9yU3BhY2VfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRTdHJva2VDb2xvclNwYWNlXzE9Y2FzdD0oQ0dDb2xvclNwYWNlUmVmKQotCi1PU19DR0NvbnRleHRTZXRTdHJva2VQYXR0ZXJuPQotT1NfQ0dDb250ZXh0U2V0U3Ryb2tlUGF0dGVybl8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldFN0cm9rZVBhdHRlcm5fMT1jYXN0PUNHUGF0dGVyblJlZgotT1NfQ0dDb250ZXh0U2V0U3Ryb2tlUGF0dGVybl8yPQotCi1PU19DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGU9Ci1PU19DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGVfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGVfMT1jYXN0PShDR1RleHREcmF3aW5nTW9kZSkKLQotT1NfQ0dDb250ZXh0U2V0VGV4dE1hdHJpeD0KLU9TX0NHQ29udGV4dFNldFRleHRNYXRyaXhfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRUZXh0TWF0cml4XzE9Y2FzdD0oQ0dBZmZpbmVUcmFuc2Zvcm0gKiksZmxhZ3M9c3RydWN0Ci0KLU9TX0NHQ29udGV4dFNldFRleHRQb3NpdGlvbj0KLU9TX0NHQ29udGV4dFNldFRleHRQb3NpdGlvbl8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldFRleHRQb3NpdGlvbl8xPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9uXzI9Y2FzdD0oZmxvYXQpCi0KLU9TX0NHQ29udGV4dFNob3dUZXh0PQotT1NfQ0dDb250ZXh0U2hvd1RleHRfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTaG93VGV4dF8xPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX0NHQ29udGV4dFNob3dUZXh0XzI9Y2FzdD0oc2l6ZV90KQotCi1PU19DR0NvbnRleHRTaG93VGV4dEF0UG9pbnQ9Ci1PU19DR0NvbnRleHRTaG93VGV4dEF0UG9pbnRfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTaG93VGV4dEF0UG9pbnRfMT1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dFNob3dUZXh0QXRQb2ludF8yPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50XzM9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50XzQ9Y2FzdD0oc2l6ZV90KQotCi1PU19DR0NvbnRleHRTdHJva2VQYXRoPQotT1NfQ0dDb250ZXh0U3Ryb2tlUGF0aF8wPWNhc3Q9KENHQ29udGV4dFJlZikKLQotT1NfQ0dDb250ZXh0U3Ryb2tlUmVjdD0KLU9TX0NHQ29udGV4dFN0cm9rZVJlY3RfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTdHJva2VSZWN0XzE9Y2FzdD0oQ0dSZWN0ICopLGZsYWdzPXN0cnVjdAotCi1PU19DR0NvbnRleHRTeW5jaHJvbml6ZT0KLU9TX0NHQ29udGV4dFN5bmNocm9uaXplXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotCi1PU19DR0NvbnRleHRUcmFuc2xhdGVDVE09Ci1PU19DR0NvbnRleHRUcmFuc2xhdGVDVE1fMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRUcmFuc2xhdGVDVE1fMT1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dFRyYW5zbGF0ZUNUTV8yPWNhc3Q9KGZsb2F0KQotCi1PU19DR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhEYXRhPQotT1NfQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YV8wPWNhc3Q9KHZvaWQgKikKLU9TX0NHRGF0YVByb3ZpZGVyQ3JlYXRlV2l0aERhdGFfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19DR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhEYXRhXzI9Y2FzdD0oc2l6ZV90KQotT1NfQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YV8zPWNhc3Q9KHZvaWQgKikKLQotT1NfQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoVVJMPQotT1NfQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoVVJMXzA9Y2FzdD1DRlVSTFJlZgotCi1PU19DR0RhdGFQcm92aWRlclJlbGVhc2U9Ci1PU19DR0RhdGFQcm92aWRlclJlbGVhc2VfMD1jYXN0PShDR0RhdGFQcm92aWRlclJlZikKLQotT1NfQ0dEaXNwbGF5QmFzZUFkZHJlc3M9Ci1PU19DR0Rpc3BsYXlCYXNlQWRkcmVzc18wPWNhc3Q9KENHRGlyZWN0RGlzcGxheUlEKQotCi1PU19DR0Rpc3BsYXlCaXRzUGVyUGl4ZWw9Ci1PU19DR0Rpc3BsYXlCaXRzUGVyUGl4ZWxfMD1jYXN0PShDR0RpcmVjdERpc3BsYXlJRCkKLQotT1NfQ0dEaXNwbGF5Qml0c1BlclNhbXBsZT0KLU9TX0NHRGlzcGxheUJpdHNQZXJTYW1wbGVfMD1jYXN0PShDR0RpcmVjdERpc3BsYXlJRCkKLQotT1NfQ0dEaXNwbGF5Qnl0ZXNQZXJSb3c9Ci1PU19DR0Rpc3BsYXlCeXRlc1BlclJvd18wPWNhc3Q9KENHRGlyZWN0RGlzcGxheUlEKQotCi1PU19DR0Rpc3BsYXlQaXhlbHNIaWdoPQotT1NfQ0dEaXNwbGF5UGl4ZWxzSGlnaF8wPWNhc3Q9KENHRGlyZWN0RGlzcGxheUlEKQotCi1PU19DR0Rpc3BsYXlQaXhlbHNXaWRlPQotT1NfQ0dEaXNwbGF5UGl4ZWxzV2lkZV8wPWNhc3Q9KENHRGlyZWN0RGlzcGxheUlEKQotCi1PU19DR0ZvbnRDcmVhdGVXaXRoUGxhdGZvcm1Gb250PQotT1NfQ0dGb250Q3JlYXRlV2l0aFBsYXRmb3JtRm9udF8wPQotCi1PU19DR0ZvbnRSZWxlYXNlPQotT1NfQ0dGb250UmVsZWFzZV8wPWNhc3Q9KENHRm9udFJlZikKLQotT1NfQ0dGdW5jdGlvbkNyZWF0ZT0KLU9TX0NHRnVuY3Rpb25DcmVhdGVfMD1jYXN0PXZvaWQgKgotT1NfQ0dGdW5jdGlvbkNyZWF0ZV8xPWNhc3Q9c2l6ZV90Ci1PU19DR0Z1bmN0aW9uQ3JlYXRlXzI9Y2FzdD1jb25zdCBmbG9hdCAqCi1PU19DR0Z1bmN0aW9uQ3JlYXRlXzM9Y2FzdD1zaXplX3QKLU9TX0NHRnVuY3Rpb25DcmVhdGVfND1jYXN0PWNvbnN0IGZsb2F0ICoKLU9TX0NHRnVuY3Rpb25DcmVhdGVfNT1jYXN0PWNvbnN0IENHRnVuY3Rpb25DYWxsYmFja3MgKgotCi1PU19DR0Z1bmN0aW9uUmVsZWFzZT0KLU9TX0NHRnVuY3Rpb25SZWxlYXNlXzA9Y2FzdD1DR0Z1bmN0aW9uUmVmCi0KLU9TX0NHR2V0RGlzcGxheXNXaXRoUmVjdD0KLU9TX0NHR2V0RGlzcGxheXNXaXRoUmVjdF8wPWZsYWdzPXN0cnVjdAotT1NfQ0dHZXREaXNwbGF5c1dpdGhSZWN0XzE9Y2FzdD1DR0Rpc3BsYXlDb3VudAotT1NfQ0dHZXREaXNwbGF5c1dpdGhSZWN0XzI9Y2FzdD0oQ0dEaXJlY3REaXNwbGF5SUQgKikKLU9TX0NHR2V0RGlzcGxheXNXaXRoUmVjdF8zPWNhc3Q9Q0dEaXNwbGF5Q291bnQgKgotCi1PU19DR0ltYWdlQ3JlYXRlPQotT1NfQ0dJbWFnZUNyZWF0ZV8wPWNhc3Q9KHNpemVfdCkKLU9TX0NHSW1hZ2VDcmVhdGVfMT1jYXN0PShzaXplX3QpCi1PU19DR0ltYWdlQ3JlYXRlXzI9Y2FzdD0oc2l6ZV90KQotT1NfQ0dJbWFnZUNyZWF0ZV8zPWNhc3Q9KHNpemVfdCkKLU9TX0NHSW1hZ2VDcmVhdGVfND1jYXN0PShzaXplX3QpCi1PU19DR0ltYWdlQ3JlYXRlXzU9Y2FzdD0oQ0dDb2xvclNwYWNlUmVmKQotT1NfQ0dJbWFnZUNyZWF0ZV82PWNhc3Q9KENHSW1hZ2VBbHBoYUluZm8pCi1PU19DR0ltYWdlQ3JlYXRlXzc9Y2FzdD0oQ0dEYXRhUHJvdmlkZXJSZWYpCi1PU19DR0ltYWdlQ3JlYXRlXzg9Y2FzdD0oY29uc3QgZmxvYXQgKikKLU9TX0NHSW1hZ2VDcmVhdGVfOT1jYXN0PShCb29sZWFuKQotT1NfQ0dJbWFnZUNyZWF0ZV8xMD1jYXN0PShDR0NvbG9yUmVuZGVyaW5nSW50ZW50KQotCi1PU19DR0ltYWdlQ3JlYXRlV2l0aEpQRUdEYXRhUHJvdmlkZXI9Ci1PU19DR0ltYWdlQ3JlYXRlV2l0aEpQRUdEYXRhUHJvdmlkZXJfMD1jYXN0PUNHRGF0YVByb3ZpZGVyUmVmCi1PU19DR0ltYWdlQ3JlYXRlV2l0aEpQRUdEYXRhUHJvdmlkZXJfMT0KLU9TX0NHSW1hZ2VDcmVhdGVXaXRoSlBFR0RhdGFQcm92aWRlcl8yPQotT1NfQ0dJbWFnZUNyZWF0ZVdpdGhKUEVHRGF0YVByb3ZpZGVyXzM9Ci0KLU9TX0NHSW1hZ2VDcmVhdGVXaXRoUE5HRGF0YVByb3ZpZGVyPQotT1NfQ0dJbWFnZUNyZWF0ZVdpdGhQTkdEYXRhUHJvdmlkZXJfMD1jYXN0PUNHRGF0YVByb3ZpZGVyUmVmCi1PU19DR0ltYWdlQ3JlYXRlV2l0aFBOR0RhdGFQcm92aWRlcl8xPQotT1NfQ0dJbWFnZUNyZWF0ZVdpdGhQTkdEYXRhUHJvdmlkZXJfMj0KLU9TX0NHSW1hZ2VDcmVhdGVXaXRoUE5HRGF0YVByb3ZpZGVyXzM9Ci0KLU9TX0NHSW1hZ2VHZXRBbHBoYUluZm89Ci1PU19DR0ltYWdlR2V0QWxwaGFJbmZvXzA9Y2FzdD0oQ0dJbWFnZVJlZikKLQotT1NfQ0dJbWFnZUdldEJpdHNQZXJDb21wb25lbnQ9Ci1PU19DR0ltYWdlR2V0Qml0c1BlckNvbXBvbmVudF8wPWNhc3Q9KENHSW1hZ2VSZWYpCi0KLU9TX0NHSW1hZ2VHZXRCaXRzUGVyUGl4ZWw9Ci1PU19DR0ltYWdlR2V0Qml0c1BlclBpeGVsXzA9Y2FzdD0oQ0dJbWFnZVJlZikKLQotT1NfQ0dJbWFnZUdldEJ5dGVzUGVyUm93PQotT1NfQ0dJbWFnZUdldEJ5dGVzUGVyUm93XzA9Y2FzdD0oQ0dJbWFnZVJlZikKLQotT1NfQ0dJbWFnZUdldENvbG9yU3BhY2U9Ci1PU19DR0ltYWdlR2V0Q29sb3JTcGFjZV8wPWNhc3Q9KENHSW1hZ2VSZWYpCi0KLU9TX0NHSW1hZ2VHZXRIZWlnaHQ9Ci1PU19DR0ltYWdlR2V0SGVpZ2h0XzA9Y2FzdD0oQ0dJbWFnZVJlZikKLQotT1NfQ0dJbWFnZUdldFdpZHRoPQotT1NfQ0dJbWFnZUdldFdpZHRoXzA9Y2FzdD0oQ0dJbWFnZVJlZikKLQotT1NfQ0dJbWFnZVJlbGVhc2U9Ci1PU19DR0ltYWdlUmVsZWFzZV8wPWNhc3Q9KENHSW1hZ2VSZWYpCi0KLU9TX0NHUGF0aEFkZEFyYz0KLU9TX0NHUGF0aEFkZEFyY18wPWNhc3Q9Q0dNdXRhYmxlUGF0aFJlZgotT1NfQ0dQYXRoQWRkQXJjXzE9Y2FzdD0oY29uc3QgQ0dBZmZpbmVUcmFuc2Zvcm0gKikKLU9TX0NHUGF0aEFkZEFyY18yPQotT1NfQ0dQYXRoQWRkQXJjXzM9Ci1PU19DR1BhdGhBZGRBcmNfND0KLU9TX0NHUGF0aEFkZEFyY181PQotT1NfQ0dQYXRoQWRkQXJjXzY9Ci1PU19DR1BhdGhBZGRBcmNfNz0KLQotT1NfQ0dQYXRoQWRkQ3VydmVUb1BvaW50PQotT1NfQ0dQYXRoQWRkQ3VydmVUb1BvaW50XzA9Y2FzdD0oQ0dNdXRhYmxlUGF0aFJlZikKLU9TX0NHUGF0aEFkZEN1cnZlVG9Qb2ludF8xPWNhc3Q9KGNvbnN0IENHQWZmaW5lVHJhbnNmb3JtICopCi1PU19DR1BhdGhBZGRDdXJ2ZVRvUG9pbnRfMj0KLU9TX0NHUGF0aEFkZEN1cnZlVG9Qb2ludF8zPQotT1NfQ0dQYXRoQWRkQ3VydmVUb1BvaW50XzQ9Ci1PU19DR1BhdGhBZGRDdXJ2ZVRvUG9pbnRfNT0KLU9TX0NHUGF0aEFkZEN1cnZlVG9Qb2ludF82PQotT1NfQ0dQYXRoQWRkQ3VydmVUb1BvaW50Xzc9Ci0KLU9TX0NHUGF0aEFkZExpbmVUb1BvaW50PQotT1NfQ0dQYXRoQWRkTGluZVRvUG9pbnRfMD1jYXN0PUNHTXV0YWJsZVBhdGhSZWYKLU9TX0NHUGF0aEFkZExpbmVUb1BvaW50XzE9Y2FzdD1jb25zdCBDR0FmZmluZVRyYW5zZm9ybSAqCi1PU19DR1BhdGhBZGRMaW5lVG9Qb2ludF8yPQotT1NfQ0dQYXRoQWRkTGluZVRvUG9pbnRfMz0KLQotT1NfQ0dQYXRoQWRkUGF0aD0KLU9TX0NHUGF0aEFkZFBhdGhfMD1jYXN0PShDR011dGFibGVQYXRoUmVmKQotT1NfQ0dQYXRoQWRkUGF0aF8xPWNhc3Q9Y29uc3QgQ0dBZmZpbmVUcmFuc2Zvcm0gKgotT1NfQ0dQYXRoQWRkUGF0aF8yPWNhc3Q9Q0dQYXRoUmVmCi0KLU9TX0NHUGF0aEFkZFF1YWRDdXJ2ZVRvUG9pbnQ9Ci1PU19DR1BhdGhBZGRRdWFkQ3VydmVUb1BvaW50XzA9Y2FzdD0oQ0dNdXRhYmxlUGF0aFJlZikKLU9TX0NHUGF0aEFkZFF1YWRDdXJ2ZVRvUG9pbnRfMT1jYXN0PShjb25zdCBDR0FmZmluZVRyYW5zZm9ybSAqKQotT1NfQ0dQYXRoQWRkUXVhZEN1cnZlVG9Qb2ludF8yPQotT1NfQ0dQYXRoQWRkUXVhZEN1cnZlVG9Qb2ludF8zPQotT1NfQ0dQYXRoQWRkUXVhZEN1cnZlVG9Qb2ludF80PQotT1NfQ0dQYXRoQWRkUXVhZEN1cnZlVG9Qb2ludF81PQotCi1PU19DR1BhdGhBZGRSZWN0PQotT1NfQ0dQYXRoQWRkUmVjdF8wPWNhc3Q9KENHTXV0YWJsZVBhdGhSZWYpCi1PU19DR1BhdGhBZGRSZWN0XzE9Y2FzdD1jb25zdCBDR0FmZmluZVRyYW5zZm9ybSAqCi1PU19DR1BhdGhBZGRSZWN0XzI9ZmxhZ3M9c3RydWN0Ci0KLU9TX0NHUGF0aEFwcGx5PQotT1NfQ0dQYXRoQXBwbHlfMD1jYXN0PUNHUGF0aFJlZgotT1NfQ0dQYXRoQXBwbHlfMT1jYXN0PXZvaWQgKgotT1NfQ0dQYXRoQXBwbHlfMj1jYXN0PUNHUGF0aEFwcGxpZXJGdW5jdGlvbgotCi1PU19DR1BhdGhDbG9zZVN1YnBhdGg9Ci1PU19DR1BhdGhDbG9zZVN1YnBhdGhfMD1jYXN0PShDR011dGFibGVQYXRoUmVmKQotCi1PU19DR1BhdGhDcmVhdGVNdXRhYmxlPQotCi1PU19DR1BhdGhHZXRCb3VuZGluZ0JveD1mbGFncz1ub19nZW4KLU9TX0NHUGF0aEdldEJvdW5kaW5nQm94XzA9Y2FzdD1DR1BhdGhSZWYKLU9TX0NHUGF0aEdldEJvdW5kaW5nQm94XzE9Ci0KLU9TX0NHUGF0aEdldEN1cnJlbnRQb2ludD1mbGFncz1ub19nZW4KLU9TX0NHUGF0aEdldEN1cnJlbnRQb2ludF8wPWNhc3Q9Q0dQYXRoUmVmCi1PU19DR1BhdGhHZXRDdXJyZW50UG9pbnRfMT0KLQotT1NfQ0dQYXRoSXNFbXB0eT0KLU9TX0NHUGF0aElzRW1wdHlfMD1jYXN0PUNHUGF0aFJlZgotCi1PU19DR1BhdGhNb3ZlVG9Qb2ludD0KLU9TX0NHUGF0aE1vdmVUb1BvaW50XzA9Y2FzdD1DR011dGFibGVQYXRoUmVmCi1PU19DR1BhdGhNb3ZlVG9Qb2ludF8xPWNhc3Q9Y29uc3QgQ0dBZmZpbmVUcmFuc2Zvcm0gKgotT1NfQ0dQYXRoTW92ZVRvUG9pbnRfMj0KLU9TX0NHUGF0aE1vdmVUb1BvaW50XzM9Ci0KLU9TX0NHUGF0aFJlbGVhc2U9Ci1PU19DR1BhdGhSZWxlYXNlXzA9Y2FzdD1DR1BhdGhSZWYKLQotT1NfQ0dQYXR0ZXJuQ3JlYXRlPQotT1NfQ0dQYXR0ZXJuQ3JlYXRlXzA9Y2FzdD12b2lkICoKLU9TX0NHUGF0dGVybkNyZWF0ZV8xPWZsYWdzPXN0cnVjdAotT1NfQ0dQYXR0ZXJuQ3JlYXRlXzI9Y2FzdD1DR0FmZmluZVRyYW5zZm9ybSAqLGZsYWdzPXN0cnVjdAotT1NfQ0dQYXR0ZXJuQ3JlYXRlXzM9Ci1PU19DR1BhdHRlcm5DcmVhdGVfND0KLU9TX0NHUGF0dGVybkNyZWF0ZV81PWNhc3Q9Q0dQYXR0ZXJuVGlsaW5nCi1PU19DR1BhdHRlcm5DcmVhdGVfNj0KLU9TX0NHUGF0dGVybkNyZWF0ZV83PWNhc3Q9KGNvbnN0IENHUGF0dGVybkNhbGxiYWNrcyAqKQotCi1PU19DR1BhdHRlcm5SZWxlYXNlPQotT1NfQ0dQYXR0ZXJuUmVsZWFzZV8wPWNhc3Q9Q0dQYXR0ZXJuUmVmCi0KLU9TX0NHUG9pbnRBcHBseUFmZmluZVRyYW5zZm9ybT1mbGFncz1ub19nZW4KLU9TX0NHUG9pbnRBcHBseUFmZmluZVRyYW5zZm9ybV8wPQotT1NfQ0dQb2ludEFwcGx5QWZmaW5lVHJhbnNmb3JtXzE9Ci1PU19DR1BvaW50QXBwbHlBZmZpbmVUcmFuc2Zvcm1fMj0KLQotT1NfQ0dQb3N0S2V5Ym9hcmRFdmVudD0KLU9TX0NHUG9zdEtleWJvYXJkRXZlbnRfMD1jYXN0PShDR0NoYXJDb2RlKQotT1NfQ0dQb3N0S2V5Ym9hcmRFdmVudF8xPWNhc3Q9Q0dLZXlDb2RlCi1PU19DR1Bvc3RLZXlib2FyZEV2ZW50XzI9Y2FzdD1ib29sZWFuX3QKLQotT1NfQ0dQb3N0TW91c2VFdmVudD0KLU9TX0NHUG9zdE1vdXNlRXZlbnRfMD1mbGFncz1zdHJ1Y3QKLU9TX0NHUG9zdE1vdXNlRXZlbnRfMT1jYXN0PWJvb2xlYW5fdAotT1NfQ0dQb3N0TW91c2VFdmVudF8yPQotT1NfQ0dQb3N0TW91c2VFdmVudF8zPWNhc3Q9Ym9vbGVhbl90Ci1PU19DR1Bvc3RNb3VzZUV2ZW50XzQ9Y2FzdD1ib29sZWFuX3QKLU9TX0NHUG9zdE1vdXNlRXZlbnRfNT1jYXN0PWJvb2xlYW5fdAotCi1PU19DR1JlY3RDb250YWluc1BvaW50PQotT1NfQ0dSZWN0Q29udGFpbnNQb2ludF8wPWZsYWdzPXN0cnVjdAotT1NfQ0dSZWN0Q29udGFpbnNQb2ludF8xPWZsYWdzPXN0cnVjdAotCi1PU19DR1NoYWRpbmdDcmVhdGVBeGlhbD0KLU9TX0NHU2hhZGluZ0NyZWF0ZUF4aWFsXzA9Y2FzdD1DR0NvbG9yU3BhY2VSZWYKLU9TX0NHU2hhZGluZ0NyZWF0ZUF4aWFsXzE9ZmxhZ3M9c3RydWN0Ci1PU19DR1NoYWRpbmdDcmVhdGVBeGlhbF8yPWZsYWdzPXN0cnVjdAotT1NfQ0dTaGFkaW5nQ3JlYXRlQXhpYWxfMz1jYXN0PUNHRnVuY3Rpb25SZWYKLU9TX0NHU2hhZGluZ0NyZWF0ZUF4aWFsXzQ9Ci1PU19DR1NoYWRpbmdDcmVhdGVBeGlhbF81PQotCi1PU19DR1NoYWRpbmdDcmVhdGVSYWRpYWw9Ci1PU19DR1NoYWRpbmdDcmVhdGVSYWRpYWxfMD1jYXN0PUNHQ29sb3JTcGFjZVJlZgotT1NfQ0dTaGFkaW5nQ3JlYXRlUmFkaWFsXzE9ZmxhZ3M9c3RydWN0Ci1PU19DR1NoYWRpbmdDcmVhdGVSYWRpYWxfMj0KLU9TX0NHU2hhZGluZ0NyZWF0ZVJhZGlhbF8zPWZsYWdzPXN0cnVjdAotT1NfQ0dTaGFkaW5nQ3JlYXRlUmFkaWFsXzQ9Ci1PU19DR1NoYWRpbmdDcmVhdGVSYWRpYWxfNT1jYXN0PUNHRnVuY3Rpb25SZWYKLU9TX0NHU2hhZGluZ0NyZWF0ZVJhZGlhbF82PQotT1NfQ0dTaGFkaW5nQ3JlYXRlUmFkaWFsXzc9Ci0KLU9TX0NHU2hhZGluZ1JlbGVhc2U9Ci1PU19DR1NoYWRpbmdSZWxlYXNlXzA9Y2FzdD1DR1NoYWRpbmdSZWYKLQotT1NfQ0dXYXJwTW91c2VDdXJzb3JQb3NpdGlvbj0KLU9TX0NHV2FycE1vdXNlQ3Vyc29yUG9zaXRpb25fMD1mbGFncz1zdHJ1Y3QKLQotT1NfQ1BTRW5hYmxlRm9yZWdyb3VuZE9wZXJhdGlvbj0KLU9TX0NQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb25fMD0KLU9TX0NQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb25fMT0KLU9TX0NQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb25fMj0KLU9TX0NQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb25fMz0KLU9TX0NQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb25fND0KLQotT1NfQ1BTU2V0UHJvY2Vzc05hbWU9Ci1PU19DUFNTZXRQcm9jZXNzTmFtZV8wPQotT1NfQ1BTU2V0UHJvY2Vzc05hbWVfMT0KLQotT1NfQ2FsY01lbnVTaXplPQotT1NfQ2FsY01lbnVTaXplXzA9Y2FzdD1NZW51UmVmCi0KLU9TX0NhbGxOZXh0RXZlbnRIYW5kbGVyPQotT1NfQ2FsbE5leHRFdmVudEhhbmRsZXJfMD1jYXN0PShFdmVudEhhbmRsZXJDYWxsUmVmKQotT1NfQ2FsbE5leHRFdmVudEhhbmRsZXJfMT1jYXN0PShFdmVudFJlZikKLQotT1NfQ2FuY2VsTWVudVRyYWNraW5nPQotT1NfQ2FuY2VsTWVudVRyYWNraW5nXzA9Y2FzdD1NZW51UmVmCi1PU19DYW5jZWxNZW51VHJhY2tpbmdfMT0KLU9TX0NhbmNlbE1lbnVUcmFja2luZ18yPQotCi1PU19DaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzPQotT1NfQ2hhbmdlV2luZG93QXR0cmlidXRlc18wPWNhc3Q9V2luZG93UmVmCi1PU19DaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzXzE9Y2FzdD1XaW5kb3dBdHRyaWJ1dGVzCi1PU19DaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzXzI9Y2FzdD1XaW5kb3dBdHRyaWJ1dGVzCi0KLU9TX0NoYXJXaWR0aD0KLU9TX0NoYXJXaWR0aF8wPWNhc3Q9KENoYXJQYXJhbWV0ZXIpCi0KLU9TX0NsZWFyQ3VycmVudFNjcmFwPQotCi1PU19DbGVhcktleWJvYXJkRm9jdXM9Ci1PU19DbGVhcktleWJvYXJkRm9jdXNfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX0NsZWFyTWVudUJhcj0KLQotT1NfQ2xpcENHQ29udGV4dFRvUmVnaW9uPQotT1NfQ2xpcENHQ29udGV4dFRvUmVnaW9uXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ2xpcENHQ29udGV4dFRvUmVnaW9uXzE9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfQ2xpcENHQ29udGV4dFRvUmVnaW9uXzI9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19DbG9zZURhdGFCcm93c2VyQ29udGFpbmVyPQotT1NfQ2xvc2VEYXRhQnJvd3NlckNvbnRhaW5lcl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19DbG9zZURhdGFCcm93c2VyQ29udGFpbmVyXzE9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtSUQpCi0KLU9TX0Nsb3NlUG9seT0KLQotT1NfQ2xvc2VSZ249Ci1PU19DbG9zZVJnbl8wPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfQ29sbGFwc2VXaW5kb3c9Ci1PU19Db2xsYXBzZVdpbmRvd18wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NvbGxhcHNlV2luZG93XzE9Y2FzdD0oQm9vbGVhbikKLQotT1NfQ29udmVydEV2ZW50UmVmVG9FdmVudFJlY29yZD0KLU9TX0NvbnZlcnRFdmVudFJlZlRvRXZlbnRSZWNvcmRfMD1jYXN0PShFdmVudFJlZikKLU9TX0NvbnZlcnRFdmVudFJlZlRvRXZlbnRSZWNvcmRfMT1jYXN0PShFdmVudFJlY29yZCAqKQotCi1PU19Db252ZXJ0RnJvbVBTdHJpbmdUb1VuaWNvZGU9Ci1PU19Db252ZXJ0RnJvbVBTdHJpbmdUb1VuaWNvZGVfMD1jYXN0PVRleHRUb1VuaWNvZGVJbmZvCi1PU19Db252ZXJ0RnJvbVBTdHJpbmdUb1VuaWNvZGVfMT1jYXN0PUNvbnN0U3RyMjU1UGFyYW0KLU9TX0NvbnZlcnRGcm9tUFN0cmluZ1RvVW5pY29kZV8yPQotT1NfQ29udmVydEZyb21QU3RyaW5nVG9Vbmljb2RlXzM9Y2FzdD1CeXRlQ291bnQgKgotT1NfQ29udmVydEZyb21QU3RyaW5nVG9Vbmljb2RlXzQ9Ci0KLU9TX0NvbnZlcnRGcm9tVW5pY29kZVRvUFN0cmluZz0KLU9TX0NvbnZlcnRGcm9tVW5pY29kZVRvUFN0cmluZ18wPWNhc3Q9VW5pY29kZVRvVGV4dEluZm8KLU9TX0NvbnZlcnRGcm9tVW5pY29kZVRvUFN0cmluZ18xPQotT1NfQ29udmVydEZyb21Vbmljb2RlVG9QU3RyaW5nXzI9Y2FzdD1Db25zdFVuaUNoYXJBcnJheVB0cgotT1NfQ29udmVydEZyb21Vbmljb2RlVG9QU3RyaW5nXzM9Y2FzdD0odW5zaWduZWQgY2hhciAqKQotCi1PU19Db3B5Qml0cz0KLU9TX0NvcHlCaXRzXzA9Y2FzdD0oY29uc3QgQml0TWFwICopCi1PU19Db3B5Qml0c18xPWNhc3Q9KGNvbnN0IEJpdE1hcCAqKQotT1NfQ29weUJpdHNfMj1jYXN0PShjb25zdCBSZWN0ICopCi1PU19Db3B5Qml0c18zPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NvcHlCaXRzXzQ9Y2FzdD0oc2hvcnQpCi1PU19Db3B5Qml0c181PWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfQ29weUNvbnRyb2xUaXRsZUFzQ0ZTdHJpbmc9Ci1PU19Db3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZ18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19Db3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZ18xPWNhc3Q9KENGU3RyaW5nUmVmICopCi0KLU9TX0NvcHlEZWVwTWFzaz0KLU9TX0NvcHlEZWVwTWFza18wPWNhc3Q9KGNvbnN0IEJpdE1hcCAqKQotT1NfQ29weURlZXBNYXNrXzE9Y2FzdD0oY29uc3QgQml0TWFwICopCi1PU19Db3B5RGVlcE1hc2tfMj1jYXN0PShjb25zdCBCaXRNYXAgKikKLU9TX0NvcHlEZWVwTWFza18zPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NvcHlEZWVwTWFza180PWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NvcHlEZWVwTWFza181PWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NvcHlEZWVwTWFza182PWNhc3Q9KHNob3J0KQotT1NfQ29weURlZXBNYXNrXzc9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19Db3B5TWVudUl0ZW1UZXh0QXNDRlN0cmluZz0KLU9TX0NvcHlNZW51SXRlbVRleHRBc0NGU3RyaW5nXzA9Y2FzdD0oTWVudVJlZikKLU9TX0NvcHlNZW51SXRlbVRleHRBc0NGU3RyaW5nXzE9Y2FzdD0oTWVudUl0ZW1JbmRleCkKLU9TX0NvcHlNZW51SXRlbVRleHRBc0NGU3RyaW5nXzI9Y2FzdD0oQ0ZTdHJpbmdSZWYgKikKLQotT1NfQ29weVJnbj0KLU9TX0NvcHlSZ25fMD1jYXN0PShSZ25IYW5kbGUpCi1PU19Db3B5UmduXzE9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19Db3VudERyYWdJdGVtRmxhdm9ycz0KLU9TX0NvdW50RHJhZ0l0ZW1GbGF2b3JzXzA9Y2FzdD0oRHJhZ1JlZikKLU9TX0NvdW50RHJhZ0l0ZW1GbGF2b3JzXzE9Y2FzdD0oRHJhZ0l0ZW1SZWYpCi1PU19Db3VudERyYWdJdGVtRmxhdm9yc18yPWNhc3Q9KFVJbnQxNiAqKQotCi1PU19Db3VudERyYWdJdGVtcz0KLU9TX0NvdW50RHJhZ0l0ZW1zXzA9Y2FzdD0oRHJhZ1JlZikKLU9TX0NvdW50RHJhZ0l0ZW1zXzE9Y2FzdD0oVUludDE2ICopCi0KLU9TX0NvdW50TWVudUl0ZW1zPQotT1NfQ291bnRNZW51SXRlbXNfMD1jYXN0PShNZW51UmVmKQotCi1PU19Db3VudFN1YkNvbnRyb2xzPQotT1NfQ291bnRTdWJDb250cm9sc18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19Db3VudFN1YkNvbnRyb2xzXzE9Y2FzdD0oVUludDE2ICopCi0KLU9TX0NyZWF0ZUJldmVsQnV0dG9uQ29udHJvbD0KLU9TX0NyZWF0ZUJldmVsQnV0dG9uQ29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZUJldmVsQnV0dG9uQ29udHJvbF8xPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NyZWF0ZUJldmVsQnV0dG9uQ29udHJvbF8yPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sXzM9Y2FzdD0oQ29udHJvbEJldmVsVGhpY2tuZXNzKQotT1NfQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sXzQ9Y2FzdD0oQ29udHJvbEJldmVsQnV0dG9uQmVoYXZpb3IpCi1PU19DcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2xfNT1jYXN0PShDb250cm9sQnV0dG9uQ29udGVudEluZm9QdHIpCi1PU19DcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2xfNj1jYXN0PShTSW50MTYpCi1PU19DcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2xfNz1jYXN0PShDb250cm9sQmV2ZWxCdXR0b25NZW51QmVoYXZpb3IpCi1PU19DcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2xfOD1jYXN0PShDb250cm9sQmV2ZWxCdXR0b25NZW51UGxhY2VtZW50KQotT1NfQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sXzk9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVDR0NvbnRleHRGb3JQb3J0PQotT1NfQ3JlYXRlQ0dDb250ZXh0Rm9yUG9ydF8wPWNhc3Q9KENHcmFmUHRyKQotT1NfQ3JlYXRlQ0dDb250ZXh0Rm9yUG9ydF8xPWNhc3Q9KENHQ29udGV4dFJlZiAqKQotCi1PU19DcmVhdGVDaGVja0JveENvbnRyb2w9Ci1PU19DcmVhdGVDaGVja0JveENvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVDaGVja0JveENvbnRyb2xfMT1jYXN0PShjb25zdCBSZWN0ICopCi1PU19DcmVhdGVDaGVja0JveENvbnRyb2xfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NyZWF0ZUNoZWNrQm94Q29udHJvbF8zPWNhc3Q9KFNJbnQzMikKLU9TX0NyZWF0ZUNoZWNrQm94Q29udHJvbF80PWNhc3Q9KEJvb2xlYW4pCi1PU19DcmVhdGVDaGVja0JveENvbnRyb2xfNT1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0NyZWF0ZURhdGFCcm93c2VyQ29udHJvbD0KLU9TX0NyZWF0ZURhdGFCcm93c2VyQ29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZURhdGFCcm93c2VyQ29udHJvbF8xPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NyZWF0ZURhdGFCcm93c2VyQ29udHJvbF8yPWNhc3Q9KERhdGFCcm93c2VyVmlld1N0eWxlKQotT1NfQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sXzM9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sPQotT1NfQ3JlYXRlRWRpdFVuaWNvZGVUZXh0Q29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2xfMT0KLU9TX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2xfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2xfMz0KLU9TX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2xfND0KLU9TX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2xfNT1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0NyZWF0ZUV2ZW50PQotT1NfQ3JlYXRlRXZlbnRfMD1jYXN0PShDRkFsbG9jYXRvclJlZikKLU9TX0NyZWF0ZUV2ZW50XzE9Y2FzdD0oVUludDMyKQotT1NfQ3JlYXRlRXZlbnRfMj1jYXN0PShVSW50MzIpCi1PU19DcmVhdGVFdmVudF8zPWNhc3Q9KEV2ZW50VGltZSkKLU9TX0NyZWF0ZUV2ZW50XzQ9Y2FzdD0oRXZlbnRBdHRyaWJ1dGVzKQotT1NfQ3JlYXRlRXZlbnRfNT1jYXN0PShFdmVudFJlZiAqKQotCi1PU19DcmVhdGVHcm91cEJveENvbnRyb2w9Ci1PU19DcmVhdGVHcm91cEJveENvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVHcm91cEJveENvbnRyb2xfMT1jYXN0PShjb25zdCBSZWN0ICopCi1PU19DcmVhdGVHcm91cEJveENvbnRyb2xfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NyZWF0ZUdyb3VwQm94Q29udHJvbF8zPWNhc3Q9KEJvb2xlYW4pCi1PU19DcmVhdGVHcm91cEJveENvbnRyb2xfND1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0NyZWF0ZUljb25Db250cm9sPQotT1NfQ3JlYXRlSWNvbkNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVJY29uQ29udHJvbF8xPQotT1NfQ3JlYXRlSWNvbkNvbnRyb2xfMj0KLU9TX0NyZWF0ZUljb25Db250cm9sXzM9Ci1PU19DcmVhdGVJY29uQ29udHJvbF80PWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbD0KLU9TX0NyZWF0ZUxpdHRsZUFycm93c0NvbnRyb2xfMD1jYXN0PVdpbmRvd1JlZgotT1NfQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbF8xPWNhc3Q9Y29uc3QgUmVjdCAqCi1PU19DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sXzI9Ci1PU19DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sXzM9Ci1PU19DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sXzQ9Ci1PU19DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sXzU9Ci1PU19DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sXzY9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVOZXdNZW51PQotT1NfQ3JlYXRlTmV3TWVudV8wPWNhc3Q9KE1lbnVJRCkKLU9TX0NyZWF0ZU5ld01lbnVfMT1jYXN0PShNZW51QXR0cmlidXRlcykKLU9TX0NyZWF0ZU5ld01lbnVfMj1jYXN0PShNZW51UmVmICopCi0KLU9TX0NyZWF0ZU5ld1dpbmRvdz0KLU9TX0NyZWF0ZU5ld1dpbmRvd18wPWNhc3Q9KFdpbmRvd0NsYXNzKQotT1NfQ3JlYXRlTmV3V2luZG93XzE9Y2FzdD0oV2luZG93QXR0cmlidXRlcykKLU9TX0NyZWF0ZU5ld1dpbmRvd18yPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NyZWF0ZU5ld1dpbmRvd18zPWNhc3Q9KFdpbmRvd1JlZiAqKQotCi1PU19DcmVhdGVQb3B1cEFycm93Q29udHJvbD0KLU9TX0NyZWF0ZVBvcHVwQXJyb3dDb250cm9sXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2xfMT1jYXN0PShjb25zdCBSZWN0ICopCi1PU19DcmVhdGVQb3B1cEFycm93Q29udHJvbF8yPWNhc3Q9KENvbnRyb2xQb3B1cEFycm93T3JpZW50YXRpb24pCi1PU19DcmVhdGVQb3B1cEFycm93Q29udHJvbF8zPWNhc3Q9KENvbnRyb2xQb3B1cEFycm93U2l6ZSkKLU9TX0NyZWF0ZVBvcHVwQXJyb3dDb250cm9sXzQ9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2w9Ci1PU19DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2xfMT0KLU9TX0NyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbF8yPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfQ3JlYXRlUG9wdXBCdXR0b25Db250cm9sXzM9Ci1PU19DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2xfND0KLU9TX0NyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbF81PQotT1NfQ3JlYXRlUG9wdXBCdXR0b25Db250cm9sXzY9Ci1PU19DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2xfNz0KLU9TX0NyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbF84PWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sPQotT1NfQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sXzE9Ci1PU19DcmVhdGVQcm9ncmVzc0JhckNvbnRyb2xfMj0KLU9TX0NyZWF0ZVByb2dyZXNzQmFyQ29udHJvbF8zPQotT1NfQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sXzQ9Ci1PU19DcmVhdGVQcm9ncmVzc0JhckNvbnRyb2xfNT0KLU9TX0NyZWF0ZVByb2dyZXNzQmFyQ29udHJvbF82PWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2w9Ci1PU19DcmVhdGVQdXNoQnV0dG9uQ29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZVB1c2hCdXR0b25Db250cm9sXzE9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2xfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NyZWF0ZVB1c2hCdXR0b25Db250cm9sXzM9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sPQotT1NfQ3JlYXRlUHVzaEJ1dHRvbldpdGhJY29uQ29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2xfMT0KLU9TX0NyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2xfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2xfMz1jYXN0PShDb250cm9sQnV0dG9uQ29udGVudEluZm8gKikKLU9TX0NyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2xfND1jYXN0PShDb250cm9sUHVzaEJ1dHRvbkljb25BbGlnbm1lbnQpCi1PU19DcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sXzU9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2w9Ci1PU19DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2xfMT1jYXN0PShjb25zdCBSZWN0ICopCi1PU19DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2xfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbF8zPWNhc3Q9KFNJbnQzMikKLU9TX0NyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbF80PWNhc3Q9KEJvb2xlYW4pCi1PU19DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2xfNT1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0NyZWF0ZVJvb3RDb250cm9sPQotT1NfQ3JlYXRlUm9vdENvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVSb290Q29udHJvbF8xPWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlU2Nyb2xsQmFyQ29udHJvbD0KLU9TX0NyZWF0ZVNjcm9sbEJhckNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzE9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzI9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzM9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzQ9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzU9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzY9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzc9Y2FzdD0oQ29udHJvbEFjdGlvblVQUCkKLU9TX0NyZWF0ZVNjcm9sbEJhckNvbnRyb2xfOD1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0NyZWF0ZVNlcGFyYXRvckNvbnRyb2w9Ci1PU19DcmVhdGVTZXBhcmF0b3JDb250cm9sXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfQ3JlYXRlU2VwYXJhdG9yQ29udHJvbF8xPQotT1NfQ3JlYXRlU2VwYXJhdG9yQ29udHJvbF8yPWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlU2xpZGVyQ29udHJvbD0KLU9TX0NyZWF0ZVNsaWRlckNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVTbGlkZXJDb250cm9sXzE9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfQ3JlYXRlU2xpZGVyQ29udHJvbF8yPWNhc3Q9KFNJbnQzMikKLU9TX0NyZWF0ZVNsaWRlckNvbnRyb2xfMz1jYXN0PShTSW50MzIpCi1PU19DcmVhdGVTbGlkZXJDb250cm9sXzQ9Y2FzdD0oU0ludDMyKQotT1NfQ3JlYXRlU2xpZGVyQ29udHJvbF81PWNhc3Q9KENvbnRyb2xTbGlkZXJPcmllbnRhdGlvbikKLU9TX0NyZWF0ZVNsaWRlckNvbnRyb2xfNj1jYXN0PShVSW50MTYpCi1PU19DcmVhdGVTbGlkZXJDb250cm9sXzc9Y2FzdD0oQm9vbGVhbikKLU9TX0NyZWF0ZVNsaWRlckNvbnRyb2xfOD1jYXN0PShDb250cm9sQWN0aW9uVVBQKQotT1NfQ3JlYXRlU2xpZGVyQ29udHJvbF85PWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlU3RhbmRhcmRBbGVydD0KLU9TX0NyZWF0ZVN0YW5kYXJkQWxlcnRfMD1jYXN0PShBbGVydFR5cGUpCi1PU19DcmVhdGVTdGFuZGFyZEFsZXJ0XzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19DcmVhdGVTdGFuZGFyZEFsZXJ0XzI9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19DcmVhdGVTdGFuZGFyZEFsZXJ0XzM9Y2FzdD0oY29uc3QgQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWMgKikKLU9TX0NyZWF0ZVN0YW5kYXJkQWxlcnRfND1jYXN0PShEaWFsb2dSZWYgKikKLQotT1NfQ3JlYXRlU3RhdGljVGV4dENvbnRyb2w9Ci1PU19DcmVhdGVTdGF0aWNUZXh0Q29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZVN0YXRpY1RleHRDb250cm9sXzE9Ci1PU19DcmVhdGVTdGF0aWNUZXh0Q29udHJvbF8yPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfQ3JlYXRlU3RhdGljVGV4dENvbnRyb2xfMz1jYXN0PShjb25zdCBDb250cm9sRm9udFN0eWxlUmVjICopCi1PU19DcmVhdGVTdGF0aWNUZXh0Q29udHJvbF80PWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlVGFic0NvbnRyb2w9Ci1PU19DcmVhdGVUYWJzQ29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZVRhYnNDb250cm9sXzE9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfQ3JlYXRlVGFic0NvbnRyb2xfMj1jYXN0PShDb250cm9sVGFiU2l6ZSkKLU9TX0NyZWF0ZVRhYnNDb250cm9sXzM9Y2FzdD0oQ29udHJvbFRhYkRpcmVjdGlvbikKLU9TX0NyZWF0ZVRhYnNDb250cm9sXzQ9Y2FzdD0oVUludDE2KQotT1NfQ3JlYXRlVGFic0NvbnRyb2xfNT1jYXN0PShjb25zdCBDb250cm9sVGFiRW50cnkgKikKLU9TX0NyZWF0ZVRhYnNDb250cm9sXzY9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVUZXh0VG9Vbmljb2RlSW5mb0J5RW5jb2Rpbmc9Ci1PU19DcmVhdGVUZXh0VG9Vbmljb2RlSW5mb0J5RW5jb2RpbmdfMD1jYXN0PShUZXh0RW5jb2RpbmcpCi1PU19DcmVhdGVUZXh0VG9Vbmljb2RlSW5mb0J5RW5jb2RpbmdfMT1jYXN0PShUZXh0VG9Vbmljb2RlSW5mbyAqKQotCi1PU19DcmVhdGVVbmljb2RlVG9UZXh0SW5mb0J5RW5jb2Rpbmc9Ci1PU19DcmVhdGVVbmljb2RlVG9UZXh0SW5mb0J5RW5jb2RpbmdfMD1jYXN0PShUZXh0RW5jb2RpbmcpCi1PU19DcmVhdGVVbmljb2RlVG9UZXh0SW5mb0J5RW5jb2RpbmdfMT1jYXN0PShVbmljb2RlVG9UZXh0SW5mbyAqKQotCi1PU19DcmVhdGVVc2VyUGFuZUNvbnRyb2w9Ci1PU19DcmVhdGVVc2VyUGFuZUNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVVc2VyUGFuZUNvbnRyb2xfMT0KLU9TX0NyZWF0ZVVzZXJQYW5lQ29udHJvbF8yPQotT1NfQ3JlYXRlVXNlclBhbmVDb250cm9sXzM9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVXaW5kb3dHcm91cD0KLU9TX0NyZWF0ZVdpbmRvd0dyb3VwXzA9Y2FzdD0oV2luZG93R3JvdXBBdHRyaWJ1dGVzKQotT1NfQ3JlYXRlV2luZG93R3JvdXBfMT1jYXN0PShXaW5kb3dHcm91cFJlZiAqKQotCi1PU19ETUdldEZpcnN0U2NyZWVuRGV2aWNlPQotT1NfRE1HZXRGaXJzdFNjcmVlbkRldmljZV8wPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX0RNR2V0TmV4dFNjcmVlbkRldmljZT0KLU9TX0RNR2V0TmV4dFNjcmVlbkRldmljZV8wPWNhc3Q9KEdESGFuZGxlKQotT1NfRE1HZXROZXh0U2NyZWVuRGV2aWNlXzE9Y2FzdD0oQm9vbGVhbikKLQotT1NfRGF0YUJyb3dzZXJDaGFuZ2VBdHRyaWJ1dGVzPWZsYWdzPWR5bmFtaWMKLU9TX0RhdGFCcm93c2VyQ2hhbmdlQXR0cmlidXRlc18wPQotT1NfRGF0YUJyb3dzZXJDaGFuZ2VBdHRyaWJ1dGVzXzE9Ci1PU19EYXRhQnJvd3NlckNoYW5nZUF0dHJpYnV0ZXNfMj0KLQotT1NfRGF0YUJyb3dzZXJHZXRBdHRyaWJ1dGVzPWZsYWdzPWR5bmFtaWMKLU9TX0RhdGFCcm93c2VyR2V0QXR0cmlidXRlc18wPQotT1NfRGF0YUJyb3dzZXJHZXRBdHRyaWJ1dGVzXzE9Ci0KLU9TX0RhdGFCcm93c2VyR2V0TWV0cmljPWZsYWdzPWR5bmFtaWMKLU9TX0RhdGFCcm93c2VyR2V0TWV0cmljXzA9Ci1PU19EYXRhQnJvd3NlckdldE1ldHJpY18xPQotT1NfRGF0YUJyb3dzZXJHZXRNZXRyaWNfMj0KLU9TX0RhdGFCcm93c2VyR2V0TWV0cmljXzM9Ci0KLU9TX0RhdGFCcm93c2VyU2V0TWV0cmljPWZsYWdzPWR5bmFtaWMKLU9TX0RhdGFCcm93c2VyU2V0TWV0cmljXzA9Ci1PU19EYXRhQnJvd3NlclNldE1ldHJpY18xPQotT1NfRGF0YUJyb3dzZXJTZXRNZXRyaWNfMj0KLU9TX0RhdGFCcm93c2VyU2V0TWV0cmljXzM9Ci0KLU9TX0RlbGV0ZUdsb2JhbFJlZj1mbGFncz1ub19nZW4KLU9TX0RlbGV0ZUdsb2JhbFJlZl8wPQotCi1PU19EZWxldGVNZW51PQotT1NfRGVsZXRlTWVudV8wPWNhc3Q9KE1lbnVJRCkKLQotT1NfRGVsZXRlTWVudUl0ZW09Ci1PU19EZWxldGVNZW51SXRlbV8wPWNhc3Q9KE1lbnVSZWYpCi1PU19EZWxldGVNZW51SXRlbV8xPWNhc3Q9KHNob3J0KQotCi1PU19EZWxldGVNZW51SXRlbXM9Ci1PU19EZWxldGVNZW51SXRlbXNfMD1jYXN0PShNZW51UmVmKQotT1NfRGVsZXRlTWVudUl0ZW1zXzE9Y2FzdD0oTWVudUl0ZW1JbmRleCkKLU9TX0RlbGV0ZU1lbnVJdGVtc18yPWNhc3Q9KEl0ZW1Db3VudCkKLQotT1NfRGlmZlJnbj0KLU9TX0RpZmZSZ25fMD1jYXN0PShSZ25IYW5kbGUpCi1PU19EaWZmUmduXzE9Y2FzdD0oUmduSGFuZGxlKQotT1NfRGlmZlJnbl8yPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfRGlzYWJsZUNvbnRyb2w9Ci1PU19EaXNhYmxlQ29udHJvbF8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0Rpc2FibGVNZW51Q29tbWFuZD0KLU9TX0Rpc2FibGVNZW51Q29tbWFuZF8wPWNhc3Q9KE1lbnVSZWYpCi1PU19EaXNhYmxlTWVudUNvbW1hbmRfMT1jYXN0PShNZW51Q29tbWFuZCkKLQotT1NfRGlzYWJsZU1lbnVJdGVtPQotT1NfRGlzYWJsZU1lbnVJdGVtXzA9Y2FzdD0oTWVudVJlZikKLU9TX0Rpc2FibGVNZW51SXRlbV8xPWNhc3Q9KE1lbnVJdGVtSW5kZXgpCi0KLU9TX0Rpc3Bvc2VDb250cm9sPQotT1NfRGlzcG9zZUNvbnRyb2xfMD1jYXN0PShDb250cm9sUmVmKQotCi1PU19EaXNwb3NlRHJhZz0KLU9TX0Rpc3Bvc2VEcmFnXzA9Y2FzdD0oRHJhZ1JlZikKLQotT1NfRGlzcG9zZUdXb3JsZD0KLU9TX0Rpc3Bvc2VHV29ybGRfMD1jYXN0PShHV29ybGRQdHIpCi0KLU9TX0Rpc3Bvc2VIYW5kbGU9Ci1PU19EaXNwb3NlSGFuZGxlXzA9Y2FzdD0oSGFuZGxlKQotCi1PU19EaXNwb3NlTWVudT0KLU9TX0Rpc3Bvc2VNZW51XzA9Y2FzdD0oTWVudVJlZikKLQotT1NfRGlzcG9zZVB0cj0KLU9TX0Rpc3Bvc2VQdHJfMD1jYXN0PShQdHIpCi0KLU9TX0Rpc3Bvc2VSZ249Ci1PU19EaXNwb3NlUmduXzA9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19EaXNwb3NlVGV4dFRvVW5pY29kZUluZm89Ci1PU19EaXNwb3NlVGV4dFRvVW5pY29kZUluZm9fMD1jYXN0PVRleHRUb1VuaWNvZGVJbmZvICoKLQotT1NfRGlzcG9zZVVuaWNvZGVUb1RleHRJbmZvPQotT1NfRGlzcG9zZVVuaWNvZGVUb1RleHRJbmZvXzA9Y2FzdD1Vbmljb2RlVG9UZXh0SW5mbyAqCi0KLU9TX0Rpc3Bvc2VXaW5kb3c9Ci1PU19EaXNwb3NlV2luZG93XzA9Y2FzdD0oV2luZG93UmVmKQotCi1PU19EcmF3Q29udHJvbEluQ3VycmVudFBvcnQ9Ci1PU19EcmF3Q29udHJvbEluQ3VycmVudFBvcnRfMD1jYXN0PShDb250cm9sUmVmKQotCi1PU19EcmF3TWVudUJhcj0KLQotT1NfRHJhd1RleHQ9Ci1PU19EcmF3VGV4dF8wPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX0RyYXdUZXh0XzE9Y2FzdD0oc2hvcnQpCi1PU19EcmF3VGV4dF8yPWNhc3Q9KHNob3J0KQotCi1PU19EcmF3VGhlbWVCdXR0b249Ci1PU19EcmF3VGhlbWVCdXR0b25fMD1jYXN0PShSZWN0ICopCi1PU19EcmF3VGhlbWVCdXR0b25fMT1jYXN0PShUaGVtZUJ1dHRvbktpbmQpCi1PU19EcmF3VGhlbWVCdXR0b25fMj1jYXN0PShjb25zdCBUaGVtZUJ1dHRvbkRyYXdJbmZvICopCi1PU19EcmF3VGhlbWVCdXR0b25fMz1jYXN0PShjb25zdCBUaGVtZUJ1dHRvbkRyYXdJbmZvICopCi1PU19EcmF3VGhlbWVCdXR0b25fND1jYXN0PShUaGVtZUVyYXNlVVBQKQotT1NfRHJhd1RoZW1lQnV0dG9uXzU9Y2FzdD0oVGhlbWVCdXR0b25EcmF3VVBQKQotT1NfRHJhd1RoZW1lQnV0dG9uXzY9Y2FzdD0oVUludDMyKQotCi1PU19EcmF3VGhlbWVFZGl0VGV4dEZyYW1lPQotT1NfRHJhd1RoZW1lRWRpdFRleHRGcmFtZV8wPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0RyYXdUaGVtZUVkaXRUZXh0RnJhbWVfMT1jYXN0PShUaGVtZURyYXdTdGF0ZSkKLQotT1NfRHJhd1RoZW1lRm9jdXNSZWN0PQotT1NfRHJhd1RoZW1lRm9jdXNSZWN0XzA9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfRHJhd1RoZW1lRm9jdXNSZWN0XzE9Y2FzdD0oQm9vbGVhbikKLQotT1NfRHJhd1RoZW1lUG9wdXBBcnJvdz0KLU9TX0RyYXdUaGVtZVBvcHVwQXJyb3dfMD0KLU9TX0RyYXdUaGVtZVBvcHVwQXJyb3dfMT1jYXN0PVRoZW1lQXJyb3dPcmllbnRhdGlvbgotT1NfRHJhd1RoZW1lUG9wdXBBcnJvd18yPWNhc3Q9KFRoZW1lUG9wdXBBcnJvd1NpemUpCi1PU19EcmF3VGhlbWVQb3B1cEFycm93XzM9Y2FzdD0oVGhlbWVEcmF3U3RhdGUpCi1PU19EcmF3VGhlbWVQb3B1cEFycm93XzQ9Y2FzdD0oVGhlbWVFcmFzZVVQUCkKLU9TX0RyYXdUaGVtZVBvcHVwQXJyb3dfNT1jYXN0PShVSW50MzIpCi0KLU9TX0RyYXdUaGVtZVNlcGFyYXRvcj0KLU9TX0RyYXdUaGVtZVNlcGFyYXRvcl8wPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0RyYXdUaGVtZVNlcGFyYXRvcl8xPWNhc3Q9KFRoZW1lRHJhd1N0YXRlKQotCi1PU19EcmF3VGhlbWVUZXh0Qm94PQotT1NfRHJhd1RoZW1lVGV4dEJveF8wPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfRHJhd1RoZW1lVGV4dEJveF8xPWNhc3Q9KFRoZW1lRm9udElEKQotT1NfRHJhd1RoZW1lVGV4dEJveF8yPWNhc3Q9KFRoZW1lRHJhd1N0YXRlKQotT1NfRHJhd1RoZW1lVGV4dEJveF8zPWNhc3Q9KEJvb2xlYW4pCi1PU19EcmF3VGhlbWVUZXh0Qm94XzQ9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfRHJhd1RoZW1lVGV4dEJveF81PWNhc3Q9KFNJbnQxNikKLU9TX0RyYXdUaGVtZVRleHRCb3hfNj1jYXN0PSh2b2lkICopCi0KLU9TX0VtYmVkQ29udHJvbD0KLU9TX0VtYmVkQ29udHJvbF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19FbWJlZENvbnRyb2xfMT1jYXN0PShDb250cm9sUmVmKQotCi1PU19FbXB0eVJlY3Q9Ci1PU19FbXB0eVJlY3RfMD1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX0VtcHR5UmduPQotT1NfRW1wdHlSZ25fMD1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX0VuYWJsZUNvbnRyb2w9Ci1PU19FbmFibGVDb250cm9sXzA9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfRW5hYmxlTWVudUNvbW1hbmQ9Ci1PU19FbmFibGVNZW51Q29tbWFuZF8wPWNhc3Q9KE1lbnVSZWYpCi1PU19FbmFibGVNZW51Q29tbWFuZF8xPWNhc3Q9KE1lbnVDb21tYW5kKQotCi1PU19FbmFibGVNZW51SXRlbT0KLU9TX0VuYWJsZU1lbnVJdGVtXzA9Y2FzdD0oTWVudVJlZikKLU9TX0VuYWJsZU1lbnVJdGVtXzE9Y2FzdD0oTWVudUl0ZW1JbmRleCkKLQotT1NfRW5kVXBkYXRlPQotT1NfRW5kVXBkYXRlXzA9Y2FzdD0oV2luZG93UmVmKQotCi1PU19FcXVhbFJlY3Q9Ci1PU19FcXVhbFJlY3RfMD0KLU9TX0VxdWFsUmVjdF8xPQotCi1PU19FcmFzZVJlY3Q9Ci1PU19FcmFzZVJlY3RfMD1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX0VyYXNlUmduPQotT1NfRXJhc2VSZ25fMD1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX0ZNQ3JlYXRlRm9udEZhbWlseUluc3RhbmNlSXRlcmF0b3I9Ci1PU19GTUNyZWF0ZUZvbnRGYW1pbHlJbnN0YW5jZUl0ZXJhdG9yXzA9Y2FzdD0oRk1Gb250RmFtaWx5KQotT1NfRk1DcmVhdGVGb250RmFtaWx5SW5zdGFuY2VJdGVyYXRvcl8xPWNhc3Q9KEZNRm9udEZhbWlseUluc3RhbmNlSXRlcmF0b3IgKikKLQotT1NfRk1DcmVhdGVGb250RmFtaWx5SXRlcmF0b3I9Ci1PU19GTUNyZWF0ZUZvbnRGYW1pbHlJdGVyYXRvcl8wPWNhc3Q9KGNvbnN0IEZNRmlsdGVyICopCi1PU19GTUNyZWF0ZUZvbnRGYW1pbHlJdGVyYXRvcl8xPWNhc3Q9KHZvaWQgKikKLU9TX0ZNQ3JlYXRlRm9udEZhbWlseUl0ZXJhdG9yXzI9Y2FzdD0oT3B0aW9uQml0cykKLU9TX0ZNQ3JlYXRlRm9udEZhbWlseUl0ZXJhdG9yXzM9Y2FzdD0oRk1Gb250RmFtaWx5SXRlcmF0b3IgKikKLQotT1NfRk1EaXNwb3NlRm9udEZhbWlseUluc3RhbmNlSXRlcmF0b3I9Ci1PU19GTURpc3Bvc2VGb250RmFtaWx5SW5zdGFuY2VJdGVyYXRvcl8wPWNhc3Q9KEZNRm9udEZhbWlseUluc3RhbmNlSXRlcmF0b3IgKikKLQotT1NfRk1EaXNwb3NlRm9udEZhbWlseUl0ZXJhdG9yPQotT1NfRk1EaXNwb3NlRm9udEZhbWlseUl0ZXJhdG9yXzA9Y2FzdD0oRk1Gb250RmFtaWx5SXRlcmF0b3IgKikKLQotT1NfRk1HZXRBVFNGb250UmVmRnJvbUZvbnQ9Ci1PU19GTUdldEFUU0ZvbnRSZWZGcm9tRm9udF8wPQotCi1PU19GTUdldEZvbnRGYW1pbHlGcm9tTmFtZT0KLU9TX0ZNR2V0Rm9udEZhbWlseUZyb21OYW1lXzA9Y2FzdD0oQ29uc3RTdHIyNTVQYXJhbSkKLQotT1NfRk1HZXRGb250RmFtaWx5SW5zdGFuY2VGcm9tRm9udD0KLU9TX0ZNR2V0Rm9udEZhbWlseUluc3RhbmNlRnJvbUZvbnRfMD1jYXN0PUZNRm9udAotT1NfRk1HZXRGb250RmFtaWx5SW5zdGFuY2VGcm9tRm9udF8xPWNhc3Q9Rk1Gb250RmFtaWx5ICoKLU9TX0ZNR2V0Rm9udEZhbWlseUluc3RhbmNlRnJvbUZvbnRfMj1jYXN0PUZNRm9udFN0eWxlICoKLQotT1NfRk1HZXRGb250RmFtaWx5TmFtZT0KLU9TX0ZNR2V0Rm9udEZhbWlseU5hbWVfMD1jYXN0PUZNRm9udEZhbWlseQotT1NfRk1HZXRGb250RmFtaWx5TmFtZV8xPWNhc3Q9KHVuc2lnbmVkIGNoYXIgKikKLQotT1NfRk1HZXRGb250RnJvbUZvbnRGYW1pbHlJbnN0YW5jZT0KLU9TX0ZNR2V0Rm9udEZyb21Gb250RmFtaWx5SW5zdGFuY2VfMD1jYXN0PShGTUZvbnRGYW1pbHkpCi1PU19GTUdldEZvbnRGcm9tRm9udEZhbWlseUluc3RhbmNlXzE9Y2FzdD0oRk1Gb250U3R5bGUpCi1PU19GTUdldEZvbnRGcm9tRm9udEZhbWlseUluc3RhbmNlXzI9Y2FzdD0oRk1Gb250ICopCi1PU19GTUdldEZvbnRGcm9tRm9udEZhbWlseUluc3RhbmNlXzM9Y2FzdD0oRk1Gb250U3R5bGUgKikKLQotT1NfRk1HZXROZXh0Rm9udEZhbWlseT0KLU9TX0ZNR2V0TmV4dEZvbnRGYW1pbHlfMD1jYXN0PShGTUZvbnRGYW1pbHlJdGVyYXRvciAqKQotT1NfRk1HZXROZXh0Rm9udEZhbWlseV8xPWNhc3Q9KEZNRm9udEZhbWlseSAqKQotCi1PU19GTUdldE5leHRGb250RmFtaWx5SW5zdGFuY2U9Ci1PU19GTUdldE5leHRGb250RmFtaWx5SW5zdGFuY2VfMD1jYXN0PShGTUZvbnRGYW1pbHlJbnN0YW5jZUl0ZXJhdG9yICopCi1PU19GTUdldE5leHRGb250RmFtaWx5SW5zdGFuY2VfMT1jYXN0PShGTUZvbnQgKikKLU9TX0ZNR2V0TmV4dEZvbnRGYW1pbHlJbnN0YW5jZV8yPWNhc3Q9KEZNRm9udFN0eWxlICopCi1PU19GTUdldE5leHRGb250RmFtaWx5SW5zdGFuY2VfMz1jYXN0PShGTUZvbnRTaXplICopCi0KLU9TX0ZQSXNGb250UGFuZWxWaXNpYmxlPQotCi1PU19GUFNob3dIaWRlRm9udFBhbmVsPQotCi1PU19GU0dldENhdGFsb2dJbmZvPQotT1NfRlNHZXRDYXRhbG9nSW5mb18wPWNhc3Q9KEZTUmVmICopCi1PU19GU0dldENhdGFsb2dJbmZvXzE9Y2FzdD0oRlNDYXRhbG9nSW5mb0JpdG1hcCkKLU9TX0ZTR2V0Q2F0YWxvZ0luZm9fMj1jYXN0PShGU0NhdGFsb2dJbmZvICopCi1PU19GU0dldENhdGFsb2dJbmZvXzM9Y2FzdD0oSEZTVW5pU3RyMjU1ICopCi1PU19GU0dldENhdGFsb2dJbmZvXzQ9Y2FzdD0oRlNTcGVjICopCi1PU19GU0dldENhdGFsb2dJbmZvXzU9Y2FzdD0oRlNSZWYgKikKLQotT1NfRlNwR2V0RkluZm89Ci1PU19GU3BHZXRGSW5mb18wPWNhc3Q9KEZTU3BlYyAqKQotT1NfRlNwR2V0RkluZm9fMT1jYXN0PShGSW5mbyAqKQotCi1PU19GU3BNYWtlRlNSZWY9Ci1PU19GU3BNYWtlRlNSZWZfMD1jYXN0PShjb25zdCBGU1NwZWMgKikKLU9TX0ZTcE1ha2VGU1JlZl8xPWNhc3Q9KEZTUmVmICopCi0KLU9TX0ZldGNoRm9udEluZm89Ci1PU19GZXRjaEZvbnRJbmZvXzA9Ci1PU19GZXRjaEZvbnRJbmZvXzE9Ci1PU19GZXRjaEZvbnRJbmZvXzI9Ci1PU19GZXRjaEZvbnRJbmZvXzM9Ci0KLU9TX0ZpbmRXaW5kb3c9Ci1PU19GaW5kV2luZG93XzA9Y2FzdD0oUG9pbnQgKiksZmxhZ3M9c3RydWN0Ci1PU19GaW5kV2luZG93XzE9Y2FzdD0oV2luZG93UmVmICopCi0KLU9TX0ZpeDJMb25nPQotT1NfRml4MkxvbmdfMD0KLQotT1NfRml4Mlg9Ci1PU19GaXgyWF8wPWNhc3Q9Rml4ZWQKLQotT1NfRnJhbWVPdmFsPQotT1NfRnJhbWVPdmFsXzA9Y2FzdD0oY29uc3QgUmVjdCAqKQotCi1PU19GcmFtZVBvbHk9Ci1PU19GcmFtZVBvbHlfMD1jYXN0PShQb2x5SGFuZGxlKQotCi1PU19GcmFtZVJlY3Q9Ci1PU19GcmFtZVJlY3RfMD1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX0ZyYW1lUm91bmRSZWN0PQotT1NfRnJhbWVSb3VuZFJlY3RfMD1jYXN0PShjb25zdCBSZWN0ICopCi1PU19GcmFtZVJvdW5kUmVjdF8xPWNhc3Q9KHNob3J0KQotT1NfRnJhbWVSb3VuZFJlY3RfMj1jYXN0PShzaG9ydCkKLQotT1NfRnJvbnRXaW5kb3c9Ci0KLU9TX0dlc3RhbHQ9Ci1PU19HZXN0YWx0XzA9Y2FzdD1PU1R5cGUKLU9TX0dlc3RhbHRfMT1jYXN0PWxvbmcgKgotCi1PU19HZXRBcHBGb250PQotCi1PU19HZXRBcHBsaWNhdGlvbkV2ZW50VGFyZ2V0PQotCi1PU19HZXRBdmFpbGFibGVXaW5kb3dBdHRyaWJ1dGVzPQotT1NfR2V0QXZhaWxhYmxlV2luZG93QXR0cmlidXRlc18wPWNhc3Q9KFdpbmRvd0NsYXNzKQotCi1PU19HZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kcz0KLU9TX0dldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzXzA9Y2FzdD0oR0RIYW5kbGUpCi1PU19HZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kc18xPWNhc3Q9KFJlY3QgKikKLQotT1NfR2V0QmVzdENvbnRyb2xSZWN0PQotT1NfR2V0QmVzdENvbnRyb2xSZWN0XzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldEJlc3RDb250cm9sUmVjdF8xPWNhc3Q9KFJlY3QgKikKLU9TX0dldEJlc3RDb250cm9sUmVjdF8yPWNhc3Q9KFNJbnQxNiAqKQotCi1PU19HZXRDYXJldFRpbWU9Ci0KLU9TX0dldENsaXA9Ci1PU19HZXRDbGlwXzA9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19HZXRDb250cm9sMzJCaXRNYXhpbXVtPQotT1NfR2V0Q29udHJvbDMyQml0TWF4aW11bV8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0dldENvbnRyb2wzMkJpdE1pbmltdW09Ci1PU19HZXRDb250cm9sMzJCaXRNaW5pbXVtXzA9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfR2V0Q29udHJvbDMyQml0VmFsdWU9Ci1PU19HZXRDb250cm9sMzJCaXRWYWx1ZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0dldENvbnRyb2xCb3VuZHM9Ci1PU19HZXRDb250cm9sQm91bmRzXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldENvbnRyb2xCb3VuZHNfMT1jYXN0PShSZWN0ICopCi0KLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uUmVjXzJfM0k9Ci1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY18yXzNJXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uUmVjXzJfM0lfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY18yXzNJXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uUmVjXzJfM0lfMz1jYXN0PShTaXplKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sRWRpdFRleHRTZWxlY3Rpb25SZWNfMl8zSV80PWNhc3Q9KHZvaWQgKikKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uUmVjXzJfM0lfNT0KLQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sRm9udFN0eWxlUmVjXzJfM0k9Ci1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xGb250U3R5bGVSZWNfMl8zSV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xGb250U3R5bGVSZWNfMl8zSV8xPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEZvbnRTdHlsZVJlY18yXzNJXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEZvbnRTdHlsZVJlY18yXzNJXzM9Y2FzdD0oU2l6ZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEZvbnRTdHlsZVJlY18yXzNJXzQ9Y2FzdD0odm9pZCAqKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sRm9udFN0eWxlUmVjXzJfM0lfNT1jYXN0PShTaXplICopCi0KLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzNJPQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJfM0lfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJfM0lfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8zSV8yPWNhc3Q9KFJlc1R5cGUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8zSV8zPWNhc3Q9KFNpemUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8zSV80PWNhc3Q9KHZvaWQgKikKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzNJXzU9Y2FzdD0oU2l6ZSAqKQotCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zQl8zST0KLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNCXzNJXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNCXzNJXzE9Y2FzdD0oQ29udHJvbFBhcnRDb2RlKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM0JfM0lfMj1jYXN0PShSZXNUeXBlKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM0JfM0lfMz1jYXN0PShTaXplKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM0JfM0lfND1jYXN0PSh2b2lkICopCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zQl8zSV81PWNhc3Q9KFNpemUgKikKLQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM0lfM0k9Ci1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zSV8zSV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zSV8zSV8xPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNJXzNJXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNJXzNJXzM9Y2FzdD0oU2l6ZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNJXzNJXzQ9Y2FzdD0odm9pZCAqKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM0lfM0lfNT1jYXN0PShTaXplICopCi0KLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNTXzNJPQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM1NfM0lfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM1NfM0lfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zU18zSV8yPWNhc3Q9KFJlc1R5cGUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zU18zSV8zPWNhc3Q9KFNpemUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zU18zSV80PWNhc3Q9KHZvaWQgKikKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNTXzNJXzU9Y2FzdD0oU2l6ZSAqKQotCi1PU19HZXRDb250cm9sRXZlbnRUYXJnZXQ9Ci1PU19HZXRDb250cm9sRXZlbnRUYXJnZXRfMD1jYXN0PShDb250cm9sUmVmKQotCi1PU19HZXRDb250cm9sRmVhdHVyZXM9Ci1PU19HZXRDb250cm9sRmVhdHVyZXNfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0Q29udHJvbEZlYXR1cmVzXzE9Y2FzdD1VSW50MzIgKgotCi1PU19HZXRDb250cm9sS2luZD0KLU9TX0dldENvbnRyb2xLaW5kXzA9Y2FzdD1Db250cm9sUmVmCi1PU19HZXRDb250cm9sS2luZF8xPQotCi1PU19HZXRDb250cm9sT3duZXI9Ci1PU19HZXRDb250cm9sT3duZXJfMD1jYXN0PShDb250cm9sUmVmKQotCi1PU19HZXRDb250cm9sUHJvcGVydHk9Ci1PU19HZXRDb250cm9sUHJvcGVydHlfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0Q29udHJvbFByb3BlcnR5XzE9Ci1PU19HZXRDb250cm9sUHJvcGVydHlfMj0KLU9TX0dldENvbnRyb2xQcm9wZXJ0eV8zPQotT1NfR2V0Q29udHJvbFByb3BlcnR5XzQ9Y2FzdD1VSW50MzIgKgotT1NfR2V0Q29udHJvbFByb3BlcnR5XzU9Y2FzdD12b2lkICoKLQotT1NfR2V0Q29udHJvbFJlZmVyZW5jZT0KLU9TX0dldENvbnRyb2xSZWZlcmVuY2VfMD1jYXN0PShDb250cm9sUmVmKQotCi1PU19HZXRDb250cm9sUmVnaW9uPQotT1NfR2V0Q29udHJvbFJlZ2lvbl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXRDb250cm9sUmVnaW9uXzE9Y2FzdD0oQ29udHJvbFBhcnRDb2RlKQotT1NfR2V0Q29udHJvbFJlZ2lvbl8yPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfR2V0Q29udHJvbFZhbHVlPQotT1NfR2V0Q29udHJvbFZhbHVlXzA9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfR2V0Q29udHJvbFZpZXdTaXplPQotT1NfR2V0Q29udHJvbFZpZXdTaXplXzA9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfR2V0Q3VycmVudEV2ZW50QnV0dG9uU3RhdGU9Ci0KLU9TX0dldEN1cnJlbnRFdmVudEtleU1vZGlmaWVycz0KLQotT1NfR2V0Q3VycmVudEV2ZW50TG9vcD0KLQotT1NfR2V0Q3VycmVudEV2ZW50UXVldWU9Ci0KLU9TX0dldEN1cnJlbnRQcm9jZXNzPQotT1NfR2V0Q3VycmVudFByb2Nlc3NfMD1jYXN0PShQcm9jZXNzU2VyaWFsTnVtYmVyICopCi0KLU9TX0dldEN1cnJlbnRTY3JhcD0KLU9TX0dldEN1cnJlbnRTY3JhcF8wPWNhc3Q9KFNjcmFwUmVmICopCi0KLU9TX0dldERhdGFCcm93c2VyQ2FsbGJhY2tzPQotT1NfR2V0RGF0YUJyb3dzZXJDYWxsYmFja3NfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJDYWxsYmFja3NfMT1jYXN0PShEYXRhQnJvd3NlckNhbGxiYWNrcyAqKQotCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1Db3VudD0KLU9TX0dldERhdGFCcm93c2VySXRlbUNvdW50XzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VySXRlbUNvdW50XzE9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtSUQpCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1Db3VudF8yPWNhc3Q9KEJvb2xlYW4pCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1Db3VudF8zPWNhc3Q9KERhdGFCcm93c2VySXRlbVN0YXRlKQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtQ291bnRfND1jYXN0PShVSW50MzIgKikKLQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtRGF0YUJ1dHRvblZhbHVlPQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtRGF0YUJ1dHRvblZhbHVlXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VySXRlbURhdGFCdXR0b25WYWx1ZV8xPWNhc3Q9VGhlbWVCdXR0b25WYWx1ZSAqCi0KLU9TX0dldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHM9Ci1PU19HZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHNfMT1jYXN0PShEYXRhQnJvd3Nlckl0ZW1JRCkKLU9TX0dldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHNfMj1jYXN0PShEYXRhQnJvd3NlclByb3BlcnR5SUQpCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzXzM9Y2FzdD0oRGF0YUJyb3dzZXJQcm9wZXJ0eVBhcnQpCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzXzQ9Y2FzdD0oUmVjdCAqKQotCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1TdGF0ZT0KLU9TX0dldERhdGFCcm93c2VySXRlbVN0YXRlXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VySXRlbVN0YXRlXzE9Ci1PU19HZXREYXRhQnJvd3Nlckl0ZW1TdGF0ZV8yPWNhc3Q9RGF0YUJyb3dzZXJJdGVtU3RhdGUgKgotCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1zPQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtc18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1zXzE9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtSUQpCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1zXzI9Y2FzdD0oQm9vbGVhbikKLU9TX0dldERhdGFCcm93c2VySXRlbXNfMz1jYXN0PShEYXRhQnJvd3Nlckl0ZW1TdGF0ZSkKLU9TX0dldERhdGFCcm93c2VySXRlbXNfND1jYXN0PShIYW5kbGUpCi0KLU9TX0dldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uPQotT1NfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW5fMD1jYXN0PUNvbnRyb2xSZWYKLU9TX0dldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uXzE9Y2FzdD0oRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5JRCAqKQotT1NfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW5fMj1jYXN0PUJvb2xlYW4gKgotCi1PU19HZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0PQotT1NfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0XzE9Y2FzdD1VSW50MTYgKgotCi1PU19HZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzYz0KLU9TX0dldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjXzE9Y2FzdD0oRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5JRCkKLU9TX0dldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjXzI9Y2FzdD0oRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2MgKikKLQotT1NfR2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzPQotT1NfR2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VyUHJvcGVydHlGbGFnc18xPWNhc3Q9RGF0YUJyb3dzZXJQcm9wZXJ0eUlECi1PU19HZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3NfMj1jYXN0PShEYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MgKikKLQotT1NfR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldD0KLU9TX0dldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXRfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldF8xPQotCi1PU19HZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uPQotT1NfR2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uXzE9Y2FzdD0oVUludDMyICopCi1PU19HZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uXzI9Y2FzdD0oVUludDMyICopCi0KLU9TX0dldERhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yPQotT1NfR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3JfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3JfMT1jYXN0PShVSW50MzIgKikKLU9TX0dldERhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yXzI9Y2FzdD0oVUludDMyICopCi0KLU9TX0dldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3M9Ci1PU19HZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3NfMT1jYXN0PURhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MgKgotCi1PU19HZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eT0KLU9TX0dldERhdGFCcm93c2VyU29ydFByb3BlcnR5XzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VyU29ydFByb3BlcnR5XzE9Y2FzdD1EYXRhQnJvd3NlclByb3BlcnR5SUQgKgotCi1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uPQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uXzE9Y2FzdD0oRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5JRCkKLU9TX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb25fMj1jYXN0PShEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkluZGV4ICopCi0KLU9TX0dldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlEPQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSURfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSURfMT1jYXN0PShEYXRhQnJvd3NlclRhYmxlVmlld1Jvd0luZGV4KQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSURfMj1jYXN0PShEYXRhQnJvd3Nlckl0ZW1JRCAqKQotCi1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3c9Ci1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93XzE9Y2FzdD0oRGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dJbmRleCkKLU9TX0dldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd18yPWNhc3Q9KERhdGFCcm93c2VySXRlbUlEICopCi0KLU9TX0dldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aD0KLU9TX0dldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGhfMT1jYXN0PShEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbklEKQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoXzI9Y2FzdD0oVUludDE2ICopCi0KLU9TX0dldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0PQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHRfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHRfMT1jYXN0PShVSW50MTYgKikKLQotT1NfR2V0RGJsVGltZT0KLQotT1NfR2V0RGVmRm9udFNpemU9Ci0KLU9TX0dldERldmljZUxpc3Q9Ci0KLU9TX0dldERyYWdBbGxvd2FibGVBY3Rpb25zPQotT1NfR2V0RHJhZ0FsbG93YWJsZUFjdGlvbnNfMD1jYXN0PShEcmFnUmVmKQotT1NfR2V0RHJhZ0FsbG93YWJsZUFjdGlvbnNfMT1jYXN0PShEcmFnQWN0aW9ucyAqKQotCi1PU19HZXREcmFnRHJvcEFjdGlvbj0KLU9TX0dldERyYWdEcm9wQWN0aW9uXzA9Y2FzdD0oRHJhZ1JlZikKLU9TX0dldERyYWdEcm9wQWN0aW9uXzE9Y2FzdD0oRHJhZ0FjdGlvbnMgKikKLQotT1NfR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXI9Ci1PU19HZXREcmFnSXRlbVJlZmVyZW5jZU51bWJlcl8wPWNhc3Q9KERyYWdSZWYpCi1PU19HZXREcmFnSXRlbVJlZmVyZW5jZU51bWJlcl8xPQotT1NfR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXJfMj1jYXN0PShEcmFnSXRlbVJlZiAqKQotCi1PU19HZXREcmFnTW9kaWZpZXJzPQotT1NfR2V0RHJhZ01vZGlmaWVyc18wPWNhc3Q9KERyYWdSZWYpCi1PU19HZXREcmFnTW9kaWZpZXJzXzE9Y2FzdD0oU0ludDE2ICopCi1PU19HZXREcmFnTW9kaWZpZXJzXzI9Y2FzdD0oU0ludDE2ICopCi1PU19HZXREcmFnTW9kaWZpZXJzXzM9Y2FzdD0oU0ludDE2ICopCi0KLU9TX0dldERyYWdNb3VzZT0KLU9TX0dldERyYWdNb3VzZV8wPWNhc3Q9KERyYWdSZWYpCi1PU19HZXREcmFnTW91c2VfMT1jYXN0PShQb2ludCAqKQotT1NfR2V0RHJhZ01vdXNlXzI9Y2FzdD0oUG9pbnQgKikKLQotT1NfR2V0RXZlbnRDbGFzcz0KLU9TX0dldEV2ZW50Q2xhc3NfMD1jYXN0PShFdmVudFJlZikKLQotT1NfR2V0RXZlbnREaXNwYXRjaGVyVGFyZ2V0PQotCi1PU19HZXRFdmVudEtpbmQ9Ci1PU19HZXRFdmVudEtpbmRfMD1jYXN0PShFdmVudFJlZikKLQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BvaW50XzI9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnRfMl8wPWNhc3Q9KEV2ZW50UmVmKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BvaW50XzJfMT1jYXN0PShFdmVudFBhcmFtTmFtZSkKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQb2ludF8yXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnRfMl8zPWNhc3Q9KEV2ZW50UGFyYW1UeXBlICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnRfMl80PWNhc3Q9KFVJbnQzMikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQb2ludF8yXzU9Y2FzdD0oVUludDMyICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnRfMl82PWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1JlY3RfMj0KLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dSZWN0XzJfMD1jYXN0PUV2ZW50UmVmCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUmVjdF8yXzE9Y2FzdD1FdmVudFBhcmFtTmFtZQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1JlY3RfMl8yPWNhc3Q9RXZlbnRQYXJhbVR5cGUKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dSZWN0XzJfMz1jYXN0PUV2ZW50UGFyYW1UeXBlICoKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dSZWN0XzJfND1jYXN0PShVSW50MzIpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUmVjdF8yXzU9Y2FzdD1VSW50MzIgKgotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1JlY3RfMl82PWNhc3Q9dm9pZCAqCi0KLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElDb21tYW5kXzI9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzA9Y2FzdD0oRXZlbnRSZWYpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzE9Y2FzdD0oRXZlbnRQYXJhbU5hbWUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzM9Y2FzdD0oRXZlbnRQYXJhbVR5cGUgKikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElDb21tYW5kXzJfND1jYXN0PShVSW50MzIpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzU9Y2FzdD0oVUludDMyICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzY9Y2FzdD0odm9pZCAqKQotCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BvaW50XzI9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BvaW50XzJfMD1jYXN0PShFdmVudFJlZikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUG9pbnRfMl8xPWNhc3Q9KEV2ZW50UGFyYW1OYW1lKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Qb2ludF8yXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BvaW50XzJfMz1jYXN0PShFdmVudFBhcmFtVHlwZSAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Qb2ludF8yXzQ9Y2FzdD0oVUludDMyKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Qb2ludF8yXzU9Y2FzdD0oVUludDMyICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BvaW50XzJfNj1jYXN0PSh2b2lkICopCi0KLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUkdCQ29sb3JfMj0KLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUkdCQ29sb3JfMl8wPWNhc3Q9KEV2ZW50UmVmKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SR0JDb2xvcl8yXzE9Y2FzdD0oRXZlbnRQYXJhbU5hbWUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJfMj1jYXN0PShFdmVudFBhcmFtVHlwZSkKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUkdCQ29sb3JfMl8zPWNhc3Q9KEV2ZW50UGFyYW1UeXBlICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJfND1jYXN0PShVSW50MzIpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJfNT1jYXN0PShVSW50MzIgKikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUkdCQ29sb3JfMl82PWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzI9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8wPWNhc3Q9KEV2ZW50UmVmKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJfMT1jYXN0PShFdmVudFBhcmFtTmFtZSkKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8zPWNhc3Q9KEV2ZW50UGFyYW1UeXBlICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl80PWNhc3Q9KFVJbnQzMikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzU9Y2FzdD0oVUludDMyICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl82PWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0I9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQl8wPWNhc3Q9KEV2ZW50UmVmKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0JfMT1jYXN0PShFdmVudFBhcmFtTmFtZSkKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNCXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQl8zPWNhc3Q9KEV2ZW50UGFyYW1UeXBlICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQl80PWNhc3Q9KFVJbnQzMikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNCXzU9Y2FzdD0oVUludDMyICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQl82PWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0M9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQ18wPWNhc3Q9KEV2ZW50UmVmKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0NfMT1jYXN0PShFdmVudFBhcmFtTmFtZSkKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNDXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQ18zPWNhc3Q9KEV2ZW50UGFyYW1UeXBlICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQ180PWNhc3Q9KFVJbnQzMikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNDXzU9Y2FzdD0oVUludDMyICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQ182PWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0k9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zSV8wPWNhc3Q9KEV2ZW50UmVmKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0lfMT1jYXN0PShFdmVudFBhcmFtTmFtZSkKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNJXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zSV8zPWNhc3Q9KEV2ZW50UGFyYW1UeXBlICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zSV80PWNhc3Q9KFVJbnQzMikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNJXzU9Y2FzdD0oVUludDMyICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zSV82PWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM1M9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zU18wPWNhc3Q9KEV2ZW50UmVmKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM1NfMT1jYXN0PShFdmVudFBhcmFtTmFtZSkKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNTXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zU18zPWNhc3Q9KEV2ZW50UGFyYW1UeXBlICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zU180PWNhc3Q9KFVJbnQzMikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNTXzU9Y2FzdD0oVUludDMyICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zU182PWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0RXZlbnRUaW1lPQotT1NfR2V0RXZlbnRUaW1lXzA9Y2FzdD0oRXZlbnRSZWYpCi0KLU9TX0dldEZsYXZvckRhdGE9Ci1PU19HZXRGbGF2b3JEYXRhXzA9Y2FzdD0oRHJhZ1JlZikKLU9TX0dldEZsYXZvckRhdGFfMT1jYXN0PShEcmFnSXRlbVJlZikKLU9TX0dldEZsYXZvckRhdGFfMj1jYXN0PShGbGF2b3JUeXBlKQotT1NfR2V0Rmxhdm9yRGF0YV8zPWNhc3Q9KHZvaWQgKikKLU9TX0dldEZsYXZvckRhdGFfND1jYXN0PShTaXplICopCi1PU19HZXRGbGF2b3JEYXRhXzU9Ci0KLU9TX0dldEZsYXZvckRhdGFTaXplPQotT1NfR2V0Rmxhdm9yRGF0YVNpemVfMD1jYXN0PShEcmFnUmVmKQotT1NfR2V0Rmxhdm9yRGF0YVNpemVfMT1jYXN0PShEcmFnSXRlbVJlZikKLU9TX0dldEZsYXZvckRhdGFTaXplXzI9Y2FzdD0oRmxhdm9yVHlwZSkKLU9TX0dldEZsYXZvckRhdGFTaXplXzM9Y2FzdD0oU2l6ZSAqKQotCi1PU19HZXRGbGF2b3JUeXBlPQotT1NfR2V0Rmxhdm9yVHlwZV8wPWNhc3Q9KERyYWdSZWYpCi1PU19HZXRGbGF2b3JUeXBlXzE9Y2FzdD0oRHJhZ0l0ZW1SZWYpCi1PU19HZXRGbGF2b3JUeXBlXzI9Ci1PU19HZXRGbGF2b3JUeXBlXzM9Y2FzdD0oRmxhdm9yVHlwZSAqKQotCi1PU19HZXRGb250SW5mbz0KLU9TX0dldEZvbnRJbmZvXzA9Y2FzdD0oRm9udEluZm8gKikKLQotT1NfR2V0R0RldmljZT0KLQotT1NfR2V0R1dvcmxkPQotT1NfR2V0R1dvcmxkXzA9Y2FzdD0oQ0dyYWZQdHIgKikKLU9TX0dldEdXb3JsZF8xPWNhc3Q9KEdESGFuZGxlICopCi0KLU9TX0dldEdsb2JhbE1vdXNlPQotT1NfR2V0R2xvYmFsTW91c2VfMD1jYXN0PShQb2ludCAqKQotCi1PU19HZXRIYW5kbGVTaXplPQotT1NfR2V0SGFuZGxlU2l6ZV8wPWNhc3Q9KEhhbmRsZSkKLQotT1NfR2V0SWNvbkZhbWlseURhdGE9Ci1PU19HZXRJY29uRmFtaWx5RGF0YV8wPWNhc3Q9SWNvbkZhbWlseUhhbmRsZQotT1NfR2V0SWNvbkZhbWlseURhdGFfMT1jYXN0PU9TVHlwZQotT1NfR2V0SWNvbkZhbWlseURhdGFfMj1jYXN0PShIYW5kbGUpCi0KLU9TX0dldEljb25SZWY9Ci1PU19HZXRJY29uUmVmXzA9Y2FzdD0oU0ludDE2KQotT1NfR2V0SWNvblJlZl8xPWNhc3Q9KE9TVHlwZSkKLU9TX0dldEljb25SZWZfMj1jYXN0PShPU1R5cGUpCi1PU19HZXRJY29uUmVmXzM9Y2FzdD0oSWNvblJlZiAqKQotCi1PU19HZXRJY29uUmVmRnJvbUljb25GYW1pbHlQdHI9ZmxhZ3M9ZHluYW1pYwotT1NfR2V0SWNvblJlZkZyb21JY29uRmFtaWx5UHRyXzA9Ci1PU19HZXRJY29uUmVmRnJvbUljb25GYW1pbHlQdHJfMT0KLU9TX0dldEljb25SZWZGcm9tSWNvbkZhbWlseVB0cl8yPQotCi1PU19HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQ9Ci1PU19HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSURfMD1jYXN0PShNZW51UmVmKQotT1NfR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEXzE9Y2FzdD0oTWVudUNvbW1hbmQpCi1PU19HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSURfMj1jYXN0PShVSW50MzIpCi1PU19HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSURfMz1jYXN0PShNZW51UmVmICopCi1PU19HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSURfND1jYXN0PShNZW51SXRlbUluZGV4ICopCi0KLU9TX0dldEluZGV4ZWRTdWJDb250cm9sPQotT1NfR2V0SW5kZXhlZFN1YkNvbnRyb2xfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0SW5kZXhlZFN1YkNvbnRyb2xfMT1jYXN0PShVSW50MTYpCi1PU19HZXRJbmRleGVkU3ViQ29udHJvbF8yPWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfR2V0SXRlbU1hcms9Ci1PU19HZXRJdGVtTWFya18wPWNhc3Q9KE1lbnVSZWYpCi1PU19HZXRJdGVtTWFya18xPQotT1NfR2V0SXRlbU1hcmtfMj0KLQotT1NfR2V0S2V5Ym9hcmRGb2N1cz0KLU9TX0dldEtleWJvYXJkRm9jdXNfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19HZXRLZXlib2FyZEZvY3VzXzE9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19HZXRMYXN0VXNlckV2ZW50VGltZT0KLQotT1NfR2V0TUJhckhlaWdodD0KLQotT1NfR2V0TWFpbkRldmljZT0KLQotT1NfR2V0TWFpbkV2ZW50UXVldWU9Ci0KLU9TX0dldE1lbnVDb21tYW5kTWFyaz0KLU9TX0dldE1lbnVDb21tYW5kTWFya18wPWNhc3Q9KE1lbnVSZWYpCi1PU19HZXRNZW51Q29tbWFuZE1hcmtfMT1jYXN0PShNZW51Q29tbWFuZCkKLU9TX0dldE1lbnVDb21tYW5kTWFya18yPWNhc3Q9KFVuaUNoYXIgKikKLQotT1NfR2V0TWVudUV2ZW50VGFyZ2V0PQotT1NfR2V0TWVudUV2ZW50VGFyZ2V0XzA9Y2FzdD0oTWVudVJlZikKLQotT1NfR2V0TWVudUZvbnQ9Ci1PU19HZXRNZW51Rm9udF8wPWNhc3Q9KE1lbnVSZWYpCi1PU19HZXRNZW51Rm9udF8xPWNhc3Q9KFNJbnQxNiAqKQotT1NfR2V0TWVudUZvbnRfMj1jYXN0PShVSW50MTYgKikKLQotT1NfR2V0TWVudUhlaWdodD0KLU9TX0dldE1lbnVIZWlnaHRfMD1jYXN0PShNZW51UmVmKQotCi1PU19HZXRNZW51SUQ9Ci1PU19HZXRNZW51SURfMD1jYXN0PShNZW51UmVmKQotCi1PU19HZXRNZW51SXRlbUNvbW1hbmRJRD0KLU9TX0dldE1lbnVJdGVtQ29tbWFuZElEXzA9Y2FzdD0oTWVudVJlZikKLU9TX0dldE1lbnVJdGVtQ29tbWFuZElEXzE9Y2FzdD0oU0ludDE2KQotT1NfR2V0TWVudUl0ZW1Db21tYW5kSURfMj1jYXN0PShNZW51Q29tbWFuZCAqKQotCi1PU19HZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnU9Ci1PU19HZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnVfMD1jYXN0PShNZW51UmVmKQotT1NfR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51XzE9Y2FzdD0oU0ludDE2KQotT1NfR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51XzI9Y2FzdD0oTWVudVJlZiAqKQotCi1PU19HZXRNZW51SXRlbVJlZkNvbj0KLU9TX0dldE1lbnVJdGVtUmVmQ29uXzA9Y2FzdD0oTWVudVJlZikKLU9TX0dldE1lbnVJdGVtUmVmQ29uXzE9Y2FzdD0oU0ludDE2KQotT1NfR2V0TWVudUl0ZW1SZWZDb25fMj1jYXN0PShVSW50MzIgKikKLQotT1NfR2V0TWVudVRyYWNraW5nRGF0YT0KLU9TX0dldE1lbnVUcmFja2luZ0RhdGFfMD1jYXN0PShNZW51UmVmKQotT1NfR2V0TWVudVRyYWNraW5nRGF0YV8xPQotCi1PU19HZXRNZW51V2lkdGg9Ci1PU19HZXRNZW51V2lkdGhfMD1jYXN0PShNZW51UmVmKQotCi1PU19HZXRNb3VzZT0KLU9TX0dldE1vdXNlXzA9Y2FzdD0oUG9pbnQgKikKLQotT1NfR2V0TmV4dERldmljZT0KLU9TX0dldE5leHREZXZpY2VfMD1jYXN0PShHREhhbmRsZSkKLQotT1NfR2V0UGl4Qm91bmRzPQotT1NfR2V0UGl4Qm91bmRzXzA9Y2FzdD0oUGl4TWFwSGFuZGxlKQotT1NfR2V0UGl4Qm91bmRzXzE9Y2FzdD0oUmVjdCAqKQotCi1PU19HZXRQaXhEZXB0aD0KLU9TX0dldFBpeERlcHRoXzA9Y2FzdD0oUGl4TWFwSGFuZGxlKQotCi1PU19HZXRQb3J0PQotT1NfR2V0UG9ydF8wPWNhc3Q9KEdyYWZQdHIgKikKLQotT1NfR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzPQotT1NfR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzXzA9Y2FzdD0oQ0dyYWZQdHIpCi0KLU9TX0dldFBvcnRCb3VuZHM9Ci1PU19HZXRQb3J0Qm91bmRzXzA9Y2FzdD0oQ0dyYWZQdHIpCi1PU19HZXRQb3J0Qm91bmRzXzE9Y2FzdD0oUmVjdCAqKQotCi1PU19HZXRQb3J0Q2xpcFJlZ2lvbj0KLU9TX0dldFBvcnRDbGlwUmVnaW9uXzA9Y2FzdD0oQ0dyYWZQdHIpCi1PU19HZXRQb3J0Q2xpcFJlZ2lvbl8xPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfR2V0UG9ydFZpc2libGVSZWdpb249Ci1PU19HZXRQb3J0VmlzaWJsZVJlZ2lvbl8wPWNhc3Q9KENHcmFmUHRyKQotT1NfR2V0UG9ydFZpc2libGVSZWdpb25fMT1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX0dldFByZXZpb3VzV2luZG93PQotT1NfR2V0UHJldmlvdXNXaW5kb3dfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX0dldFB0clNpemU9Ci1PU19HZXRQdHJTaXplXzA9Y2FzdD0oUHRyKQotCi1PU19HZXRSZWdpb25Cb3VuZHM9Ci1PU19HZXRSZWdpb25Cb3VuZHNfMD1jYXN0PShSZ25IYW5kbGUpCi1PU19HZXRSZWdpb25Cb3VuZHNfMT1jYXN0PShSZWN0ICopCi0KLU9TX0dldFJvb3RDb250cm9sPQotT1NfR2V0Um9vdENvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19HZXRSb290Q29udHJvbF8xPWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfR2V0U2NyYXBGbGF2b3JDb3VudD0KLU9TX0dldFNjcmFwRmxhdm9yQ291bnRfMD1jYXN0PShTY3JhcFJlZikKLU9TX0dldFNjcmFwRmxhdm9yQ291bnRfMT1jYXN0PShVSW50MzIgKikKLQotT1NfR2V0U2NyYXBGbGF2b3JEYXRhX19JSV8zSV8zQj0KLU9TX0dldFNjcmFwRmxhdm9yRGF0YV9fSUlfM0lfM0JfMD1jYXN0PShTY3JhcFJlZikKLU9TX0dldFNjcmFwRmxhdm9yRGF0YV9fSUlfM0lfM0JfMT1jYXN0PShTY3JhcEZsYXZvclR5cGUpCi1PU19HZXRTY3JhcEZsYXZvckRhdGFfX0lJXzNJXzNCXzI9Y2FzdD0oU2l6ZSAqKQotT1NfR2V0U2NyYXBGbGF2b3JEYXRhX19JSV8zSV8zQl8zPWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0U2NyYXBGbGF2b3JEYXRhX19JSV8zSV8zQz0KLU9TX0dldFNjcmFwRmxhdm9yRGF0YV9fSUlfM0lfM0NfMD1jYXN0PShTY3JhcFJlZikKLU9TX0dldFNjcmFwRmxhdm9yRGF0YV9fSUlfM0lfM0NfMT1jYXN0PShTY3JhcEZsYXZvclR5cGUpCi1PU19HZXRTY3JhcEZsYXZvckRhdGFfX0lJXzNJXzNDXzI9Y2FzdD0oU2l6ZSAqKQotT1NfR2V0U2NyYXBGbGF2b3JEYXRhX19JSV8zSV8zQ18zPWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0U2NyYXBGbGF2b3JJbmZvTGlzdD0KLU9TX0dldFNjcmFwRmxhdm9ySW5mb0xpc3RfMD1jYXN0PShTY3JhcFJlZikKLU9TX0dldFNjcmFwRmxhdm9ySW5mb0xpc3RfMT1jYXN0PShVSW50MzIgKikKLU9TX0dldFNjcmFwRmxhdm9ySW5mb0xpc3RfMj1jYXN0PShTY3JhcEZsYXZvckluZm8gKikKLQotT1NfR2V0U2NyYXBGbGF2b3JTaXplPQotT1NfR2V0U2NyYXBGbGF2b3JTaXplXzA9Y2FzdD0oU2NyYXBSZWYpCi1PU19HZXRTY3JhcEZsYXZvclNpemVfMT1jYXN0PShTY3JhcEZsYXZvclR5cGUpCi1PU19HZXRTY3JhcEZsYXZvclNpemVfMj1jYXN0PShTaXplICopCi0KLU9TX0dldFNjcmlwdE1hbmFnZXJWYXJpYWJsZT0KLU9TX0dldFNjcmlwdE1hbmFnZXJWYXJpYWJsZV8wPQotCi1PU19HZXRTdXBlckNvbnRyb2w9Ci1PU19HZXRTdXBlckNvbnRyb2xfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0U3VwZXJDb250cm9sXzE9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19HZXRUYWJDb250ZW50UmVjdD0KLU9TX0dldFRhYkNvbnRlbnRSZWN0XzA9Y2FzdD1Db250cm9sUmVmCi1PU19HZXRUYWJDb250ZW50UmVjdF8xPQotCi1PU19HZXRUaGVtZUJydXNoQXNDb2xvcj0KLU9TX0dldFRoZW1lQnJ1c2hBc0NvbG9yXzA9Ci1PU19HZXRUaGVtZUJydXNoQXNDb2xvcl8xPQotT1NfR2V0VGhlbWVCcnVzaEFzQ29sb3JfMj0KLU9TX0dldFRoZW1lQnJ1c2hBc0NvbG9yXzM9Ci0KLU9TX0dldFRoZW1lQnV0dG9uQ29udGVudEJvdW5kcz0KLU9TX0dldFRoZW1lQnV0dG9uQ29udGVudEJvdW5kc18wPQotT1NfR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzXzE9Ci1PU19HZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHNfMj0KLU9TX0dldFRoZW1lQnV0dG9uQ29udGVudEJvdW5kc18zPQotCi1PU19HZXRUaGVtZURyYXdpbmdTdGF0ZT0KLU9TX0dldFRoZW1lRHJhd2luZ1N0YXRlXzA9Y2FzdD0oVGhlbWVEcmF3aW5nU3RhdGUgKikKLQotT1NfR2V0VGhlbWVGb250PQotT1NfR2V0VGhlbWVGb250XzA9Y2FzdD0oVGhlbWVGb250SUQpCi1PU19HZXRUaGVtZUZvbnRfMT1jYXN0PShTY3JpcHRDb2RlKQotT1NfR2V0VGhlbWVGb250XzI9Y2FzdD0odW5zaWduZWQgY2hhciAqKQotT1NfR2V0VGhlbWVGb250XzM9Y2FzdD0oU0ludDE2ICopCi1PU19HZXRUaGVtZUZvbnRfND1jYXN0PShTdHlsZSAqKQotCi1PU19HZXRUaGVtZU1lbnVJdGVtRXh0cmE9Ci1PU19HZXRUaGVtZU1lbnVJdGVtRXh0cmFfMD0KLU9TX0dldFRoZW1lTWVudUl0ZW1FeHRyYV8xPQotT1NfR2V0VGhlbWVNZW51SXRlbUV4dHJhXzI9Ci0KLU9TX0dldFRoZW1lTWV0cmljPQotT1NfR2V0VGhlbWVNZXRyaWNfMD0KLU9TX0dldFRoZW1lTWV0cmljXzE9Ci0KLU9TX0dldFRoZW1lVGV4dENvbG9yPQotT1NfR2V0VGhlbWVUZXh0Q29sb3JfMD0KLU9TX0dldFRoZW1lVGV4dENvbG9yXzE9Ci1PU19HZXRUaGVtZVRleHRDb2xvcl8yPQotT1NfR2V0VGhlbWVUZXh0Q29sb3JfMz0KLQotT1NfR2V0VGhlbWVUZXh0RGltZW5zaW9ucz0KLU9TX0dldFRoZW1lVGV4dERpbWVuc2lvbnNfMD1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0dldFRoZW1lVGV4dERpbWVuc2lvbnNfMT1jYXN0PShUaGVtZUZvbnRJRCkKLU9TX0dldFRoZW1lVGV4dERpbWVuc2lvbnNfMj1jYXN0PShUaGVtZURyYXdTdGF0ZSkKLU9TX0dldFRoZW1lVGV4dERpbWVuc2lvbnNfMz1jYXN0PShCb29sZWFuKQotT1NfR2V0VGhlbWVUZXh0RGltZW5zaW9uc180PWNhc3Q9KFBvaW50ICopCi1PU19HZXRUaGVtZVRleHREaW1lbnNpb25zXzU9Y2FzdD0oU0ludDE2ICopCi0KLU9TX0dldFVzZXJGb2N1c0V2ZW50VGFyZ2V0PQotCi1PU19HZXRVc2VyRm9jdXNXaW5kb3c9Ci0KLU9TX0dldFdSZWZDb249Ci1PU19HZXRXUmVmQ29uXzA9Y2FzdD0oV2luZG93UmVmKQotCi1PU19HZXRXaW5kb3dBY3RpdmF0aW9uU2NvcGU9Ci1PU19HZXRXaW5kb3dBY3RpdmF0aW9uU2NvcGVfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19HZXRXaW5kb3dBY3RpdmF0aW9uU2NvcGVfMT1jYXN0PShXaW5kb3dBY3RpdmF0aW9uU2NvcGUgKikKLQotT1NfR2V0V2luZG93Qm91bmRzPQotT1NfR2V0V2luZG93Qm91bmRzXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfR2V0V2luZG93Qm91bmRzXzE9Y2FzdD0oV2luZG93UmVnaW9uQ29kZSkKLU9TX0dldFdpbmRvd0JvdW5kc18yPWNhc3Q9KFJlY3QgKikKLQotT1NfR2V0V2luZG93RGVmYXVsdEJ1dHRvbj0KLU9TX0dldFdpbmRvd0RlZmF1bHRCdXR0b25fMD1jYXN0PShXaW5kb3dSZWYpCi1PU19HZXRXaW5kb3dEZWZhdWx0QnV0dG9uXzE9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19HZXRXaW5kb3dFdmVudFRhcmdldD0KLU9TX0dldFdpbmRvd0V2ZW50VGFyZ2V0XzA9Y2FzdD0oV2luZG93UmVmKQotCi1PU19HZXRXaW5kb3dGcm9tUG9ydD0KLU9TX0dldFdpbmRvd0Zyb21Qb3J0XzA9Y2FzdD0oQ0dyYWZQdHIpCi0KLU9TX0dldFdpbmRvd0dyb3VwT2ZDbGFzcz0KLU9TX0dldFdpbmRvd0dyb3VwT2ZDbGFzc18wPQotCi1PU19HZXRXaW5kb3dNb2RhbGl0eT0KLU9TX0dldFdpbmRvd01vZGFsaXR5XzA9Y2FzdD0oV2luZG93UmVmKQotT1NfR2V0V2luZG93TW9kYWxpdHlfMT1jYXN0PShXaW5kb3dNb2RhbGl0eSAqKQotT1NfR2V0V2luZG93TW9kYWxpdHlfMj1jYXN0PShXaW5kb3dSZWYgKikKLQotT1NfR2V0V2luZG93UG9ydD0KLU9TX0dldFdpbmRvd1BvcnRfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX0dldFdpbmRvd1JlZ2lvbj0KLU9TX0dldFdpbmRvd1JlZ2lvbl8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0dldFdpbmRvd1JlZ2lvbl8xPWNhc3Q9KFdpbmRvd1JlZ2lvbkNvZGUpCi1PU19HZXRXaW5kb3dSZWdpb25fMj1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX0dldFdpbmRvd1Jlc2l6ZUxpbWl0cz0KLU9TX0dldFdpbmRvd1Jlc2l6ZUxpbWl0c18wPWNhc3Q9V2luZG93UmVmCi1PU19HZXRXaW5kb3dSZXNpemVMaW1pdHNfMT1jYXN0PUhJU2l6ZSAqCi1PU19HZXRXaW5kb3dSZXNpemVMaW1pdHNfMj1jYXN0PUhJU2l6ZSAqCi0KLU9TX0dldFdpbmRvd1N0cnVjdHVyZVdpZHRocz0KLU9TX0dldFdpbmRvd1N0cnVjdHVyZVdpZHRoc18wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0dldFdpbmRvd1N0cnVjdHVyZVdpZHRoc18xPWNhc3Q9KFJlY3QgKikKLQotT1NfSElDb21ib0JveEFwcGVuZFRleHRJdGVtPQotT1NfSElDb21ib0JveEFwcGVuZFRleHRJdGVtXzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElDb21ib0JveEFwcGVuZFRleHRJdGVtXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19ISUNvbWJvQm94QXBwZW5kVGV4dEl0ZW1fMj1jYXN0PShDRkluZGV4ICopCi0KLU9TX0hJQ29tYm9Cb3hDb3B5VGV4dEl0ZW1BdEluZGV4PQotT1NfSElDb21ib0JveENvcHlUZXh0SXRlbUF0SW5kZXhfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISUNvbWJvQm94Q29weVRleHRJdGVtQXRJbmRleF8xPWNhc3Q9KENGSW5kZXgpCi1PU19ISUNvbWJvQm94Q29weVRleHRJdGVtQXRJbmRleF8yPWNhc3Q9KENGU3RyaW5nUmVmICopCi0KLU9TX0hJQ29tYm9Cb3hDcmVhdGU9Ci1PU19ISUNvbWJvQm94Q3JlYXRlXzA9Y2FzdD0oY29uc3QgSElSZWN0ICopCi1PU19ISUNvbWJvQm94Q3JlYXRlXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19ISUNvbWJvQm94Q3JlYXRlXzI9Y2FzdD0oY29uc3QgQ29udHJvbEZvbnRTdHlsZVJlYyAqKQotT1NfSElDb21ib0JveENyZWF0ZV8zPWNhc3Q9KENGQXJyYXlSZWYpCi1PU19ISUNvbWJvQm94Q3JlYXRlXzQ9Y2FzdD0oT3B0aW9uQml0cykKLU9TX0hJQ29tYm9Cb3hDcmVhdGVfNT1jYXN0PShISVZpZXdSZWYgKikKLQotT1NfSElDb21ib0JveEdldEl0ZW1Db3VudD0KLU9TX0hJQ29tYm9Cb3hHZXRJdGVtQ291bnRfMD1jYXN0PShISVZpZXdSZWYpCi0KLU9TX0hJQ29tYm9Cb3hJbnNlcnRUZXh0SXRlbUF0SW5kZXg9Ci1PU19ISUNvbWJvQm94SW5zZXJ0VGV4dEl0ZW1BdEluZGV4XzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElDb21ib0JveEluc2VydFRleHRJdGVtQXRJbmRleF8xPWNhc3Q9KENGSW5kZXgpCi1PU19ISUNvbWJvQm94SW5zZXJ0VGV4dEl0ZW1BdEluZGV4XzI9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi0KLU9TX0hJQ29tYm9Cb3hSZW1vdmVJdGVtQXRJbmRleD0KLU9TX0hJQ29tYm9Cb3hSZW1vdmVJdGVtQXRJbmRleF8wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJQ29tYm9Cb3hSZW1vdmVJdGVtQXRJbmRleF8xPWNhc3Q9KENGSW5kZXgpCi0KLU9TX0hJT2JqZWN0Q29weUNsYXNzSUQ9Ci1PU19ISU9iamVjdENvcHlDbGFzc0lEXzA9Y2FzdD0oSElPYmplY3RSZWYpCi0KLU9TX0hJT2JqZWN0Q3JlYXRlPQotT1NfSElPYmplY3RDcmVhdGVfMD1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0hJT2JqZWN0Q3JlYXRlXzE9Y2FzdD0oRXZlbnRSZWYpCi1PU19ISU9iamVjdENyZWF0ZV8yPWNhc3Q9KEhJT2JqZWN0UmVmICopCi0KLU9TX0hJT2JqZWN0UmVnaXN0ZXJTdWJjbGFzcz0KLU9TX0hJT2JqZWN0UmVnaXN0ZXJTdWJjbGFzc18wPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19ISU9iamVjdFJlZ2lzdGVyU3ViY2xhc3NfMj1jYXN0PShPcHRpb25CaXRzKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzM9Y2FzdD0oRXZlbnRIYW5kbGVyVVBQKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzQ9Y2FzdD0oVUludDMyKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzU9Y2FzdD0oY29uc3QgRXZlbnRUeXBlU3BlYyAqKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzY9Y2FzdD0odm9pZCAqKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzc9Y2FzdD0oSElPYmplY3RDbGFzc1JlZiAqKQotCi1PU19ISVNjcm9sbFZpZXdDcmVhdGU9Ci1PU19ISVNjcm9sbFZpZXdDcmVhdGVfMD0KLU9TX0hJU2Nyb2xsVmlld0NyZWF0ZV8xPWNhc3Q9SElWaWV3UmVmKgotCi1PU19ISVRleHRWaWV3Q3JlYXRlPQotT1NfSElUZXh0Vmlld0NyZWF0ZV8wPQotT1NfSElUZXh0Vmlld0NyZWF0ZV8xPQotT1NfSElUZXh0Vmlld0NyZWF0ZV8yPQotT1NfSElUZXh0Vmlld0NyZWF0ZV8zPWNhc3Q9SElWaWV3UmVmICoKLQotT1NfSElUZXh0Vmlld0dldFRYTk9iamVjdD0KLU9TX0hJVGV4dFZpZXdHZXRUWE5PYmplY3RfMD1jYXN0PShISVZpZXdSZWYpCi0KLU9TX0hJVGhlbWVEcmF3QmFja2dyb3VuZD0KLU9TX0hJVGhlbWVEcmF3QmFja2dyb3VuZF8wPQotT1NfSElUaGVtZURyYXdCYWNrZ3JvdW5kXzE9Ci1PU19ISVRoZW1lRHJhd0JhY2tncm91bmRfMj1jYXN0PUNHQ29udGV4dFJlZgotT1NfSElUaGVtZURyYXdCYWNrZ3JvdW5kXzM9Ci0KLU9TX0hJVGhlbWVEcmF3QnV0dG9uPQotT1NfSElUaGVtZURyYXdCdXR0b25fMD1jYXN0PShjb25zdCBISVJlY3QgKiksZmxhZ3M9bm9fb3V0Ci1PU19ISVRoZW1lRHJhd0J1dHRvbl8xPWNhc3Q9KGNvbnN0IEhJVGhlbWVCdXR0b25EcmF3SW5mbyAqKQotT1NfSElUaGVtZURyYXdCdXR0b25fMj1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19ISVRoZW1lRHJhd0J1dHRvbl8zPWNhc3Q9KEhJVGhlbWVPcmllbnRhdGlvbikKLU9TX0hJVGhlbWVEcmF3QnV0dG9uXzQ9Y2FzdD0oSElSZWN0ICopLGZsYWdzPW5vX2luCi0KLU9TX0hJVGhlbWVEcmF3Rm9jdXNSZWN0PQotT1NfSElUaGVtZURyYXdGb2N1c1JlY3RfMD0KLU9TX0hJVGhlbWVEcmF3Rm9jdXNSZWN0XzE9Ci1PU19ISVRoZW1lRHJhd0ZvY3VzUmVjdF8yPWNhc3Q9Q0dDb250ZXh0UmVmCi1PU19ISVRoZW1lRHJhd0ZvY3VzUmVjdF8zPQotCi1PU19ISVRoZW1lRHJhd0ZyYW1lPQotT1NfSElUaGVtZURyYXdGcmFtZV8wPQotT1NfSElUaGVtZURyYXdGcmFtZV8xPQotT1NfSElUaGVtZURyYXdGcmFtZV8yPWNhc3Q9Q0dDb250ZXh0UmVmCi1PU19ISVRoZW1lRHJhd0ZyYW1lXzM9Ci0KLU9TX0hJVGhlbWVEcmF3R2VuZXJpY1dlbGw9Ci1PU19ISVRoZW1lRHJhd0dlbmVyaWNXZWxsXzA9Y2FzdD0oY29uc3QgSElSZWN0ICopCi1PU19ISVRoZW1lRHJhd0dlbmVyaWNXZWxsXzE9Y2FzdD0oY29uc3QgSElUaGVtZUJ1dHRvbkRyYXdJbmZvICopCi1PU19ISVRoZW1lRHJhd0dlbmVyaWNXZWxsXzI9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfSElUaGVtZURyYXdHZW5lcmljV2VsbF8zPWNhc3Q9KEhJVGhlbWVPcmllbnRhdGlvbikKLQotT1NfSElUaGVtZURyYXdHcm91cEJveD0KLU9TX0hJVGhlbWVEcmF3R3JvdXBCb3hfMD0KLU9TX0hJVGhlbWVEcmF3R3JvdXBCb3hfMT0KLU9TX0hJVGhlbWVEcmF3R3JvdXBCb3hfMj1jYXN0PUNHQ29udGV4dFJlZgotT1NfSElUaGVtZURyYXdHcm91cEJveF8zPQotCi1PU19ISVRoZW1lRHJhd0dyb3dCb3g9Ci1PU19ISVRoZW1lRHJhd0dyb3dCb3hfMD0KLU9TX0hJVGhlbWVEcmF3R3Jvd0JveF8xPQotT1NfSElUaGVtZURyYXdHcm93Qm94XzI9Y2FzdD1DR0NvbnRleHRSZWYKLU9TX0hJVGhlbWVEcmF3R3Jvd0JveF8zPQotCi1PU19ISVRoZW1lRHJhd1BvcHVwQXJyb3c9Ci1PU19ISVRoZW1lRHJhd1BvcHVwQXJyb3dfMD0KLU9TX0hJVGhlbWVEcmF3UG9wdXBBcnJvd18xPQotT1NfSElUaGVtZURyYXdQb3B1cEFycm93XzI9Y2FzdD1DR0NvbnRleHRSZWYKLU9TX0hJVGhlbWVEcmF3UG9wdXBBcnJvd18zPQotCi1PU19ISVRoZW1lRHJhd1NlcGFyYXRvcj0KLU9TX0hJVGhlbWVEcmF3U2VwYXJhdG9yXzA9Ci1PU19ISVRoZW1lRHJhd1NlcGFyYXRvcl8xPQotT1NfSElUaGVtZURyYXdTZXBhcmF0b3JfMj1jYXN0PUNHQ29udGV4dFJlZgotT1NfSElUaGVtZURyYXdTZXBhcmF0b3JfMz0KLQotT1NfSElUaGVtZURyYXdUYWI9Ci1PU19ISVRoZW1lRHJhd1RhYl8wPWNhc3Q9KGNvbnN0IEhJUmVjdCAqKSxmbGFncz1ub19vdXQKLU9TX0hJVGhlbWVEcmF3VGFiXzE9Y2FzdD0oY29uc3QgSElUaGVtZVRhYkRyYXdJbmZvICopCi1PU19ISVRoZW1lRHJhd1RhYl8yPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0hJVGhlbWVEcmF3VGFiXzM9Y2FzdD0oSElUaGVtZU9yaWVudGF0aW9uKQotT1NfSElUaGVtZURyYXdUYWJfND1jYXN0PShISVJlY3QgKiksZmxhZ3M9bm9faW4KLQotT1NfSElUaGVtZURyYXdUYWJQYW5lPQotT1NfSElUaGVtZURyYXdUYWJQYW5lXzA9Y2FzdD0oY29uc3QgSElSZWN0ICopCi1PU19ISVRoZW1lRHJhd1RhYlBhbmVfMT1jYXN0PShjb25zdCBISVRoZW1lVGFiUGFuZURyYXdJbmZvICopCi1PU19ISVRoZW1lRHJhd1RhYlBhbmVfMj1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19ISVRoZW1lRHJhd1RhYlBhbmVfMz1jYXN0PShISVRoZW1lT3JpZW50YXRpb24pCi0KLU9TX0hJVGhlbWVEcmF3VGV4dEJveD0KLU9TX0hJVGhlbWVEcmF3VGV4dEJveF8wPWNhc3Q9Q0ZTdHJpbmdSZWYKLU9TX0hJVGhlbWVEcmF3VGV4dEJveF8xPQotT1NfSElUaGVtZURyYXdUZXh0Qm94XzI9Ci1PU19ISVRoZW1lRHJhd1RleHRCb3hfMz1jYXN0PUNHQ29udGV4dFJlZgotT1NfSElUaGVtZURyYXdUZXh0Qm94XzQ9Ci0KLU9TX0hJVGhlbWVEcmF3VHJhY2s9Ci1PU19ISVRoZW1lRHJhd1RyYWNrXzA9Ci1PU19ISVRoZW1lRHJhd1RyYWNrXzE9Ci1PU19ISVRoZW1lRHJhd1RyYWNrXzI9Y2FzdD1DR0NvbnRleHRSZWYKLU9TX0hJVGhlbWVEcmF3VHJhY2tfMz0KLQotT1NfSElUaGVtZUdldEJ1dHRvbkJhY2tncm91bmRCb3VuZHM9Ci1PU19ISVRoZW1lR2V0QnV0dG9uQmFja2dyb3VuZEJvdW5kc18wPQotT1NfSElUaGVtZUdldEJ1dHRvbkJhY2tncm91bmRCb3VuZHNfMT0KLU9TX0hJVGhlbWVHZXRCdXR0b25CYWNrZ3JvdW5kQm91bmRzXzI9Ci0KLU9TX0hJVGhlbWVHZXRCdXR0b25Db250ZW50Qm91bmRzPQotT1NfSElUaGVtZUdldEJ1dHRvbkNvbnRlbnRCb3VuZHNfMD0KLU9TX0hJVGhlbWVHZXRCdXR0b25Db250ZW50Qm91bmRzXzE9Ci1PU19ISVRoZW1lR2V0QnV0dG9uQ29udGVudEJvdW5kc18yPQotCi1PU19ISVRoZW1lR2V0VGV4dERpbWVuc2lvbnM9Ci1PU19ISVRoZW1lR2V0VGV4dERpbWVuc2lvbnNfMD1jYXN0PUNGU3RyaW5nUmVmCi1PU19ISVRoZW1lR2V0VGV4dERpbWVuc2lvbnNfMT0KLU9TX0hJVGhlbWVHZXRUZXh0RGltZW5zaW9uc18yPQotT1NfSElUaGVtZUdldFRleHREaW1lbnNpb25zXzM9Ci1PU19ISVRoZW1lR2V0VGV4dERpbWVuc2lvbnNfND0KLU9TX0hJVGhlbWVHZXRUZXh0RGltZW5zaW9uc181PQotCi1PU19ISVRoZW1lSGl0VGVzdFNjcm9sbEJhckFycm93cz0KLU9TX0hJVGhlbWVIaXRUZXN0U2Nyb2xsQmFyQXJyb3dzXzA9Ci1PU19ISVRoZW1lSGl0VGVzdFNjcm9sbEJhckFycm93c18xPQotT1NfSElUaGVtZUhpdFRlc3RTY3JvbGxCYXJBcnJvd3NfMj0KLU9TX0hJVGhlbWVIaXRUZXN0U2Nyb2xsQmFyQXJyb3dzXzM9Ci1PU19ISVRoZW1lSGl0VGVzdFNjcm9sbEJhckFycm93c180PQotT1NfSElUaGVtZUhpdFRlc3RTY3JvbGxCYXJBcnJvd3NfNT0KLQotT1NfSElUaGVtZUhpdFRlc3RUcmFjaz0KLU9TX0hJVGhlbWVIaXRUZXN0VHJhY2tfMD0KLU9TX0hJVGhlbWVIaXRUZXN0VHJhY2tfMT0KLU9TX0hJVGhlbWVIaXRUZXN0VHJhY2tfMj0KLQotT1NfSElUaGVtZVNldEZpbGw9ZmxhZ3M9ZHluYW1pYwotT1NfSElUaGVtZVNldEZpbGxfMD1jYXN0PVRoZW1lQnJ1c2gKLU9TX0hJVGhlbWVTZXRGaWxsXzE9Y2FzdD12b2lkICoKLU9TX0hJVGhlbWVTZXRGaWxsXzI9Y2FzdD1DR0NvbnRleHRSZWYKLU9TX0hJVGhlbWVTZXRGaWxsXzM9Y2FzdD1ISVRoZW1lT3JpZW50YXRpb24KLQotT1NfSElWaWV3QWRkU3Vidmlldz0KLU9TX0hJVmlld0FkZFN1YnZpZXdfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdBZGRTdWJ2aWV3XzE9Y2FzdD0oSElWaWV3UmVmKQotCi1PU19ISVZpZXdDaGFuZ2VBdHRyaWJ1dGVzPQotT1NfSElWaWV3Q2hhbmdlQXR0cmlidXRlc18wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld0NoYW5nZUF0dHJpYnV0ZXNfMT0KLU9TX0hJVmlld0NoYW5nZUF0dHJpYnV0ZXNfMj0KLQotT1NfSElWaWV3Q2hhbmdlRmVhdHVyZXM9Ci1PU19ISVZpZXdDaGFuZ2VGZWF0dXJlc18wPWNhc3Q9SElWaWV3UmVmCi1PU19ISVZpZXdDaGFuZ2VGZWF0dXJlc18xPQotT1NfSElWaWV3Q2hhbmdlRmVhdHVyZXNfMj0KLQotT1NfSElWaWV3Q2xpY2s9Ci1PU19ISVZpZXdDbGlja18wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld0NsaWNrXzE9Y2FzdD0oRXZlbnRSZWYpCi0KLU9TX0hJVmlld0NvbnZlcnRQb2ludD0KLU9TX0hJVmlld0NvbnZlcnRQb2ludF8wPWNhc3Q9KEhJUG9pbnQgKikKLU9TX0hJVmlld0NvbnZlcnRQb2ludF8xPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld0NvbnZlcnRQb2ludF8yPWNhc3Q9KEhJVmlld1JlZikKLQotT1NfSElWaWV3Q29udmVydFJlY3Q9Ci1PU19ISVZpZXdDb252ZXJ0UmVjdF8wPQotT1NfSElWaWV3Q29udmVydFJlY3RfMT1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdDb252ZXJ0UmVjdF8yPWNhc3Q9KEhJVmlld1JlZikKLQotT1NfSElWaWV3Q29udmVydFJlZ2lvbj0KLU9TX0hJVmlld0NvbnZlcnRSZWdpb25fMD1jYXN0PVJnbkhhbmRsZQotT1NfSElWaWV3Q29udmVydFJlZ2lvbl8xPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld0NvbnZlcnRSZWdpb25fMj1jYXN0PShISVZpZXdSZWYpCi0KLU9TX0hJVmlld0NyZWF0ZU9mZnNjcmVlbkltYWdlPQotT1NfSElWaWV3Q3JlYXRlT2Zmc2NyZWVuSW1hZ2VfMD1jYXN0PUhJVmlld1JlZgotT1NfSElWaWV3Q3JlYXRlT2Zmc2NyZWVuSW1hZ2VfMT1jYXN0PU9wdGlvbkJpdHMKLU9TX0hJVmlld0NyZWF0ZU9mZnNjcmVlbkltYWdlXzI9Y2FzdD0oSElSZWN0ICopCi1PU19ISVZpZXdDcmVhdGVPZmZzY3JlZW5JbWFnZV8zPWNhc3Q9Q0dJbWFnZVJlZiAqCi0KLU9TX0hJVmlld0ZpbmRCeUlEPQotT1NfSElWaWV3RmluZEJ5SURfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdGaW5kQnlJRF8xPWNhc3Q9KEhJVmlld0lEICopLGZsYWdzPXN0cnVjdAotT1NfSElWaWV3RmluZEJ5SURfMj1jYXN0PShISVZpZXdSZWYgKikKLQotT1NfSElWaWV3R2V0Qm91bmRzPQotT1NfSElWaWV3R2V0Qm91bmRzXzA9Y2FzdD1ISVZpZXdSZWYKLU9TX0hJVmlld0dldEJvdW5kc18xPQotCi1PU19ISVZpZXdHZXRGZWF0dXJlcz0KLU9TX0hJVmlld0dldEZlYXR1cmVzXzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3R2V0RmVhdHVyZXNfMT1jYXN0PUhJVmlld0ZlYXR1cmVzICoKLQotT1NfSElWaWV3R2V0Rmlyc3RTdWJ2aWV3PQotT1NfSElWaWV3R2V0Rmlyc3RTdWJ2aWV3XzA9Y2FzdD0oSElWaWV3UmVmKQotCi1PU19ISVZpZXdHZXRGcmFtZT0KLU9TX0hJVmlld0dldEZyYW1lXzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3R2V0RnJhbWVfMT1jYXN0PShISVJlY3QgKikKLQotT1NfSElWaWV3R2V0TGFzdFN1YnZpZXc9Ci1PU19ISVZpZXdHZXRMYXN0U3Vidmlld18wPWNhc3Q9KEhJVmlld1JlZikKLQotT1NfSElWaWV3R2V0TmV4dFZpZXc9Ci1PU19ISVZpZXdHZXROZXh0Vmlld18wPWNhc3Q9KEhJVmlld1JlZikKLQotT1NfSElWaWV3R2V0Um9vdD0KLU9TX0hJVmlld0dldFJvb3RfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX0hJVmlld0dldFNpemVDb25zdHJhaW50cz0KLU9TX0hJVmlld0dldFNpemVDb25zdHJhaW50c18wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld0dldFNpemVDb25zdHJhaW50c18xPWNhc3Q9KEhJU2l6ZSAqKQotT1NfSElWaWV3R2V0U2l6ZUNvbnN0cmFpbnRzXzI9Y2FzdD0oSElTaXplICopCi0KLU9TX0hJVmlld0dldFN1YnZpZXdIaXQ9Ci1PU19ISVZpZXdHZXRTdWJ2aWV3SGl0XzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3R2V0U3Vidmlld0hpdF8xPWNhc3Q9KENHUG9pbnQgKikKLU9TX0hJVmlld0dldFN1YnZpZXdIaXRfMj1jYXN0PShCb29sZWFuKQotT1NfSElWaWV3R2V0U3Vidmlld0hpdF8zPWNhc3Q9KEhJVmlld1JlZiAqKQotCi1PU19ISVZpZXdHZXRTdXBlcnZpZXc9Ci1PU19ISVZpZXdHZXRTdXBlcnZpZXdfMD1jYXN0PShISVZpZXdSZWYpCi0KLU9TX0hJVmlld0dldFZpZXdGb3JNb3VzZUV2ZW50PQotT1NfSElWaWV3R2V0Vmlld0Zvck1vdXNlRXZlbnRfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdHZXRWaWV3Rm9yTW91c2VFdmVudF8xPWNhc3Q9KEV2ZW50UmVmKQotT1NfSElWaWV3R2V0Vmlld0Zvck1vdXNlRXZlbnRfMj1jYXN0PShISVZpZXdSZWYgKikKLQotT1NfSElWaWV3SXNEcmF3aW5nRW5hYmxlZD0KLU9TX0hJVmlld0lzRHJhd2luZ0VuYWJsZWRfMD1jYXN0PShISVZpZXdSZWYpCi0KLU9TX0hJVmlld0lzVmlzaWJsZT0KLU9TX0hJVmlld0lzVmlzaWJsZV8wPWNhc3Q9KEhJVmlld1JlZikKLQotT1NfSElWaWV3UmVtb3ZlRnJvbVN1cGVydmlldz0KLU9TX0hJVmlld1JlbW92ZUZyb21TdXBlcnZpZXdfMD1jYXN0PShISVZpZXdSZWYpCi0KLU9TX0hJVmlld1JlbmRlcj0KLU9TX0hJVmlld1JlbmRlcl8wPWNhc3Q9SElWaWV3UmVmCi0KLU9TX0hJVmlld1Njcm9sbFJlY3Q9Ci1PU19ISVZpZXdTY3JvbGxSZWN0XzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3U2Nyb2xsUmVjdF8xPQotT1NfSElWaWV3U2Nyb2xsUmVjdF8yPQotT1NfSElWaWV3U2Nyb2xsUmVjdF8zPQotCi1PU19ISVZpZXdTZXRCb3VuZHNPcmlnaW49Ci1PU19ISVZpZXdTZXRCb3VuZHNPcmlnaW5fMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdTZXRCb3VuZHNPcmlnaW5fMT0KLU9TX0hJVmlld1NldEJvdW5kc09yaWdpbl8yPQotCi1PU19ISVZpZXdTZXREcmF3aW5nRW5hYmxlZD0KLU9TX0hJVmlld1NldERyYXdpbmdFbmFibGVkXzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3U2V0RHJhd2luZ0VuYWJsZWRfMT1jYXN0PShCb29sZWFuKQotCi1PU19ISVZpZXdTZXRGcmFtZT0KLU9TX0hJVmlld1NldEZyYW1lXzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3U2V0RnJhbWVfMT1jYXN0PShjb25zdCBISVJlY3QgKikKLQotT1NfSElWaWV3U2V0TmVlZHNEaXNwbGF5PQotT1NfSElWaWV3U2V0TmVlZHNEaXNwbGF5XzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3U2V0TmVlZHNEaXNwbGF5XzE9Y2FzdD0oQm9vbGVhbikKLQotT1NfSElWaWV3U2V0TmVlZHNEaXNwbGF5SW5SZWdpb249Ci1PU19ISVZpZXdTZXROZWVkc0Rpc3BsYXlJblJlZ2lvbl8wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld1NldE5lZWRzRGlzcGxheUluUmVnaW9uXzE9Y2FzdD0oUmduSGFuZGxlKQotT1NfSElWaWV3U2V0TmVlZHNEaXNwbGF5SW5SZWdpb25fMj1jYXN0PShCb29sZWFuKQotCi1PU19ISVZpZXdTZXRWaXNpYmxlPQotT1NfSElWaWV3U2V0VmlzaWJsZV8wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld1NldFZpc2libGVfMT1jYXN0PShCb29sZWFuKQotCi1PU19ISVZpZXdTZXRaT3JkZXI9Ci1PU19ISVZpZXdTZXRaT3JkZXJfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdTZXRaT3JkZXJfMT1jYXN0PShISVZpZXdaT3JkZXJPcCkKLU9TX0hJVmlld1NldFpPcmRlcl8yPWNhc3Q9KEhJVmlld1JlZikKLQotT1NfSElWaWV3U2ltdWxhdGVDbGljaz0KLU9TX0hJVmlld1NpbXVsYXRlQ2xpY2tfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdTaW11bGF0ZUNsaWNrXzE9Y2FzdD0oSElWaWV3UGFydENvZGUpCi1PU19ISVZpZXdTaW11bGF0ZUNsaWNrXzI9Y2FzdD0oVUludDMyKQotT1NfSElWaWV3U2ltdWxhdGVDbGlja18zPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSAqKQotCi1PU19ITG9jaz0KLU9TX0hMb2NrXzA9Y2FzdD0oSGFuZGxlKQotCi1PU19ITUdldFRhZ0RlbGF5PQotT1NfSE1HZXRUYWdEZWxheV8wPQotCi1PU19ITUhpZGVUYWc9Ci0KLU9TX0hNSW5zdGFsbENvbnRyb2xDb250ZW50Q2FsbGJhY2s9Ci1PU19ITUluc3RhbGxDb250cm9sQ29udGVudENhbGxiYWNrXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0hNSW5zdGFsbENvbnRyb2xDb250ZW50Q2FsbGJhY2tfMT1jYXN0PShITUNvbnRyb2xDb250ZW50VVBQKQotCi1PU19ITVNldFRhZ0RlbGF5PQotT1NfSE1TZXRUYWdEZWxheV8wPQotCi1PU19IVW5sb2NrPQotT1NfSFVubG9ja18wPWNhc3Q9KEhhbmRsZSkKLQotT1NfSGFuZGxlQ29udHJvbENsaWNrPQotT1NfSGFuZGxlQ29udHJvbENsaWNrXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0hhbmRsZUNvbnRyb2xDbGlja18xPWZsYWdzPXN0cnVjdAotT1NfSGFuZGxlQ29udHJvbENsaWNrXzI9Y2FzdD0oRXZlbnRNb2RpZmllcnMpCi1PU19IYW5kbGVDb250cm9sQ2xpY2tfMz1jYXN0PShDb250cm9sQWN0aW9uVVBQKQotCi1PU19IYW5kbGVDb250cm9sU2V0Q3Vyc29yPQotT1NfSGFuZGxlQ29udHJvbFNldEN1cnNvcl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19IYW5kbGVDb250cm9sU2V0Q3Vyc29yXzE9ZmxhZ3M9c3RydWN0Ci1PU19IYW5kbGVDb250cm9sU2V0Q3Vyc29yXzI9Y2FzdD0oRXZlbnRNb2RpZmllcnMpCi1PU19IYW5kbGVDb250cm9sU2V0Q3Vyc29yXzM9Y2FzdD0oQm9vbGVhbiAqKQotCi1PU19IaVdvcmQ9Ci1PU19IaVdvcmRfMD0KLQotT1NfSGlkZVdpbmRvdz0KLU9TX0hpZGVXaW5kb3dfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX0hpbGl0ZU1lbnU9Ci1PU19IaWxpdGVNZW51XzA9Y2FzdD0oTWVudUlEKQotCi1PU19JY29uUmVmVG9JY29uRmFtaWx5PQotT1NfSWNvblJlZlRvSWNvbkZhbWlseV8wPWNhc3Q9SWNvblJlZgotT1NfSWNvblJlZlRvSWNvbkZhbWlseV8xPWNhc3Q9SWNvblNlbGVjdG9yVmFsdWUKLU9TX0ljb25SZWZUb0ljb25GYW1pbHlfMj1jYXN0PUljb25GYW1pbHlIYW5kbGUgKgotCi1PU19Jbml0Q29udGV4dHVhbE1lbnVzPQotCi1PU19Jbml0Q3Vyc29yPQotCi1PU19Jbml0RGF0YUJyb3dzZXJDYWxsYmFja3M9Ci1PU19Jbml0RGF0YUJyb3dzZXJDYWxsYmFja3NfMD1jYXN0PShEYXRhQnJvd3NlckNhbGxiYWNrcyAqKSxmbGFncz1pbml0Ci0KLU9TX0luaXREYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrcz0KLU9TX0luaXREYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrc18wPQotCi1PU19JbnNlcnRNZW51PQotT1NfSW5zZXJ0TWVudV8wPWNhc3Q9KE1lbnVSZWYpCi1PU19JbnNlcnRNZW51XzE9Y2FzdD0oTWVudUlEKQotCi1PU19JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmc9Ci1PU19JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmdfMD1jYXN0PShNZW51UmVmKQotT1NfSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmdfMj1jYXN0PShNZW51SXRlbUluZGV4KQotT1NfSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nXzM9Y2FzdD0oTWVudUl0ZW1BdHRyaWJ1dGVzKQotT1NfSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nXzQ9Y2FzdD0oTWVudUNvbW1hbmQpCi0KLU9TX0luc3RhbGxFdmVudEhhbmRsZXI9Ci1PU19JbnN0YWxsRXZlbnRIYW5kbGVyXzA9Y2FzdD0oRXZlbnRUYXJnZXRSZWYpCi1PU19JbnN0YWxsRXZlbnRIYW5kbGVyXzE9Y2FzdD0oRXZlbnRIYW5kbGVyVVBQKQotT1NfSW5zdGFsbEV2ZW50SGFuZGxlcl8yPWNhc3Q9KFVJbnQzMikKLU9TX0luc3RhbGxFdmVudEhhbmRsZXJfMz1jYXN0PShjb25zdCBFdmVudFR5cGVTcGVjICopCi1PU19JbnN0YWxsRXZlbnRIYW5kbGVyXzQ9Y2FzdD0odm9pZCAqKQotT1NfSW5zdGFsbEV2ZW50SGFuZGxlcl81PWNhc3Q9KEV2ZW50SGFuZGxlclJlZiAqKQotCi1PU19JbnN0YWxsRXZlbnRMb29wSWRsZVRpbWVyPQotT1NfSW5zdGFsbEV2ZW50TG9vcElkbGVUaW1lcl8wPWNhc3Q9KEV2ZW50TG9vcFJlZikKLU9TX0luc3RhbGxFdmVudExvb3BJZGxlVGltZXJfMT1jYXN0PShFdmVudFRpbWVySW50ZXJ2YWwpCi1PU19JbnN0YWxsRXZlbnRMb29wSWRsZVRpbWVyXzI9Y2FzdD0oRXZlbnRUaW1lckludGVydmFsKQotT1NfSW5zdGFsbEV2ZW50TG9vcElkbGVUaW1lcl8zPWNhc3Q9KEV2ZW50TG9vcElkbGVUaW1lclVQUCkKLU9TX0luc3RhbGxFdmVudExvb3BJZGxlVGltZXJfND1jYXN0PSh2b2lkICopCi1PU19JbnN0YWxsRXZlbnRMb29wSWRsZVRpbWVyXzU9Y2FzdD0oRXZlbnRMb29wVGltZXJSZWYgKikKLQotT1NfSW5zdGFsbEV2ZW50TG9vcFRpbWVyPQotT1NfSW5zdGFsbEV2ZW50TG9vcFRpbWVyXzA9Y2FzdD0oRXZlbnRMb29wUmVmKQotT1NfSW5zdGFsbEV2ZW50TG9vcFRpbWVyXzE9Y2FzdD0oRXZlbnRUaW1lckludGVydmFsKQotT1NfSW5zdGFsbEV2ZW50TG9vcFRpbWVyXzI9Y2FzdD0oRXZlbnRUaW1lckludGVydmFsKQotT1NfSW5zdGFsbEV2ZW50TG9vcFRpbWVyXzM9Y2FzdD0oRXZlbnRMb29wVGltZXJVUFApCi1PU19JbnN0YWxsRXZlbnRMb29wVGltZXJfND1jYXN0PSh2b2lkICopCi1PU19JbnN0YWxsRXZlbnRMb29wVGltZXJfNT1jYXN0PShFdmVudExvb3BUaW1lclJlZiAqKQotCi1PU19JbnN0YWxsUmVjZWl2ZUhhbmRsZXI9Ci1PU19JbnN0YWxsUmVjZWl2ZUhhbmRsZXJfMD1jYXN0PShEcmFnUmVjZWl2ZUhhbmRsZXJVUFApCi1PU19JbnN0YWxsUmVjZWl2ZUhhbmRsZXJfMT1jYXN0PShXaW5kb3dSZWYpCi1PU19JbnN0YWxsUmVjZWl2ZUhhbmRsZXJfMj1jYXN0PSh2b2lkICopCi0KLU9TX0luc3RhbGxUcmFja2luZ0hhbmRsZXI9Ci1PU19JbnN0YWxsVHJhY2tpbmdIYW5kbGVyXzA9Y2FzdD0oRHJhZ1RyYWNraW5nSGFuZGxlclVQUCkKLU9TX0luc3RhbGxUcmFja2luZ0hhbmRsZXJfMT1jYXN0PShXaW5kb3dSZWYpCi1PU19JbnN0YWxsVHJhY2tpbmdIYW5kbGVyXzI9Y2FzdD0odm9pZCAqKQotCi1PU19JbnZhbFdpbmRvd1JlY3Q9Ci1PU19JbnZhbFdpbmRvd1JlY3RfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19JbnZhbFdpbmRvd1JlY3RfMT1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX0ludmFsV2luZG93UmduPQotT1NfSW52YWxXaW5kb3dSZ25fMD1jYXN0PShXaW5kb3dSZWYpCi1PU19JbnZhbFdpbmRvd1Jnbl8xPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfSW52ZXJ0UmVjdD0KLU9TX0ludmVydFJlY3RfMD1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX0ludmVydFJnbj0KLU9TX0ludmVydFJnbl8wPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfSXNDb250cm9sQWN0aXZlPQotT1NfSXNDb250cm9sQWN0aXZlXzA9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfSXNDb250cm9sRW5hYmxlZD0KLU9TX0lzQ29udHJvbEVuYWJsZWRfMD1jYXN0PShDb250cm9sUmVmKQotCi1PU19Jc0NvbnRyb2xWaXNpYmxlPQotT1NfSXNDb250cm9sVmlzaWJsZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0lzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWQ9Ci1PU19Jc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0lzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWRfMT1jYXN0PShEYXRhQnJvd3Nlckl0ZW1JRCkKLQotT1NfSXNNZW51Q29tbWFuZEVuYWJsZWQ9Ci1PU19Jc01lbnVDb21tYW5kRW5hYmxlZF8wPWNhc3Q9KE1lbnVSZWYpCi1PU19Jc01lbnVDb21tYW5kRW5hYmxlZF8xPWNhc3Q9KE1lbnVDb21tYW5kKQotCi1PU19Jc01lbnVJdGVtRW5hYmxlZD0KLU9TX0lzTWVudUl0ZW1FbmFibGVkXzA9Y2FzdD0oTWVudVJlZikKLU9TX0lzTWVudUl0ZW1FbmFibGVkXzE9Y2FzdD0oTWVudUl0ZW1JbmRleCkKLQotT1NfSXNWYWxpZENvbnRyb2xIYW5kbGU9Ci1PU19Jc1ZhbGlkQ29udHJvbEhhbmRsZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0lzVmFsaWRNZW51PQotT1NfSXNWYWxpZE1lbnVfMD1jYXN0PShNZW51UmVmKQotCi1PU19Jc1ZhbGlkV2luZG93UHRyPQotT1NfSXNWYWxpZFdpbmRvd1B0cl8wPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfSXNXaW5kb3dBY3RpdmU9Ci1PU19Jc1dpbmRvd0FjdGl2ZV8wPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfSXNXaW5kb3dDb2xsYXBzZWQ9Ci1PU19Jc1dpbmRvd0NvbGxhcHNlZF8wPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfSXNXaW5kb3dWaXNpYmxlPQotT1NfSXNXaW5kb3dWaXNpYmxlXzA9Y2FzdD0oV2luZG93UmVmKQotCi1PU19KTklHZXRPYmplY3Q9ZmxhZ3M9bm9fZ2VuCi1PU19KTklHZXRPYmplY3RfMD0KLQotT1NfS2V5VHJhbnNsYXRlPQotT1NfS2V5VHJhbnNsYXRlXzA9Y2FzdD1jb25zdCB2b2lkICoKLU9TX0tleVRyYW5zbGF0ZV8xPQotT1NfS2V5VHJhbnNsYXRlXzI9Y2FzdD1VSW50MzIgKgotCi1PU19LaWxsUG9seT0KLU9TX0tpbGxQb2x5XzA9Y2FzdD0oUG9seUhhbmRsZSkKLQotT1NfTGluZVRvPQotT1NfTGluZVRvXzA9Y2FzdD0oc2hvcnQpCi1PU19MaW5lVG9fMT1jYXN0PShzaG9ydCkKLQotT1NfTG9Xb3JkPQotT1NfTG9Xb3JkXzA9Ci0KLU9TX0xvY2tQb3J0Qml0cz0KLU9TX0xvY2tQb3J0Qml0c18wPWNhc3Q9KEdyYWZQdHIpCi0KLU9TX0xvbmcyRml4PQotT1NfTG9uZzJGaXhfMD0KLQotT1NfTWVudVNlbGVjdD0KLU9TX01lbnVTZWxlY3RfMD1jYXN0PShQb2ludCAqKSxmbGFncz1zdHJ1Y3QKLQotT1NfTW92ZUNvbnRyb2w9Ci1PU19Nb3ZlQ29udHJvbF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19Nb3ZlQ29udHJvbF8xPWNhc3Q9KFNJbnQxNikKLU9TX01vdmVDb250cm9sXzI9Y2FzdD0oU0ludDE2KQotCi1PU19Nb3ZlVG89Ci1PU19Nb3ZlVG9fMD1jYXN0PShzaG9ydCkKLU9TX01vdmVUb18xPWNhc3Q9KHNob3J0KQotCi1PU19Nb3ZlV2luZG93PQotT1NfTW92ZVdpbmRvd18wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX01vdmVXaW5kb3dfMT1jYXN0PShzaG9ydCkKLU9TX01vdmVXaW5kb3dfMj1jYXN0PShzaG9ydCkKLU9TX01vdmVXaW5kb3dfMz1jYXN0PShCb29sZWFuKQotCi1PU19OYXZDcmVhdGVDaG9vc2VGb2xkZXJEaWFsb2c9Ci1PU19OYXZDcmVhdGVDaG9vc2VGb2xkZXJEaWFsb2dfMD1jYXN0PShjb25zdCBOYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnMgKikKLU9TX05hdkNyZWF0ZUNob29zZUZvbGRlckRpYWxvZ18xPWNhc3Q9KE5hdkV2ZW50VVBQKQotT1NfTmF2Q3JlYXRlQ2hvb3NlRm9sZGVyRGlhbG9nXzI9Y2FzdD0oTmF2T2JqZWN0RmlsdGVyVVBQKQotT1NfTmF2Q3JlYXRlQ2hvb3NlRm9sZGVyRGlhbG9nXzM9Y2FzdD0odm9pZCAqKQotT1NfTmF2Q3JlYXRlQ2hvb3NlRm9sZGVyRGlhbG9nXzQ9Y2FzdD0oTmF2RGlhbG9nUmVmICopCi0KLU9TX05hdkNyZWF0ZUdldEZpbGVEaWFsb2c9Ci1PU19OYXZDcmVhdGVHZXRGaWxlRGlhbG9nXzA9Y2FzdD0oY29uc3QgTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zICopCi1PU19OYXZDcmVhdGVHZXRGaWxlRGlhbG9nXzE9Y2FzdD0oTmF2VHlwZUxpc3RIYW5kbGUpCi1PU19OYXZDcmVhdGVHZXRGaWxlRGlhbG9nXzI9Y2FzdD0oTmF2RXZlbnRVUFApCi1PU19OYXZDcmVhdGVHZXRGaWxlRGlhbG9nXzM9Y2FzdD0oTmF2UHJldmlld1VQUCkKLU9TX05hdkNyZWF0ZUdldEZpbGVEaWFsb2dfND1jYXN0PShOYXZPYmplY3RGaWx0ZXJVUFApCi1PU19OYXZDcmVhdGVHZXRGaWxlRGlhbG9nXzU9Y2FzdD0odm9pZCAqKQotT1NfTmF2Q3JlYXRlR2V0RmlsZURpYWxvZ182PWNhc3Q9KE5hdkRpYWxvZ1JlZiAqKQotCi1PU19OYXZDcmVhdGVQdXRGaWxlRGlhbG9nPQotT1NfTmF2Q3JlYXRlUHV0RmlsZURpYWxvZ18wPWNhc3Q9KGNvbnN0IE5hdkRpYWxvZ0NyZWF0aW9uT3B0aW9ucyAqKQotT1NfTmF2Q3JlYXRlUHV0RmlsZURpYWxvZ18xPWNhc3Q9KE9TVHlwZSkKLU9TX05hdkNyZWF0ZVB1dEZpbGVEaWFsb2dfMj1jYXN0PShPU1R5cGUpCi1PU19OYXZDcmVhdGVQdXRGaWxlRGlhbG9nXzM9Y2FzdD0oTmF2RXZlbnRVUFApCi1PU19OYXZDcmVhdGVQdXRGaWxlRGlhbG9nXzQ9Y2FzdD0odm9pZCAqKQotT1NfTmF2Q3JlYXRlUHV0RmlsZURpYWxvZ181PWNhc3Q9KE5hdkRpYWxvZ1JlZiAqKQotCi1PU19OYXZEaWFsb2dEaXNwb3NlPQotT1NfTmF2RGlhbG9nRGlzcG9zZV8wPWNhc3Q9KE5hdkRpYWxvZ1JlZikKLQotT1NfTmF2RGlhbG9nR2V0UmVwbHk9Ci1PU19OYXZEaWFsb2dHZXRSZXBseV8wPWNhc3Q9KE5hdkRpYWxvZ1JlZikKLU9TX05hdkRpYWxvZ0dldFJlcGx5XzE9Y2FzdD0oTmF2UmVwbHlSZWNvcmQgKikKLQotT1NfTmF2RGlhbG9nR2V0U2F2ZUZpbGVOYW1lPQotT1NfTmF2RGlhbG9nR2V0U2F2ZUZpbGVOYW1lXzA9Y2FzdD0oTmF2RGlhbG9nUmVmKQotCi1PU19OYXZEaWFsb2dHZXRVc2VyQWN0aW9uPQotT1NfTmF2RGlhbG9nR2V0VXNlckFjdGlvbl8wPWNhc3Q9KE5hdkRpYWxvZ1JlZikKLQotT1NfTmF2RGlhbG9nUnVuPQotT1NfTmF2RGlhbG9nUnVuXzA9Y2FzdD0oTmF2RGlhbG9nUmVmKQotCi1PU19OYXZEaWFsb2dTZXRGaWx0ZXJUeXBlSWRlbnRpZmllcnM9ZmxhZ3M9ZHluYW1pYwotT1NfTmF2RGlhbG9nU2V0RmlsdGVyVHlwZUlkZW50aWZpZXJzXzA9Ci1PU19OYXZEaWFsb2dTZXRGaWx0ZXJUeXBlSWRlbnRpZmllcnNfMT0KLQotT1NfTmF2RGlhbG9nU2V0U2F2ZUZpbGVOYW1lPQotT1NfTmF2RGlhbG9nU2V0U2F2ZUZpbGVOYW1lXzA9Y2FzdD0oTmF2RGlhbG9nUmVmKQotT1NfTmF2RGlhbG9nU2V0U2F2ZUZpbGVOYW1lXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi0KLU9TX05hdkdldERlZmF1bHREaWFsb2dDcmVhdGlvbk9wdGlvbnM9Ci1PU19OYXZHZXREZWZhdWx0RGlhbG9nQ3JlYXRpb25PcHRpb25zXzA9Y2FzdD0oTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zICopCi0KLU9TX05ld0NvbnRyb2w9Ci1PU19OZXdDb250cm9sXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfTmV3Q29udHJvbF8xPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX05ld0NvbnRyb2xfMj1jYXN0PShDb25zdFN0cjI1NVBhcmFtKQotT1NfTmV3Q29udHJvbF8zPWNhc3Q9KEJvb2xlYW4pCi1PU19OZXdDb250cm9sXzQ9Y2FzdD0oU0ludDE2KQotT1NfTmV3Q29udHJvbF81PWNhc3Q9KFNJbnQxNikKLU9TX05ld0NvbnRyb2xfNj1jYXN0PShTSW50MTYpCi1PU19OZXdDb250cm9sXzc9Y2FzdD0oU0ludDE2KQotT1NfTmV3Q29udHJvbF84PWNhc3Q9KFNJbnQzMikKLQotT1NfTmV3RHJhZz0KLU9TX05ld0RyYWdfMD1jYXN0PShEcmFnUmVmICopCi0KLU9TX05ld0dXb3JsZEZyb21QdHI9Ci1PU19OZXdHV29ybGRGcm9tUHRyXzA9Y2FzdD0oR1dvcmxkUHRyICopCi1PU19OZXdHV29ybGRGcm9tUHRyXzE9Y2FzdD0odW5zaWduZWQgbG9uZykKLU9TX05ld0dXb3JsZEZyb21QdHJfMj1jYXN0PShjb25zdCBSZWN0ICopCi1PU19OZXdHV29ybGRGcm9tUHRyXzM9Y2FzdD0oQ1RhYkhhbmRsZSkKLU9TX05ld0dXb3JsZEZyb21QdHJfND1jYXN0PShHREhhbmRsZSkKLU9TX05ld0dXb3JsZEZyb21QdHJfNT1jYXN0PShHV29ybGRGbGFncykKLU9TX05ld0dXb3JsZEZyb21QdHJfNj1jYXN0PShQdHIpCi1PU19OZXdHV29ybGRGcm9tUHRyXzc9Y2FzdD0obG9uZykKLQotT1NfTmV3R2xvYmFsUmVmPWZsYWdzPW5vX2dlbgotT1NfTmV3R2xvYmFsUmVmXzA9Ci0KLU9TX05ld0hhbmRsZT0KLU9TX05ld0hhbmRsZV8wPWNhc3Q9KFNpemUpCi0KLU9TX05ld0hhbmRsZUNsZWFyPQotT1NfTmV3SGFuZGxlQ2xlYXJfMD1jYXN0PShTaXplKQotCi1PU19OZXdQdHI9Ci1PU19OZXdQdHJfMD1jYXN0PShTaXplKQotCi1PU19OZXdQdHJDbGVhcj0KLU9TX05ld1B0ckNsZWFyXzA9Y2FzdD0oU2l6ZSkKLQotT1NfTmV3UmduPQotCi1PU19PZmZzZXRSZWN0PQotT1NfT2Zmc2V0UmVjdF8wPQotT1NfT2Zmc2V0UmVjdF8xPQotT1NfT2Zmc2V0UmVjdF8yPQotCi1PU19PZmZzZXRSZ249Ci1PU19PZmZzZXRSZ25fMD1jYXN0PShSZ25IYW5kbGUpCi1PU19PZmZzZXRSZ25fMT1jYXN0PShzaG9ydCkKLU9TX09mZnNldFJnbl8yPWNhc3Q9KHNob3J0KQotCi1PU19PcGVuRGF0YUJyb3dzZXJDb250YWluZXI9Ci1PU19PcGVuRGF0YUJyb3dzZXJDb250YWluZXJfMD1jYXN0PShDb250cm9sUmVmKQotT1NfT3BlbkRhdGFCcm93c2VyQ29udGFpbmVyXzE9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtSUQpCi0KLU9TX09wZW5Qb2x5PQotCi1PU19PcGVuUmduPQotCi1PU19QTUNyZWF0ZVBhZ2VGb3JtYXQ9Ci1PU19QTUNyZWF0ZVBhZ2VGb3JtYXRfMD1jYXN0PShQTVBhZ2VGb3JtYXQgKikKLQotT1NfUE1DcmVhdGVQcmludFNldHRpbmdzPQotT1NfUE1DcmVhdGVQcmludFNldHRpbmdzXzA9Y2FzdD0oUE1QcmludFNldHRpbmdzICopCi0KLU9TX1BNQ3JlYXRlU2Vzc2lvbj0KLU9TX1BNQ3JlYXRlU2Vzc2lvbl8wPWNhc3Q9KFBNUHJpbnRTZXNzaW9uICopCi0KLU9TX1BNRmxhdHRlblBhZ2VGb3JtYXQ9Ci1PU19QTUZsYXR0ZW5QYWdlRm9ybWF0XzA9Y2FzdD1QTVBhZ2VGb3JtYXQKLU9TX1BNRmxhdHRlblBhZ2VGb3JtYXRfMT1jYXN0PUhhbmRsZSAqCi0KLU9TX1BNRmxhdHRlblByaW50U2V0dGluZ3M9Ci1PU19QTUZsYXR0ZW5QcmludFNldHRpbmdzXzA9Y2FzdD1QTVByaW50U2V0dGluZ3MKLU9TX1BNRmxhdHRlblByaW50U2V0dGluZ3NfMT1jYXN0PUhhbmRsZSAqCi0KLU9TX1BNR2V0QWRqdXN0ZWRQYWdlUmVjdD0KLU9TX1BNR2V0QWRqdXN0ZWRQYWdlUmVjdF8wPWNhc3Q9KFBNUGFnZUZvcm1hdCkKLU9TX1BNR2V0QWRqdXN0ZWRQYWdlUmVjdF8xPWNhc3Q9KFBNUmVjdCAqKQotCi1PU19QTUdldEFkanVzdGVkUGFwZXJSZWN0PQotT1NfUE1HZXRBZGp1c3RlZFBhcGVyUmVjdF8wPWNhc3Q9KFBNUGFnZUZvcm1hdCkKLU9TX1BNR2V0QWRqdXN0ZWRQYXBlclJlY3RfMT1jYXN0PShQTVJlY3QgKikKLQotT1NfUE1HZXRDb2xsYXRlPQotT1NfUE1HZXRDb2xsYXRlXzA9Y2FzdD1QTVByaW50U2V0dGluZ3MKLU9TX1BNR2V0Q29sbGF0ZV8xPQotCi1PU19QTUdldENvcGllcz0KLU9TX1BNR2V0Q29waWVzXzA9Y2FzdD0oUE1QcmludFNldHRpbmdzKQotT1NfUE1HZXRDb3BpZXNfMT1jYXN0PShVSW50MzIgKikKLQotT1NfUE1HZXRGaXJzdFBhZ2U9Ci1PU19QTUdldEZpcnN0UGFnZV8wPWNhc3Q9KFBNUHJpbnRTZXR0aW5ncykKLU9TX1BNR2V0Rmlyc3RQYWdlXzE9Y2FzdD0oVUludDMyICopCi0KLU9TX1BNR2V0Sm9iTmFtZUNGU3RyaW5nPQotT1NfUE1HZXRKb2JOYW1lQ0ZTdHJpbmdfMD1jYXN0PShQTVByaW50U2V0dGluZ3MpCi1PU19QTUdldEpvYk5hbWVDRlN0cmluZ18xPWNhc3Q9KENGU3RyaW5nUmVmICopCi0KLU9TX1BNR2V0TGFzdFBhZ2U9Ci1PU19QTUdldExhc3RQYWdlXzA9Y2FzdD0oUE1QcmludFNldHRpbmdzKQotT1NfUE1HZXRMYXN0UGFnZV8xPWNhc3Q9KFVJbnQzMiAqKQotCi1PU19QTUdldFBhZ2VSYW5nZT0KLU9TX1BNR2V0UGFnZVJhbmdlXzA9Y2FzdD0oUE1QcmludFNldHRpbmdzKQotT1NfUE1HZXRQYWdlUmFuZ2VfMT1jYXN0PShVSW50MzIgKikKLU9TX1BNR2V0UGFnZVJhbmdlXzI9Y2FzdD0oVUludDMyICopCi0KLU9TX1BNR2V0UmVzb2x1dGlvbj0KLU9TX1BNR2V0UmVzb2x1dGlvbl8wPWNhc3Q9KFBNUGFnZUZvcm1hdCkKLU9TX1BNR2V0UmVzb2x1dGlvbl8xPWNhc3Q9KFBNUmVzb2x1dGlvbiAqKQotCi1PU19QTVJlbGVhc2U9Ci1PU19QTVJlbGVhc2VfMD1jYXN0PShQTU9iamVjdCkKLQotT1NfUE1TZXNzaW9uQmVnaW5Eb2N1bWVudE5vRGlhbG9nPQotT1NfUE1TZXNzaW9uQmVnaW5Eb2N1bWVudE5vRGlhbG9nXzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi1PU19QTVNlc3Npb25CZWdpbkRvY3VtZW50Tm9EaWFsb2dfMT1jYXN0PShQTVByaW50U2V0dGluZ3MpCi1PU19QTVNlc3Npb25CZWdpbkRvY3VtZW50Tm9EaWFsb2dfMj1jYXN0PShQTVBhZ2VGb3JtYXQpCi0KLU9TX1BNU2Vzc2lvbkJlZ2luUGFnZU5vRGlhbG9nPQotT1NfUE1TZXNzaW9uQmVnaW5QYWdlTm9EaWFsb2dfMD1jYXN0PShQTVByaW50U2Vzc2lvbikKLU9TX1BNU2Vzc2lvbkJlZ2luUGFnZU5vRGlhbG9nXzE9Y2FzdD0oUE1QYWdlRm9ybWF0KQotT1NfUE1TZXNzaW9uQmVnaW5QYWdlTm9EaWFsb2dfMj1jYXN0PShjb25zdCBQTVJlY3QgKikKLQotT1NfUE1TZXNzaW9uQ29weURlc3RpbmF0aW9uTG9jYXRpb249Ci1PU19QTVNlc3Npb25Db3B5RGVzdGluYXRpb25Mb2NhdGlvbl8wPWNhc3Q9UE1QcmludFNlc3Npb24KLU9TX1BNU2Vzc2lvbkNvcHlEZXN0aW5hdGlvbkxvY2F0aW9uXzE9Y2FzdD1QTVByaW50U2V0dGluZ3MKLU9TX1BNU2Vzc2lvbkNvcHlEZXN0aW5hdGlvbkxvY2F0aW9uXzI9Y2FzdD0oQ0ZVUkxSZWYgKikKLQotT1NfUE1TZXNzaW9uQ3JlYXRlUHJpbnRlckxpc3Q9Ci1PU19QTVNlc3Npb25DcmVhdGVQcmludGVyTGlzdF8wPWNhc3Q9UE1QcmludFNlc3Npb24KLU9TX1BNU2Vzc2lvbkNyZWF0ZVByaW50ZXJMaXN0XzE9Y2FzdD1DRkFycmF5UmVmICoKLU9TX1BNU2Vzc2lvbkNyZWF0ZVByaW50ZXJMaXN0XzI9Y2FzdD1DRkluZGV4ICoKLU9TX1BNU2Vzc2lvbkNyZWF0ZVByaW50ZXJMaXN0XzM9Y2FzdD1QTVByaW50ZXIgKgotCi1PU19QTVNlc3Npb25EZWZhdWx0UGFnZUZvcm1hdD0KLU9TX1BNU2Vzc2lvbkRlZmF1bHRQYWdlRm9ybWF0XzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi1PU19QTVNlc3Npb25EZWZhdWx0UGFnZUZvcm1hdF8xPWNhc3Q9KFBNUGFnZUZvcm1hdCkKLQotT1NfUE1TZXNzaW9uRGVmYXVsdFByaW50U2V0dGluZ3M9Ci1PU19QTVNlc3Npb25EZWZhdWx0UHJpbnRTZXR0aW5nc18wPWNhc3Q9KFBNUHJpbnRTZXNzaW9uKQotT1NfUE1TZXNzaW9uRGVmYXVsdFByaW50U2V0dGluZ3NfMT1jYXN0PShQTVByaW50U2V0dGluZ3MpCi0KLU9TX1BNU2Vzc2lvbkVuZERvY3VtZW50Tm9EaWFsb2c9Ci1PU19QTVNlc3Npb25FbmREb2N1bWVudE5vRGlhbG9nXzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi0KLU9TX1BNU2Vzc2lvbkVuZFBhZ2VOb0RpYWxvZz0KLU9TX1BNU2Vzc2lvbkVuZFBhZ2VOb0RpYWxvZ18wPWNhc3Q9KFBNUHJpbnRTZXNzaW9uKQotCi1PU19QTVNlc3Npb25FcnJvcj0KLU9TX1BNU2Vzc2lvbkVycm9yXzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi0KLU9TX1BNU2Vzc2lvbkdldERlc3RpbmF0aW9uVHlwZT0KLU9TX1BNU2Vzc2lvbkdldERlc3RpbmF0aW9uVHlwZV8wPWNhc3Q9UE1QcmludFNlc3Npb24KLU9TX1BNU2Vzc2lvbkdldERlc3RpbmF0aW9uVHlwZV8xPWNhc3Q9UE1QcmludFNldHRpbmdzCi1PU19QTVNlc3Npb25HZXREZXN0aW5hdGlvblR5cGVfMj1jYXN0PShQTURlc3RpbmF0aW9uVHlwZSAqKQotCi1PU19QTVNlc3Npb25HZXRHcmFwaGljc0NvbnRleHQ9Ci1PU19QTVNlc3Npb25HZXRHcmFwaGljc0NvbnRleHRfMD1jYXN0PShQTVByaW50U2Vzc2lvbikKLU9TX1BNU2Vzc2lvbkdldEdyYXBoaWNzQ29udGV4dF8xPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfUE1TZXNzaW9uR2V0R3JhcGhpY3NDb250ZXh0XzI9Y2FzdD0odm9pZCAqKikKLQotT1NfUE1TZXNzaW9uUGFnZVNldHVwRGlhbG9nPQotT1NfUE1TZXNzaW9uUGFnZVNldHVwRGlhbG9nXzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi1PU19QTVNlc3Npb25QYWdlU2V0dXBEaWFsb2dfMT1jYXN0PShQTVBhZ2VGb3JtYXQpCi1PU19QTVNlc3Npb25QYWdlU2V0dXBEaWFsb2dfMj1jYXN0PShCb29sZWFuICopCi0KLU9TX1BNU2Vzc2lvblByaW50RGlhbG9nPQotT1NfUE1TZXNzaW9uUHJpbnREaWFsb2dfMD1jYXN0PShQTVByaW50U2Vzc2lvbikKLU9TX1BNU2Vzc2lvblByaW50RGlhbG9nXzE9Y2FzdD0oUE1QcmludFNldHRpbmdzKQotT1NfUE1TZXNzaW9uUHJpbnREaWFsb2dfMj1jYXN0PShQTVBhZ2VGb3JtYXQpCi1PU19QTVNlc3Npb25QcmludERpYWxvZ18zPWNhc3Q9KEJvb2xlYW4gKikKLQotT1NfUE1TZXNzaW9uU2V0Q3VycmVudFByaW50ZXI9Ci1PU19QTVNlc3Npb25TZXRDdXJyZW50UHJpbnRlcl8wPWNhc3Q9UE1QcmludFNlc3Npb24KLU9TX1BNU2Vzc2lvblNldEN1cnJlbnRQcmludGVyXzE9Y2FzdD1DRlN0cmluZ1JlZgotCi1PU19QTVNlc3Npb25TZXREZXN0aW5hdGlvbj0KLU9TX1BNU2Vzc2lvblNldERlc3RpbmF0aW9uXzA9Y2FzdD1QTVByaW50U2Vzc2lvbgotT1NfUE1TZXNzaW9uU2V0RGVzdGluYXRpb25fMT1jYXN0PVBNUHJpbnRTZXR0aW5ncwotT1NfUE1TZXNzaW9uU2V0RGVzdGluYXRpb25fMj1jYXN0PVBNRGVzdGluYXRpb25UeXBlCi1PU19QTVNlc3Npb25TZXREZXN0aW5hdGlvbl8zPWNhc3Q9Q0ZTdHJpbmdSZWYKLU9TX1BNU2Vzc2lvblNldERlc3RpbmF0aW9uXzQ9Y2FzdD1DRlVSTFJlZgotCi1PU19QTVNlc3Npb25TZXREb2N1bWVudEZvcm1hdEdlbmVyYXRpb249Ci1PU19QTVNlc3Npb25TZXREb2N1bWVudEZvcm1hdEdlbmVyYXRpb25fMD1jYXN0PShQTVByaW50U2Vzc2lvbikKLU9TX1BNU2Vzc2lvblNldERvY3VtZW50Rm9ybWF0R2VuZXJhdGlvbl8xPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfUE1TZXNzaW9uU2V0RG9jdW1lbnRGb3JtYXRHZW5lcmF0aW9uXzI9Y2FzdD0oQ0ZBcnJheVJlZikKLU9TX1BNU2Vzc2lvblNldERvY3VtZW50Rm9ybWF0R2VuZXJhdGlvbl8zPWNhc3Q9KENGVHlwZVJlZikKLQotT1NfUE1TZXNzaW9uU2V0RXJyb3I9Ci1PU19QTVNlc3Npb25TZXRFcnJvcl8wPWNhc3Q9KFBNUHJpbnRTZXNzaW9uKQotT1NfUE1TZXNzaW9uU2V0RXJyb3JfMT0KLQotT1NfUE1TZXNzaW9uVXNlU2hlZXRzPQotT1NfUE1TZXNzaW9uVXNlU2hlZXRzXzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi1PU19QTVNlc3Npb25Vc2VTaGVldHNfMT1jYXN0PShXaW5kb3dSZWYpCi1PU19QTVNlc3Npb25Vc2VTaGVldHNfMj1jYXN0PShQTVNoZWV0RG9uZVVQUCkKLQotT1NfUE1TZXNzaW9uVmFsaWRhdGVQYWdlRm9ybWF0PQotT1NfUE1TZXNzaW9uVmFsaWRhdGVQYWdlRm9ybWF0XzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi1PU19QTVNlc3Npb25WYWxpZGF0ZVBhZ2VGb3JtYXRfMT1jYXN0PShQTVBhZ2VGb3JtYXQpCi1PU19QTVNlc3Npb25WYWxpZGF0ZVBhZ2VGb3JtYXRfMj1jYXN0PShCb29sZWFuICopCi0KLU9TX1BNU2Vzc2lvblZhbGlkYXRlUHJpbnRTZXR0aW5ncz0KLU9TX1BNU2Vzc2lvblZhbGlkYXRlUHJpbnRTZXR0aW5nc18wPWNhc3Q9KFBNUHJpbnRTZXNzaW9uKQotT1NfUE1TZXNzaW9uVmFsaWRhdGVQcmludFNldHRpbmdzXzE9Y2FzdD0oUE1QcmludFNldHRpbmdzKQotT1NfUE1TZXNzaW9uVmFsaWRhdGVQcmludFNldHRpbmdzXzI9Y2FzdD0oQm9vbGVhbiAqKQotCi1PU19QTVNldENvbGxhdGU9Ci1PU19QTVNldENvbGxhdGVfMD1jYXN0PVBNUHJpbnRTZXR0aW5ncwotT1NfUE1TZXRDb2xsYXRlXzE9Ci0KLU9TX1BNU2V0Rmlyc3RQYWdlPQotT1NfUE1TZXRGaXJzdFBhZ2VfMD1jYXN0PShQTVByaW50U2V0dGluZ3MpCi1PU19QTVNldEZpcnN0UGFnZV8xPWNhc3Q9KFVJbnQzMikKLU9TX1BNU2V0Rmlyc3RQYWdlXzI9Y2FzdD0oQm9vbGVhbikKLQotT1NfUE1TZXRKb2JOYW1lQ0ZTdHJpbmc9Ci1PU19QTVNldEpvYk5hbWVDRlN0cmluZ18wPWNhc3Q9KFBNUHJpbnRTZXR0aW5ncykKLU9TX1BNU2V0Sm9iTmFtZUNGU3RyaW5nXzE9Y2FzdD1DRlN0cmluZ1JlZgotCi1PU19QTVNldExhc3RQYWdlPQotT1NfUE1TZXRMYXN0UGFnZV8wPWNhc3Q9KFBNUHJpbnRTZXR0aW5ncykKLU9TX1BNU2V0TGFzdFBhZ2VfMT1jYXN0PShVSW50MzIpCi1PU19QTVNldExhc3RQYWdlXzI9Y2FzdD0oQm9vbGVhbikKLQotT1NfUE1TZXRQYWdlUmFuZ2U9Ci1PU19QTVNldFBhZ2VSYW5nZV8wPWNhc3Q9KFBNUHJpbnRTZXR0aW5ncykKLU9TX1BNU2V0UGFnZVJhbmdlXzE9Y2FzdD0oVUludDMyKQotT1NfUE1TZXRQYWdlUmFuZ2VfMj1jYXN0PShVSW50MzIpCi0KLU9TX1BNVW5mbGF0dGVuUGFnZUZvcm1hdD0KLU9TX1BNVW5mbGF0dGVuUGFnZUZvcm1hdF8wPWNhc3Q9SGFuZGxlCi1PU19QTVVuZmxhdHRlblBhZ2VGb3JtYXRfMT1jYXN0PVBNUGFnZUZvcm1hdCAqCi0KLU9TX1BNVW5mbGF0dGVuUHJpbnRTZXR0aW5ncz0KLU9TX1BNVW5mbGF0dGVuUHJpbnRTZXR0aW5nc18wPWNhc3Q9SGFuZGxlCi1PU19QTVVuZmxhdHRlblByaW50U2V0dGluZ3NfMT1jYXN0PShQTVByaW50U2V0dGluZ3MgKikKLQotT1NfUGFpbnRPdmFsPQotT1NfUGFpbnRPdmFsXzA9Y2FzdD0oY29uc3QgUmVjdCAqKQotCi1PU19QYWludFBvbHk9Ci1PU19QYWludFBvbHlfMD1jYXN0PShQb2x5SGFuZGxlKQotCi1PU19QYWludFJlY3Q9Ci1PU19QYWludFJlY3RfMD1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX1BhaW50Um91bmRSZWN0PQotT1NfUGFpbnRSb3VuZFJlY3RfMD1jYXN0PShjb25zdCBSZWN0ICopCi1PU19QYWludFJvdW5kUmVjdF8xPWNhc3Q9KHNob3J0KQotT1NfUGFpbnRSb3VuZFJlY3RfMj1jYXN0PShzaG9ydCkKLQotT1NfUGVuU2l6ZT0KLU9TX1BlblNpemVfMD1jYXN0PShzaG9ydCkKLU9TX1BlblNpemVfMT1jYXN0PShzaG9ydCkKLQotT1NfUGlja0NvbG9yPQotT1NfUGlja0NvbG9yXzA9Y2FzdD0oQ29sb3JQaWNrZXJJbmZvICopCi0KLU9TX1BvcFVwTWVudVNlbGVjdD0KLU9TX1BvcFVwTWVudVNlbGVjdF8wPWNhc3Q9KE1lbnVSZWYpCi1PU19Qb3BVcE1lbnVTZWxlY3RfMT1jYXN0PShzaG9ydCkKLU9TX1BvcFVwTWVudVNlbGVjdF8yPWNhc3Q9KHNob3J0KQotT1NfUG9wVXBNZW51U2VsZWN0XzM9Y2FzdD0oc2hvcnQpCi0KLU9TX1Bvc3RFdmVudD0KLU9TX1Bvc3RFdmVudF8wPWNhc3Q9KEV2ZW50S2luZCkKLU9TX1Bvc3RFdmVudF8xPWNhc3Q9KFVJbnQzMikKLQotT1NfUG9zdEV2ZW50VG9RdWV1ZT0KLU9TX1Bvc3RFdmVudFRvUXVldWVfMD1jYXN0PShFdmVudFF1ZXVlUmVmKQotT1NfUG9zdEV2ZW50VG9RdWV1ZV8xPWNhc3Q9KEV2ZW50UmVmKQotT1NfUG9zdEV2ZW50VG9RdWV1ZV8yPWNhc3Q9KEV2ZW50UHJpb3JpdHkpCi0KLU9TX1B0SW5SZWN0PQotT1NfUHRJblJlY3RfMD1jYXN0PShQb2ludCAqKSxmbGFncz1zdHJ1Y3QKLU9TX1B0SW5SZWN0XzE9Y2FzdD0oY29uc3QgUmVjdCAqKQotCi1PU19QdEluUmduPQotT1NfUHRJblJnbl8wPWNhc3Q9KFBvaW50ICopLGZsYWdzPXN0cnVjdAotT1NfUHRJblJnbl8xPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfUHV0U2NyYXBGbGF2b3JfX0lJSUlfM0I9Ci1PU19QdXRTY3JhcEZsYXZvcl9fSUlJSV8zQl8wPWNhc3Q9KFNjcmFwUmVmKQotT1NfUHV0U2NyYXBGbGF2b3JfX0lJSUlfM0JfMT1jYXN0PShTY3JhcEZsYXZvclR5cGUpCi1PU19QdXRTY3JhcEZsYXZvcl9fSUlJSV8zQl8yPWNhc3Q9KFNjcmFwRmxhdm9yRmxhZ3MpCi1PU19QdXRTY3JhcEZsYXZvcl9fSUlJSV8zQl8zPWNhc3Q9KFNpemUpCi1PU19QdXRTY3JhcEZsYXZvcl9fSUlJSV8zQl80PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfUHV0U2NyYXBGbGF2b3JfX0lJSUlfM0M9Ci1PU19QdXRTY3JhcEZsYXZvcl9fSUlJSV8zQ18wPWNhc3Q9KFNjcmFwUmVmKQotT1NfUHV0U2NyYXBGbGF2b3JfX0lJSUlfM0NfMT1jYXN0PShTY3JhcEZsYXZvclR5cGUpCi1PU19QdXRTY3JhcEZsYXZvcl9fSUlJSV8zQ18yPWNhc3Q9KFNjcmFwRmxhdm9yRmxhZ3MpCi1PU19QdXRTY3JhcEZsYXZvcl9fSUlJSV8zQ18zPWNhc3Q9KFNpemUpCi1PU19QdXRTY3JhcEZsYXZvcl9fSUlJSV8zQ180PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfUURCZWdpbkNHQ29udGV4dD0KLU9TX1FEQmVnaW5DR0NvbnRleHRfMD1jYXN0PShDR3JhZlB0cikKLU9TX1FEQmVnaW5DR0NvbnRleHRfMT1jYXN0PShDR0NvbnRleHRSZWYgKikKLQotT1NfUURFbmRDR0NvbnRleHQ9Ci1PU19RREVuZENHQ29udGV4dF8wPWNhc3Q9KENHcmFmUHRyKQotT1NfUURFbmRDR0NvbnRleHRfMT1jYXN0PShDR0NvbnRleHRSZWYgKikKLQotT1NfUURGbHVzaFBvcnRCdWZmZXI9Ci1PU19RREZsdXNoUG9ydEJ1ZmZlcl8wPWNhc3Q9KENHcmFmUHRyKQotT1NfUURGbHVzaFBvcnRCdWZmZXJfMT1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX1FER2xvYmFsVG9Mb2NhbFBvaW50PQotT1NfUURHbG9iYWxUb0xvY2FsUG9pbnRfMD1jYXN0PShDR3JhZlB0cikKLU9TX1FER2xvYmFsVG9Mb2NhbFBvaW50XzE9Y2FzdD0oUG9pbnQgKikKLQotT1NfUURMb2NhbFRvR2xvYmFsUG9pbnQ9Ci1PU19RRExvY2FsVG9HbG9iYWxQb2ludF8wPWNhc3Q9KENHcmFmUHRyKQotT1NfUURMb2NhbFRvR2xvYmFsUG9pbnRfMT1jYXN0PShQb2ludCAqKQotCi1PU19RRFJlZ2lvblRvUmVjdHM9Ci1PU19RRFJlZ2lvblRvUmVjdHNfMD1jYXN0PVJnbkhhbmRsZQotT1NfUURSZWdpb25Ub1JlY3RzXzE9Y2FzdD1RRFJlZ2lvblBhcnNlRGlyZWN0aW9uCi1PU19RRFJlZ2lvblRvUmVjdHNfMj1jYXN0PVJlZ2lvblRvUmVjdHNVUFAKLU9TX1FEUmVnaW9uVG9SZWN0c18zPWNhc3Q9dm9pZCAqCi0KLU9TX1FEU2V0RGlydHlSZWdpb249Ci1PU19RRFNldERpcnR5UmVnaW9uXzA9Y2FzdD0oQ0dyYWZQdHIpCi1PU19RRFNldERpcnR5UmVnaW9uXzE9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19RRFNldFBhdHRlcm5PcmlnaW49Ci1PU19RRFNldFBhdHRlcm5PcmlnaW5fMD1jYXN0PShQb2ludCAqKSxmbGFncz1zdHJ1Y3QKLQotT1NfUURTd2FwVGV4dEZsYWdzPQotT1NfUURTd2FwVGV4dEZsYWdzXzA9Y2FzdD0oVUludDMyKQotCi1PU19SR0JCYWNrQ29sb3I9Ci1PU19SR0JCYWNrQ29sb3JfMD1jYXN0PShjb25zdCBSR0JDb2xvciAqKQotCi1PU19SR0JGb3JlQ29sb3I9Ci1PU19SR0JGb3JlQ29sb3JfMD1jYXN0PShjb25zdCBSR0JDb2xvciAqKQotCi1PU19SZWFkSWNvbkZpbGU9Ci1PU19SZWFkSWNvbkZpbGVfMD1jYXN0PWNvbnN0IEZTU3BlYyAqCi1PU19SZWFkSWNvbkZpbGVfMT1jYXN0PUljb25GYW1pbHlIYW5kbGUgKgotCi1PU19SZWNlaXZlTmV4dEV2ZW50PQotT1NfUmVjZWl2ZU5leHRFdmVudF8wPWNhc3Q9KFVJbnQzMikKLU9TX1JlY2VpdmVOZXh0RXZlbnRfMT1jYXN0PShjb25zdCBFdmVudFR5cGVTcGVjICopCi1PU19SZWNlaXZlTmV4dEV2ZW50XzI9Y2FzdD0oRXZlbnRUaW1lb3V0KQotT1NfUmVjZWl2ZU5leHRFdmVudF8zPWNhc3Q9KEJvb2xlYW4pCi1PU19SZWNlaXZlTmV4dEV2ZW50XzQ9Y2FzdD0oRXZlbnRSZWYgKikKLQotT1NfUmVjdEluUmduPQotT1NfUmVjdEluUmduXzA9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfUmVjdEluUmduXzE9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19SZWN0UmduPQotT1NfUmVjdFJnbl8wPWNhc3Q9KFJnbkhhbmRsZSkKLU9TX1JlY3RSZ25fMT1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX1JlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudD0KLQotT1NfUmVsZWFzZUV2ZW50PQotT1NfUmVsZWFzZUV2ZW50XzA9Y2FzdD0oRXZlbnRSZWYpCi0KLU9TX1JlbGVhc2VJY29uUmVmPQotT1NfUmVsZWFzZUljb25SZWZfMD1jYXN0PUljb25SZWYKLQotT1NfUmVsZWFzZU1lbnU9Ci1PU19SZWxlYXNlTWVudV8wPWNhc3Q9KE1lbnVSZWYpCi0KLU9TX1JlbGVhc2VXaW5kb3c9Ci1PU19SZWxlYXNlV2luZG93XzA9Y2FzdD1XaW5kb3dSZWYKLQotT1NfUmVsZWFzZVdpbmRvd0dyb3VwPQotT1NfUmVsZWFzZVdpbmRvd0dyb3VwXzA9Y2FzdD0oV2luZG93R3JvdXBSZWYpCi0KLU9TX1JlbW92ZUNvbnRyb2xQcm9wZXJ0eT0KLU9TX1JlbW92ZUNvbnRyb2xQcm9wZXJ0eV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19SZW1vdmVDb250cm9sUHJvcGVydHlfMT0KLU9TX1JlbW92ZUNvbnRyb2xQcm9wZXJ0eV8yPQotCi1PU19SZW1vdmVEYXRhQnJvd3Nlckl0ZW1zPQotT1NfUmVtb3ZlRGF0YUJyb3dzZXJJdGVtc18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19SZW1vdmVEYXRhQnJvd3Nlckl0ZW1zXzE9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtSUQpCi1PU19SZW1vdmVEYXRhQnJvd3Nlckl0ZW1zXzI9Y2FzdD0oVUludDMyKQotT1NfUmVtb3ZlRGF0YUJyb3dzZXJJdGVtc18zPWNhc3Q9KGNvbnN0IERhdGFCcm93c2VySXRlbUlEICopCi1PU19SZW1vdmVEYXRhQnJvd3Nlckl0ZW1zXzQ9Y2FzdD0oRGF0YUJyb3dzZXJQcm9wZXJ0eUlEKQotCi1PU19SZW1vdmVEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbj0KLU9TX1JlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1JlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uXzE9Y2FzdD0oRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5JRCkKLQotT1NfUmVtb3ZlRXZlbnRIYW5kbGVyPQotT1NfUmVtb3ZlRXZlbnRIYW5kbGVyXzA9Y2FzdD0oRXZlbnRIYW5kbGVyUmVmKQotCi1PU19SZW1vdmVFdmVudExvb3BUaW1lcj0KLU9TX1JlbW92ZUV2ZW50TG9vcFRpbWVyXzA9Y2FzdD0oRXZlbnRMb29wVGltZXJSZWYpCi0KLU9TX1JlbW92ZVJlY2VpdmVIYW5kbGVyPQotT1NfUmVtb3ZlUmVjZWl2ZUhhbmRsZXJfMD1jYXN0PShEcmFnUmVjZWl2ZUhhbmRsZXJVUFApCi1PU19SZW1vdmVSZWNlaXZlSGFuZGxlcl8xPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfUmVtb3ZlVHJhY2tpbmdIYW5kbGVyPQotT1NfUmVtb3ZlVHJhY2tpbmdIYW5kbGVyXzA9Y2FzdD0oRHJhZ1RyYWNraW5nSGFuZGxlclVQUCkKLU9TX1JlbW92ZVRyYWNraW5nSGFuZGxlcl8xPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfUmVwb3NpdGlvbldpbmRvdz0KLU9TX1JlcG9zaXRpb25XaW5kb3dfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19SZXBvc2l0aW9uV2luZG93XzE9Y2FzdD0oV2luZG93UmVmKQotT1NfUmVwb3NpdGlvbldpbmRvd18yPQotCi1PU19SZXNoYXBlQ3VzdG9tV2luZG93PQotT1NfUmVzaGFwZUN1c3RvbVdpbmRvd18wPWNhc3Q9V2luZG93UmVmCi0KLU9TX1Jlc3RvcmVBcHBsaWNhdGlvbkRvY2tUaWxlSW1hZ2U9Ci0KLU9TX1JldGFpbkV2ZW50PQotT1NfUmV0YWluRXZlbnRfMD1jYXN0PShFdmVudFJlZikKLQotT1NfUmV0YWluTWVudT0KLU9TX1JldGFpbk1lbnVfMD1jYXN0PShNZW51UmVmKQotCi1PU19SZXRhaW5XaW5kb3c9Ci1PU19SZXRhaW5XaW5kb3dfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX1JldmVhbERhdGFCcm93c2VySXRlbT0KLU9TX1JldmVhbERhdGFCcm93c2VySXRlbV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19SZXZlYWxEYXRhQnJvd3Nlckl0ZW1fMT1jYXN0PShEYXRhQnJvd3Nlckl0ZW1JRCkKLU9TX1JldmVhbERhdGFCcm93c2VySXRlbV8yPWNhc3Q9KERhdGFCcm93c2VyUHJvcGVydHlJRCkKLU9TX1JldmVhbERhdGFCcm93c2VySXRlbV8zPWNhc3Q9KERhdGFCcm93c2VyUmV2ZWFsT3B0aW9ucykKLQotT1NfUnVuU3RhbmRhcmRBbGVydD0KLU9TX1J1blN0YW5kYXJkQWxlcnRfMD1jYXN0PShEaWFsb2dSZWYpCi1PU19SdW5TdGFuZGFyZEFsZXJ0XzE9Y2FzdD0oTW9kYWxGaWx0ZXJVUFApCi1PU19SdW5TdGFuZGFyZEFsZXJ0XzI9Y2FzdD0oRGlhbG9nSXRlbUluZGV4ICopCi0KLU9TX1Njcm9sbFJlY3Q9Ci1PU19TY3JvbGxSZWN0XzA9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfU2Nyb2xsUmVjdF8xPWNhc3Q9KHNob3J0KQotT1NfU2Nyb2xsUmVjdF8yPWNhc3Q9KHNob3J0KQotT1NfU2Nyb2xsUmVjdF8zPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfU2VjdFJlY3Q9Ci1PU19TZWN0UmVjdF8wPWZsYWdzPW5vX291dAotT1NfU2VjdFJlY3RfMT1mbGFncz1ub19vdXQKLU9TX1NlY3RSZWN0XzI9ZmxhZ3M9bm9faW4KLQotT1NfU2VjdFJnbj0KLU9TX1NlY3RSZ25fMD1jYXN0PShSZ25IYW5kbGUpCi1PU19TZWN0UmduXzE9Y2FzdD0oUmduSGFuZGxlKQotT1NfU2VjdFJnbl8yPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfU2VsZWN0V2luZG93PQotT1NfU2VsZWN0V2luZG93XzA9Y2FzdD0oV2luZG93UmVmKQotCi1PU19TZW5kQmVoaW5kPQotT1NfU2VuZEJlaGluZF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX1NlbmRCZWhpbmRfMT1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX1NlbmRFdmVudFRvRXZlbnRUYXJnZXQ9Ci1PU19TZW5kRXZlbnRUb0V2ZW50VGFyZ2V0XzA9Y2FzdD0oRXZlbnRSZWYpCi1PU19TZW5kRXZlbnRUb0V2ZW50VGFyZ2V0XzE9Y2FzdD0oRXZlbnRUYXJnZXRSZWYpCi0KLU9TX1NlbmRFdmVudFRvRXZlbnRUYXJnZXRXaXRoT3B0aW9ucz0KLU9TX1NlbmRFdmVudFRvRXZlbnRUYXJnZXRXaXRoT3B0aW9uc18wPWNhc3Q9RXZlbnRSZWYKLU9TX1NlbmRFdmVudFRvRXZlbnRUYXJnZXRXaXRoT3B0aW9uc18xPWNhc3Q9KEV2ZW50VGFyZ2V0UmVmKQotT1NfU2VuZEV2ZW50VG9FdmVudFRhcmdldFdpdGhPcHRpb25zXzI9Ci0KLU9TX1NldEFwcGxpY2F0aW9uRG9ja1RpbGVJbWFnZT0KLU9TX1NldEFwcGxpY2F0aW9uRG9ja1RpbGVJbWFnZV8wPWNhc3Q9KENHSW1hZ2VSZWYpCi0KLU9TX1NldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93PQotT1NfU2V0QXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3dfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19TZXRBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvd18xPWNhc3Q9Qm9vbGVhbgotCi1PU19TZXRCZXZlbEJ1dHRvbkNvbnRlbnRJbmZvPQotT1NfU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mb18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRCZXZlbEJ1dHRvbkNvbnRlbnRJbmZvXzE9Y2FzdD0oQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvUHRyKQotCi1PU19TZXRDbGlwPQotT1NfU2V0Q2xpcF8wPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfU2V0Q29udHJvbDMyQml0TWF4aW11bT0KLU9TX1NldENvbnRyb2wzMkJpdE1heGltdW1fMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbDMyQml0TWF4aW11bV8xPWNhc3Q9KFNJbnQzMikKLQotT1NfU2V0Q29udHJvbDMyQml0TWluaW11bT0KLU9TX1NldENvbnRyb2wzMkJpdE1pbmltdW1fMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbDMyQml0TWluaW11bV8xPWNhc3Q9KFNJbnQzMikKLQotT1NfU2V0Q29udHJvbDMyQml0VmFsdWU9Ci1PU19TZXRDb250cm9sMzJCaXRWYWx1ZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sMzJCaXRWYWx1ZV8xPWNhc3Q9KFNJbnQzMikKLQotT1NfU2V0Q29udHJvbEFjdGlvbj0KLU9TX1NldENvbnRyb2xBY3Rpb25fMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbEFjdGlvbl8xPWNhc3Q9KENvbnRyb2xBY3Rpb25VUFApCi0KLU9TX1NldENvbnRyb2xCb3VuZHM9Ci1PU19TZXRDb250cm9sQm91bmRzXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2xCb3VuZHNfMT1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX1NldENvbnRyb2xDb2xvclByb2M9Ci1PU19TZXRDb250cm9sQ29sb3JQcm9jXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2xDb2xvclByb2NfMT1jYXN0PShDb250cm9sQ29sb3JVUFApCi0KLU9TX1NldENvbnRyb2xEYXRhX19JSUlJST0KLU9TX1NldENvbnRyb2xEYXRhX19JSUlJSV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUlfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUlfMj1jYXN0PShSZXNUeXBlKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlJXzM9Y2FzdD0oU2l6ZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJSV80PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sQnV0dG9uQ29udGVudEluZm9fMj0KLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvXzJfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sQnV0dG9uQ29udGVudEluZm9fMl8xPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvXzJfMj1jYXN0PShSZXNUeXBlKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sQnV0dG9uQ29udGVudEluZm9fMl8zPWNhc3Q9KFNpemUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xCdXR0b25Db250ZW50SW5mb18yXzQ9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY18yPQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sRWRpdFRleHRTZWxlY3Rpb25SZWNfMl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY18yXzE9Y2FzdD0oQ29udHJvbFBhcnRDb2RlKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sRWRpdFRleHRTZWxlY3Rpb25SZWNfMl8yPWNhc3Q9KFJlc1R5cGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY18yXzM9Y2FzdD0oU2l6ZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uUmVjXzJfND1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbFRhYkluZm9SZWNWMV8yPQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sVGFiSW5mb1JlY1YxXzJfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sVGFiSW5mb1JlY1YxXzJfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xUYWJJbmZvUmVjVjFfMl8yPWNhc3Q9KFJlc1R5cGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xUYWJJbmZvUmVjVjFfMl8zPWNhc3Q9KFNpemUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xUYWJJbmZvUmVjVjFfMl80PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzI9Ci1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8xPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzM9Y2FzdD0oU2l6ZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzQ9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zQj0KLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNCXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNCXzE9Y2FzdD0oQ29udHJvbFBhcnRDb2RlKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM0JfMj1jYXN0PShSZXNUeXBlKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM0JfMz1jYXN0PShTaXplKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM0JfND1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNJPQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM0lfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM0lfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zSV8yPWNhc3Q9KFJlc1R5cGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zSV8zPWNhc3Q9KFNpemUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zSV80PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM1M9Ci1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zU18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zU18xPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNTXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNTXzM9Y2FzdD0oU2l6ZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNTXzQ9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19TZXRDb250cm9sRm9udFN0eWxlPQotT1NfU2V0Q29udHJvbEZvbnRTdHlsZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sRm9udFN0eWxlXzE9Y2FzdD0oY29uc3QgQ29udHJvbEZvbnRTdHlsZVJlYyAqKQotCi1PU19TZXRDb250cm9sUG9wdXBNZW51SGFuZGxlPQotT1NfU2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sUG9wdXBNZW51SGFuZGxlXzE9Y2FzdD0oTWVudVJlZikKLQotT1NfU2V0Q29udHJvbFByb3BlcnR5PQotT1NfU2V0Q29udHJvbFByb3BlcnR5XzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2xQcm9wZXJ0eV8xPQotT1NfU2V0Q29udHJvbFByb3BlcnR5XzI9Ci1PU19TZXRDb250cm9sUHJvcGVydHlfMz0KLU9TX1NldENvbnRyb2xQcm9wZXJ0eV80PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfU2V0Q29udHJvbFJlZmVyZW5jZT0KLU9TX1NldENvbnRyb2xSZWZlcmVuY2VfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbFJlZmVyZW5jZV8xPWNhc3Q9KFNJbnQzMikKLQotT1NfU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nPQotT1NfU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZ18xPWNhc3Q9KENGU3RyaW5nUmVmKQotCi1PU19TZXRDb250cm9sVmlld1NpemU9Ci1PU19TZXRDb250cm9sVmlld1NpemVfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbFZpZXdTaXplXzE9Y2FzdD0oU0ludDMyKQotCi1PU19TZXRDb250cm9sVmlzaWJpbGl0eT0KLU9TX1NldENvbnRyb2xWaXNpYmlsaXR5XzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2xWaXNpYmlsaXR5XzE9Ci1PU19TZXRDb250cm9sVmlzaWJpbGl0eV8yPQotCi1PU19TZXRDdXJzb3I9Ci1PU19TZXRDdXJzb3JfMD1jYXN0PShjb25zdCBDdXJzb3IgKikKLQotT1NfU2V0RGF0YUJyb3dzZXJDYWxsYmFja3M9Ci1PU19TZXREYXRhQnJvd3NlckNhbGxiYWNrc18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3NlckNhbGxiYWNrc18xPWNhc3Q9KGNvbnN0IERhdGFCcm93c2VyQ2FsbGJhY2tzICopLGZsYWdzPWluaXQKLQotT1NfU2V0RGF0YUJyb3dzZXJDdXN0b21DYWxsYmFja3M9Ci1PU19TZXREYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrc18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrc18xPQotCi1PU19TZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnM9Ci1PU19TZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnNfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzXzE9Y2FzdD0oQm9vbGVhbikKLU9TX1NldERhdGFCcm93c2VySGFzU2Nyb2xsQmFyc18yPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX1NldERhdGFCcm93c2VySXRlbURhdGFCb29sZWFuVmFsdWU9Ci1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhQm9vbGVhblZhbHVlXzA9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtRGF0YVJlZikKLU9TX1NldERhdGFCcm93c2VySXRlbURhdGFCb29sZWFuVmFsdWVfMT1jYXN0PShCb29sZWFuKQotCi1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhQnV0dG9uVmFsdWU9Ci1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhQnV0dG9uVmFsdWVfMD1jYXN0PShEYXRhQnJvd3Nlckl0ZW1EYXRhUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJJdGVtRGF0YUJ1dHRvblZhbHVlXzE9Y2FzdD0oVGhlbWVCdXR0b25WYWx1ZSkKLQotT1NfU2V0RGF0YUJyb3dzZXJJdGVtRGF0YUljb249Ci1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhSWNvbl8wPWNhc3Q9KERhdGFCcm93c2VySXRlbURhdGFSZWYpCi1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhSWNvbl8xPWNhc3Q9KEljb25SZWYpCi0KLU9TX1NldERhdGFCcm93c2VySXRlbURhdGFJdGVtSUQ9Ci1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhSXRlbUlEXzA9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtRGF0YVJlZikKLU9TX1NldERhdGFCcm93c2VySXRlbURhdGFJdGVtSURfMT1jYXN0PShEYXRhQnJvd3Nlckl0ZW1JRCkKLQotT1NfU2V0RGF0YUJyb3dzZXJJdGVtRGF0YVRleHQ9Ci1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhVGV4dF8wPWNhc3Q9KERhdGFCcm93c2VySXRlbURhdGFSZWYpCi1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhVGV4dF8xPWNhc3Q9KENGU3RyaW5nUmVmKQotCi1PU19TZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbj0KLU9TX1NldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uXzE9Y2FzdD0oRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5JRCkKLU9TX1NldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uXzI9Y2FzdD0oQm9vbGVhbikKLQotT1NfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodD0KLU9TX1NldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHRfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodF8xPWNhc3Q9KFVJbnQxNikKLQotT1NfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2M9Ci1PU19TZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY18xPQotT1NfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfMj0KLQotT1NfU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzPQotT1NfU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzXzA9Y2FzdD1Db250cm9sUmVmCi1PU19TZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3NfMT1jYXN0PURhdGFCcm93c2VyUHJvcGVydHlJRAotT1NfU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzXzI9Y2FzdD0oRGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzKQotCi1PU19TZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uPQotT1NfU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uXzE9Y2FzdD0oVUludDMyKQotT1NfU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbl8yPWNhc3Q9KFVJbnQzMikKLQotT1NfU2V0RGF0YUJyb3dzZXJTZWxlY3RlZEl0ZW1zPQotT1NfU2V0RGF0YUJyb3dzZXJTZWxlY3RlZEl0ZW1zXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldERhdGFCcm93c2VyU2VsZWN0ZWRJdGVtc18xPWNhc3Q9KFVJbnQzMikKLU9TX1NldERhdGFCcm93c2VyU2VsZWN0ZWRJdGVtc18yPWNhc3Q9KGNvbnN0IERhdGFCcm93c2VySXRlbUlEICopCi1PU19TZXREYXRhQnJvd3NlclNlbGVjdGVkSXRlbXNfMz1jYXN0PShEYXRhQnJvd3NlclNldE9wdGlvbikKLQotT1NfU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncz0KLU9TX1NldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3NfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFnc18xPWNhc3Q9KERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MpCi0KLU9TX1NldERhdGFCcm93c2VyU29ydE9yZGVyPQotT1NfU2V0RGF0YUJyb3dzZXJTb3J0T3JkZXJfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJTb3J0T3JkZXJfMT0KLQotT1NfU2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHk9Ci1PU19TZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eV8xPWNhc3Q9KERhdGFCcm93c2VyUHJvcGVydHlJRCkKLQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbj0KLU9TX1NldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb25fMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbl8xPQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbl8yPQotCi1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlPQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlXzE9Ci0KLU9TX1NldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdz0KLU9TX1NldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dfMT0KLU9TX1NldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd18yPQotCi1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGg9Ci1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGhfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoXzE9Y2FzdD0oRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5JRCkKLU9TX1NldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aF8yPWNhc3Q9KFVJbnQxNikKLQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQ9Ci1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodF8xPQotCi1PU19TZXREYXRhQnJvd3NlclRhcmdldD0KLU9TX1NldERhdGFCcm93c2VyVGFyZ2V0XzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldERhdGFCcm93c2VyVGFyZ2V0XzE9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtSUQpCi0KLU9TX1NldERyYWdBbGxvd2FibGVBY3Rpb25zPQotT1NfU2V0RHJhZ0FsbG93YWJsZUFjdGlvbnNfMD1jYXN0PShEcmFnUmVmKQotT1NfU2V0RHJhZ0FsbG93YWJsZUFjdGlvbnNfMT1jYXN0PShEcmFnQWN0aW9ucykKLU9TX1NldERyYWdBbGxvd2FibGVBY3Rpb25zXzI9Y2FzdD0oQm9vbGVhbikKLQotT1NfU2V0RHJhZ0Ryb3BBY3Rpb249Ci1PU19TZXREcmFnRHJvcEFjdGlvbl8wPWNhc3Q9KERyYWdSZWYpCi1PU19TZXREcmFnRHJvcEFjdGlvbl8xPWNhc3Q9KERyYWdBY3Rpb25zKQotCi1PU19TZXREcmFnSW5wdXRQcm9jPQotT1NfU2V0RHJhZ0lucHV0UHJvY18wPWNhc3Q9KERyYWdSZWYpCi1PU19TZXREcmFnSW5wdXRQcm9jXzE9Y2FzdD0oRHJhZ0lucHV0VVBQKQotT1NfU2V0RHJhZ0lucHV0UHJvY18yPWNhc3Q9KHZvaWQgKikKLQotT1NfU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhPQotT1NfU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhXzA9Y2FzdD0oRHJhZ1JlZikKLU9TX1NldERyYWdJdGVtRmxhdm9yRGF0YV8xPWNhc3Q9KERyYWdJdGVtUmVmKQotT1NfU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhXzI9Y2FzdD0oRmxhdm9yVHlwZSkKLU9TX1NldERyYWdJdGVtRmxhdm9yRGF0YV8zPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX1NldERyYWdJdGVtRmxhdm9yRGF0YV80PWNhc3Q9KFNpemUpCi1PU19TZXREcmFnSXRlbUZsYXZvckRhdGFfNT1jYXN0PShVSW50MzIpCi0KLU9TX1NldERyYWdTZW5kUHJvYz0KLU9TX1NldERyYWdTZW5kUHJvY18wPWNhc3Q9KERyYWdSZWYpCi1PU19TZXREcmFnU2VuZFByb2NfMT1jYXN0PShEcmFnU2VuZERhdGFVUFApCi1PU19TZXREcmFnU2VuZFByb2NfMj1jYXN0PSh2b2lkICopCi0KLU9TX1NldEV2ZW50TG9vcFRpbWVyTmV4dEZpcmVUaW1lPQotT1NfU2V0RXZlbnRMb29wVGltZXJOZXh0RmlyZVRpbWVfMD1jYXN0PShFdmVudExvb3BUaW1lclJlZikKLU9TX1NldEV2ZW50TG9vcFRpbWVyTmV4dEZpcmVUaW1lXzE9Y2FzdD0oRXZlbnRUaW1lckludGVydmFsKQotCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnRfMj0KLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQb2ludF8yXzA9Y2FzdD0oRXZlbnRSZWYpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnRfMl8xPWNhc3Q9KEV2ZW50UGFyYW1OYW1lKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BvaW50XzJfMj1jYXN0PShFdmVudFBhcmFtVHlwZSkKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQb2ludF8yXzM9Y2FzdD0oVUludDMyKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BvaW50XzJfND1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElDb21tYW5kXzI9Ci1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzA9Y2FzdD0oRXZlbnRSZWYpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzE9Y2FzdD0oRXZlbnRQYXJhbU5hbWUpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzM9Y2FzdD0oVUludDMyKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISUNvbW1hbmRfMl80PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM0M9Ci1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zQ18wPWNhc3Q9KEV2ZW50UmVmKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM0NfMT1jYXN0PShFdmVudFBhcmFtTmFtZSkKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNDXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zQ18zPWNhc3Q9KFVJbnQzMikKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNDXzQ9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zST0KLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNJXzA9Y2FzdD0oRXZlbnRSZWYpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zSV8xPWNhc3Q9KEV2ZW50UGFyYW1OYW1lKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM0lfMj1jYXN0PShFdmVudFBhcmFtVHlwZSkKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNJXzM9Y2FzdD0oVUludDMyKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM0lfND1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNTPQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM1NfMD1jYXN0PShFdmVudFJlZikKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNTXzE9Y2FzdD0oRXZlbnRQYXJhbU5hbWUpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zU18yPWNhc3Q9KEV2ZW50UGFyYW1UeXBlKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM1NfMz1jYXN0PShVSW50MzIpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zU180PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfU2V0Rm9udEluZm9Gb3JTZWxlY3Rpb249Ci1PU19TZXRGb250SW5mb0ZvclNlbGVjdGlvbl8wPWNhc3Q9KE9TVHlwZSkKLU9TX1NldEZvbnRJbmZvRm9yU2VsZWN0aW9uXzE9Y2FzdD0oVUludDMyKQotT1NfU2V0Rm9udEluZm9Gb3JTZWxlY3Rpb25fMj1jYXN0PSh2b2lkICopCi1PU19TZXRGb250SW5mb0ZvclNlbGVjdGlvbl8zPWNhc3Q9dm9pZCAqCi0KLU9TX1NldEZyb250UHJvY2Vzcz0KLU9TX1NldEZyb250UHJvY2Vzc18wPWNhc3Q9KGNvbnN0IFByb2Nlc3NTZXJpYWxOdW1iZXIgKikKLQotT1NfU2V0RnJvbnRQcm9jZXNzV2l0aE9wdGlvbnM9Ci1PU19TZXRGcm9udFByb2Nlc3NXaXRoT3B0aW9uc18wPWNhc3Q9KGNvbnN0IFByb2Nlc3NTZXJpYWxOdW1iZXIgKikKLU9TX1NldEZyb250UHJvY2Vzc1dpdGhPcHRpb25zXzE9Ci0KLU9TX1NldEdXb3JsZD0KLU9TX1NldEdXb3JsZF8wPWNhc3Q9KENHcmFmUHRyKQotT1NfU2V0R1dvcmxkXzE9Y2FzdD0oR0RIYW5kbGUpCi0KLU9TX1NldEljb25GYW1pbHlEYXRhPQotT1NfU2V0SWNvbkZhbWlseURhdGFfMD1jYXN0PUljb25GYW1pbHlIYW5kbGUKLU9TX1NldEljb25GYW1pbHlEYXRhXzE9Y2FzdD1PU1R5cGUKLU9TX1NldEljb25GYW1pbHlEYXRhXzI9Y2FzdD1IYW5kbGUKLQotT1NfU2V0SXRlbU1hcms9Ci1PU19TZXRJdGVtTWFya18wPWNhc3Q9KE1lbnVSZWYpCi1PU19TZXRJdGVtTWFya18xPQotT1NfU2V0SXRlbU1hcmtfMj0KLQotT1NfU2V0S2V5Ym9hcmRGb2N1cz0KLU9TX1NldEtleWJvYXJkRm9jdXNfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19TZXRLZXlib2FyZEZvY3VzXzE9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldEtleWJvYXJkRm9jdXNfMj1jYXN0PShDb250cm9sRm9jdXNQYXJ0KQotCi1PU19TZXRNZW51Q29tbWFuZE1hcms9Ci1PU19TZXRNZW51Q29tbWFuZE1hcmtfMD1jYXN0PShNZW51UmVmKQotT1NfU2V0TWVudUNvbW1hbmRNYXJrXzE9Y2FzdD0oTWVudUNvbW1hbmQpCi1PU19TZXRNZW51Q29tbWFuZE1hcmtfMj1jYXN0PShVbmlDaGFyKQotCi1PU19TZXRNZW51Rm9udD0KLU9TX1NldE1lbnVGb250XzA9Y2FzdD0oTWVudVJlZikKLU9TX1NldE1lbnVGb250XzE9Y2FzdD0oU0ludDE2KQotT1NfU2V0TWVudUZvbnRfMj1jYXN0PShVSW50MTYpCi0KLU9TX1NldE1lbnVJdGVtQ29tbWFuZEtleT0KLU9TX1NldE1lbnVJdGVtQ29tbWFuZEtleV8wPWNhc3Q9KE1lbnVSZWYpCi1PU19TZXRNZW51SXRlbUNvbW1hbmRLZXlfMT1jYXN0PShNZW51SXRlbUluZGV4KQotT1NfU2V0TWVudUl0ZW1Db21tYW5kS2V5XzI9Y2FzdD0oQm9vbGVhbikKLU9TX1NldE1lbnVJdGVtQ29tbWFuZEtleV8zPWNhc3Q9KFVJbnQxNikKLQotT1NfU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51PQotT1NfU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51XzA9Y2FzdD0oTWVudVJlZikKLU9TX1NldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudV8xPWNhc3Q9KE1lbnVJdGVtSW5kZXgpCi1PU19TZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnVfMj1jYXN0PShNZW51UmVmKQotCi1PU19TZXRNZW51SXRlbUljb25IYW5kbGU9Ci1PU19TZXRNZW51SXRlbUljb25IYW5kbGVfMD1jYXN0PShNZW51UmVmKQotT1NfU2V0TWVudUl0ZW1JY29uSGFuZGxlXzE9Y2FzdD0oU0ludDE2KQotT1NfU2V0TWVudUl0ZW1JY29uSGFuZGxlXzI9Y2FzdD0oVUludDgpCi1PU19TZXRNZW51SXRlbUljb25IYW5kbGVfMz1jYXN0PShIYW5kbGUpCi0KLU9TX1NldE1lbnVJdGVtS2V5R2x5cGg9Ci1PU19TZXRNZW51SXRlbUtleUdseXBoXzA9Y2FzdD0oTWVudVJlZikKLU9TX1NldE1lbnVJdGVtS2V5R2x5cGhfMT1jYXN0PShTSW50MTYpCi1PU19TZXRNZW51SXRlbUtleUdseXBoXzI9Y2FzdD0oU0ludDE2KQotCi1PU19TZXRNZW51SXRlbU1vZGlmaWVycz0KLU9TX1NldE1lbnVJdGVtTW9kaWZpZXJzXzA9Y2FzdD0oTWVudVJlZikKLU9TX1NldE1lbnVJdGVtTW9kaWZpZXJzXzE9Y2FzdD0oU0ludDE2KQotT1NfU2V0TWVudUl0ZW1Nb2RpZmllcnNfMj1jYXN0PShVSW50OCkKLQotT1NfU2V0TWVudUl0ZW1SZWZDb249Ci1PU19TZXRNZW51SXRlbVJlZkNvbl8wPWNhc3Q9KE1lbnVSZWYpCi1PU19TZXRNZW51SXRlbVJlZkNvbl8xPWNhc3Q9KFNJbnQxNikKLU9TX1NldE1lbnVJdGVtUmVmQ29uXzI9Y2FzdD0oVUludDMyKQotCi1PU19TZXRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmc9Ci1PU19TZXRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmdfMD1jYXN0PShNZW51UmVmKQotT1NfU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nXzE9Y2FzdD0oTWVudUl0ZW1JbmRleCkKLU9TX1NldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZ18yPWNhc3Q9KENGU3RyaW5nUmVmKQotCi1PU19TZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmc9Ci1PU19TZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmdfMD1jYXN0PShNZW51UmVmKQotT1NfU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi0KLU9TX1NldE9yaWdpbj0KLU9TX1NldE9yaWdpbl8wPWNhc3Q9KHNob3J0KQotT1NfU2V0T3JpZ2luXzE9Y2FzdD0oc2hvcnQpCi0KLU9TX1NldFBvcnQ9Ci1PU19TZXRQb3J0XzA9Y2FzdD0oR3JhZlB0cikKLQotT1NfU2V0UG9ydEJvdW5kcz0KLU9TX1NldFBvcnRCb3VuZHNfMD1jYXN0PShDR3JhZlB0cikKLU9TX1NldFBvcnRCb3VuZHNfMT1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX1NldFBvcnRXaW5kb3dQb3J0PQotT1NfU2V0UG9ydFdpbmRvd1BvcnRfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX1NldFB0PQotT1NfU2V0UHRfMD1jYXN0PShQb2ludCAqKQotT1NfU2V0UHRfMT1jYXN0PShzaG9ydCkKLU9TX1NldFB0XzI9Y2FzdD0oc2hvcnQpCi0KLU9TX1NldFJlY3Q9Ci1PU19TZXRSZWN0XzA9Y2FzdD0oUmVjdCAqKQotT1NfU2V0UmVjdF8xPWNhc3Q9KHNob3J0KQotT1NfU2V0UmVjdF8yPWNhc3Q9KHNob3J0KQotT1NfU2V0UmVjdF8zPWNhc3Q9KHNob3J0KQotT1NfU2V0UmVjdF80PWNhc3Q9KHNob3J0KQotCi1PU19TZXRSZWN0UmduPQotT1NfU2V0UmVjdFJnbl8wPWNhc3Q9KFJnbkhhbmRsZSkKLU9TX1NldFJlY3RSZ25fMT1jYXN0PShzaG9ydCkKLU9TX1NldFJlY3RSZ25fMj1jYXN0PShzaG9ydCkKLU9TX1NldFJlY3RSZ25fMz1jYXN0PShzaG9ydCkKLU9TX1NldFJlY3RSZ25fND1jYXN0PShzaG9ydCkKLQotT1NfU2V0Um9vdE1lbnU9Ci1PU19TZXRSb290TWVudV8wPWNhc3Q9KE1lbnVSZWYpCi0KLU9TX1NldFRoZW1lQmFja2dyb3VuZD0KLU9TX1NldFRoZW1lQmFja2dyb3VuZF8wPWNhc3Q9KFRoZW1lQnJ1c2gpCi1PU19TZXRUaGVtZUJhY2tncm91bmRfMT1jYXN0PShTSW50MTYpCi1PU19TZXRUaGVtZUJhY2tncm91bmRfMj1jYXN0PShCb29sZWFuKQotCi1PU19TZXRUaGVtZUN1cnNvcj0KLU9TX1NldFRoZW1lQ3Vyc29yXzA9Y2FzdD0oVGhlbWVDdXJzb3IpCi0KLU9TX1NldFRoZW1lRHJhd2luZ1N0YXRlPQotT1NfU2V0VGhlbWVEcmF3aW5nU3RhdGVfMD1jYXN0PShUaGVtZURyYXdpbmdTdGF0ZSkKLU9TX1NldFRoZW1lRHJhd2luZ1N0YXRlXzE9Y2FzdD0oQm9vbGVhbikKLQotT1NfU2V0VGhlbWVUZXh0Q29sb3I9Ci1PU19TZXRUaGVtZVRleHRDb2xvcl8wPQotT1NfU2V0VGhlbWVUZXh0Q29sb3JfMT0KLU9TX1NldFRoZW1lVGV4dENvbG9yXzI9Ci0KLU9TX1NldFRoZW1lV2luZG93QmFja2dyb3VuZD0KLU9TX1NldFRoZW1lV2luZG93QmFja2dyb3VuZF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX1NldFRoZW1lV2luZG93QmFja2dyb3VuZF8xPWNhc3Q9KFRoZW1lQnJ1c2gpCi1PU19TZXRUaGVtZVdpbmRvd0JhY2tncm91bmRfMj1jYXN0PShCb29sZWFuKQotCi1PU19TZXRVcENvbnRyb2xCYWNrZ3JvdW5kPQotT1NfU2V0VXBDb250cm9sQmFja2dyb3VuZF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRVcENvbnRyb2xCYWNrZ3JvdW5kXzE9Y2FzdD0oU0ludDE2KQotT1NfU2V0VXBDb250cm9sQmFja2dyb3VuZF8yPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX1NldFdSZWZDb249Ci1PU19TZXRXUmVmQ29uXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfU2V0V1JlZkNvbl8xPWNhc3Q9KGxvbmcpCi0KLU9TX1NldFdpbmRvd0FjdGl2YXRpb25TY29wZT0KLU9TX1NldFdpbmRvd0FjdGl2YXRpb25TY29wZV8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX1NldFdpbmRvd0FjdGl2YXRpb25TY29wZV8xPWNhc3Q9KFdpbmRvd0FjdGl2YXRpb25TY29wZSkKLQotT1NfU2V0V2luZG93Qm91bmRzPQotT1NfU2V0V2luZG93Qm91bmRzXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfU2V0V2luZG93Qm91bmRzXzE9Y2FzdD0oV2luZG93UmVnaW9uQ29kZSkKLU9TX1NldFdpbmRvd0JvdW5kc18yPWNhc3Q9KFJlY3QgKikKLQotT1NfU2V0V2luZG93RGVmYXVsdEJ1dHRvbj0KLU9TX1NldFdpbmRvd0RlZmF1bHRCdXR0b25fMD1jYXN0PShXaW5kb3dSZWYpCi1PU19TZXRXaW5kb3dEZWZhdWx0QnV0dG9uXzE9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfU2V0V2luZG93R3JvdXA9Ci1PU19TZXRXaW5kb3dHcm91cF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX1NldFdpbmRvd0dyb3VwXzE9Y2FzdD0oV2luZG93R3JvdXBSZWYpCi0KLU9TX1NldFdpbmRvd0dyb3VwT3duZXI9Ci1PU19TZXRXaW5kb3dHcm91cE93bmVyXzA9Y2FzdD0oV2luZG93R3JvdXBSZWYpCi1PU19TZXRXaW5kb3dHcm91cE93bmVyXzE9Y2FzdD0oV2luZG93UmVmKQotCi1PU19TZXRXaW5kb3dHcm91cFBhcmVudD0KLU9TX1NldFdpbmRvd0dyb3VwUGFyZW50XzA9Y2FzdD0oV2luZG93R3JvdXBSZWYpCi1PU19TZXRXaW5kb3dHcm91cFBhcmVudF8xPWNhc3Q9KFdpbmRvd0dyb3VwUmVmKQotCi1PU19TZXRXaW5kb3dNb2RhbGl0eT0KLU9TX1NldFdpbmRvd01vZGFsaXR5XzA9Y2FzdD0oV2luZG93UmVmKQotT1NfU2V0V2luZG93TW9kYWxpdHlfMT1jYXN0PShXaW5kb3dNb2RhbGl0eSkKLU9TX1NldFdpbmRvd01vZGFsaXR5XzI9Y2FzdD0oV2luZG93UmVmKQotCi1PU19TZXRXaW5kb3dSZXNpemVMaW1pdHM9Ci1PU19TZXRXaW5kb3dSZXNpemVMaW1pdHNfMD1jYXN0PVdpbmRvd1JlZgotT1NfU2V0V2luZG93UmVzaXplTGltaXRzXzE9Y2FzdD0oSElTaXplICopCi1PU19TZXRXaW5kb3dSZXNpemVMaW1pdHNfMj1jYXN0PShISVNpemUgKikKLQotT1NfU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmc9Ci1PU19TZXRXaW5kb3dUaXRsZVdpdGhDRlN0cmluZ18wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX1NldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi0KLU9TX1Nob3dXaW5kb3c9Ci1PU19TaG93V2luZG93XzA9Y2FzdD0oV2luZG93UmVmKQotCi1PU19TaXplQ29udHJvbD0KLU9TX1NpemVDb250cm9sXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NpemVDb250cm9sXzE9Y2FzdD0oU0ludDE2KQotT1NfU2l6ZUNvbnRyb2xfMj1jYXN0PShTSW50MTYpCi0KLU9TX1NpemVXaW5kb3c9Ci1PU19TaXplV2luZG93XzA9Y2FzdD0oV2luZG93UmVmKQotT1NfU2l6ZVdpbmRvd18xPWNhc3Q9KHNob3J0KQotT1NfU2l6ZVdpbmRvd18yPWNhc3Q9KHNob3J0KQotT1NfU2l6ZVdpbmRvd18zPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX1N0aWxsRG93bj0KLQotT1NfU3luY0NHQ29udGV4dE9yaWdpbldpdGhQb3J0PQotT1NfU3luY0NHQ29udGV4dE9yaWdpbldpdGhQb3J0XzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfU3luY0NHQ29udGV4dE9yaWdpbldpdGhQb3J0XzE9Y2FzdD0oQ0dyYWZQdHIpCi0KLU9TX1N5c0JlZXA9Ci1PU19TeXNCZWVwXzA9Y2FzdD0oc2hvcnQpCi0KLU9TX1RYTkFjdGl2YXRlPQotT1NfVFhOQWN0aXZhdGVfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5BY3RpdmF0ZV8xPWNhc3Q9KFRYTkZyYW1lSUQpCi1PU19UWE5BY3RpdmF0ZV8yPWNhc3Q9KFRYTlNjcm9sbEJhclN0YXRlKQotCi1PU19UWE5BZGp1c3RDdXJzb3I9Ci1PU19UWE5BZGp1c3RDdXJzb3JfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5BZGp1c3RDdXJzb3JfMT1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX1RYTkNsaWNrPQotT1NfVFhOQ2xpY2tfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5DbGlja18xPWNhc3Q9KGNvbnN0IEV2ZW50UmVjb3JkICopCi0KLU9TX1RYTkNvcHk9Ci1PU19UWE5Db3B5XzA9Y2FzdD0oVFhOT2JqZWN0KQotCi1PU19UWE5DdXQ9Ci1PU19UWE5DdXRfMD1jYXN0PShUWE5PYmplY3QpCi0KLU9TX1RYTkRhdGFTaXplPQotT1NfVFhORGF0YVNpemVfMD1jYXN0PShUWE5PYmplY3QpCi0KLU9TX1RYTkRlbGV0ZU9iamVjdD0KLU9TX1RYTkRlbGV0ZU9iamVjdF8wPWNhc3Q9KFRYTk9iamVjdCkKLQotT1NfVFhORHJhdz0KLU9TX1RYTkRyYXdfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5EcmF3XzE9Y2FzdD0oR1dvcmxkUHRyKQotCi1PU19UWE5FY2hvTW9kZT0KLU9TX1RYTkVjaG9Nb2RlXzA9Y2FzdD0oVFhOT2JqZWN0KQotT1NfVFhORWNob01vZGVfMT1jYXN0PShVbmlDaGFyKQotT1NfVFhORWNob01vZGVfMj1jYXN0PShUZXh0RW5jb2RpbmcpCi1PU19UWE5FY2hvTW9kZV8zPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX1RYTkZvY3VzPQotT1NfVFhORm9jdXNfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5Gb2N1c18xPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX1RYTkdldERhdGE9Ci1PU19UWE5HZXREYXRhXzA9Y2FzdD0oVFhOT2JqZWN0KQotT1NfVFhOR2V0RGF0YV8xPWNhc3Q9KFRYTk9mZnNldCkKLU9TX1RYTkdldERhdGFfMj1jYXN0PShUWE5PZmZzZXQpCi1PU19UWE5HZXREYXRhXzM9Y2FzdD0oSGFuZGxlICopCi0KLU9TX1RYTkdldEhJUmVjdD0KLU9TX1RYTkdldEhJUmVjdF8wPWNhc3Q9VFhOT2JqZWN0Ci1PU19UWE5HZXRISVJlY3RfMT0KLU9TX1RYTkdldEhJUmVjdF8yPQotCi1PU19UWE5HZXRMaW5lQ291bnQ9Ci1PU19UWE5HZXRMaW5lQ291bnRfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5HZXRMaW5lQ291bnRfMT1jYXN0PShJdGVtQ291bnQgKikKLQotT1NfVFhOR2V0TGluZU1ldHJpY3M9Ci1PU19UWE5HZXRMaW5lTWV0cmljc18wPWNhc3Q9KFRYTk9iamVjdCkKLU9TX1RYTkdldExpbmVNZXRyaWNzXzE9Y2FzdD0oVUludDMyKQotT1NfVFhOR2V0TGluZU1ldHJpY3NfMj1jYXN0PShGaXhlZCAqKQotT1NfVFhOR2V0TGluZU1ldHJpY3NfMz1jYXN0PShGaXhlZCAqKQotCi1PU19UWE5HZXRSZWN0Qm91bmRzPQotT1NfVFhOR2V0UmVjdEJvdW5kc18wPWNhc3Q9KFRYTk9iamVjdCkKLU9TX1RYTkdldFJlY3RCb3VuZHNfMT1jYXN0PShSZWN0ICopCi1PU19UWE5HZXRSZWN0Qm91bmRzXzI9Y2FzdD0oVFhOTG9uZ1JlY3QgKikKLU9TX1RYTkdldFJlY3RCb3VuZHNfMz1jYXN0PShUWE5Mb25nUmVjdCAqKQotCi1PU19UWE5HZXRTZWxlY3Rpb249Ci1PU19UWE5HZXRTZWxlY3Rpb25fMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5HZXRTZWxlY3Rpb25fMT1jYXN0PShUWE5PZmZzZXQgKikKLU9TX1RYTkdldFNlbGVjdGlvbl8yPWNhc3Q9KFRYTk9mZnNldCAqKQotCi1PU19UWE5HZXRUWE5PYmplY3RDb250cm9scz0KLU9TX1RYTkdldFRYTk9iamVjdENvbnRyb2xzXzA9Y2FzdD0oVFhOT2JqZWN0KQotT1NfVFhOR2V0VFhOT2JqZWN0Q29udHJvbHNfMT1jYXN0PShJdGVtQ291bnQpCi1PU19UWE5HZXRUWE5PYmplY3RDb250cm9sc18yPWNhc3Q9KGNvbnN0IFRYTkNvbnRyb2xUYWcgKikKLU9TX1RYTkdldFRYTk9iamVjdENvbnRyb2xzXzM9Y2FzdD0oVFhOQ29udHJvbERhdGEgKikKLQotT1NfVFhOR2V0Vmlld1JlY3Q9Ci1PU19UWE5HZXRWaWV3UmVjdF8wPWNhc3Q9KFRYTk9iamVjdCkKLU9TX1RYTkdldFZpZXdSZWN0XzE9Ci0KLU9TX1RYTkluaXRUZXh0ZW5zaW9uPQotT1NfVFhOSW5pdFRleHRlbnNpb25fMD1jYXN0PShjb25zdCBUWE5NYWNPU1ByZWZlcnJlZEZvbnREZXNjcmlwdGlvbiAqKQotT1NfVFhOSW5pdFRleHRlbnNpb25fMT1jYXN0PShJdGVtQ291bnQpCi1PU19UWE5Jbml0VGV4dGVuc2lvbl8yPWNhc3Q9KFRYTkluaXRPcHRpb25zKQotCi1PU19UWE5OZXdPYmplY3Q9Ci1PU19UWE5OZXdPYmplY3RfMD1jYXN0PShjb25zdCBGU1NwZWMgKikKLU9TX1RYTk5ld09iamVjdF8xPWNhc3Q9KFdpbmRvd1JlZikKLU9TX1RYTk5ld09iamVjdF8yPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX1RYTk5ld09iamVjdF8zPWNhc3Q9KFRYTkZyYW1lT3B0aW9ucykKLU9TX1RYTk5ld09iamVjdF80PWNhc3Q9KFRYTkZyYW1lVHlwZSkKLU9TX1RYTk5ld09iamVjdF81PWNhc3Q9KFRYTkZpbGVUeXBlKQotT1NfVFhOTmV3T2JqZWN0XzY9Y2FzdD0oVFhOUGVybWFuZW50VGV4dEVuY29kaW5nVHlwZSkKLU9TX1RYTk5ld09iamVjdF83PWNhc3Q9KFRYTk9iamVjdCAqKQotT1NfVFhOTmV3T2JqZWN0Xzg9Y2FzdD0oVFhORnJhbWVJRCAqKQotT1NfVFhOTmV3T2JqZWN0Xzk9Y2FzdD0oVFhOT2JqZWN0UmVmY29uKQotCi1PU19UWE5PZmZzZXRUb1BvaW50PQotT1NfVFhOT2Zmc2V0VG9Qb2ludF8wPWNhc3Q9KFRYTk9iamVjdCkKLU9TX1RYTk9mZnNldFRvUG9pbnRfMT1jYXN0PShUWE5PZmZzZXQpCi1PU19UWE5PZmZzZXRUb1BvaW50XzI9Y2FzdD0oUG9pbnQgKikKLQotT1NfVFhOUGFzdGU9Ci1PU19UWE5QYXN0ZV8wPWNhc3Q9KFRYTk9iamVjdCkKLQotT1NfVFhOUG9pbnRUb09mZnNldD0KLU9TX1RYTlBvaW50VG9PZmZzZXRfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5Qb2ludFRvT2Zmc2V0XzE9ZmxhZ3M9c3RydWN0Ci1PU19UWE5Qb2ludFRvT2Zmc2V0XzI9Y2FzdD0oVFhOT2Zmc2V0ICopCi0KLU9TX1RYTlNlbGVjdEFsbD0KLU9TX1RYTlNlbGVjdEFsbF8wPWNhc3Q9KFRYTk9iamVjdCkKLQotT1NfVFhOU2V0QmFja2dyb3VuZD0KLU9TX1RYTlNldEJhY2tncm91bmRfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5TZXRCYWNrZ3JvdW5kXzE9Y2FzdD0oY29uc3QgVFhOQmFja2dyb3VuZCAqKQotCi1PU19UWE5TZXREYXRhPQotT1NfVFhOU2V0RGF0YV8wPWNhc3Q9KFRYTk9iamVjdCkKLU9TX1RYTlNldERhdGFfMT1jYXN0PShUWE5EYXRhVHlwZSkKLU9TX1RYTlNldERhdGFfMj1jYXN0PShjb25zdCB2b2lkICopCi1PU19UWE5TZXREYXRhXzM9Y2FzdD0oQnl0ZUNvdW50KQotT1NfVFhOU2V0RGF0YV80PWNhc3Q9KFRYTk9mZnNldCkKLU9TX1RYTlNldERhdGFfNT1jYXN0PShUWE5PZmZzZXQpCi0KLU9TX1RYTlNldEZyYW1lQm91bmRzPQotT1NfVFhOU2V0RnJhbWVCb3VuZHNfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5TZXRGcmFtZUJvdW5kc18xPWNhc3Q9KFNJbnQzMikKLU9TX1RYTlNldEZyYW1lQm91bmRzXzI9Y2FzdD0oU0ludDMyKQotT1NfVFhOU2V0RnJhbWVCb3VuZHNfMz1jYXN0PShTSW50MzIpCi1PU19UWE5TZXRGcmFtZUJvdW5kc180PWNhc3Q9KFNJbnQzMikKLU9TX1RYTlNldEZyYW1lQm91bmRzXzU9Y2FzdD0oVFhORnJhbWVJRCkKLQotT1NfVFhOU2V0UmVjdEJvdW5kcz0KLU9TX1RYTlNldFJlY3RCb3VuZHNfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5TZXRSZWN0Qm91bmRzXzE9Y2FzdD0oUmVjdCAqKQotT1NfVFhOU2V0UmVjdEJvdW5kc18yPWNhc3Q9KFRYTkxvbmdSZWN0ICopCi1PU19UWE5TZXRSZWN0Qm91bmRzXzM9Y2FzdD0oQm9vbGVhbikKLQotT1NfVFhOU2V0U2VsZWN0aW9uPQotT1NfVFhOU2V0U2VsZWN0aW9uXzA9Y2FzdD0oVFhOT2JqZWN0KQotT1NfVFhOU2V0U2VsZWN0aW9uXzE9Y2FzdD0oVFhOT2Zmc2V0KQotT1NfVFhOU2V0U2VsZWN0aW9uXzI9Y2FzdD0oVFhOT2Zmc2V0KQotCi1PU19UWE5TZXRUWE5PYmplY3RDb250cm9scz0KLU9TX1RYTlNldFRYTk9iamVjdENvbnRyb2xzXzA9Y2FzdD0oVFhOT2JqZWN0KQotT1NfVFhOU2V0VFhOT2JqZWN0Q29udHJvbHNfMT1jYXN0PShCb29sZWFuKQotT1NfVFhOU2V0VFhOT2JqZWN0Q29udHJvbHNfMj1jYXN0PShJdGVtQ291bnQpCi1PU19UWE5TZXRUWE5PYmplY3RDb250cm9sc18zPWNhc3Q9KGNvbnN0IFRYTkNvbnRyb2xUYWcgKikKLU9TX1RYTlNldFRYTk9iamVjdENvbnRyb2xzXzQ9Y2FzdD0oY29uc3QgVFhOQ29udHJvbERhdGEgKikKLQotT1NfVFhOU2V0VHlwZUF0dHJpYnV0ZXM9Ci1PU19UWE5TZXRUeXBlQXR0cmlidXRlc18wPWNhc3Q9KFRYTk9iamVjdCkKLU9TX1RYTlNldFR5cGVBdHRyaWJ1dGVzXzE9Y2FzdD0oSXRlbUNvdW50KQotT1NfVFhOU2V0VHlwZUF0dHJpYnV0ZXNfMj1jYXN0PShjb25zdCBUWE5UeXBlQXR0cmlidXRlcyAqKQotT1NfVFhOU2V0VHlwZUF0dHJpYnV0ZXNfMz1jYXN0PShUWE5PZmZzZXQpCi1PU19UWE5TZXRUeXBlQXR0cmlidXRlc180PWNhc3Q9KFRYTk9mZnNldCkKLQotT1NfVFhOU2hvd1NlbGVjdGlvbj0KLU9TX1RYTlNob3dTZWxlY3Rpb25fMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5TaG93U2VsZWN0aW9uXzE9Y2FzdD0oQm9vbGVhbikKLQotT1NfVGVzdENvbnRyb2w9Ci1PU19UZXN0Q29udHJvbF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19UZXN0Q29udHJvbF8xPWNhc3Q9KFBvaW50ICopLGZsYWdzPXN0cnVjdAotCi1PU19UZXh0RmFjZT0KLU9TX1RleHRGYWNlXzA9Y2FzdD0oU3R5bGVQYXJhbWV0ZXIpCi0KLU9TX1RleHRGb250PQotT1NfVGV4dEZvbnRfMD1jYXN0PShzaG9ydCkKLQotT1NfVGV4dE1vZGU9Ci1PU19UZXh0TW9kZV8wPWNhc3Q9KHNob3J0KQotCi1PU19UZXh0U2l6ZT0KLU9TX1RleHRTaXplXzA9Y2FzdD0oc2hvcnQpCi0KLU9TX1RleHRXaWR0aD0KLU9TX1RleHRXaWR0aF8wPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX1RleHRXaWR0aF8xPWNhc3Q9KHNob3J0KQotT1NfVGV4dFdpZHRoXzI9Y2FzdD0oc2hvcnQpCi0KLU9TX1RyYWNrRHJhZz0KLU9TX1RyYWNrRHJhZ18wPWNhc3Q9KERyYWdSZWYpCi1PU19UcmFja0RyYWdfMT1jYXN0PShjb25zdCBFdmVudFJlY29yZCAqKQotT1NfVHJhY2tEcmFnXzI9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19UcmFja01vdXNlTG9jYXRpb25XaXRoT3B0aW9ucz0KLU9TX1RyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zXzA9Y2FzdD0oR3JhZlB0cikKLU9TX1RyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zXzE9Y2FzdD0oT3B0aW9uQml0cykKLU9TX1RyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zXzI9Y2FzdD0oRXZlbnRUaW1lb3V0KQotT1NfVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnNfMz1jYXN0PShQb2ludCAqKQotT1NfVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnNfND1jYXN0PShVSW50MzIgKikKLU9TX1RyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zXzU9Y2FzdD0oTW91c2VUcmFja2luZ1Jlc3VsdCAqKQotCi1PU19VVFR5cGVDcmVhdGVQcmVmZXJyZWRJZGVudGlmaWVyRm9yVGFnPQotT1NfVVRUeXBlQ3JlYXRlUHJlZmVycmVkSWRlbnRpZmllckZvclRhZ18wPWNhc3Q9Q0ZTdHJpbmdSZWYKLU9TX1VUVHlwZUNyZWF0ZVByZWZlcnJlZElkZW50aWZpZXJGb3JUYWdfMT1jYXN0PUNGU3RyaW5nUmVmCi1PU19VVFR5cGVDcmVhdGVQcmVmZXJyZWRJZGVudGlmaWVyRm9yVGFnXzI9Y2FzdD1DRlN0cmluZ1JlZgotCi1PU19VbmlvblJlY3Q9Ci1PU19VbmlvblJlY3RfMD1mbGFncz1ub19vdXQKLU9TX1VuaW9uUmVjdF8xPWZsYWdzPW5vX291dAotT1NfVW5pb25SZWN0XzI9ZmxhZ3M9bm9faW4KLQotT1NfVW5pb25SZ249Ci1PU19VbmlvblJnbl8wPWNhc3Q9KFJnbkhhbmRsZSkKLU9TX1VuaW9uUmduXzE9Y2FzdD0oUmduSGFuZGxlKQotT1NfVW5pb25SZ25fMj1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX1VubG9ja1BvcnRCaXRzPQotT1NfVW5sb2NrUG9ydEJpdHNfMD1jYXN0PShHcmFmUHRyKQotCi1PU19VcGRhdGVDb250cm9scz0KLU9TX1VwZGF0ZUNvbnRyb2xzXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfVXBkYXRlQ29udHJvbHNfMT1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX1VwZGF0ZURhdGFCcm93c2VySXRlbXM9Ci1PU19VcGRhdGVEYXRhQnJvd3Nlckl0ZW1zXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1VwZGF0ZURhdGFCcm93c2VySXRlbXNfMT1jYXN0PShEYXRhQnJvd3Nlckl0ZW1JRCkKLU9TX1VwZGF0ZURhdGFCcm93c2VySXRlbXNfMj1jYXN0PShVSW50MzIpCi1PU19VcGRhdGVEYXRhQnJvd3Nlckl0ZW1zXzM9Y2FzdD0oY29uc3QgRGF0YUJyb3dzZXJJdGVtSUQgKikKLU9TX1VwZGF0ZURhdGFCcm93c2VySXRlbXNfND1jYXN0PShEYXRhQnJvd3NlclByb3BlcnR5SUQpCi1PU19VcGRhdGVEYXRhQnJvd3Nlckl0ZW1zXzU9Y2FzdD0oRGF0YUJyb3dzZXJQcm9wZXJ0eUlEKQotCi1PU19VcGdyYWRlU2NyaXB0SW5mb1RvVGV4dEVuY29kaW5nPQotT1NfVXBncmFkZVNjcmlwdEluZm9Ub1RleHRFbmNvZGluZ18wPWNhc3Q9U2NyaXB0Q29kZQotT1NfVXBncmFkZVNjcmlwdEluZm9Ub1RleHRFbmNvZGluZ18xPWNhc3Q9TGFuZ0NvZGUKLU9TX1VwZ3JhZGVTY3JpcHRJbmZvVG9UZXh0RW5jb2RpbmdfMj1jYXN0PShSZWdpb25Db2RlKQotT1NfVXBncmFkZVNjcmlwdEluZm9Ub1RleHRFbmNvZGluZ18zPWNhc3Q9Q29uc3RTdHIyNTVQYXJhbQotT1NfVXBncmFkZVNjcmlwdEluZm9Ub1RleHRFbmNvZGluZ180PWNhc3Q9VGV4dEVuY29kaW5nICoKLQotT1NfV2FpdE1vdXNlTW92ZWQ9Ci1PU19XYWl0TW91c2VNb3ZlZF8wPWZsYWdzPXN0cnVjdAotCi1PU19YMkZpeD0KLU9TX1gyRml4XzA9Ci0KLU9TX1pvb21XaW5kb3dJZGVhbD0KLU9TX1pvb21XaW5kb3dJZGVhbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX1pvb21XaW5kb3dJZGVhbF8xPWNhc3Q9KFdpbmRvd1BhcnRDb2RlKQotT1NfWm9vbVdpbmRvd0lkZWFsXzI9Y2FzdD0oUG9pbnQgKikKLQotT1NfZ2V0ZW52PQotT1NfZ2V0ZW52XzA9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1PU19nZXRwaWQ9Ci0KLU9TX2tDRk51bWJlckZvcm1hdHRlckRlY2ltYWxTZXBhcmF0b3I9ZmxhZ3M9Y29uc3QKLQotT1Nfa0hJVmlld1dpbmRvd0NvbnRlbnRJRD1mbGFncz1jb25zdCBhZGRyZXNzCi0KLU9TX2tQTURvY3VtZW50Rm9ybWF0UERGPWZsYWdzPWNvbnN0Ci0KLU9TX2tQTUdyYXBoaWNzQ29udGV4dENvcmVHcmFwaGljcz1mbGFncz1jb25zdAotCi1PU19rVVRUYWdDbGFzc0ZpbGVuYW1lRXh0ZW5zaW9uPWZsYWdzPWNvbnN0Ci0KLU9TX21lbWNweV9fSUlJPQotT1NfbWVtY3B5X19JSUlfMD1jYXN0PSh2b2lkICopCi1PU19tZW1jcHlfX0lJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbWNweV9fSUlJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNVVGFiXzJJPQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVVRhYl8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1VUYWJfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVVRhYl8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQml0TWFwXzJJPQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQml0TWFwXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQml0TWFwXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0JpdE1hcF8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ3Vyc29yXzJJPQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ3Vyc29yXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ3Vyc29yXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0N1cnNvcl8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fRXZlbnRSZWNvcmRfMkk9Ci1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9FdmVudFJlY29yZF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0V2ZW50UmVjb3JkXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0V2ZW50UmVjb3JkXzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Gb250U2VsZWN0aW9uUURTdHlsZV8yST0KLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0ZvbnRTZWxlY3Rpb25RRFN0eWxlXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fRm9udFNlbGVjdGlvblFEU3R5bGVfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fRm9udFNlbGVjdGlvblFEU3R5bGVfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hNSGVscENvbnRlbnRSZWNfMkk9Ci1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ITUhlbHBDb250ZW50UmVjXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSE1IZWxwQ29udGVudFJlY18ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ITUhlbHBDb250ZW50UmVjXzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9QaXhNYXBfMkk9Ci1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9QaXhNYXBfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9QaXhNYXBfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUGl4TWFwXzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SR0JDb2xvcl8yST0KLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUkdCQ29sb3JfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUkdCQ29sb3JfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMkk9Ci1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0lfM0JJPQotT1NfbWVtY3B5X19JXzNCSV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbWNweV9fSV8zQklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPWNyaXRpY2FsIG5vX291dAotT1NfbWVtY3B5X19JXzNCSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtY3B5X19JXzNDST0KLU9TX21lbWNweV9fSV8zQ0lfMD1jYXN0PSh2b2lkICopCi1PU19tZW1jcHlfX0lfM0NJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1jcml0aWNhbCBub19vdXQKLU9TX21lbWNweV9fSV8zQ0lfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fSV8zRkk9Ci1PU19tZW1jcHlfX0lfM0ZJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtY3B5X19JXzNGSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9Y3JpdGljYWwgbm9fb3V0Ci1PU19tZW1jcHlfX0lfM0ZJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0lfM0lJPQotT1NfbWVtY3B5X19JXzNJSV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbWNweV9fSV8zSUlfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPWNyaXRpY2FsIG5vX291dAotT1NfbWVtY3B5X19JXzNJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNMYXlvdXRSZWNvcmRfMklJPQotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNMYXlvdXRSZWNvcmRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNMYXlvdXRSZWNvcmRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNMYXlvdXRSZWNvcmRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1RyYXBlem9pZF8ySUk9Ci1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1RyYXBlem9pZF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1RyYXBlem9pZF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1RyYXBlem9pZF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQYXRoRWxlbWVudF8ySUk9Ci1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUGF0aEVsZW1lbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BhdGhFbGVtZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbWNweV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQYXRoRWxlbWVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fRm9udFNlbGVjdGlvblFEU3R5bGVfMklJPQotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Gb250U2VsZWN0aW9uUURTdHlsZV8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0ZvbnRTZWxlY3Rpb25RRFN0eWxlXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbWNweV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fRm9udFNlbGVjdGlvblFEU3R5bGVfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0dEZXZpY2VfMklJPQotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9HRGV2aWNlXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbWNweV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fR0RldmljZV8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0dEZXZpY2VfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hNSGVscENvbnRlbnRSZWNfMklJPQotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ITUhlbHBDb250ZW50UmVjXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbWNweV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSE1IZWxwQ29udGVudFJlY18ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hNSGVscENvbnRlbnRSZWNfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BpeE1hcF8ySUk9Ci1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BpeE1hcF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BpeE1hcF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BpeE1hcF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8ySUk9Ci1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbWNweV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fXzNCSUk9Ci1PU19tZW1jcHlfX18zQklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1jcml0aWNhbCBub19pbgotT1NfbWVtY3B5X19fM0JJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbWNweV9fXzNCSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fXzNCXzNDST0KLU9TX21lbWNweV9fXzNCXzNDSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9Y3JpdGljYWwgbm9faW4KLU9TX21lbWNweV9fXzNCXzNDSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9Y3JpdGljYWwgbm9fb3V0Ci1PU19tZW1jcHlfX18zQl8zQ0lfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fXzNDSUk9Ci1PU19tZW1jcHlfX18zQ0lJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1jcml0aWNhbCBub19pbgotT1NfbWVtY3B5X19fM0NJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbWNweV9fXzNDSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fXzNDXzNCST0KLU9TX21lbWNweV9fXzNDXzNCSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9Y3JpdGljYWwgbm9faW4KLU9TX21lbWNweV9fXzNDXzNCSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9Y3JpdGljYWwgbm9fb3V0Ci1PU19tZW1jcHlfX18zQ18zQklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fXzNGSUk9Ci1PU19tZW1jcHlfX18zRklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1jcml0aWNhbCBub19pbgotT1NfbWVtY3B5X19fM0ZJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbWNweV9fXzNGSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fXzNJSUk9Ci1PU19tZW1jcHlfX18zSUlJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1jcml0aWNhbCBub19pbgotT1NfbWVtY3B5X19fM0lJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbWNweV9fXzNJSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fVFhOVGFiXzJJPQotT1NfbWVtY3B5X19fM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9UWE5UYWJfMklfMD1jYXN0PSh2b2lkICopLGZsYWdzPWNyaXRpY2FsIG5vX2luCi1PU19tZW1jcHlfX18zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1RYTlRhYl8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1jcHlfX18zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1RYTlRhYl8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtc2V0PQotT1NfbWVtc2V0XzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtc2V0XzE9Ci1PU19tZW1zZXRfMj0KLQotT1Nfc3RybGVuPQotT1Nfc3RybGVuXzA9Y2FzdD1jaGFyICoKLQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BNUmVjdD0KLVBNUmVjdF90b3A9Y2FzdD0oZG91YmxlKQotUE1SZWN0X2xlZnQ9Y2FzdD0oZG91YmxlKQotUE1SZWN0X2JvdHRvbT1jYXN0PShkb3VibGUpCi1QTVJlY3RfcmlnaHQ9Y2FzdD0oZG91YmxlKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BNUmVzb2x1dGlvbj0KLVBNUmVzb2x1dGlvbl9oUmVzPQotUE1SZXNvbHV0aW9uX3ZSZXM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUGl4TWFwPQotUGl4TWFwX3BtVmVyc2lvbj0KLVBpeE1hcF9wYWNrVHlwZT0KLVBpeE1hcF9wYWNrU2l6ZT0KLVBpeE1hcF9oUmVzPQotUGl4TWFwX3ZSZXM9Ci1QaXhNYXBfcGl4ZWxUeXBlPQotUGl4TWFwX3BpeGVsU2l6ZT0KLVBpeE1hcF9jbXBDb3VudD0KLVBpeE1hcF9jbXBTaXplPQotUGl4TWFwX3BpeGVsRm9ybWF0PQotUGl4TWFwX3BtVGFibGU9Y2FzdD0oQ1RhYkhhbmRsZSkKLVBpeE1hcF9wbUV4dD1jYXN0PSh2b2lkICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUG9pbnQ9Ci1Qb2ludF92PQotUG9pbnRfaD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Qcm9ncmVzc1RyYWNrSW5mbz0KLVByb2dyZXNzVHJhY2tJbmZvX3BoYXNlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yPQotUkdCQ29sb3JfcmVkPQotUkdCQ29sb3JfZ3JlZW49Ci1SR0JDb2xvcl9ibHVlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3Q9Ci1SZWN0X3RvcD0KLVJlY3RfbGVmdD0KLVJlY3RfYm90dG9tPQotUmVjdF9yaWdodD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9TY3JvbGxCYXJUcmFja0luZm89Ci1TY3JvbGxCYXJUcmFja0luZm9fdmlld3NpemU9Ci1TY3JvbGxCYXJUcmFja0luZm9fcHJlc3NTdGF0ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9TbGlkZXJUcmFja0luZm89Ci1TbGlkZXJUcmFja0luZm9fdGh1bWJEaXI9Ci1TbGlkZXJUcmFja0luZm9fcHJlc3NTdGF0ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9UWE5CYWNrZ3JvdW5kPQotVFhOQmFja2dyb3VuZF9iZ1R5cGU9Ci1UWE5CYWNrZ3JvdW5kX2JnX3JlZD1hY2Nlc3Nvcj1iZy5jb2xvci5yZWQKLVRYTkJhY2tncm91bmRfYmdfZ3JlZW49YWNjZXNzb3I9YmcuY29sb3IuZ3JlZW4KLVRYTkJhY2tncm91bmRfYmdfYmx1ZT1hY2Nlc3Nvcj1iZy5jb2xvci5ibHVlCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fVFhOTG9uZ1JlY3Q9Ci1UWE5Mb25nUmVjdF90b3A9Ci1UWE5Mb25nUmVjdF9sZWZ0PQotVFhOTG9uZ1JlY3RfYm90dG9tPQotVFhOTG9uZ1JlY3RfcmlnaHQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fVFhOVGFiPQotVFhOVGFiX3ZhbHVlPQotVFhOVGFiX3RhYlR5cGU9Ci1UWE5UYWJfZmlsbGVyPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1RoZW1lQnV0dG9uRHJhd0luZm89Ci1UaGVtZUJ1dHRvbkRyYXdJbmZvX3N0YXRlPWNhc3Q9KFRoZW1lRHJhd1N0YXRlKQotVGhlbWVCdXR0b25EcmF3SW5mb192YWx1ZT1jYXN0PShUaGVtZUJ1dHRvblZhbHVlKQotVGhlbWVCdXR0b25EcmF3SW5mb19hZG9ybm1lbnQ9Y2FzdD0oVGhlbWVCdXR0b25BZG9ybm1lbnQpCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2RlLkNERS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jZGUuQ0RFLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyODBkOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jZGUuQ0RFLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2RlX0NERT0KLUNERV9EdEFjdGlvbkFyZ19zaXplb2Y9Ci0KLUNERV9fRHRBY3Rpb25JbnZva2U9Ci1DREVfX0R0QWN0aW9uSW52b2tlXzA9Y2FzdD1XaWRnZXQKLUNERV9fRHRBY3Rpb25JbnZva2VfMT1jYXN0PWNoYXIgKgotQ0RFX19EdEFjdGlvbkludm9rZV8yPQotQ0RFX19EdEFjdGlvbkludm9rZV8zPQotQ0RFX19EdEFjdGlvbkludm9rZV80PWNhc3Q9Y2hhciAqCi1DREVfX0R0QWN0aW9uSW52b2tlXzU9Y2FzdD1jaGFyICoKLUNERV9fRHRBY3Rpb25JbnZva2VfNj1jYXN0PWNoYXIgKgotQ0RFX19EdEFjdGlvbkludm9rZV83PQotQ0RFX19EdEFjdGlvbkludm9rZV84PWNhc3Q9RHRBY3Rpb25DYWxsYmFja1Byb2MKLUNERV9fRHRBY3Rpb25JbnZva2VfOT1jYXN0PVh0UG9pbnRlcgotCi1DREVfX0R0QXBwSW5pdGlhbGl6ZT0KLUNERV9fRHRBcHBJbml0aWFsaXplXzA9Y2FzdD0oWHRBcHBDb250ZXh0KQotQ0RFX19EdEFwcEluaXRpYWxpemVfMT1jYXN0PShEaXNwbGF5ICopCi1DREVfX0R0QXBwSW5pdGlhbGl6ZV8yPWNhc3Q9V2lkZ2V0Ci1DREVfX0R0QXBwSW5pdGlhbGl6ZV8zPWNhc3Q9KGNoYXIgKikKLUNERV9fRHRBcHBJbml0aWFsaXplXzQ9Y2FzdD0oY2hhciAqKQotCi1DREVfX0R0RGJMb2FkPQotCi1DREVfX0R0RHRzRGF0YVR5cGVJc0FjdGlvbj0KLUNERV9fRHREdHNEYXRhVHlwZUlzQWN0aW9uXzA9Y2FzdD1jaGFyICoKLQotQ0RFX19EdER0c0RhdGFUeXBlTmFtZXM9Ci0KLUNERV9fRHREdHNEYXRhVHlwZVRvQXR0cmlidXRlVmFsdWU9Ci1DREVfX0R0RHRzRGF0YVR5cGVUb0F0dHJpYnV0ZVZhbHVlXzA9Y2FzdD1jaGFyICoKLUNERV9fRHREdHNEYXRhVHlwZVRvQXR0cmlidXRlVmFsdWVfMT1jYXN0PWNoYXIgKgotQ0RFX19EdER0c0RhdGFUeXBlVG9BdHRyaWJ1dGVWYWx1ZV8yPWNhc3Q9Y2hhciAqCi0KLUNERV9fRHREdHNGaWxlVG9EYXRhVHlwZT0KLUNERV9fRHREdHNGaWxlVG9EYXRhVHlwZV8wPWNhc3Q9Y2hhciAqCi0KLUNERV9fRHREdHNGcmVlQXR0cmlidXRlVmFsdWU9Ci1DREVfX0R0RHRzRnJlZUF0dHJpYnV0ZVZhbHVlXzA9Y2FzdD1jaGFyICoKLQotQ0RFX19EdER0c0ZyZWVEYXRhVHlwZT0KLUNERV9fRHREdHNGcmVlRGF0YVR5cGVfMD1jYXN0PWNoYXIgKgotCi1DREVfX0R0RHRzRnJlZURhdGFUeXBlTmFtZXM9Ci1DREVfX0R0RHRzRnJlZURhdGFUeXBlTmFtZXNfMD1jYXN0PWNoYXIgKioKLQotQ0RFX19YdEFwcENyZWF0ZVNoZWxsPQotQ0RFX19YdEFwcENyZWF0ZVNoZWxsXzA9Y2FzdD0oU3RyaW5nKQotQ0RFX19YdEFwcENyZWF0ZVNoZWxsXzE9Y2FzdD0oU3RyaW5nKQotQ0RFX19YdEFwcENyZWF0ZVNoZWxsXzI9Y2FzdD0oV2lkZ2V0Q2xhc3MpCi1DREVfX1h0QXBwQ3JlYXRlU2hlbGxfMz1jYXN0PShEaXNwbGF5ICopCi1DREVfX1h0QXBwQ3JlYXRlU2hlbGxfND1jYXN0PShBcmdMaXN0KQotQ0RFX19YdEFwcENyZWF0ZVNoZWxsXzU9Ci0KLUNERV9fWHRDcmVhdGVBcHBsaWNhdGlvbkNvbnRleHQ9Ci0KLUNERV9fWHREaXNwbGF5SW5pdGlhbGl6ZT0KLUNERV9fWHREaXNwbGF5SW5pdGlhbGl6ZV8wPWNhc3Q9KFh0QXBwQ29udGV4dCkKLUNERV9fWHREaXNwbGF5SW5pdGlhbGl6ZV8xPWNhc3Q9KERpc3BsYXkgKikKLUNERV9fWHREaXNwbGF5SW5pdGlhbGl6ZV8yPWNhc3Q9KFN0cmluZykKLUNERV9fWHREaXNwbGF5SW5pdGlhbGl6ZV8zPWNhc3Q9KFN0cmluZykKLUNERV9fWHREaXNwbGF5SW5pdGlhbGl6ZV80PWNhc3Q9KFhybU9wdGlvbkRlc2NSZWMgKikKLUNERV9fWHREaXNwbGF5SW5pdGlhbGl6ZV81PWNhc3Q9KENhcmRpbmFsKQotQ0RFX19YdERpc3BsYXlJbml0aWFsaXplXzY9Y2FzdD0oaW50ICopCi1DREVfX1h0RGlzcGxheUluaXRpYWxpemVfNz1jYXN0PShTdHJpbmcgKikKLQotQ0RFX19YdFJlYWxpemVXaWRnZXQ9Ci1DREVfX1h0UmVhbGl6ZVdpZGdldF8wPWNhc3Q9KFdpZGdldCkKLQotQ0RFX19YdFJlc2l6ZVdpZGdldD0KLUNERV9fWHRSZXNpemVXaWRnZXRfMD1jYXN0PShXaWRnZXQpCi1DREVfX1h0UmVzaXplV2lkZ2V0XzE9Ci1DREVfX1h0UmVzaXplV2lkZ2V0XzI9Ci1DREVfX1h0UmVzaXplV2lkZ2V0XzM9Ci0KLUNERV9fWHRTZXRNYXBwZWRXaGVuTWFuYWdlZD0KLUNERV9fWHRTZXRNYXBwZWRXaGVuTWFuYWdlZF8wPWNhc3Q9KFdpZGdldCkKLUNERV9fWHRTZXRNYXBwZWRXaGVuTWFuYWdlZF8xPQotCi1DREVfX1h0VG9vbGtpdEluaXRpYWxpemU9Ci0KLUNERV9fdG9wTGV2ZWxTaGVsbFdpZGdldENsYXNzPWZsYWdzPWNvbnN0Ci0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NkZV9EdEFjdGlvbkFyZz0KLUR0QWN0aW9uQXJnX2FyZ0NsYXNzPQotRHRBY3Rpb25BcmdfbmFtZT1hY2Nlc3Nvcj11LmZpbGUubmFtZSxjYXN0PWNoYXIgKgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmdkaXAuR2RpcC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5nZGlwLkdkaXAucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwNzMyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmdkaXAuR2RpcC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjc3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX0dkaXA9ZmxhZ3M9Y3BwCi1HZGlwX0JpdG1hcF9kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1HZGlwX0JpdG1hcF9kZWxldGVfMD0KLQotR2RpcF9CaXRtYXBfMW5ld19fST1mbGFncz1uZXcKLUdkaXBfQml0bWFwXzFuZXdfX0lfMD1jYXN0PUhJQ09OCi0KLUdkaXBfQml0bWFwXzFuZXdfX0lJPWZsYWdzPW5ldwotR2RpcF9CaXRtYXBfMW5ld19fSUlfMD1jYXN0PUhCSVRNQVAKLUdkaXBfQml0bWFwXzFuZXdfX0lJXzE9Y2FzdD1IUEFMRVRURQotCi1HZGlwX0JpdG1hcF8xbmV3X19JSUlJST1mbGFncz1uZXcKLUdkaXBfQml0bWFwXzFuZXdfX0lJSUlJXzA9Ci1HZGlwX0JpdG1hcF8xbmV3X19JSUlJSV8xPQotR2RpcF9CaXRtYXBfMW5ld19fSUlJSUlfMj0KLUdkaXBfQml0bWFwXzFuZXdfX0lJSUlJXzM9Y2FzdD1QaXhlbEZvcm1hdAotR2RpcF9CaXRtYXBfMW5ld19fSUlJSUlfND1jYXN0PUJZVEUgKgotCi1HZGlwX0JydXNoX0Nsb25lPWZsYWdzPWNwcAotR2RpcF9CcnVzaF9DbG9uZV8wPWNhc3Q9KEJydXNoICopCi0KLUdkaXBfQnJ1c2hfR2V0VHlwZT1mbGFncz1jcHAKLUdkaXBfQnJ1c2hfR2V0VHlwZV8wPWNhc3Q9KEJydXNoICopCi0KLUdkaXBfQ29sb3JfZGVsZXRlPWZsYWdzPWRlbGV0ZQotR2RpcF9Db2xvcl9kZWxldGVfMD0KLQotR2RpcF9Db2xvcl9uZXc9ZmxhZ3M9bmV3Ci1HZGlwX0NvbG9yX25ld18wPWNhc3Q9QVJHQgotCi1HZGlwX0ZvbnRGYW1pbHlfR2V0RmFtaWx5TmFtZT1mbGFncz1jcHAKLUdkaXBfRm9udEZhbWlseV9HZXRGYW1pbHlOYW1lXzA9Y2FzdD1Gb250RmFtaWx5ICoKLUdkaXBfRm9udEZhbWlseV9HZXRGYW1pbHlOYW1lXzE9Y2FzdD1XQ0hBUiAqCi1HZGlwX0ZvbnRGYW1pbHlfR2V0RmFtaWx5TmFtZV8yPWNhc3Q9V0NIQVIKLQotR2RpcF9Gb250RmFtaWx5X2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfRm9udEZhbWlseV9kZWxldGVfMD0KLQotR2RpcF9Gb250RmFtaWx5X25ldz1mbGFncz1uZXcKLQotR2RpcF9Gb250X0dldEZhbWlseT1mbGFncz1jcHAKLUdkaXBfRm9udF9HZXRGYW1pbHlfMD1jYXN0PShGb250ICopCi1HZGlwX0ZvbnRfR2V0RmFtaWx5XzE9Y2FzdD0oRm9udEZhbWlseSAqKQotCi1HZGlwX0ZvbnRfR2V0U2l6ZT1mbGFncz1jcHAKLUdkaXBfRm9udF9HZXRTaXplXzA9Y2FzdD0oRm9udCAqKQotCi1HZGlwX0ZvbnRfR2V0U3R5bGU9ZmxhZ3M9Y3BwCi1HZGlwX0ZvbnRfR2V0U3R5bGVfMD1jYXN0PShGb250ICopCi0KLUdkaXBfRm9udF9Jc0F2YWlsYWJsZT1mbGFncz1jcHAKLUdkaXBfRm9udF9Jc0F2YWlsYWJsZV8wPWNhc3Q9Rm9udCAqCi0KLUdkaXBfRm9udF9kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1HZGlwX0ZvbnRfZGVsZXRlXzA9Ci0KLUdkaXBfRm9udF8xbmV3X19JST1mbGFncz1uZXcKLUdkaXBfRm9udF8xbmV3X19JSV8wPWNhc3Q9KEhEQykKLUdkaXBfRm9udF8xbmV3X19JSV8xPWNhc3Q9KEhGT05UCi0KLUdkaXBfRm9udF8xbmV3X19fM0NGSUlJPWZsYWdzPW5ldwotR2RpcF9Gb250XzFuZXdfX18zQ0ZJSUlfMD1jYXN0PWNvbnN0IFdDSEFSICoKLUdkaXBfRm9udF8xbmV3X19fM0NGSUlJXzE9Y2FzdD1SRUFMCi1HZGlwX0ZvbnRfMW5ld19fXzNDRklJSV8yPWNhc3Q9SU5UCi1HZGlwX0ZvbnRfMW5ld19fXzNDRklJSV8zPWNhc3Q9VW5pdAotR2RpcF9Gb250XzFuZXdfX18zQ0ZJSUlfND1jYXN0PWNvbnN0IEZvbnRDb2xsZWN0aW9uICoKLQotR2RpcF9HZGlwbHVzU2h1dGRvd249Ci1HZGlwX0dkaXBsdXNTaHV0ZG93bl8wPWNhc3Q9VUxPTkdfUFRSCi0KLUdkaXBfR2RpcGx1c1N0YXJ0dXA9Ci1HZGlwX0dkaXBsdXNTdGFydHVwXzA9Y2FzdD0oVUxPTkdfUFRSICopCi1HZGlwX0dkaXBsdXNTdGFydHVwXzE9Y2FzdD1jb25zdCBHZGlwbHVzU3RhcnR1cElucHV0ICoKLUdkaXBfR2RpcGx1c1N0YXJ0dXBfMj1jYXN0PUdkaXBsdXNTdGFydHVwT3V0cHV0ICoKLQotR2RpcF9HcmFwaGljc1BhdGhfQWRkQXJjPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc1BhdGhfQWRkQXJjXzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRBcmNfMT1jYXN0PShSRUFMKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkQXJjXzI9Y2FzdD0oUkVBTCkKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZEFyY18zPWNhc3Q9KFJFQUwpCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRBcmNfND1jYXN0PShSRUFMKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkQXJjXzU9Y2FzdD0oUkVBTCkKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZEFyY182PWNhc3Q9KFJFQUwpCi0KLUdkaXBfR3JhcGhpY3NQYXRoX0FkZEJlemllcj1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZEJlemllcl8wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkQmV6aWVyXzE9Y2FzdD0oUkVBTCkKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZEJlemllcl8yPWNhc3Q9UkVBTAotR2RpcF9HcmFwaGljc1BhdGhfQWRkQmV6aWVyXzM9Y2FzdD1SRUFMCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRCZXppZXJfND1jYXN0PShSRUFMKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkQmV6aWVyXzU9Y2FzdD1SRUFMCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRCZXppZXJfNj1jYXN0PShSRUFMKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkQmV6aWVyXzc9Y2FzdD0oUkVBTCkKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZEJlemllcl84PWNhc3Q9KFJFQUwpCi0KLUdkaXBfR3JhcGhpY3NQYXRoX0FkZExpbmU9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRMaW5lXzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRMaW5lXzE9Y2FzdD1SRUFMCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRMaW5lXzI9Y2FzdD1SRUFMCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRMaW5lXzM9Y2FzdD1SRUFMCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRMaW5lXzQ9Y2FzdD1SRUFMCi0KLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFBhdGg9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRQYXRoXzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRQYXRoXzE9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRQYXRoXzI9Y2FzdD1CT09MCi0KLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFJlY3RhbmdsZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFJlY3RhbmdsZV8wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkUmVjdGFuZ2xlXzE9ZmxhZ3M9c3RydWN0Ci0KLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFN0cmluZz1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFN0cmluZ18wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkU3RyaW5nXzE9Y2FzdD1jb25zdCBXQ0hBUiAqCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRTdHJpbmdfMj1jYXN0PUlOVAotR2RpcF9HcmFwaGljc1BhdGhfQWRkU3RyaW5nXzM9Y2FzdD1jb25zdCBGb250RmFtaWx5ICoKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFN0cmluZ180PWNhc3Q9SU5UCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRTdHJpbmdfNT1jYXN0PShSRUFMKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkU3RyaW5nXzY9Y2FzdD1jb25zdCBQb2ludEYgKixmbGFncz1zdHJ1Y3QKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFN0cmluZ183PWNhc3Q9Y29uc3QgU3RyaW5nRm9ybWF0ICoKLQotR2RpcF9HcmFwaGljc1BhdGhfQ2xvc2VGaWd1cmU9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzUGF0aF9DbG9zZUZpZ3VyZV8wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRCb3VuZHM9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRCb3VuZHNfMD1jYXN0PShHcmFwaGljc1BhdGggKikKLUdkaXBfR3JhcGhpY3NQYXRoX0dldEJvdW5kc18xPQotR2RpcF9HcmFwaGljc1BhdGhfR2V0Qm91bmRzXzI9Y2FzdD1NYXRyaXggKgotR2RpcF9HcmFwaGljc1BhdGhfR2V0Qm91bmRzXzM9Y2FzdD1QZW4gKgotCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRMYXN0UG9pbnQ9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRMYXN0UG9pbnRfMD1jYXN0PShHcmFwaGljc1BhdGggKikKLUdkaXBfR3JhcGhpY3NQYXRoX0dldExhc3RQb2ludF8xPWNhc3Q9KFBvaW50RiAqKQotCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRQYXRoUG9pbnRzPWZsYWdzPW5vX2dlbiBjcHAKLUdkaXBfR3JhcGhpY3NQYXRoX0dldFBhdGhQb2ludHNfMD1jYXN0PShHcmFwaGljc1BhdGggKikKLUdkaXBfR3JhcGhpY3NQYXRoX0dldFBhdGhQb2ludHNfMT1jYXN0PVBvaW50RiAqCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRQYXRoUG9pbnRzXzI9Ci0KLUdkaXBfR3JhcGhpY3NQYXRoX0dldFBhdGhUeXBlcz1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NQYXRoX0dldFBhdGhUeXBlc18wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotR2RpcF9HcmFwaGljc1BhdGhfR2V0UGF0aFR5cGVzXzE9Y2FzdD1CWVRFICoKLUdkaXBfR3JhcGhpY3NQYXRoX0dldFBhdGhUeXBlc18yPQotCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRQb2ludENvdW50PWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc1BhdGhfR2V0UG9pbnRDb3VudF8wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotCi1HZGlwX0dyYXBoaWNzUGF0aF9Jc091dGxpbmVWaXNpYmxlPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc1BhdGhfSXNPdXRsaW5lVmlzaWJsZV8wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotR2RpcF9HcmFwaGljc1BhdGhfSXNPdXRsaW5lVmlzaWJsZV8xPQotR2RpcF9HcmFwaGljc1BhdGhfSXNPdXRsaW5lVmlzaWJsZV8yPQotR2RpcF9HcmFwaGljc1BhdGhfSXNPdXRsaW5lVmlzaWJsZV8zPWNhc3Q9Y29uc3QgUGVuICoKLUdkaXBfR3JhcGhpY3NQYXRoX0lzT3V0bGluZVZpc2libGVfND1jYXN0PWNvbnN0IEdyYXBoaWNzICoKLQotR2RpcF9HcmFwaGljc1BhdGhfSXNWaXNpYmxlPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc1BhdGhfSXNWaXNpYmxlXzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi1HZGlwX0dyYXBoaWNzUGF0aF9Jc1Zpc2libGVfMT0KLUdkaXBfR3JhcGhpY3NQYXRoX0lzVmlzaWJsZV8yPQotR2RpcF9HcmFwaGljc1BhdGhfSXNWaXNpYmxlXzM9Y2FzdD1jb25zdCBHcmFwaGljcyAqCi0KLUdkaXBfR3JhcGhpY3NQYXRoX1NldEZpbGxNb2RlPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc1BhdGhfU2V0RmlsbE1vZGVfMD1jYXN0PShHcmFwaGljc1BhdGggKikKLUdkaXBfR3JhcGhpY3NQYXRoX1NldEZpbGxNb2RlXzE9Y2FzdD1GaWxsTW9kZQotCi1HZGlwX0dyYXBoaWNzUGF0aF9TdGFydEZpZ3VyZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NQYXRoX1N0YXJ0RmlndXJlXzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi0KLUdkaXBfR3JhcGhpY3NQYXRoX2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfR3JhcGhpY3NQYXRoX2RlbGV0ZV8wPQotCi1HZGlwX0dyYXBoaWNzUGF0aF9uZXc9ZmxhZ3M9bmV3Ci1HZGlwX0dyYXBoaWNzUGF0aF9uZXdfMD1jYXN0PUZpbGxNb2RlCi0KLUdkaXBfR3JhcGhpY3NfRHJhd0FyYz1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfRHJhd0FyY18wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0RyYXdBcmNfMT1jYXN0PShQZW4gKikKLUdkaXBfR3JhcGhpY3NfRHJhd0FyY18yPQotR2RpcF9HcmFwaGljc19EcmF3QXJjXzM9Ci1HZGlwX0dyYXBoaWNzX0RyYXdBcmNfND0KLUdkaXBfR3JhcGhpY3NfRHJhd0FyY181PQotR2RpcF9HcmFwaGljc19EcmF3QXJjXzY9Ci1HZGlwX0dyYXBoaWNzX0RyYXdBcmNfNz0KLQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfRHJhd0VsbGlwc2VfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZV8xPWNhc3Q9KFBlbiAqKQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZV8yPQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZV8zPQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZV80PQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZV81PQotCi1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJSUk9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJSUlfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUlJXzE9Y2FzdD0oSW1hZ2UgKikKLUdkaXBfR3JhcGhpY3NfMURyYXdJbWFnZV9fSUlJSV8yPWNhc3Q9KElOVCkKLUdkaXBfR3JhcGhpY3NfMURyYXdJbWFnZV9fSUlJSV8zPWNhc3Q9KElOVCkKLQotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJSUlJSUlJST1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfMURyYXdJbWFnZV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdF8ySUlJSUlJSUlfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJSUlJSUlJSV8xPWNhc3Q9KEltYWdlICopCi1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMklJSUlJSUlJXzI9Y2FzdD1jb25zdCBSZWN0ICosZmxhZ3M9c3RydWN0Ci1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMklJSUlJSUlJXzM9Y2FzdD0oSU5UKQotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJSUlJSUlJSV80PWNhc3Q9KElOVCkKLUdkaXBfR3JhcGhpY3NfMURyYXdJbWFnZV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdF8ySUlJSUlJSUlfNT1jYXN0PUlOVAotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJSUlJSUlJSV82PWNhc3Q9SU5UCi1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMklJSUlJSUlJXzc9Y2FzdD0oVW5pdCkKLUdkaXBfR3JhcGhpY3NfMURyYXdJbWFnZV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdF8ySUlJSUlJSUlfOD1jYXN0PUltYWdlQXR0cmlidXRlcyAqCi1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMklJSUlJSUlJXzk9Y2FzdD1EcmF3SW1hZ2VBYm9ydAotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJSUlJSUlJSV8xMD1jYXN0PVZPSUQgKgotCi1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19EcmF3TGluZV8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lXzE9Y2FzdD0oUGVuICopCi1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lXzI9Ci1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lXzM9Ci1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lXzQ9Ci1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lXzU9Ci0KLUdkaXBfR3JhcGhpY3NfRHJhd0xpbmVzPWZsYWdzPW5vX2dlbiBjcHAKLUdkaXBfR3JhcGhpY3NfRHJhd0xpbmVzXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfRHJhd0xpbmVzXzE9Y2FzdD0oUGVuICopCi1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lc18yPQotR2RpcF9HcmFwaGljc19EcmF3TGluZXNfMz1jYXN0PUlOVAotCi1HZGlwX0dyYXBoaWNzX0RyYXdQYXRoPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19EcmF3UGF0aF8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0RyYXdQYXRoXzE9Y2FzdD0oUGVuICopCi1HZGlwX0dyYXBoaWNzX0RyYXdQYXRoXzI9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi0KLUdkaXBfR3JhcGhpY3NfRHJhd1BvbHlnb249ZmxhZ3M9bm9fZ2VuIGNwcAotR2RpcF9HcmFwaGljc19EcmF3UG9seWdvbl8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0RyYXdQb2x5Z29uXzE9Y2FzdD0oUGVuICopCi1HZGlwX0dyYXBoaWNzX0RyYXdQb2x5Z29uXzI9Ci1HZGlwX0dyYXBoaWNzX0RyYXdQb2x5Z29uXzM9Y2FzdD1JTlQKLQotR2RpcF9HcmFwaGljc19EcmF3UmVjdGFuZ2xlPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19EcmF3UmVjdGFuZ2xlXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfRHJhd1JlY3RhbmdsZV8xPWNhc3Q9KFBlbiAqKQotR2RpcF9HcmFwaGljc19EcmF3UmVjdGFuZ2xlXzI9Ci1HZGlwX0dyYXBoaWNzX0RyYXdSZWN0YW5nbGVfMz0KLUdkaXBfR3JhcGhpY3NfRHJhd1JlY3RhbmdsZV80PQotR2RpcF9HcmFwaGljc19EcmF3UmVjdGFuZ2xlXzU9Ci0KLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMkk9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzXzFEcmF3U3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklfMT1jYXN0PVdDSEFSICoKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklfMj1jYXN0PWludAotR2RpcF9HcmFwaGljc18xRHJhd1N0cmluZ19fSV8zQ0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1BvaW50Rl8ySV8zPWNhc3Q9Rm9udCAqCi1HZGlwX0dyYXBoaWNzXzFEcmF3U3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJXzQ9ZmxhZ3M9c3RydWN0Ci1HZGlwX0dyYXBoaWNzXzFEcmF3U3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJXzU9Y2FzdD1CcnVzaCAqCi0KLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklJPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc18xRHJhd1N0cmluZ19fSV8zQ0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1BvaW50Rl8ySUlfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc18xRHJhd1N0cmluZ19fSV8zQ0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1BvaW50Rl8ySUlfMT1jYXN0PVdDSEFSICoKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklJXzI9Y2FzdD1pbnQKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklJXzM9Y2FzdD1Gb250ICoKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklJXzQ9ZmxhZ3M9c3RydWN0Ci1HZGlwX0dyYXBoaWNzXzFEcmF3U3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJSV81PWNhc3Q9U3RyaW5nRm9ybWF0ICoKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklJXzY9Y2FzdD0oQnJ1c2ggKikKLQotR2RpcF9HcmFwaGljc19GaWxsRWxsaXBzZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfRmlsbEVsbGlwc2VfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc19GaWxsRWxsaXBzZV8xPWNhc3Q9KEJydXNoICopCi1HZGlwX0dyYXBoaWNzX0ZpbGxFbGxpcHNlXzI9Y2FzdD0oSU5UKQotR2RpcF9HcmFwaGljc19GaWxsRWxsaXBzZV8zPWNhc3Q9KElOVCkKLUdkaXBfR3JhcGhpY3NfRmlsbEVsbGlwc2VfND1jYXN0PShJTlQpCi1HZGlwX0dyYXBoaWNzX0ZpbGxFbGxpcHNlXzU9Y2FzdD0oSU5UKQotCi1HZGlwX0dyYXBoaWNzX0ZpbGxQYXRoPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19GaWxsUGF0aF8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0ZpbGxQYXRoXzE9Y2FzdD0oQnJ1c2ggKikKLUdkaXBfR3JhcGhpY3NfRmlsbFBhdGhfMj1jYXN0PShHcmFwaGljc1BhdGggKikKLQotR2RpcF9HcmFwaGljc19GaWxsUGllPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19GaWxsUGllXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfRmlsbFBpZV8xPWNhc3Q9KEJydXNoICopCi1HZGlwX0dyYXBoaWNzX0ZpbGxQaWVfMj1jYXN0PShJTlQpCi1HZGlwX0dyYXBoaWNzX0ZpbGxQaWVfMz1jYXN0PShJTlQpCi1HZGlwX0dyYXBoaWNzX0ZpbGxQaWVfND1jYXN0PShJTlQpCi1HZGlwX0dyYXBoaWNzX0ZpbGxQaWVfNT1jYXN0PShJTlQpCi1HZGlwX0dyYXBoaWNzX0ZpbGxQaWVfNj1jYXN0PShSRUFMKQotR2RpcF9HcmFwaGljc19GaWxsUGllXzc9Y2FzdD0oUkVBTCkKLQotR2RpcF9HcmFwaGljc19GaWxsUG9seWdvbj1mbGFncz1ub19nZW4gY3BwCi1HZGlwX0dyYXBoaWNzX0ZpbGxQb2x5Z29uXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfRmlsbFBvbHlnb25fMT1jYXN0PShCcnVzaCAqKQotR2RpcF9HcmFwaGljc19GaWxsUG9seWdvbl8yPWNhc3Q9UG9pbnQgKgotR2RpcF9HcmFwaGljc19GaWxsUG9seWdvbl8zPWNhc3Q9KElOVCkKLUdkaXBfR3JhcGhpY3NfRmlsbFBvbHlnb25fND1jYXN0PUZpbGxNb2RlCi0KLUdkaXBfR3JhcGhpY3NfRmlsbFJlY3RhbmdsZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfRmlsbFJlY3RhbmdsZV8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0ZpbGxSZWN0YW5nbGVfMT1jYXN0PShCcnVzaCAqKQotR2RpcF9HcmFwaGljc19GaWxsUmVjdGFuZ2xlXzI9Y2FzdD0oSU5UKQotR2RpcF9HcmFwaGljc19GaWxsUmVjdGFuZ2xlXzM9Y2FzdD1JTlQKLUdkaXBfR3JhcGhpY3NfRmlsbFJlY3RhbmdsZV80PWNhc3Q9SU5UCi1HZGlwX0dyYXBoaWNzX0ZpbGxSZWN0YW5nbGVfNT1jYXN0PUlOVAotCi1HZGlwX0dyYXBoaWNzX0ZsdXNoPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19GbHVzaF8wPWNhc3Q9R3JhcGhpY3MgKgotR2RpcF9HcmFwaGljc19GbHVzaF8xPWNhc3Q9Rmx1c2hJbnRlbnRpb24KLQotR2RpcF9HcmFwaGljc19HZXRDbGlwPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19HZXRDbGlwXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfR2V0Q2xpcF8xPWNhc3Q9UmVnaW9uICoKLQotR2RpcF9HcmFwaGljc18xR2V0Q2xpcEJvdW5kc19fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0Rl8yPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc18xR2V0Q2xpcEJvdW5kc19fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0Rl8yXzA9Y2FzdD1HcmFwaGljcyAqCi1HZGlwX0dyYXBoaWNzXzFHZXRDbGlwQm91bmRzX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RGXzJfMT0KLQotR2RpcF9HcmFwaGljc18xR2V0Q2xpcEJvdW5kc19fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzI9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzXzFHZXRDbGlwQm91bmRzX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMl8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzXzFHZXRDbGlwQm91bmRzX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMl8xPQotCi1HZGlwX0dyYXBoaWNzX0dldEhEQz1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfR2V0SERDXzA9Y2FzdD1HcmFwaGljcyAqCi0KLUdkaXBfR3JhcGhpY3NfR2V0SW50ZXJwb2xhdGlvbk1vZGU9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzX0dldEludGVycG9sYXRpb25Nb2RlXzA9Y2FzdD0oR3JhcGhpY3MgKikKLQotR2RpcF9HcmFwaGljc19HZXRTbW9vdGhpbmdNb2RlPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19HZXRTbW9vdGhpbmdNb2RlXzA9Y2FzdD0oR3JhcGhpY3MgKikKLQotR2RpcF9HcmFwaGljc19HZXRUZXh0UmVuZGVyaW5nSGludD1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfR2V0VGV4dFJlbmRlcmluZ0hpbnRfMD1jYXN0PShHcmFwaGljcyAqKQotCi1HZGlwX0dyYXBoaWNzX0dldFRyYW5zZm9ybT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfR2V0VHJhbnNmb3JtXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfR2V0VHJhbnNmb3JtXzE9Y2FzdD1NYXRyaXggKgotCi1HZGlwX0dyYXBoaWNzX0dldFZpc2libGVDbGlwQm91bmRzPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19HZXRWaXNpYmxlQ2xpcEJvdW5kc18wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0dldFZpc2libGVDbGlwQm91bmRzXzE9Ci0KLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMj1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RGXzJfMT1jYXN0PWNvbnN0IFdDSEFSICoKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl8yPWNhc3Q9SU5UCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RGXzJfMz1jYXN0PWNvbnN0IEZvbnQgKgotR2RpcF9HcmFwaGljc18xTWVhc3VyZVN0cmluZ19fSV8zQ0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1BvaW50Rl8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0Rl8yXzQ9Y2FzdD1jb25zdCBQb2ludEYgKixmbGFncz1zdHJ1Y3QKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl81PWNhc3Q9U3RyaW5nRm9ybWF0ICoKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl82PQotCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMj1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0Rl8yXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0Rl8yXzE9Y2FzdD1jb25zdCBXQ0hBUiAqCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl8yPWNhc3Q9SU5UCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl8zPWNhc3Q9Y29uc3QgRm9udCAqCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl80PWNhc3Q9Y29uc3QgUG9pbnRGICosZmxhZ3M9c3RydWN0Ci1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl81PWNhc3Q9UmVjdEYgKgotCi1HZGlwX0dyYXBoaWNzX1JlbGVhc2VIREM9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzX1JlbGVhc2VIRENfMD1jYXN0PUdyYXBoaWNzICoKLUdkaXBfR3JhcGhpY3NfUmVsZWFzZUhEQ18xPWNhc3Q9SERDCi0KLUdkaXBfR3JhcGhpY3NfUmVzZXRDbGlwPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19SZXNldENsaXBfMD1jYXN0PShHcmFwaGljcyAqKQotCi1HZGlwX0dyYXBoaWNzXzFTZXRDbGlwX19JST1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfMVNldENsaXBfX0lJXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfMVNldENsaXBfX0lJXzE9Y2FzdD1HcmFwaGljc1BhdGggKgotCi1HZGlwX0dyYXBoaWNzXzFTZXRDbGlwX19JSUk9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzXzFTZXRDbGlwX19JSUlfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc18xU2V0Q2xpcF9fSUlJXzE9Y2FzdD1SZWdpb24gKgotR2RpcF9HcmFwaGljc18xU2V0Q2xpcF9fSUlJXzI9Y2FzdD1Db21iaW5lTW9kZQotCi1HZGlwX0dyYXBoaWNzXzFTZXRDbGlwX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RGXzI9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzXzFTZXRDbGlwX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RGXzJfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc18xU2V0Q2xpcF9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0Rl8yXzE9ZmxhZ3M9c3RydWN0Ci0KLUdkaXBfR3JhcGhpY3NfU2V0Q29tcG9zaXRpbmdRdWFsaXR5PWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19TZXRDb21wb3NpdGluZ1F1YWxpdHlfMD1jYXN0PUdyYXBoaWNzICoKLUdkaXBfR3JhcGhpY3NfU2V0Q29tcG9zaXRpbmdRdWFsaXR5XzE9Y2FzdD1Db21wb3NpdGluZ1F1YWxpdHkKLQotR2RpcF9HcmFwaGljc19TZXRJbnRlcnBvbGF0aW9uTW9kZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfU2V0SW50ZXJwb2xhdGlvbk1vZGVfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc19TZXRJbnRlcnBvbGF0aW9uTW9kZV8xPWNhc3Q9SW50ZXJwb2xhdGlvbk1vZGUKLQotR2RpcF9HcmFwaGljc19TZXRQaXhlbE9mZnNldE1vZGU9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzX1NldFBpeGVsT2Zmc2V0TW9kZV8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX1NldFBpeGVsT2Zmc2V0TW9kZV8xPWNhc3Q9UGl4ZWxPZmZzZXRNb2RlCi0KLUdkaXBfR3JhcGhpY3NfU2V0U21vb3RoaW5nTW9kZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfU2V0U21vb3RoaW5nTW9kZV8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX1NldFNtb290aGluZ01vZGVfMT1jYXN0PShTbW9vdGhpbmdNb2RlKQotCi1HZGlwX0dyYXBoaWNzX1NldFRleHRSZW5kZXJpbmdIaW50PWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19TZXRUZXh0UmVuZGVyaW5nSGludF8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX1NldFRleHRSZW5kZXJpbmdIaW50XzE9Y2FzdD1UZXh0UmVuZGVyaW5nSGludAotCi1HZGlwX0dyYXBoaWNzX1NldFRyYW5zZm9ybT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfU2V0VHJhbnNmb3JtXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfU2V0VHJhbnNmb3JtXzE9Y2FzdD0oTWF0cml4ICopCi0KLUdkaXBfR3JhcGhpY3NfZGVsZXRlPWZsYWdzPWRlbGV0ZQotR2RpcF9HcmFwaGljc19kZWxldGVfMD0KLQotR2RpcF9HcmFwaGljc19uZXc9ZmxhZ3M9bmV3Ci1HZGlwX0dyYXBoaWNzX25ld18wPWNhc3Q9KEhEQykKLQotR2RpcF9IYXRjaEJydXNoX2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfSGF0Y2hCcnVzaF9kZWxldGVfMD0KLQotR2RpcF9IYXRjaEJydXNoX25ldz1mbGFncz1uZXcKLUdkaXBfSGF0Y2hCcnVzaF9uZXdfMD1jYXN0PUhhdGNoU3R5bGUKLUdkaXBfSGF0Y2hCcnVzaF9uZXdfMT1jYXN0PUNvbG9yICosZmxhZ3M9c3RydWN0Ci1HZGlwX0hhdGNoQnJ1c2hfbmV3XzI9Y2FzdD1Db2xvciAqLGZsYWdzPXN0cnVjdAotCi1HZGlwX0ltYWdlQXR0cmlidXRlc19TZXRDb2xvck1hdHJpeD1mbGFncz1jcHAKLUdkaXBfSW1hZ2VBdHRyaWJ1dGVzX1NldENvbG9yTWF0cml4XzA9Y2FzdD0oSW1hZ2VBdHRyaWJ1dGVzICopCi1HZGlwX0ltYWdlQXR0cmlidXRlc19TZXRDb2xvck1hdHJpeF8xPWNhc3Q9Q29sb3JNYXRyaXggKgotR2RpcF9JbWFnZUF0dHJpYnV0ZXNfU2V0Q29sb3JNYXRyaXhfMj1jYXN0PUNvbG9yTWF0cml4RmxhZ3MKLUdkaXBfSW1hZ2VBdHRyaWJ1dGVzX1NldENvbG9yTWF0cml4XzM9Y2FzdD1Db2xvckFkanVzdFR5cGUKLQotR2RpcF9JbWFnZUF0dHJpYnV0ZXNfU2V0V3JhcE1vZGU9ZmxhZ3M9Y3BwCi1HZGlwX0ltYWdlQXR0cmlidXRlc19TZXRXcmFwTW9kZV8wPWNhc3Q9KEltYWdlQXR0cmlidXRlcyAqKQotR2RpcF9JbWFnZUF0dHJpYnV0ZXNfU2V0V3JhcE1vZGVfMT1jYXN0PVdyYXBNb2RlCi0KLUdkaXBfSW1hZ2VBdHRyaWJ1dGVzX2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfSW1hZ2VBdHRyaWJ1dGVzX2RlbGV0ZV8wPQotCi1HZGlwX0ltYWdlQXR0cmlidXRlc19uZXc9ZmxhZ3M9bmV3Ci0KLUdkaXBfSW1hZ2VfR2V0SGVpZ2h0PWZsYWdzPWNwcAotR2RpcF9JbWFnZV9HZXRIZWlnaHRfMD1jYXN0PUltYWdlICoKLQotR2RpcF9JbWFnZV9HZXRXaWR0aD1mbGFncz1jcHAKLUdkaXBfSW1hZ2VfR2V0V2lkdGhfMD1jYXN0PUltYWdlICoKLQotR2RpcF9MaW5lYXJHcmFkaWVudEJydXNoX1NldEludGVycG9sYXRpb25Db2xvcnM9ZmxhZ3M9bm9fZ2VuIGNwcAotR2RpcF9MaW5lYXJHcmFkaWVudEJydXNoX1NldEludGVycG9sYXRpb25Db2xvcnNfMD1jYXN0PUxpbmVhckdyYWRpZW50QnJ1c2ggKgotR2RpcF9MaW5lYXJHcmFkaWVudEJydXNoX1NldEludGVycG9sYXRpb25Db2xvcnNfMT1jYXN0PWNvbnN0IENvbG9yICoKLUdkaXBfTGluZWFyR3JhZGllbnRCcnVzaF9TZXRJbnRlcnBvbGF0aW9uQ29sb3JzXzI9Y2FzdD1jb25zdCBSRUFMICoKLUdkaXBfTGluZWFyR3JhZGllbnRCcnVzaF9TZXRJbnRlcnBvbGF0aW9uQ29sb3JzXzM9Ci0KLUdkaXBfTGluZWFyR3JhZGllbnRCcnVzaF9TZXRXcmFwTW9kZT1mbGFncz1jcHAKLUdkaXBfTGluZWFyR3JhZGllbnRCcnVzaF9TZXRXcmFwTW9kZV8wPWNhc3Q9TGluZWFyR3JhZGllbnRCcnVzaCAqCi1HZGlwX0xpbmVhckdyYWRpZW50QnJ1c2hfU2V0V3JhcE1vZGVfMT1jYXN0PVdyYXBNb2RlCi0KLUdkaXBfTGluZWFyR3JhZGllbnRCcnVzaF9kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1HZGlwX0xpbmVhckdyYWRpZW50QnJ1c2hfZGVsZXRlXzA9Ci0KLUdkaXBfTGluZWFyR3JhZGllbnRCcnVzaF9uZXc9ZmxhZ3M9bmV3Ci1HZGlwX0xpbmVhckdyYWRpZW50QnJ1c2hfbmV3XzA9ZmxhZ3M9c3RydWN0Ci1HZGlwX0xpbmVhckdyYWRpZW50QnJ1c2hfbmV3XzE9ZmxhZ3M9c3RydWN0Ci1HZGlwX0xpbmVhckdyYWRpZW50QnJ1c2hfbmV3XzI9Y2FzdD1Db2xvciAqLGZsYWdzPXN0cnVjdAotR2RpcF9MaW5lYXJHcmFkaWVudEJydXNoX25ld18zPWNhc3Q9Q29sb3IgKixmbGFncz1zdHJ1Y3QKLQotR2RpcF9NYXRyaXhfR2V0RWxlbWVudHM9ZmxhZ3M9Y3BwCi1HZGlwX01hdHJpeF9HZXRFbGVtZW50c18wPWNhc3Q9KE1hdHJpeCAqKQotR2RpcF9NYXRyaXhfR2V0RWxlbWVudHNfMT1jYXN0PShSRUFMICopCi0KLUdkaXBfTWF0cml4X0ludmVydD1mbGFncz1jcHAKLUdkaXBfTWF0cml4X0ludmVydF8wPWNhc3Q9KE1hdHJpeCAqKQotCi1HZGlwX01hdHJpeF9Jc0lkZW50aXR5PWZsYWdzPWNwcAotR2RpcF9NYXRyaXhfSXNJZGVudGl0eV8wPWNhc3Q9KE1hdHJpeCAqKQotCi1HZGlwX01hdHJpeF9NdWx0aXBseT1mbGFncz1jcHAKLUdkaXBfTWF0cml4X011bHRpcGx5XzA9Y2FzdD0oTWF0cml4ICopCi1HZGlwX01hdHJpeF9NdWx0aXBseV8xPWNhc3Q9KE1hdHJpeCAqKQotR2RpcF9NYXRyaXhfTXVsdGlwbHlfMj1jYXN0PShNYXRyaXhPcmRlcikKLQotR2RpcF9NYXRyaXhfUm90YXRlPWZsYWdzPWNwcAotR2RpcF9NYXRyaXhfUm90YXRlXzA9Y2FzdD0oTWF0cml4ICopCi1HZGlwX01hdHJpeF9Sb3RhdGVfMT1jYXN0PShSRUFMKQotR2RpcF9NYXRyaXhfUm90YXRlXzI9Y2FzdD0oTWF0cml4T3JkZXIpCi0KLUdkaXBfTWF0cml4X1NjYWxlPWZsYWdzPWNwcAotR2RpcF9NYXRyaXhfU2NhbGVfMD1jYXN0PShNYXRyaXggKikKLUdkaXBfTWF0cml4X1NjYWxlXzE9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1NjYWxlXzI9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1NjYWxlXzM9Y2FzdD0oTWF0cml4T3JkZXIpCi0KLUdkaXBfTWF0cml4X1NldEVsZW1lbnRzPWZsYWdzPWNwcAotR2RpcF9NYXRyaXhfU2V0RWxlbWVudHNfMD1jYXN0PShNYXRyaXggKikKLUdkaXBfTWF0cml4X1NldEVsZW1lbnRzXzE9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1NldEVsZW1lbnRzXzI9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1NldEVsZW1lbnRzXzM9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1NldEVsZW1lbnRzXzQ9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1NldEVsZW1lbnRzXzU9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1NldEVsZW1lbnRzXzY9Y2FzdD0oUkVBTCkKLQotR2RpcF9NYXRyaXhfU2hlYXI9ZmxhZ3M9Y3BwCi1HZGlwX01hdHJpeF9TaGVhcl8wPWNhc3Q9KE1hdHJpeCAqKQotR2RpcF9NYXRyaXhfU2hlYXJfMT1jYXN0PShSRUFMKQotR2RpcF9NYXRyaXhfU2hlYXJfMj1jYXN0PShSRUFMKQotR2RpcF9NYXRyaXhfU2hlYXJfMz1jYXN0PShNYXRyaXhPcmRlcikKLQotR2RpcF9NYXRyaXhfMVRyYW5zZm9ybVBvaW50c19fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMkk9ZmxhZ3M9Y3BwCi1HZGlwX01hdHJpeF8xVHJhbnNmb3JtUG9pbnRzX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1BvaW50Rl8ySV8wPWNhc3Q9KE1hdHJpeCAqKQotR2RpcF9NYXRyaXhfMVRyYW5zZm9ybVBvaW50c19fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklfMT0KLUdkaXBfTWF0cml4XzFUcmFuc2Zvcm1Qb2ludHNfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJXzI9Ci0KLUdkaXBfTWF0cml4XzFUcmFuc2Zvcm1Qb2ludHNfX0lfM0ZJPWZsYWdzPW5vX2dlbgotR2RpcF9NYXRyaXhfMVRyYW5zZm9ybVBvaW50c19fSV8zRklfMD0KLUdkaXBfTWF0cml4XzFUcmFuc2Zvcm1Qb2ludHNfX0lfM0ZJXzE9Ci1HZGlwX01hdHJpeF8xVHJhbnNmb3JtUG9pbnRzX19JXzNGSV8yPQotCi1HZGlwX01hdHJpeF9UcmFuc2xhdGU9ZmxhZ3M9Y3BwCi1HZGlwX01hdHJpeF9UcmFuc2xhdGVfMD1jYXN0PShNYXRyaXggKikKLUdkaXBfTWF0cml4X1RyYW5zbGF0ZV8xPWNhc3Q9KFJFQUwpCi1HZGlwX01hdHJpeF9UcmFuc2xhdGVfMj1jYXN0PShSRUFMKQotR2RpcF9NYXRyaXhfVHJhbnNsYXRlXzM9Y2FzdD0oTWF0cml4T3JkZXIpCi0KLUdkaXBfTWF0cml4X2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfTWF0cml4X2RlbGV0ZV8wPQotCi1HZGlwX01hdHJpeF9uZXc9ZmxhZ3M9bmV3Ci1HZGlwX01hdHJpeF9uZXdfMD1jYXN0PShSRUFMKQotR2RpcF9NYXRyaXhfbmV3XzE9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X25ld18yPWNhc3Q9KFJFQUwpCi1HZGlwX01hdHJpeF9uZXdfMz1jYXN0PShSRUFMKQotR2RpcF9NYXRyaXhfbmV3XzQ9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X25ld181PWNhc3Q9KFJFQUwpCi0KLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0Q2VudGVyQ29sb3I9ZmxhZ3M9Y3BwCi1HZGlwX1BhdGhHcmFkaWVudEJydXNoX1NldENlbnRlckNvbG9yXzA9Y2FzdD0oUGF0aEdyYWRpZW50QnJ1c2ggKikKLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0Q2VudGVyQ29sb3JfMT1jYXN0PShDb2xvciAqKSxmbGFncz1zdHJ1Y3QKLQotR2RpcF9QYXRoR3JhZGllbnRCcnVzaF9TZXRDZW50ZXJQb2ludD1mbGFncz1jcHAKLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0Q2VudGVyUG9pbnRfMD1jYXN0PShQYXRoR3JhZGllbnRCcnVzaCAqKQotR2RpcF9QYXRoR3JhZGllbnRCcnVzaF9TZXRDZW50ZXJQb2ludF8xPWZsYWdzPXN0cnVjdAotCi1HZGlwX1BhdGhHcmFkaWVudEJydXNoX1NldEdyYXBoaWNzUGF0aD1mbGFncz1jcHAKLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0R3JhcGhpY3NQYXRoXzA9Y2FzdD0oUGF0aEdyYWRpZW50QnJ1c2ggKikKLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0R3JhcGhpY3NQYXRoXzE9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi0KLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0U3Vycm91bmRDb2xvcnM9ZmxhZ3M9bm9fZ2VuCi1HZGlwX1BhdGhHcmFkaWVudEJydXNoX1NldFN1cnJvdW5kQ29sb3JzXzA9Y2FzdD0oUGF0aEdyYWRpZW50QnJ1c2ggKikKLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0U3Vycm91bmRDb2xvcnNfMT1jYXN0PUNvbG9yICoKLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0U3Vycm91bmRDb2xvcnNfMj1jYXN0PUlOVCAqCi0KLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfZGVsZXRlPWZsYWdzPWRlbGV0ZQotR2RpcF9QYXRoR3JhZGllbnRCcnVzaF9kZWxldGVfMD0KLQotR2RpcF9QYXRoR3JhZGllbnRCcnVzaF9uZXc9ZmxhZ3M9bmV3Ci1HZGlwX1BhdGhHcmFkaWVudEJydXNoX25ld18wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotCi1HZGlwX1Blbl9HZXRCcnVzaD1mbGFncz1jcHAKLUdkaXBfUGVuX0dldEJydXNoXzA9Y2FzdD0oUGVuICopCi0KLUdkaXBfUGVuX1NldEJydXNoPWZsYWdzPWNwcAotR2RpcF9QZW5fU2V0QnJ1c2hfMD1jYXN0PShQZW4gKikKLUdkaXBfUGVuX1NldEJydXNoXzE9Y2FzdD1CcnVzaCAqCi0KLUdkaXBfUGVuX1NldERhc2hQYXR0ZXJuPWZsYWdzPWNwcAotR2RpcF9QZW5fU2V0RGFzaFBhdHRlcm5fMD1jYXN0PShQZW4gKikKLUdkaXBfUGVuX1NldERhc2hQYXR0ZXJuXzE9Y2FzdD0oUkVBTCAqKQotR2RpcF9QZW5fU2V0RGFzaFBhdHRlcm5fMj1jYXN0PWludAotCi1HZGlwX1Blbl9TZXREYXNoU3R5bGU9ZmxhZ3M9Y3BwCi1HZGlwX1Blbl9TZXREYXNoU3R5bGVfMD1jYXN0PVBlbiAqCi1HZGlwX1Blbl9TZXREYXNoU3R5bGVfMT1jYXN0PURhc2hTdHlsZQotCi1HZGlwX1Blbl9TZXRMaW5lQ2FwPWZsYWdzPWNwcAotR2RpcF9QZW5fU2V0TGluZUNhcF8wPWNhc3Q9KFBlbiAqKQotR2RpcF9QZW5fU2V0TGluZUNhcF8xPWNhc3Q9KExpbmVDYXApCi1HZGlwX1Blbl9TZXRMaW5lQ2FwXzI9Y2FzdD0oTGluZUNhcCkKLUdkaXBfUGVuX1NldExpbmVDYXBfMz1jYXN0PShEYXNoQ2FwKQotCi1HZGlwX1Blbl9TZXRMaW5lSm9pbj1mbGFncz1jcHAKLUdkaXBfUGVuX1NldExpbmVKb2luXzA9Y2FzdD0oUGVuICopCi1HZGlwX1Blbl9TZXRMaW5lSm9pbl8xPWNhc3Q9KExpbmVKb2luKQotCi1HZGlwX1Blbl9kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1HZGlwX1Blbl9kZWxldGVfMD0KLQotR2RpcF9QZW5fbmV3PWZsYWdzPW5ldwotR2RpcF9QZW5fbmV3XzA9Y2FzdD0oQ29sb3IgKiksZmxhZ3M9c3RydWN0Ci1HZGlwX1Blbl9uZXdfMT1jYXN0PVJFQUwKLQotR2RpcF9Qb2ludF9kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1HZGlwX1BvaW50X2RlbGV0ZV8wPQotCi1HZGlwX1BvaW50X25ldz1mbGFncz1uZXcKLUdkaXBfUG9pbnRfbmV3XzA9Ci1HZGlwX1BvaW50X25ld18xPQotCi1HZGlwX1JlZ2lvbl9HZXRIUkdOPWZsYWdzPWNwcAotR2RpcF9SZWdpb25fR2V0SFJHTl8wPWNhc3Q9KFJlZ2lvbiAqKQotR2RpcF9SZWdpb25fR2V0SFJHTl8xPWNhc3Q9KEdyYXBoaWNzICopCi0KLUdkaXBfUmVnaW9uX0lzSW5maW5pdGU9ZmxhZ3M9Y3BwCi1HZGlwX1JlZ2lvbl9Jc0luZmluaXRlXzA9Y2FzdD0oUmVnaW9uICopCi1HZGlwX1JlZ2lvbl9Jc0luZmluaXRlXzE9Y2FzdD0oR3JhcGhpY3MgKikKLQotR2RpcF9SZWdpb25fZGVsZXRlPWZsYWdzPWRlbGV0ZQotR2RpcF9SZWdpb25fZGVsZXRlXzA9Ci0KLUdkaXBfUmVnaW9uXzFuZXdfXz1mbGFncz1uZXcKLQotR2RpcF9SZWdpb25fMW5ld19fST1mbGFncz1uZXcKLUdkaXBfUmVnaW9uXzFuZXdfX0lfMD1jYXN0PUhSR04KLQotR2RpcF9Tb2xpZEJydXNoX2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfU29saWRCcnVzaF9kZWxldGVfMD0KLQotR2RpcF9Tb2xpZEJydXNoX25ldz1mbGFncz1uZXcKLUdkaXBfU29saWRCcnVzaF9uZXdfMD1jYXN0PShDb2xvciAqLGZsYWdzPXN0cnVjdAotCi1HZGlwX1N0cmluZ0Zvcm1hdF9DbG9uZT1mbGFncz1jcHAKLUdkaXBfU3RyaW5nRm9ybWF0X0Nsb25lXzA9Y2FzdD0oU3RyaW5nRm9ybWF0ICopCi0KLUdkaXBfU3RyaW5nRm9ybWF0X0dlbmVyaWNEZWZhdWx0PWFjY2Vzc29yPVN0cmluZ0Zvcm1hdDo6R2VuZXJpY0RlZmF1bHQKLQotR2RpcF9TdHJpbmdGb3JtYXRfR2VuZXJpY1R5cG9ncmFwaGljPWFjY2Vzc29yPVN0cmluZ0Zvcm1hdDo6R2VuZXJpY1R5cG9ncmFwaGljCi0KLUdkaXBfU3RyaW5nRm9ybWF0X0dldEZvcm1hdEZsYWdzPWZsYWdzPWNwcAotR2RpcF9TdHJpbmdGb3JtYXRfR2V0Rm9ybWF0RmxhZ3NfMD1jYXN0PShTdHJpbmdGb3JtYXQgKikKLQotR2RpcF9TdHJpbmdGb3JtYXRfU2V0Rm9ybWF0RmxhZ3M9ZmxhZ3M9Y3BwCi1HZGlwX1N0cmluZ0Zvcm1hdF9TZXRGb3JtYXRGbGFnc18wPWNhc3Q9KFN0cmluZ0Zvcm1hdCAqKQotR2RpcF9TdHJpbmdGb3JtYXRfU2V0Rm9ybWF0RmxhZ3NfMT1jYXN0PVN0cmluZ0Zvcm1hdEZsYWdzCi0KLUdkaXBfU3RyaW5nRm9ybWF0X1NldEhvdGtleVByZWZpeD1mbGFncz1jcHAKLUdkaXBfU3RyaW5nRm9ybWF0X1NldEhvdGtleVByZWZpeF8wPWNhc3Q9KFN0cmluZ0Zvcm1hdCAqKQotR2RpcF9TdHJpbmdGb3JtYXRfU2V0SG90a2V5UHJlZml4XzE9Y2FzdD1Ib3RrZXlQcmVmaXgKLQotR2RpcF9TdHJpbmdGb3JtYXRfU2V0VGFiU3RvcHM9ZmxhZ3M9Y3BwCi1HZGlwX1N0cmluZ0Zvcm1hdF9TZXRUYWJTdG9wc18wPWNhc3Q9KFN0cmluZ0Zvcm1hdCAqKQotR2RpcF9TdHJpbmdGb3JtYXRfU2V0VGFiU3RvcHNfMT0KLUdkaXBfU3RyaW5nRm9ybWF0X1NldFRhYlN0b3BzXzI9Ci1HZGlwX1N0cmluZ0Zvcm1hdF9TZXRUYWJTdG9wc18zPQotCi1HZGlwX1N0cmluZ0Zvcm1hdF9kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1HZGlwX1N0cmluZ0Zvcm1hdF9kZWxldGVfMD0KLQotR2RpcF9UZXh0dXJlQnJ1c2hfU2V0VHJhbnNmb3JtPWZsYWdzPWNwcAotR2RpcF9UZXh0dXJlQnJ1c2hfU2V0VHJhbnNmb3JtXzA9Y2FzdD0oVGV4dHVyZUJydXNoICopCi1HZGlwX1RleHR1cmVCcnVzaF9TZXRUcmFuc2Zvcm1fMT1jYXN0PU1hdHJpeCAqCi0KLUdkaXBfVGV4dHVyZUJydXNoX2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfVGV4dHVyZUJydXNoX2RlbGV0ZV8wPQotCi1HZGlwX1RleHR1cmVCcnVzaF9uZXc9ZmxhZ3M9bmV3Ci1HZGlwX1RleHR1cmVCcnVzaF9uZXdfMD1jYXN0PUltYWdlICoKLUdkaXBfVGV4dHVyZUJydXNoX25ld18xPWNhc3Q9V3JhcE1vZGUKLUdkaXBfVGV4dHVyZUJydXNoX25ld18yPQotR2RpcF9UZXh0dXJlQnJ1c2hfbmV3XzM9Ci1HZGlwX1RleHR1cmVCcnVzaF9uZXdfND0KLUdkaXBfVGV4dHVyZUJydXNoX25ld181PQotCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX0dkaXBsdXNTdGFydHVwSW5wdXQ9ZmxhZ3M9Y3BwCi1HZGlwbHVzU3RhcnR1cElucHV0X0dkaXBsdXNWZXJzaW9uPQotR2RpcGx1c1N0YXJ0dXBJbnB1dF9EZWJ1Z0V2ZW50Q2FsbGJhY2s9Y2FzdD1EZWJ1Z0V2ZW50UHJvYwotR2RpcGx1c1N0YXJ0dXBJbnB1dF9TdXBwcmVzc0JhY2tncm91bmRUaHJlYWQ9Y2FzdD1CT09MCi1HZGlwbHVzU3RhcnR1cElucHV0X1N1cHByZXNzRXh0ZXJuYWxDb2RlY3M9Y2FzdD1CT09MCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1BvaW50Rj0KLVBvaW50Rl9YPWNhc3Q9UkVBTAotUG9pbnRGX1k9Y2FzdD1SRUFMCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3Q9Ci1SZWN0X1g9Ci1SZWN0X1k9Ci1SZWN0X1dpZHRoPQotUmVjdF9IZWlnaHQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RGPQotUmVjdEZfWD0KLVJlY3RGX1k9Ci1SZWN0Rl9XaWR0aD0KLVJlY3RGX0hlaWdodD0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5nbm9tZS5HTk9NRS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5nbm9tZS5HTk9NRS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2EwMzM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ25vbWUuR05PTUUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ25vbWVfR05PTUU9Ci1HTk9NRV9Hbm9tZVZGU01pbWVBcHBsaWNhdGlvbl9zaXplb2Y9Ci0KLUdOT01FX19kbGNsb3NlPQotR05PTUVfX2RsY2xvc2VfMD1jYXN0PSh2b2lkICopCi0KLUdOT01FX19kbG9wZW49Ci1HTk9NRV9fZGxvcGVuXzA9Y2FzdD0oY29uc3QgY2hhciAqKQotR05PTUVfX2Rsb3Blbl8xPQotCi1HTk9NRV9fZGxzeW09Ci1HTk9NRV9fZGxzeW1fMD1jYXN0PSh2b2lkICopCi1HTk9NRV9fZGxzeW1fMT1jYXN0PShjb25zdCBjaGFyICopCi0KLUdOT01FX19nX2ZyZWU9Ci1HTk9NRV9fZ19mcmVlXzA9Y2FzdD1ncG9pbnRlcgotCi1HTk9NRV9fZ19saXN0X2FwcGVuZD0KLUdOT01FX19nX2xpc3RfYXBwZW5kXzA9Y2FzdD0oR0xpc3QgKikKLUdOT01FX19nX2xpc3RfYXBwZW5kXzE9Y2FzdD0oZ3BvaW50ZXIpCi0KLUdOT01FX19nX2xpc3RfZnJlZT0KLUdOT01FX19nX2xpc3RfZnJlZV8wPWNhc3Q9KEdMaXN0ICopCi0KLUdOT01FX19nX2xpc3RfbmV4dD0KLUdOT01FX19nX2xpc3RfbmV4dF8wPQotCi1HTk9NRV9fZ19vYmplY3RfdW5yZWY9Ci1HTk9NRV9fZ19vYmplY3RfdW5yZWZfMD1jYXN0PWdwb2ludGVyCi0KLUdOT01FX19nbm9tZV9pY29uX2xvb2t1cD0KLUdOT01FX19nbm9tZV9pY29uX2xvb2t1cF8wPWNhc3Q9KEdub21lSWNvblRoZW1lICopCi1HTk9NRV9fZ25vbWVfaWNvbl9sb29rdXBfMT1jYXN0PUdub21lVGh1bWJuYWlsRmFjdG9yeSAqCi1HTk9NRV9fZ25vbWVfaWNvbl9sb29rdXBfMj1jYXN0PWNvbnN0IGNoYXIgKgotR05PTUVfX2dub21lX2ljb25fbG9va3VwXzM9Y2FzdD1jb25zdCBjaGFyICoKLUdOT01FX19nbm9tZV9pY29uX2xvb2t1cF80PWNhc3Q9R25vbWVWRlNGaWxlSW5mbyAqCi1HTk9NRV9fZ25vbWVfaWNvbl9sb29rdXBfNT1jYXN0PWNvbnN0IGNoYXIgKgotR05PTUVfX2dub21lX2ljb25fbG9va3VwXzY9Y2FzdD1Hbm9tZUljb25Mb29rdXBGbGFncwotR05PTUVfX2dub21lX2ljb25fbG9va3VwXzc9Y2FzdD1Hbm9tZUljb25Mb29rdXBSZXN1bHRGbGFncyAqCi0KLUdOT01FX19nbm9tZV9pY29uX3RoZW1lX2xvb2t1cF9pY29uPQotR05PTUVfX2dub21lX2ljb25fdGhlbWVfbG9va3VwX2ljb25fMD1jYXN0PUdub21lSWNvblRoZW1lICoKLUdOT01FX19nbm9tZV9pY29uX3RoZW1lX2xvb2t1cF9pY29uXzE9Y2FzdD1jb25zdCBjaGFyICoKLUdOT01FX19nbm9tZV9pY29uX3RoZW1lX2xvb2t1cF9pY29uXzI9Ci1HTk9NRV9fZ25vbWVfaWNvbl90aGVtZV9sb29rdXBfaWNvbl8zPWNhc3Q9KGNvbnN0IEdub21lSWNvbkRhdGEgKiopCi1HTk9NRV9fZ25vbWVfaWNvbl90aGVtZV9sb29rdXBfaWNvbl80PQotCi1HTk9NRV9fZ25vbWVfaWNvbl90aGVtZV9uZXc9Ci0KLUdOT01FX19nbm9tZV92ZnNfZ2V0X3JlZ2lzdGVyZWRfbWltZV90eXBlcz0KLQotR05PTUVfX2dub21lX3Zmc19pbml0PQotCi1HTk9NRV9fZ25vbWVfdmZzX21ha2VfdXJpX2Zyb21faW5wdXQ9Ci1HTk9NRV9fZ25vbWVfdmZzX21ha2VfdXJpX2Zyb21faW5wdXRfMD1jYXN0PShjb25zdCBjaGFyICopCi0KLUdOT01FX19nbm9tZV92ZnNfbWFrZV91cmlfZnJvbV9pbnB1dF93aXRoX2RpcnM9ZmxhZ3M9ZHluYW1pYwotR05PTUVfX2dub21lX3Zmc19tYWtlX3VyaV9mcm9tX2lucHV0X3dpdGhfZGlyc18wPWNhc3Q9KGNvbnN0IGNoYXIgKikKLUdOT01FX19nbm9tZV92ZnNfbWFrZV91cmlfZnJvbV9pbnB1dF93aXRoX2RpcnNfMT0KLQotR05PTUVfX2dub21lX3Zmc19taW1lX2FwcGxpY2F0aW9uX2ZyZWU9Ci1HTk9NRV9fZ25vbWVfdmZzX21pbWVfYXBwbGljYXRpb25fZnJlZV8wPWNhc3Q9R25vbWVWRlNNaW1lQXBwbGljYXRpb24gKgotCi1HTk9NRV9fZ25vbWVfdmZzX21pbWVfYXBwbGljYXRpb25fbGF1bmNoPWZsYWdzPWR5bmFtaWMKLUdOT01FX19nbm9tZV92ZnNfbWltZV9hcHBsaWNhdGlvbl9sYXVuY2hfMD1jYXN0PShHbm9tZVZGU01pbWVBcHBsaWNhdGlvbiAqKQotR05PTUVfX2dub21lX3Zmc19taW1lX2FwcGxpY2F0aW9uX2xhdW5jaF8xPWNhc3Q9KEdMaXN0ICopCi0KLUdOT01FX19nbm9tZV92ZnNfbWltZV9leHRlbnNpb25zX2xpc3RfZnJlZT0KLUdOT01FX19nbm9tZV92ZnNfbWltZV9leHRlbnNpb25zX2xpc3RfZnJlZV8wPWNhc3Q9R0xpc3QgKgotCi1HTk9NRV9fZ25vbWVfdmZzX21pbWVfZ2V0X2RlZmF1bHRfYXBwbGljYXRpb249Ci1HTk9NRV9fZ25vbWVfdmZzX21pbWVfZ2V0X2RlZmF1bHRfYXBwbGljYXRpb25fMD1jYXN0PShjb25zdCBjaGFyICopCi0KLUdOT01FX19nbm9tZV92ZnNfbWltZV9nZXRfZXh0ZW5zaW9uc19saXN0PQotR05PTUVfX2dub21lX3Zmc19taW1lX2dldF9leHRlbnNpb25zX2xpc3RfMD1jYXN0PWNvbnN0IGNoYXIgKgotCi1HTk9NRV9fZ25vbWVfdmZzX21pbWVfcmVnaXN0ZXJlZF9taW1lX3R5cGVfbGlzdF9mcmVlPQotR05PTUVfX2dub21lX3Zmc19taW1lX3JlZ2lzdGVyZWRfbWltZV90eXBlX2xpc3RfZnJlZV8wPWNhc3Q9R0xpc3QgKgotCi1HTk9NRV9fZ25vbWVfdmZzX21pbWVfdHlwZV9mcm9tX25hbWU9Ci1HTk9NRV9fZ25vbWVfdmZzX21pbWVfdHlwZV9mcm9tX25hbWVfMD1jYXN0PShjb25zdCBjaGFyICopCi0KLUdOT01FX19nbm9tZV92ZnNfdXJsX3Nob3c9ZmxhZ3M9ZHluYW1pYwotR05PTUVfX2dub21lX3Zmc191cmxfc2hvd18wPWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotR05PTUVfbWVtbW92ZT0KLUdOT01FX21lbW1vdmVfMD1jYXN0PXZvaWQgKixmbGFncz1ub19pbgotR05PTUVfbWVtbW92ZV8xPWNhc3Q9Y29uc3Qgdm9pZCAqCi1HTk9NRV9tZW1tb3ZlXzI9Y2FzdD1zaXplX3QKLQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ25vbWVfR25vbWVWRlNNaW1lQXBwbGljYXRpb249Ci1Hbm9tZVZGU01pbWVBcHBsaWNhdGlvbl9pZD1jYXN0PWNoYXIgKgotR25vbWVWRlNNaW1lQXBwbGljYXRpb25fbmFtZT1jYXN0PWNoYXIgKgotR25vbWVWRlNNaW1lQXBwbGljYXRpb25fY29tbWFuZD1jYXN0PWNoYXIgKgotR25vbWVWRlNNaW1lQXBwbGljYXRpb25fY2FuX29wZW5fbXVsdGlwbGVfZmlsZXM9Y2FzdD1nYm9vbGVhbgotR25vbWVWRlNNaW1lQXBwbGljYXRpb25fZXhwZWN0c191cmlzPWNhc3Q9R25vbWVWRlNNaW1lQXBwbGljYXRpb25Bcmd1bWVudFR5cGUKLUdub21lVkZTTWltZUFwcGxpY2F0aW9uX3N1cHBvcnRlZF91cmlfc2NoZW1lcz1jYXN0PShHTGlzdCAqKQotR25vbWVWRlNNaW1lQXBwbGljYXRpb25fcmVxdWlyZXNfdGVybWluYWw9Y2FzdD1nYm9vbGVhbgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmdub21lLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmdub21lLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxY2M1ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5nbm9tZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc3d0X2NvcHlyaWdodD0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXAotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zXG5cCi0gKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKSBWZXJzaW9uIDIuMSB0aGF0XG5cCi0gKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiAobGdwbC12MjEudHh0KS4gIFRoZSBMR1BMIGlzIGFsc29cblwKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGdwbC5odG1sLiAgSWYgdGhlIHZlcnNpb25cblwKLSAqIG9mIHRoZSBMR1BMIGF0IGh0dHA6Ly93d3cuZ251Lm9yZyBpcyBkaWZmZXJlbnQgdG8gdGhlIHZlcnNpb24gb2ZcblwKLSAqIHRoZSBMR1BMIGFjY29tcGFueWluZyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgdGhlcmUgaXMgYW55IGNvbmZsaWN0XG5cCi0gKiBiZXR3ZWVuIHRoZSB0d28gbGljZW5zZSB2ZXJzaW9ucywgdGhlIHRlcm1zIG9mIHRoZSBMR1BMIGFjY29tcGFueWluZ1xuXAotICogdGhpcyBkaXN0cmlidXRpb24gc2hhbGwgZ292ZXJuLlxuXAotICogXG5cCi0gKiBDb250cmlidXRvcnM6XG5cCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG5cCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbgotIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ3RrLkdUSy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsuR1RLLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NzU2MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsuR1RLLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dUSz0KLUdUS19fR1RLX1dJREdFVF9IRUlHSFQ9Ci1HVEtfX0dUS19XSURHRVRfSEVJR0hUXzA9Y2FzdD1HdGtXaWRnZXQgKgotCi1HVEtfX0dUS19XSURHRVRfV0lEVEg9Ci1HVEtfX0dUS19XSURHRVRfV0lEVEhfMD1jYXN0PUd0a1dpZGdldCAqCi0KLUdUS19fZ19zaWduYWxfY29ubmVjdD0KLUdUS19fZ19zaWduYWxfY29ubmVjdF8wPWNhc3Q9KGdwb2ludGVyKQotR1RLX19nX3NpZ25hbF9jb25uZWN0XzE9Y2FzdD0oY29uc3QgZ2NoYXIgKiksZmxhZ3M9bm9fb3V0Ci1HVEtfX2dfc2lnbmFsX2Nvbm5lY3RfMj1jYXN0PShHQ2FsbGJhY2spCi1HVEtfX2dfc2lnbmFsX2Nvbm5lY3RfMz1jYXN0PWdwb2ludGVyCi0KLUdUS19fZ3RrX2V2ZW50c19wZW5kaW5nPQotCi1HVEtfX2d0a19pbml0X2NoZWNrPQotR1RLX19ndGtfaW5pdF9jaGVja18wPWNhc3Q9aW50ICoKLUdUS19fZ3RrX2luaXRfY2hlY2tfMT1jYXN0PWNoYXIgKioqCi0KLUdUS19fZ3RrX21haW49Ci0KLUdUS19fZ3RrX21haW5faXRlcmF0aW9uPQotCi1HVEtfX2d0a19wbHVnX25ldz0KLUdUS19fZ3RrX3BsdWdfbmV3XzA9Ci0KLUdUS19fZ3RrX3dpZGdldF9kZXN0cm95PQotR1RLX19ndGtfd2lkZ2V0X2Rlc3Ryb3lfMD1jYXN0PUd0a1dpZGdldCAqCi0KLUdUS19fZ3RrX3dpZGdldF9zaG93PQotR1RLX19ndGtfd2lkZ2V0X3Nob3dfMD1jYXN0PUd0a1dpZGdldCAqCi0KLUdUS19fZ3RrX3dpZGdldF9zaG93X25vdz0KLUdUS19fZ3RrX3dpZGdldF9zaG93X25vd18wPWNhc3Q9R3RrV2lkZ2V0ICoKLQotR1RLX19ndGtfd2luZG93X25ldz0KLUdUS19fZ3RrX3dpbmRvd19uZXdfMD1jYXN0PUd0a1dpbmRvd1R5cGUKLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmd0ay5PUy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsuT1MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhYTUyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmd0ay5PUy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDY5OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dJbnRlcmZhY2VJbmZvPQotR0ludGVyZmFjZUluZm9faW50ZXJmYWNlX2luaXQ9Y2FzdD0oR0ludGVyZmFjZUluaXRGdW5jKQotR0ludGVyZmFjZUluZm9faW50ZXJmYWNlX2ZpbmFsaXplPWNhc3Q9KEdJbnRlcmZhY2VGaW5hbGl6ZUZ1bmMpCi1HSW50ZXJmYWNlSW5mb19pbnRlcmZhY2VfZGF0YT1jYXN0PShncG9pbnRlcikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HT2JqZWN0Q2xhc3M9Ci1HT2JqZWN0Q2xhc3NfY29uc3RydWN0b3I9Y2FzdD0oR09iamVjdCAqKCopKCkpCi1HT2JqZWN0Q2xhc3Nfc2V0X3Byb3BlcnR5PWNhc3Q9KHZvaWQgKCopKCkpCi1HT2JqZWN0Q2xhc3NfZ2V0X3Byb3BlcnR5PWNhc3Q9KHZvaWQgKCopKCkpCi1HT2JqZWN0Q2xhc3NfZGlzcG9zZT1jYXN0PSh2b2lkICgqKSgpKQotR09iamVjdENsYXNzX2ZpbmFsaXplPWNhc3Q9KHZvaWQgKCopKCkpCi1HT2JqZWN0Q2xhc3NfZGlzcGF0Y2hfcHJvcGVydGllc19jaGFuZ2VkPWNhc3Q9KHZvaWQgKCopKCkpCi1HT2JqZWN0Q2xhc3Nfbm90aWZ5PWNhc3Q9KHZvaWQgKCopKCkpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR1R5cGVJbmZvPQotR1R5cGVJbmZvX2NsYXNzX3NpemU9Y2FzdD0oZ3VpbnQxNikKLUdUeXBlSW5mb19iYXNlX2luaXQ9Y2FzdD0oR0Jhc2VJbml0RnVuYykKLUdUeXBlSW5mb19iYXNlX2ZpbmFsaXplPWNhc3Q9KEdCYXNlRmluYWxpemVGdW5jKQotR1R5cGVJbmZvX2NsYXNzX2luaXQ9Y2FzdD0oR0NsYXNzSW5pdEZ1bmMpCi1HVHlwZUluZm9fY2xhc3NfZmluYWxpemU9Y2FzdD0oR0NsYXNzRmluYWxpemVGdW5jKQotR1R5cGVJbmZvX2NsYXNzX2RhdGE9Y2FzdD0oZ2NvbnN0cG9pbnRlcikKLUdUeXBlSW5mb19pbnN0YW5jZV9zaXplPWNhc3Q9KGd1aW50MTYpCi1HVHlwZUluZm9fbl9wcmVhbGxvY3M9Y2FzdD0oZ3VpbnQxNikKLUdUeXBlSW5mb19pbnN0YW5jZV9pbml0PWNhc3Q9KEdJbnN0YW5jZUluaXRGdW5jKQotR1R5cGVJbmZvX3ZhbHVlX3RhYmxlPWNhc3Q9KEdUeXBlVmFsdWVUYWJsZSAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dUeXBlUXVlcnk9Ci1HVHlwZVF1ZXJ5X3R5cGU9Y2FzdD0oR1R5cGUpCi1HVHlwZVF1ZXJ5X3R5cGVfbmFtZT1jYXN0PShjb25zdCBnY2hhciAqKQotR1R5cGVRdWVyeV9jbGFzc19zaXplPWNhc3Q9KGd1aW50KQotR1R5cGVRdWVyeV9pbnN0YW5jZV9zaXplPWNhc3Q9KGd1aW50KQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yPQotR2RrQ29sb3JfcGl4ZWw9Y2FzdD0oZ3VpbnQzMikKLUdka0NvbG9yX3JlZD1jYXN0PShndWludDE2KQotR2RrQ29sb3JfZ3JlZW49Y2FzdD0oZ3VpbnQxNikKLUdka0NvbG9yX2JsdWU9Y2FzdD0oZ3VpbnQxNikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtEcmFnQ29udGV4dD0KLUdka0RyYWdDb250ZXh0X3Byb3RvY29sPWNhc3Q9KEdka0RyYWdQcm90b2NvbCkKLUdka0RyYWdDb250ZXh0X2lzX3NvdXJjZT1jYXN0PShnYm9vbGVhbikKLUdka0RyYWdDb250ZXh0X3NvdXJjZV93aW5kb3c9Y2FzdD0oR2RrV2luZG93ICopCi1HZGtEcmFnQ29udGV4dF9kZXN0X3dpbmRvdz1jYXN0PShHZGtXaW5kb3cgKikKLUdka0RyYWdDb250ZXh0X3RhcmdldHM9Y2FzdD0oR0xpc3QgKikKLUdka0RyYWdDb250ZXh0X2FjdGlvbnM9Y2FzdD0oR2RrRHJhZ0FjdGlvbikKLUdka0RyYWdDb250ZXh0X3N1Z2dlc3RlZF9hY3Rpb249Y2FzdD0oR2RrRHJhZ0FjdGlvbikKLUdka0RyYWdDb250ZXh0X2FjdGlvbj1jYXN0PShHZGtEcmFnQWN0aW9uKQotR2RrRHJhZ0NvbnRleHRfc3RhcnRfdGltZT1jYXN0PShndWludDMyKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50PQotR2RrRXZlbnRfdHlwZT1jYXN0PShHZGtFdmVudFR5cGUpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRBbnk9Ci1HZGtFdmVudEFueV93aW5kb3c9Y2FzdD0oR2RrV2luZG93ICopCi1HZGtFdmVudEFueV9zZW5kX2V2ZW50PWNhc3Q9KGdpbnQ4KQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50QnV0dG9uPQotR2RrRXZlbnRCdXR0b25fd2luZG93PWNhc3Q9KEdka1dpbmRvdyAqKQotR2RrRXZlbnRCdXR0b25fc2VuZF9ldmVudD1jYXN0PShnaW50OCkKLUdka0V2ZW50QnV0dG9uX3RpbWU9Y2FzdD0oZ3VpbnQzMikKLUdka0V2ZW50QnV0dG9uX3g9Y2FzdD0oZ2RvdWJsZSkKLUdka0V2ZW50QnV0dG9uX3k9Y2FzdD0oZ2RvdWJsZSkKLUdka0V2ZW50QnV0dG9uX2F4ZXM9Y2FzdD0oZ2RvdWJsZSAqKQotR2RrRXZlbnRCdXR0b25fc3RhdGU9Y2FzdD0oZ3VpbnQpCi1HZGtFdmVudEJ1dHRvbl9idXR0b249Y2FzdD0oZ3VpbnQpCi1HZGtFdmVudEJ1dHRvbl9kZXZpY2U9Y2FzdD0oR2RrRGV2aWNlICopCi1HZGtFdmVudEJ1dHRvbl94X3Jvb3Q9Y2FzdD0oZ2RvdWJsZSkKLUdka0V2ZW50QnV0dG9uX3lfcm9vdD1jYXN0PShnZG91YmxlKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50Q3Jvc3Npbmc9Ci1HZGtFdmVudENyb3NzaW5nX3dpbmRvdz1jYXN0PShHZGtXaW5kb3cgKikKLUdka0V2ZW50Q3Jvc3Npbmdfc2VuZF9ldmVudD1jYXN0PShnaW50OCkKLUdka0V2ZW50Q3Jvc3Npbmdfc3Vid2luZG93PWNhc3Q9KEdka1dpbmRvdyAqKQotR2RrRXZlbnRDcm9zc2luZ190aW1lPQotR2RrRXZlbnRDcm9zc2luZ194PQotR2RrRXZlbnRDcm9zc2luZ195PQotR2RrRXZlbnRDcm9zc2luZ194X3Jvb3Q9Ci1HZGtFdmVudENyb3NzaW5nX3lfcm9vdD0KLUdka0V2ZW50Q3Jvc3NpbmdfbW9kZT1jYXN0PShHZGtDcm9zc2luZ01vZGUpCi1HZGtFdmVudENyb3NzaW5nX2RldGFpbD1jYXN0PShHZGtOb3RpZnlUeXBlKQotR2RrRXZlbnRDcm9zc2luZ19mb2N1cz1jYXN0PShnYm9vbGVhbikKLUdka0V2ZW50Q3Jvc3Npbmdfc3RhdGU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRFeHBvc2U9Ci1HZGtFdmVudEV4cG9zZV93aW5kb3c9Y2FzdD0oR2RrV2luZG93ICopCi1HZGtFdmVudEV4cG9zZV9zZW5kX2V2ZW50PWNhc3Q9KGdpbnQ4KQotR2RrRXZlbnRFeHBvc2VfYXJlYV94PWFjY2Vzc29yPWFyZWEueAotR2RrRXZlbnRFeHBvc2VfYXJlYV95PWFjY2Vzc29yPWFyZWEueQotR2RrRXZlbnRFeHBvc2VfYXJlYV93aWR0aD1hY2Nlc3Nvcj1hcmVhLndpZHRoCi1HZGtFdmVudEV4cG9zZV9hcmVhX2hlaWdodD1hY2Nlc3Nvcj1hcmVhLmhlaWdodAotR2RrRXZlbnRFeHBvc2VfcmVnaW9uPWNhc3Q9KEdka1JlZ2lvbiAqKQotR2RrRXZlbnRFeHBvc2VfY291bnQ9Y2FzdD0oZ2ludCkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEZvY3VzPQotR2RrRXZlbnRGb2N1c193aW5kb3c9Y2FzdD0oR2RrV2luZG93ICopCi1HZGtFdmVudEZvY3VzX3NlbmRfZXZlbnQ9Y2FzdD0oZ2ludDgpCi1HZGtFdmVudEZvY3VzX2luPWNhc3Q9KGdpbnQxNikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEtleT0KLUdka0V2ZW50S2V5X3dpbmRvdz1jYXN0PShHZGtXaW5kb3cgKikKLUdka0V2ZW50S2V5X3NlbmRfZXZlbnQ9Y2FzdD0oZ2ludDgpCi1HZGtFdmVudEtleV90aW1lPWNhc3Q9KGd1aW50MzIpCi1HZGtFdmVudEtleV9zdGF0ZT1jYXN0PShndWludCkKLUdka0V2ZW50S2V5X2tleXZhbD1jYXN0PShndWludCkKLUdka0V2ZW50S2V5X2xlbmd0aD1jYXN0PShnaW50KQotR2RrRXZlbnRLZXlfc3RyaW5nPWNhc3Q9KGdjaGFyICopCi1HZGtFdmVudEtleV9oYXJkd2FyZV9rZXljb2RlPWNhc3Q9KGd1aW50MTYpCi1HZGtFdmVudEtleV9ncm91cD1jYXN0PShndWludDgpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRNb3Rpb249Ci1HZGtFdmVudE1vdGlvbl93aW5kb3c9Y2FzdD0oR2RrV2luZG93ICopCi1HZGtFdmVudE1vdGlvbl9zZW5kX2V2ZW50PWNhc3Q9KGdpbnQ4KQotR2RrRXZlbnRNb3Rpb25fdGltZT1jYXN0PShndWludDMyKQotR2RrRXZlbnRNb3Rpb25feD1jYXN0PShnZG91YmxlKQotR2RrRXZlbnRNb3Rpb25feT1jYXN0PShnZG91YmxlKQotR2RrRXZlbnRNb3Rpb25fYXhlcz1jYXN0PShnZG91YmxlICopCi1HZGtFdmVudE1vdGlvbl9zdGF0ZT1jYXN0PShndWludCkKLUdka0V2ZW50TW90aW9uX2lzX2hpbnQ9Y2FzdD0oZ2ludDE2KQotR2RrRXZlbnRNb3Rpb25fZGV2aWNlPWNhc3Q9KEdka0RldmljZSAqKQotR2RrRXZlbnRNb3Rpb25feF9yb290PWNhc3Q9KGdkb3VibGUpCi1HZGtFdmVudE1vdGlvbl95X3Jvb3Q9Y2FzdD0oZ2RvdWJsZSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudFNjcm9sbD0KLUdka0V2ZW50U2Nyb2xsX3dpbmRvdz1jYXN0PShHZGtXaW5kb3cgKikKLUdka0V2ZW50U2Nyb2xsX3NlbmRfZXZlbnQ9Y2FzdD0oZ2ludDgpCi1HZGtFdmVudFNjcm9sbF90aW1lPWNhc3Q9KGd1aW50MzIpCi1HZGtFdmVudFNjcm9sbF94PWNhc3Q9KGdkb3VibGUpCi1HZGtFdmVudFNjcm9sbF95PWNhc3Q9KGdkb3VibGUpCi1HZGtFdmVudFNjcm9sbF9zdGF0ZT1jYXN0PShndWludCkKLUdka0V2ZW50U2Nyb2xsX2RpcmVjdGlvbj1jYXN0PShHZGtTY3JvbGxEaXJlY3Rpb24pCi1HZGtFdmVudFNjcm9sbF9kZXZpY2U9Y2FzdD0oR2RrRGV2aWNlICopCi1HZGtFdmVudFNjcm9sbF94X3Jvb3Q9Y2FzdD0oZ2RvdWJsZSkKLUdka0V2ZW50U2Nyb2xsX3lfcm9vdD1jYXN0PShnZG91YmxlKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50VmlzaWJpbGl0eT0KLUdka0V2ZW50VmlzaWJpbGl0eV93aW5kb3c9Y2FzdD0oR2RrV2luZG93ICopCi1HZGtFdmVudFZpc2liaWxpdHlfc2VuZF9ldmVudD1jYXN0PShnaW50OCkKLUdka0V2ZW50VmlzaWJpbGl0eV9zdGF0ZT1jYXN0PUdka1Zpc2liaWxpdHlTdGF0ZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50V2luZG93U3RhdGU9Ci1HZGtFdmVudFdpbmRvd1N0YXRlX3dpbmRvdz1jYXN0PShHZGtXaW5kb3cgKikKLUdka0V2ZW50V2luZG93U3RhdGVfc2VuZF9ldmVudD0KLUdka0V2ZW50V2luZG93U3RhdGVfY2hhbmdlZF9tYXNrPQotR2RrRXZlbnRXaW5kb3dTdGF0ZV9uZXdfd2luZG93X3N0YXRlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0dDVmFsdWVzPQotR2RrR0NWYWx1ZXNfZm9yZWdyb3VuZF9waXhlbD1hY2Nlc3Nvcj1mb3JlZ3JvdW5kLnBpeGVsLGNhc3Q9KGd1aW50MzIpCi1HZGtHQ1ZhbHVlc19mb3JlZ3JvdW5kX3JlZD1hY2Nlc3Nvcj1mb3JlZ3JvdW5kLnJlZCxjYXN0PShndWludDE2KQotR2RrR0NWYWx1ZXNfZm9yZWdyb3VuZF9ncmVlbj1hY2Nlc3Nvcj1mb3JlZ3JvdW5kLmdyZWVuLGNhc3Q9KGd1aW50MTYpCi1HZGtHQ1ZhbHVlc19mb3JlZ3JvdW5kX2JsdWU9YWNjZXNzb3I9Zm9yZWdyb3VuZC5ibHVlLGNhc3Q9KGd1aW50MTYpCi1HZGtHQ1ZhbHVlc19iYWNrZ3JvdW5kX3BpeGVsPWFjY2Vzc29yPWJhY2tncm91bmQucGl4ZWwsY2FzdD0oZ3VpbnQzMikKLUdka0dDVmFsdWVzX2JhY2tncm91bmRfcmVkPWFjY2Vzc29yPWJhY2tncm91bmQucmVkLGNhc3Q9KGd1aW50MTYpCi1HZGtHQ1ZhbHVlc19iYWNrZ3JvdW5kX2dyZWVuPWFjY2Vzc29yPWJhY2tncm91bmQuZ3JlZW4sY2FzdD0oZ3VpbnQxNikKLUdka0dDVmFsdWVzX2JhY2tncm91bmRfYmx1ZT1hY2Nlc3Nvcj1iYWNrZ3JvdW5kLmJsdWUsY2FzdD0oZ3VpbnQxNikKLUdka0dDVmFsdWVzX2ZvbnQ9Y2FzdD0oR2RrRm9udCAqKQotR2RrR0NWYWx1ZXNfZnVuY3Rpb249Y2FzdD0oR2RrRnVuY3Rpb24pCi1HZGtHQ1ZhbHVlc19maWxsPWNhc3Q9KEdka0ZpbGwpCi1HZGtHQ1ZhbHVlc190aWxlPWNhc3Q9KEdka1BpeG1hcCAqKQotR2RrR0NWYWx1ZXNfc3RpcHBsZT1jYXN0PShHZGtQaXhtYXAgKikKLUdka0dDVmFsdWVzX2NsaXBfbWFzaz1jYXN0PShHZGtQaXhtYXAgKikKLUdka0dDVmFsdWVzX3N1YndpbmRvd19tb2RlPWNhc3Q9KEdka1N1YndpbmRvd01vZGUpCi1HZGtHQ1ZhbHVlc190c194X29yaWdpbj1jYXN0PShnaW50KQotR2RrR0NWYWx1ZXNfdHNfeV9vcmlnaW49Y2FzdD0oZ2ludCkKLUdka0dDVmFsdWVzX2NsaXBfeF9vcmlnaW49Y2FzdD0oZ2ludCkKLUdka0dDVmFsdWVzX2NsaXBfeV9vcmlnaW49Y2FzdD0oZ2ludCkKLUdka0dDVmFsdWVzX2dyYXBoaWNzX2V4cG9zdXJlcz1jYXN0PShnaW50KQotR2RrR0NWYWx1ZXNfbGluZV93aWR0aD1jYXN0PShnaW50KQotR2RrR0NWYWx1ZXNfbGluZV9zdHlsZT1jYXN0PShHZGtMaW5lU3R5bGUpCi1HZGtHQ1ZhbHVlc19jYXBfc3R5bGU9Y2FzdD0oR2RrQ2FwU3R5bGUpCi1HZGtHQ1ZhbHVlc19qb2luX3N0eWxlPWNhc3Q9KEdka0pvaW5TdHlsZSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtHZW9tZXRyeT0KLUdka0dlb21ldHJ5X21pbl93aWR0aD0KLUdka0dlb21ldHJ5X21pbl9oZWlnaHQ9Ci1HZGtHZW9tZXRyeV9tYXhfd2lkdGg9Ci1HZGtHZW9tZXRyeV9tYXhfaGVpZ2h0PQotR2RrR2VvbWV0cnlfYmFzZV93aWR0aD0KLUdka0dlb21ldHJ5X2Jhc2VfaGVpZ2h0PQotR2RrR2VvbWV0cnlfd2lkdGhfaW5jPQotR2RrR2VvbWV0cnlfaGVpZ2h0X2luYz0KLUdka0dlb21ldHJ5X21pbl9hc3BlY3Q9Ci1HZGtHZW9tZXRyeV9tYXhfYXNwZWN0PQotR2RrR2VvbWV0cnlfd2luX2dyYXZpdHk9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrSW1hZ2U9Ci1HZGtJbWFnZV90eXBlPWNhc3Q9KEdka0ltYWdlVHlwZSkKLUdka0ltYWdlX3Zpc3VhbD1jYXN0PShHZGtWaXN1YWwgKikKLUdka0ltYWdlX2J5dGVfb3JkZXI9Y2FzdD0oR2RrQnl0ZU9yZGVyKQotR2RrSW1hZ2Vfd2lkdGg9Y2FzdD0oZ2ludCkKLUdka0ltYWdlX2hlaWdodD1jYXN0PShnaW50KQotR2RrSW1hZ2VfZGVwdGg9Y2FzdD0oZ3VpbnQxNikKLUdka0ltYWdlX2JwcD1jYXN0PShndWludDE2KQotR2RrSW1hZ2VfYnBsPWNhc3Q9KGd1aW50MTYpCi1HZGtJbWFnZV9iaXRzX3Blcl9waXhlbD1jYXN0PShndWludDE2KQotR2RrSW1hZ2VfbWVtPWNhc3Q9KGdwb2ludGVyKQotR2RrSW1hZ2VfY29sb3JtYXA9Y2FzdD0oR2RrQ29sb3JtYXAgKikKLUdka0ltYWdlX3dpbmRvd2luZ19kYXRhPWNhc3Q9KGdwb2ludGVyKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka1JlY3RhbmdsZT0KLUdka1JlY3RhbmdsZV94PWNhc3Q9KGdpbnQpCi1HZGtSZWN0YW5nbGVfeT1jYXN0PShnaW50KQotR2RrUmVjdGFuZ2xlX3dpZHRoPWNhc3Q9KGdpbnQpCi1HZGtSZWN0YW5nbGVfaGVpZ2h0PWNhc3Q9KGdpbnQpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrVmlzdWFsPQotR2RrVmlzdWFsX3R5cGU9Y2FzdD0oR2RrVmlzdWFsVHlwZSkKLUdka1Zpc3VhbF9kZXB0aD1jYXN0PShnaW50KQotR2RrVmlzdWFsX2J5dGVfb3JkZXI9Y2FzdD0oR2RrQnl0ZU9yZGVyKQotR2RrVmlzdWFsX2NvbG9ybWFwX3NpemU9Y2FzdD0oZ2ludCkKLUdka1Zpc3VhbF9iaXRzX3Blcl9yZ2I9Y2FzdD0oZ2ludCkKLUdka1Zpc3VhbF9yZWRfbWFzaz1jYXN0PShndWludDMyKQotR2RrVmlzdWFsX3JlZF9zaGlmdD1jYXN0PShnaW50KQotR2RrVmlzdWFsX3JlZF9wcmVjPWNhc3Q9KGdpbnQpCi1HZGtWaXN1YWxfZ3JlZW5fbWFzaz1jYXN0PShndWludDMyKQotR2RrVmlzdWFsX2dyZWVuX3NoaWZ0PWNhc3Q9KGdpbnQpCi1HZGtWaXN1YWxfZ3JlZW5fcHJlYz1jYXN0PShnaW50KQotR2RrVmlzdWFsX2JsdWVfbWFzaz1jYXN0PShndWludDMyKQotR2RrVmlzdWFsX2JsdWVfc2hpZnQ9Y2FzdD0oZ2ludCkKLUdka1Zpc3VhbF9ibHVlX3ByZWM9Y2FzdD0oZ2ludCkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtXaW5kb3dBdHRyPQotR2RrV2luZG93QXR0cl90aXRsZT1jYXN0PWdjaGFyICoKLUdka1dpbmRvd0F0dHJfZXZlbnRfbWFzaz0KLUdka1dpbmRvd0F0dHJfeD0KLUdka1dpbmRvd0F0dHJfeT0KLUdka1dpbmRvd0F0dHJfd2lkdGg9Ci1HZGtXaW5kb3dBdHRyX2hlaWdodD0KLUdka1dpbmRvd0F0dHJfd2NsYXNzPQotR2RrV2luZG93QXR0cl92aXN1YWw9Y2FzdD1HZGtWaXN1YWwgKgotR2RrV2luZG93QXR0cl9jb2xvcm1hcD1jYXN0PUdka0NvbG9ybWFwICoKLUdka1dpbmRvd0F0dHJfd2luZG93X3R5cGU9Ci1HZGtXaW5kb3dBdHRyX2N1cnNvcj1jYXN0PUdka0N1cnNvciAqCi1HZGtXaW5kb3dBdHRyX3dtY2xhc3NfbmFtZT1jYXN0PWdjaGFyICoKLUdka1dpbmRvd0F0dHJfd21jbGFzc19jbGFzcz1jYXN0PWdjaGFyICoKLUdka1dpbmRvd0F0dHJfb3ZlcnJpZGVfcmVkaXJlY3Q9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQWRqdXN0bWVudD0KLUd0a0FkanVzdG1lbnRfbG93ZXI9Y2FzdD0oZ2RvdWJsZSkKLUd0a0FkanVzdG1lbnRfdXBwZXI9Y2FzdD0oZ2RvdWJsZSkKLUd0a0FkanVzdG1lbnRfdmFsdWU9Y2FzdD0oZ2RvdWJsZSkKLUd0a0FkanVzdG1lbnRfc3RlcF9pbmNyZW1lbnQ9Y2FzdD0oZ2RvdWJsZSkKLUd0a0FkanVzdG1lbnRfcGFnZV9pbmNyZW1lbnQ9Y2FzdD0oZ2RvdWJsZSkKLUd0a0FkanVzdG1lbnRfcGFnZV9zaXplPWNhc3Q9KGdkb3VibGUpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQWxsb2NhdGlvbj0KLUd0a0FsbG9jYXRpb25feD0KLUd0a0FsbG9jYXRpb25feT0KLUd0a0FsbG9jYXRpb25fd2lkdGg9Ci1HdGtBbGxvY2F0aW9uX2hlaWdodD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtCb3JkZXI9Ci1HdGtCb3JkZXJfbGVmdD0KLUd0a0JvcmRlcl9yaWdodD0KLUd0a0JvcmRlcl90b3A9Ci1HdGtCb3JkZXJfYm90dG9tPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0NvbG9yU2VsZWN0aW9uRGlhbG9nPQotR3RrQ29sb3JTZWxlY3Rpb25EaWFsb2dfY29sb3JzZWw9Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtDb2xvclNlbGVjdGlvbkRpYWxvZ19va19idXR0b249Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtDb2xvclNlbGVjdGlvbkRpYWxvZ19jYW5jZWxfYnV0dG9uPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrQ29sb3JTZWxlY3Rpb25EaWFsb2dfaGVscF9idXR0b249Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQ29tYm89Ci1HdGtDb21ib19lbnRyeT1jYXN0PShHdGtXaWRnZXQgKikKLUd0a0NvbWJvX2xpc3Q9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrRmlsZVNlbGVjdGlvbj0KLUd0a0ZpbGVTZWxlY3Rpb25fZGlyX2xpc3Q9Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2ZpbGVfbGlzdD1jYXN0PShHdGtXaWRnZXQgKikKLUd0a0ZpbGVTZWxlY3Rpb25fc2VsZWN0aW9uX2VudHJ5PWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9zZWxlY3Rpb25fdGV4dD1jYXN0PShHdGtXaWRnZXQgKikKLUd0a0ZpbGVTZWxlY3Rpb25fbWFpbl92Ym94PWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9va19idXR0b249Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2NhbmNlbF9idXR0b249Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2hlbHBfYnV0dG9uPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9oaXN0b3J5X3B1bGxkb3duPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9oaXN0b3J5X21lbnU9Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2hpc3RvcnlfbGlzdD1jYXN0PShHTGlzdCAqKQotR3RrRmlsZVNlbGVjdGlvbl9maWxlb3BfZGlhbG9nPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9maWxlb3BfZW50cnk9Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2ZpbGVvcF9maWxlPWNhc3Q9KGdjaGFyICopCi1HdGtGaWxlU2VsZWN0aW9uX2NtcGxfc3RhdGU9Y2FzdD0oZ3BvaW50ZXIpCi1HdGtGaWxlU2VsZWN0aW9uX2ZpbGVvcF9jX2Rpcj1jYXN0PShHdGtXaWRnZXQgKikKLUd0a0ZpbGVTZWxlY3Rpb25fZmlsZW9wX2RlbF9maWxlPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9maWxlb3BfcmVuX2ZpbGU9Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2J1dHRvbl9hcmVhPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9hY3Rpb25fYXJlYT1jYXN0PShHdGtXaWRnZXQgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtGaXhlZD0KLUd0a0ZpeGVkX2NoaWxkcmVuPWNhc3Q9KEdMaXN0ICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrUmVxdWlzaXRpb249Ci1HdGtSZXF1aXNpdGlvbl93aWR0aD0KLUd0a1JlcXVpc2l0aW9uX2hlaWdodD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtTZWxlY3Rpb25EYXRhPQotR3RrU2VsZWN0aW9uRGF0YV9zZWxlY3Rpb249Y2FzdD0oR2RrQXRvbSkKLUd0a1NlbGVjdGlvbkRhdGFfdGFyZ2V0PWNhc3Q9KEdka0F0b20pCi1HdGtTZWxlY3Rpb25EYXRhX3R5cGU9Y2FzdD0oR2RrQXRvbSkKLUd0a1NlbGVjdGlvbkRhdGFfZm9ybWF0PWNhc3Q9KGdpbnQpCi1HdGtTZWxlY3Rpb25EYXRhX2RhdGE9Y2FzdD0oZ3VjaGFyICopCi1HdGtTZWxlY3Rpb25EYXRhX2xlbmd0aD1jYXN0PShnaW50KQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1RhcmdldEVudHJ5PQotR3RrVGFyZ2V0RW50cnlfdGFyZ2V0PWNhc3Q9KGdjaGFyICopCi1HdGtUYXJnZXRFbnRyeV9mbGFncz1jYXN0PShndWludCkKLUd0a1RhcmdldEVudHJ5X2luZm89Y2FzdD0oZ3VpbnQpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrVGFyZ2V0UGFpcj0KLUd0a1RhcmdldFBhaXJfdGFyZ2V0PWNhc3Q9KEdka0F0b20pCi1HdGtUYXJnZXRQYWlyX2ZsYWdzPWNhc3Q9KGd1aW50KQotR3RrVGFyZ2V0UGFpcl9pbmZvPWNhc3Q9KGd1aW50KQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1dpZGdldENsYXNzPQotR3RrV2lkZ2V0Q2xhc3NfYWN0aXZhdGVfc2lnbmFsPQotR3RrV2lkZ2V0Q2xhc3Nfc2V0X3Njcm9sbF9hZGp1c3RtZW50c19zaWduYWw9Ci1HdGtXaWRnZXRDbGFzc19kaXNwYXRjaF9jaGlsZF9wcm9wZXJ0aWVzX2NoYW5nZWQ9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2hvdz1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zaG93X2FsbD1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19oaWRlPWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX2hpZGVfYWxsPWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX21hcD1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc191bm1hcD1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19yZWFsaXplPWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX3VucmVhbGl6ZT1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zaXplX3JlcXVlc3Q9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2l6ZV9hbGxvY2F0ZT1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zdGF0ZV9jaGFuZ2VkPWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX3BhcmVudF9zZXQ9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfaGllcmFyY2h5X2NoYW5nZWQ9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc3R5bGVfc2V0PWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX2RpcmVjdGlvbl9jaGFuZ2VkPWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX2dyYWJfbm90aWZ5PWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX2NoaWxkX25vdGlmeT1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19tbmVtb25pY19hY3RpdmF0ZT1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZ3JhYl9mb2N1cz1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19mb2N1cz1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX2J1dHRvbl9wcmVzc19ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfYnV0dG9uX3JlbGVhc2VfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX3Njcm9sbF9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfbW90aW9uX25vdGlmeV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZGVsZXRlX2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19kZXN0cm95X2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19leHBvc2VfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX2tleV9wcmVzc19ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfa2V5X3JlbGVhc2VfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX2VudGVyX25vdGlmeV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfbGVhdmVfbm90aWZ5X2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19jb25maWd1cmVfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX2ZvY3VzX2luX2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19mb2N1c19vdXRfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX21hcF9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfdW5tYXBfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX3Byb3BlcnR5X25vdGlmeV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2VsZWN0aW9uX2NsZWFyX2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zZWxlY3Rpb25fcmVxdWVzdF9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2VsZWN0aW9uX25vdGlmeV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfcHJveGltaXR5X2luX2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19wcm94aW1pdHlfb3V0X2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc192aXNpYmlsaXR5X25vdGlmeV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfY2xpZW50X2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19ub19leHBvc2VfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX3dpbmRvd19zdGF0ZV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2VsZWN0aW9uX2dldD1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zZWxlY3Rpb25fcmVjZWl2ZWQ9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZHJhZ19iZWdpbj1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19kcmFnX2VuZD1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19kcmFnX2RhdGFfZ2V0PWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX2RyYWdfZGF0YV9kZWxldGU9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZHJhZ19sZWF2ZT1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19kcmFnX21vdGlvbj1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZHJhZ19kcm9wPWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19kcmFnX2RhdGFfcmVjZWl2ZWQ9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfcG9wdXBfbWVudT1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2hvd19oZWxwPWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19nZXRfYWNjZXNzaWJsZT1jYXN0PShBdGtPYmplY3QqKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zY3JlZW5fY2hhbmdlZD1jYXN0PSh2b2lkKCopKCkpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfTE9ORz1mbGFncz1ub19nZW4KLUxPTkdfdmFsdWU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfT1M9Ci1PU19DYWxsPQotT1NfQ2FsbF8wPQotT1NfQ2FsbF8xPQotT1NfQ2FsbF8yPQotT1NfQ2FsbF8zPQotCi1PU19HREtfRVZFTlRfVFlQRT0KLU9TX0dES19FVkVOVF9UWVBFXzA9Y2FzdD0oR2RrRXZlbnQgKikKLQotT1NfR0RLX0VWRU5UX1dJTkRPVz0KLU9TX0dES19FVkVOVF9XSU5ET1dfMD1jYXN0PShHZGtFdmVudEFueSAqKQotCi1PU19HREtfV0lORE9XSU5HX1gxMT1mbGFncz1ub19nZW4KLQotT1NfR0ludGVyZmFjZUluZm9fc2l6ZW9mPQotCi1PU19HUG9sbEZEX3NpemVvZj0KLQotT1NfR1RLX0FDQ0VMX0xBQkVMX0dFVF9BQ0NFTF9TVFJJTkc9Ci1PU19HVEtfQUNDRUxfTEFCRUxfR0VUX0FDQ0VMX1NUUklOR18wPWNhc3Q9KEd0a0FjY2VsTGFiZWwgKikKLQotT1NfR1RLX0FDQ0VMX0xBQkVMX1NFVF9BQ0NFTF9TVFJJTkc9Ci1PU19HVEtfQUNDRUxfTEFCRUxfU0VUX0FDQ0VMX1NUUklOR18wPWNhc3Q9KEd0a0FjY2VsTGFiZWwgKikKLU9TX0dUS19BQ0NFTF9MQUJFTF9TRVRfQUNDRUxfU1RSSU5HXzE9Y2FzdD0oZ2NoYXIgKikKLQotT1NfR1RLX0VOVFJZX0lNX0NPTlRFWFQ9Ci1PU19HVEtfRU5UUllfSU1fQ09OVEVYVF8wPWNhc3Q9KEd0a0VudHJ5ICopCi0KLU9TX0dUS19TQ1JPTExFRF9XSU5ET1dfSFNDUk9MTEJBUj0KLU9TX0dUS19TQ1JPTExFRF9XSU5ET1dfSFNDUk9MTEJBUl8wPWNhc3Q9KEd0a1Njcm9sbGVkV2luZG93ICopCi0KLU9TX0dUS19TQ1JPTExFRF9XSU5ET1dfU0NST0xMQkFSX1NQQUNJTkc9Ci1PU19HVEtfU0NST0xMRURfV0lORE9XX1NDUk9MTEJBUl9TUEFDSU5HXzA9Y2FzdD0oR3RrU2Nyb2xsZWRXaW5kb3cgKikKLQotT1NfR1RLX1NDUk9MTEVEX1dJTkRPV19WU0NST0xMQkFSPQotT1NfR1RLX1NDUk9MTEVEX1dJTkRPV19WU0NST0xMQkFSXzA9Y2FzdD0oR3RrU2Nyb2xsZWRXaW5kb3cgKikKLQotT1NfR1RLX1RFWFRWSUVXX0lNX0NPTlRFWFQ9Ci1PU19HVEtfVEVYVFZJRVdfSU1fQ09OVEVYVF8wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi0KLU9TX0dUS19XSURHRVRfSEVJR0hUPQotT1NfR1RLX1dJREdFVF9IRUlHSFRfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfR1RLX1dJREdFVF9SRVFVSVNJVElPTl9IRUlHSFQ9Ci1PU19HVEtfV0lER0VUX1JFUVVJU0lUSU9OX0hFSUdIVF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19HVEtfV0lER0VUX1JFUVVJU0lUSU9OX1dJRFRIPQotT1NfR1RLX1dJREdFVF9SRVFVSVNJVElPTl9XSURUSF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19HVEtfV0lER0VUX1NFVF9IRUlHSFQ9Ci1PU19HVEtfV0lER0VUX1NFVF9IRUlHSFRfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX0dUS19XSURHRVRfU0VUX0hFSUdIVF8xPQotCi1PU19HVEtfV0lER0VUX1NFVF9XSURUSD0KLU9TX0dUS19XSURHRVRfU0VUX1dJRFRIXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19HVEtfV0lER0VUX1NFVF9XSURUSF8xPQotCi1PU19HVEtfV0lER0VUX1NFVF9YPQotT1NfR1RLX1dJREdFVF9TRVRfWF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfR1RLX1dJREdFVF9TRVRfWF8xPQotCi1PU19HVEtfV0lER0VUX1NFVF9ZPQotT1NfR1RLX1dJREdFVF9TRVRfWV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfR1RLX1dJREdFVF9TRVRfWV8xPQotCi1PU19HVEtfV0lER0VUX1dJRFRIPQotT1NfR1RLX1dJREdFVF9XSURUSF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19HVEtfV0lER0VUX1dJTkRPVz0KLU9TX0dUS19XSURHRVRfV0lORE9XXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX0dUS19XSURHRVRfWD0KLU9TX0dUS19XSURHRVRfWF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19HVEtfV0lER0VUX1k9Ci1PU19HVEtfV0lER0VUX1lfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfR1R5cGVJbmZvX3NpemVvZj0KLQotT1NfR1R5cGVRdWVyeV9zaXplb2Y9Ci0KLU9TX0dka0NvbG9yX3NpemVvZj0KLQotT1NfR2RrRHJhZ0NvbnRleHRfc2l6ZW9mPQotCi1PU19HZGtFdmVudEFueV9zaXplb2Y9Ci0KLU9TX0dka0V2ZW50QnV0dG9uX3NpemVvZj0KLQotT1NfR2RrRXZlbnRDcm9zc2luZ19zaXplb2Y9Ci0KLU9TX0dka0V2ZW50RXhwb3NlX3NpemVvZj0KLQotT1NfR2RrRXZlbnRGb2N1c19zaXplb2Y9Ci0KLU9TX0dka0V2ZW50S2V5X3NpemVvZj0KLQotT1NfR2RrRXZlbnRNb3Rpb25fc2l6ZW9mPQotCi1PU19HZGtFdmVudFNjcm9sbF9zaXplb2Y9Ci0KLU9TX0dka0V2ZW50VmlzaWJpbGl0eV9zaXplb2Y9Ci0KLU9TX0dka0V2ZW50V2luZG93U3RhdGVfc2l6ZW9mPQotCi1PU19HZGtFdmVudF9zaXplb2Y9Ci0KLU9TX0dka0dDVmFsdWVzX3NpemVvZj0KLQotT1NfR2RrR2VvbWV0cnlfc2l6ZW9mPQotCi1PU19HZGtJbWFnZV9zaXplb2Y9Ci0KLU9TX0dka1JlY3RhbmdsZV9zaXplb2Y9Ci0KLU9TX0dka1Zpc3VhbF9zaXplb2Y9Ci0KLU9TX0dka1dpbmRvd0F0dHJfc2l6ZW9mPQotCi1PU19HdGtBZGp1c3RtZW50X3NpemVvZj0KLQotT1NfR3RrQWxsb2NhdGlvbl9zaXplb2Y9Ci0KLU9TX0d0a0JvcmRlcl9zaXplb2Y9Ci0KLU9TX0d0a0NvbG9yU2VsZWN0aW9uRGlhbG9nX3NpemVvZj0KLQotT1NfR3RrQ29tYm9fc2l6ZW9mPQotCi1PU19HdGtGaWxlU2VsZWN0aW9uX3NpemVvZj0KLQotT1NfR3RrRml4ZWRDbGFzc19zaXplb2Y9Ci0KLU9TX0d0a0ZpeGVkX3NpemVvZj0KLQotT1NfR3RrUmVxdWlzaXRpb25fc2l6ZW9mPQotCi1PU19HdGtTZWxlY3Rpb25EYXRhX3NpemVvZj0KLQotT1NfR3RrVGFyZ2V0RW50cnlfc2l6ZW9mPQotCi1PU19HdGtUYXJnZXRQYWlyX3NpemVvZj0KLQotT1NfR3RrVGV4dEl0ZXJfc2l6ZW9mPQotCi1PU19HdGtUcmVlSXRlcl9zaXplb2Y9Ci0KLU9TX1BUUl9zaXplb2Y9Ci0KLU9TX1BhbmdvQXR0cmlidXRlX3NpemVvZj0KLQotT1NfUGFuZ29JdGVtX3NpemVvZj0KLQotT1NfUGFuZ29MYXlvdXRMaW5lX3NpemVvZj0KLQotT1NfUGFuZ29MYXlvdXRSdW5fc2l6ZW9mPQotCi1PU19QYW5nb0xvZ0F0dHJfc2l6ZW9mPQotCi1PU19QYW5nb1JlY3RhbmdsZV9zaXplb2Y9Ci0KLU9TX1hBbnlFdmVudF9zaXplb2Y9Ci0KLU9TX1hCdXR0b25FdmVudF9zaXplb2Y9Ci0KLU9TX1hDbGllbnRNZXNzYWdlRXZlbnRfc2l6ZW9mPQotCi1PU19YQ3Jvc3NpbmdFdmVudF9zaXplb2Y9Ci0KLU9TX1hFdmVudF9zaXplb2Y9Ci0KLU9TX1hFeHBvc2VFdmVudF9zaXplb2Y9Ci0KLU9TX1hGb2N1c0NoYW5nZUV2ZW50X3NpemVvZj0KLQotT1NfWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX3NpemVvZj0KLQotT1NfWFZpc2liaWxpdHlFdmVudF9zaXplb2Y9Ci0KLU9TX1hXaW5kb3dDaGFuZ2VzX3NpemVvZj0KLQotT1NfWF9FVkVOVF9UWVBFPQotT1NfWF9FVkVOVF9UWVBFXzA9Y2FzdD0oWEV2ZW50ICopCi0KLU9TX1hfRVZFTlRfV0lORE9XPQotT1NfWF9FVkVOVF9XSU5ET1dfMD1jYXN0PShYQW55RXZlbnQgKikKLQotT1NfX0NhbGw9Ci1PU19fQ2FsbF8wPQotT1NfX0NhbGxfMT0KLU9TX19DYWxsXzI9Ci0KLU9TX19HREtfRElTUExBWT0KLQotT1NfX0dES19QSVhNQVBfWElEPQotT1NfX0dES19QSVhNQVBfWElEXzA9Y2FzdD1HZGtQaXhtYXAgKgotCi1PU19fR0RLX1JPT1RfUEFSRU5UPQotCi1PU19fR0RLX1RZUEVfQ09MT1I9ZmxhZ3M9Y29uc3QKLQotT1NfX0dES19UWVBFX1BJWEJVRj1mbGFncz1jb25zdAotCi1PU19fR1RLX0lTX0JVVFRPTj0KLU9TX19HVEtfSVNfQlVUVE9OXzA9Ci0KLU9TX19HVEtfSVNfQ0VMTF9SRU5ERVJFUl9QSVhCVUY9Ci1PU19fR1RLX0lTX0NFTExfUkVOREVSRVJfUElYQlVGXzA9Ci0KLU9TX19HVEtfSVNfQ0VMTF9SRU5ERVJFUl9URVhUPQotT1NfX0dUS19JU19DRUxMX1JFTkRFUkVSX1RFWFRfMD0KLQotT1NfX0dUS19JU19DT05UQUlORVI9Ci1PU19fR1RLX0lTX0NPTlRBSU5FUl8wPQotCi1PU19fR1RLX0lTX0lNQUdFX01FTlVfSVRFTT0KLU9TX19HVEtfSVNfSU1BR0VfTUVOVV9JVEVNXzA9Ci0KLU9TX19HVEtfU1RPQ0tfQ0FOQ0VMPWZsYWdzPWNvbnN0Ci0KLU9TX19HVEtfU1RPQ0tfT0s9ZmxhZ3M9Y29uc3QKLQotT1NfX0dUS19UWVBFX0ZJWEVEPWZsYWdzPWNvbnN0Ci0KLU9TX19HVEtfVFlQRV9XSURHRVQ9ZmxhZ3M9Y29uc3QKLQotT1NfX0dUS19XSURHRVRfRkxBR1M9Ci1PU19fR1RLX1dJREdFVF9GTEFHU18wPQotCi1PU19fR1RLX1dJREdFVF9IQVNfREVGQVVMVD0KLU9TX19HVEtfV0lER0VUX0hBU19ERUZBVUxUXzA9Ci0KLU9TX19HVEtfV0lER0VUX0hBU19GT0NVUz0KLU9TX19HVEtfV0lER0VUX0hBU19GT0NVU18wPQotCi1PU19fR1RLX1dJREdFVF9JU19TRU5TSVRJVkU9Ci1PU19fR1RLX1dJREdFVF9JU19TRU5TSVRJVkVfMD0KLQotT1NfX0dUS19XSURHRVRfTUFQUEVEPQotT1NfX0dUS19XSURHRVRfTUFQUEVEXzA9Ci0KLU9TX19HVEtfV0lER0VUX1NFTlNJVElWRT0KLU9TX19HVEtfV0lER0VUX1NFTlNJVElWRV8wPQotCi1PU19fR1RLX1dJREdFVF9TRVRfRkxBR1M9Ci1PU19fR1RLX1dJREdFVF9TRVRfRkxBR1NfMD0KLU9TX19HVEtfV0lER0VUX1NFVF9GTEFHU18xPQotCi1PU19fR1RLX1dJREdFVF9TVEFURT0KLU9TX19HVEtfV0lER0VUX1NUQVRFXzA9Ci0KLU9TX19HVEtfV0lER0VUX1VOU0VUX0ZMQUdTPQotT1NfX0dUS19XSURHRVRfVU5TRVRfRkxBR1NfMD0KLU9TX19HVEtfV0lER0VUX1VOU0VUX0ZMQUdTXzE9Ci0KLU9TX19HVEtfV0lER0VUX1ZJU0lCTEU9Ci1PU19fR1RLX1dJREdFVF9WSVNJQkxFXzA9Ci0KLU9TX19HX09CSkVDVF9DTEFTUz0KLU9TX19HX09CSkVDVF9DTEFTU18wPQotCi1PU19fR19PQkpFQ1RfR0VUX0NMQVNTPQotT1NfX0dfT0JKRUNUX0dFVF9DTEFTU18wPQotCi1PU19fR19PQkpFQ1RfVFlQRT0KLU9TX19HX09CSkVDVF9UWVBFXzA9Ci0KLU9TX19HX1RZUEVfQk9PTEVBTj1mbGFncz1jb25zdAotCi1PU19fR19UWVBFX0lOVD1mbGFncz1jb25zdAotCi1PU19fR19UWVBFX1NUUklORz1mbGFncz1jb25zdAotCi1PU19fUEFOR09fUElYRUxTPQotT1NfX1BBTkdPX1BJWEVMU18wPQotCi1PU19fUEFOR09fVFlQRV9GT05UX0RFU0NSSVBUSU9OPWZsYWdzPWNvbnN0Ci0KLU9TX19YQ2hlY2tJZkV2ZW50PQotT1NfX1hDaGVja0lmRXZlbnRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENoZWNrSWZFdmVudF8xPWNhc3Q9WEV2ZW50ICoKLU9TX19YQ2hlY2tJZkV2ZW50XzI9Y2FzdD0oQm9vbCAoKikoKSkKLU9TX19YQ2hlY2tJZkV2ZW50XzM9Y2FzdD0oWFBvaW50ZXIpCi0KLU9TX19YQ2hlY2tNYXNrRXZlbnQ9Ci1PU19fWENoZWNrTWFza0V2ZW50XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDaGVja01hc2tFdmVudF8xPWNhc3Q9KGxvbmcpCi1PU19fWENoZWNrTWFza0V2ZW50XzI9Y2FzdD0oWEV2ZW50ICopCi0KLU9TX19YQ2hlY2tXaW5kb3dFdmVudD0KLU9TX19YQ2hlY2tXaW5kb3dFdmVudF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ2hlY2tXaW5kb3dFdmVudF8xPWNhc3Q9V2luZG93Ci1PU19fWENoZWNrV2luZG93RXZlbnRfMj1jYXN0PShsb25nKQotT1NfX1hDaGVja1dpbmRvd0V2ZW50XzM9Y2FzdD0oWEV2ZW50ICopCi0KLU9TX19YRGVmYXVsdFJvb3RXaW5kb3c9Ci1PU19fWERlZmF1bHRSb290V2luZG93XzA9Y2FzdD1EaXNwbGF5ICoKLQotT1NfX1hEZWZhdWx0U2NyZWVuPQotT1NfX1hEZWZhdWx0U2NyZWVuXzA9Y2FzdD1EaXNwbGF5ICoKLQotT1NfX1hGbHVzaD0KLU9TX19YRmx1c2hfMD1jYXN0PShEaXNwbGF5ICopCi0KLU9TX19YRnJlZT0KLU9TX19YRnJlZV8wPWNhc3Q9dm9pZCAqCi0KLU9TX19YR2V0U2VsZWN0aW9uT3duZXI9Ci1PU19fWEdldFNlbGVjdGlvbk93bmVyXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hHZXRTZWxlY3Rpb25Pd25lcl8xPWNhc3Q9KEF0b20pCi0KLU9TX19YSW50ZXJuQXRvbT0KLU9TX19YSW50ZXJuQXRvbV8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWEludGVybkF0b21fMT1jYXN0PWNoYXIgKgotT1NfX1hJbnRlcm5BdG9tXzI9Y2FzdD1Cb29sCi0KLU9TX19YS2V5c3ltVG9LZXljb2RlPQotT1NfX1hLZXlzeW1Ub0tleWNvZGVfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hLZXlzeW1Ub0tleWNvZGVfMT1jYXN0PUtleVN5bQotCi1PU19fWExpc3RQcm9wZXJ0aWVzPQotT1NfX1hMaXN0UHJvcGVydGllc18wPWNhc3Q9RGlzcGxheSAqCi1PU19fWExpc3RQcm9wZXJ0aWVzXzE9Y2FzdD1XaW5kb3cKLU9TX19YTGlzdFByb3BlcnRpZXNfMj1jYXN0PWludCAqCi0KLU9TX19YUXVlcnlUcmVlPQotT1NfX1hRdWVyeVRyZWVfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hRdWVyeVRyZWVfMT1jYXN0PVdpbmRvdwotT1NfX1hRdWVyeVRyZWVfMj1jYXN0PVdpbmRvdyAqCi1PU19fWFF1ZXJ5VHJlZV8zPWNhc3Q9V2luZG93ICoKLU9TX19YUXVlcnlUcmVlXzQ9Y2FzdD1XaW5kb3cgKioKLU9TX19YUXVlcnlUcmVlXzU9Y2FzdD11bnNpZ25lZCBpbnQgKgotCi1PU19fWFJlY29uZmlndXJlV01XaW5kb3c9Ci1PU19fWFJlY29uZmlndXJlV01XaW5kb3dfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hSZWNvbmZpZ3VyZVdNV2luZG93XzE9Y2FzdD0oV2luZG93KQotT1NfX1hSZWNvbmZpZ3VyZVdNV2luZG93XzI9Ci1PU19fWFJlY29uZmlndXJlV01XaW5kb3dfMz0KLU9TX19YUmVjb25maWd1cmVXTVdpbmRvd180PWZsYWdzPW5vX291dAotCi1PU19fWFJlbmRlckNvbXBvc2l0ZT1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlckNvbXBvc2l0ZV8wPQotT1NfX1hSZW5kZXJDb21wb3NpdGVfMT0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzI9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV8zPQotT1NfX1hSZW5kZXJDb21wb3NpdGVfND0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzU9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV82PQotT1NfX1hSZW5kZXJDb21wb3NpdGVfNz0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzg9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV85PQotT1NfX1hSZW5kZXJDb21wb3NpdGVfMTA9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV8xMT0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzEyPQotCi1PU19fWFJlbmRlckNyZWF0ZVBpY3R1cmU9ZmxhZ3M9ZHluYW1pYwotT1NfX1hSZW5kZXJDcmVhdGVQaWN0dXJlXzA9Ci1PU19fWFJlbmRlckNyZWF0ZVBpY3R1cmVfMT0KLU9TX19YUmVuZGVyQ3JlYXRlUGljdHVyZV8yPQotT1NfX1hSZW5kZXJDcmVhdGVQaWN0dXJlXzM9Ci1PU19fWFJlbmRlckNyZWF0ZVBpY3R1cmVfND1mbGFncz1ub19vdXQKLQotT1NfX1hSZW5kZXJGaW5kU3RhbmRhcmRGb3JtYXQ9ZmxhZ3M9ZHluYW1pYwotT1NfX1hSZW5kZXJGaW5kU3RhbmRhcmRGb3JtYXRfMD0KLU9TX19YUmVuZGVyRmluZFN0YW5kYXJkRm9ybWF0XzE9Ci0KLU9TX19YUmVuZGVyRmluZFZpc3VhbEZvcm1hdD1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlckZpbmRWaXN1YWxGb3JtYXRfMD0KLU9TX19YUmVuZGVyRmluZFZpc3VhbEZvcm1hdF8xPQotCi1PU19fWFJlbmRlckZyZWVQaWN0dXJlPWZsYWdzPWR5bmFtaWMKLU9TX19YUmVuZGVyRnJlZVBpY3R1cmVfMD0KLU9TX19YUmVuZGVyRnJlZVBpY3R1cmVfMT0KLQotT1NfX1hSZW5kZXJRdWVyeUV4dGVuc2lvbj1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlclF1ZXJ5RXh0ZW5zaW9uXzA9Ci1PU19fWFJlbmRlclF1ZXJ5RXh0ZW5zaW9uXzE9Ci1PU19fWFJlbmRlclF1ZXJ5RXh0ZW5zaW9uXzI9Ci0KLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWN0YW5nbGVzPWZsYWdzPWR5bmFtaWMKLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWN0YW5nbGVzXzA9Ci1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVjdGFuZ2xlc18xPQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlQ2xpcFJlY3RhbmdsZXNfMj0KLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWN0YW5nbGVzXzM9Ci1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVjdGFuZ2xlc180PQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlQ2xpcFJlY3RhbmdsZXNfNT0KLQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlVHJhbnNmb3JtPWZsYWdzPWR5bmFtaWMKLU9TX19YUmVuZGVyU2V0UGljdHVyZVRyYW5zZm9ybV8wPQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlVHJhbnNmb3JtXzE9Ci1PU19fWFJlbmRlclNldFBpY3R1cmVUcmFuc2Zvcm1fMj0KLQotT1NfX1hTZW5kRXZlbnQ9Ci1PU19fWFNlbmRFdmVudF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU2VuZEV2ZW50XzE9Y2FzdD0oV2luZG93KQotT1NfX1hTZW5kRXZlbnRfMj0KLU9TX19YU2VuZEV2ZW50XzM9Ci1PU19fWFNlbmRFdmVudF80PWNhc3Q9KFhFdmVudCAqKQotCi1PU19fWFNldEVycm9ySGFuZGxlcj0KLU9TX19YU2V0RXJyb3JIYW5kbGVyXzA9Y2FzdD0oWEVycm9ySGFuZGxlcikKLQotT1NfX1hTZXRJT0Vycm9ySGFuZGxlcj0KLU9TX19YU2V0SU9FcnJvckhhbmRsZXJfMD1jYXN0PShYSU9FcnJvckhhbmRsZXIpCi0KLU9TX19YU2V0SW5wdXRGb2N1cz0KLU9TX19YU2V0SW5wdXRGb2N1c18wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFNldElucHV0Rm9jdXNfMT1jYXN0PVdpbmRvdwotT1NfX1hTZXRJbnB1dEZvY3VzXzI9Ci1PU19fWFNldElucHV0Rm9jdXNfMz0KLQotT1NfX1hTeW5jaHJvbml6ZT0KLU9TX19YU3luY2hyb25pemVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFN5bmNocm9uaXplXzE9Ci0KLU9TX19YVGVzdEZha2VCdXR0b25FdmVudD0KLU9TX19YVGVzdEZha2VCdXR0b25FdmVudF8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFRlc3RGYWtlQnV0dG9uRXZlbnRfMT0KLU9TX19YVGVzdEZha2VCdXR0b25FdmVudF8yPWNhc3Q9Qm9vbAotT1NfX1hUZXN0RmFrZUJ1dHRvbkV2ZW50XzM9Y2FzdD0odW5zaWduZWQgbG9uZykKLQotT1NfX1hUZXN0RmFrZUtleUV2ZW50PQotT1NfX1hUZXN0RmFrZUtleUV2ZW50XzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YVGVzdEZha2VLZXlFdmVudF8xPQotT1NfX1hUZXN0RmFrZUtleUV2ZW50XzI9Y2FzdD1Cb29sCi1PU19fWFRlc3RGYWtlS2V5RXZlbnRfMz1jYXN0PXVuc2lnbmVkIGxvbmcKLQotT1NfX1hUZXN0RmFrZU1vdGlvbkV2ZW50PQotT1NfX1hUZXN0RmFrZU1vdGlvbkV2ZW50XzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YVGVzdEZha2VNb3Rpb25FdmVudF8xPQotT1NfX1hUZXN0RmFrZU1vdGlvbkV2ZW50XzI9Ci1PU19fWFRlc3RGYWtlTW90aW9uRXZlbnRfMz0KLU9TX19YVGVzdEZha2VNb3Rpb25FdmVudF80PWNhc3Q9dW5zaWduZWQgbG9uZwotCi1PU19fWFdhcnBQb2ludGVyPQotT1NfX1hXYXJwUG9pbnRlcl8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFdhcnBQb2ludGVyXzE9Y2FzdD1XaW5kb3cKLU9TX19YV2FycFBvaW50ZXJfMj1jYXN0PVdpbmRvdwotT1NfX1hXYXJwUG9pbnRlcl8zPQotT1NfX1hXYXJwUG9pbnRlcl80PQotT1NfX1hXYXJwUG9pbnRlcl81PQotT1NfX1hXYXJwUG9pbnRlcl82PQotT1NfX1hXYXJwUG9pbnRlcl83PQotT1NfX1hXYXJwUG9pbnRlcl84PQotCi1PU19fYXRrX29iamVjdF9hZGRfcmVsYXRpb25zaGlwPQotT1NfX2F0a19vYmplY3RfYWRkX3JlbGF0aW9uc2hpcF8wPWNhc3Q9KEF0a09iamVjdCAqKQotT1NfX2F0a19vYmplY3RfYWRkX3JlbGF0aW9uc2hpcF8xPWNhc3Q9KEF0a1JlbGF0aW9uVHlwZSkKLU9TX19hdGtfb2JqZWN0X2FkZF9yZWxhdGlvbnNoaXBfMj1jYXN0PShBdGtPYmplY3QgKikKLQotT1NfX2RsY2xvc2U9Ci1PU19fZGxjbG9zZV8wPWNhc3Q9KHZvaWQgKikKLQotT1NfX2Rsb3Blbj0KLU9TX19kbG9wZW5fMD1jYXN0PShjb25zdCBjaGFyICopCi1PU19fZGxvcGVuXzE9Ci0KLU9TX19kbHN5bT0KLU9TX19kbHN5bV8wPWNhc3Q9KHZvaWQgKikKLU9TX19kbHN5bV8xPWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotT1NfX2dfY2Nsb3N1cmVfbmV3PQotT1NfX2dfY2Nsb3N1cmVfbmV3XzA9Y2FzdD0oR0NhbGxiYWNrKQotT1NfX2dfY2Nsb3N1cmVfbmV3XzE9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fZ19jY2xvc3VyZV9uZXdfMj1jYXN0PShHQ2xvc3VyZU5vdGlmeSkKLQotT1NfX2dfY2xvc3VyZV9yZWY9Ci1PU19fZ19jbG9zdXJlX3JlZl8wPWNhc3Q9KEdDbG9zdXJlICopCi0KLU9TX19nX2Nsb3N1cmVfdW5yZWY9Ci1PU19fZ19jbG9zdXJlX3VucmVmXzA9Y2FzdD0oR0Nsb3N1cmUgKikKLQotT1NfX2dfZmlsZW5hbWVfZnJvbV91cmk9Ci1PU19fZ19maWxlbmFtZV9mcm9tX3VyaV8wPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX19nX2ZpbGVuYW1lX2Zyb21fdXJpXzE9Y2FzdD0oY2hhciAqKikKLU9TX19nX2ZpbGVuYW1lX2Zyb21fdXJpXzI9Y2FzdD0oR0Vycm9yICoqKQotCi1PU19fZ19maWxlbmFtZV9mcm9tX3V0Zjg9Ci1PU19fZ19maWxlbmFtZV9mcm9tX3V0ZjhfMD1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2dfZmlsZW5hbWVfZnJvbV91dGY4XzE9Y2FzdD0oZ3NzaXplKQotT1NfX2dfZmlsZW5hbWVfZnJvbV91dGY4XzI9Y2FzdD0oZ3NpemUgKikKLU9TX19nX2ZpbGVuYW1lX2Zyb21fdXRmOF8zPWNhc3Q9KGdzaXplICopCi1PU19fZ19maWxlbmFtZV9mcm9tX3V0ZjhfND1jYXN0PShHRXJyb3IgKiopCi0KLU9TX19nX2ZpbGVuYW1lX3RvX3VyaT0KLU9TX19nX2ZpbGVuYW1lX3RvX3VyaV8wPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX19nX2ZpbGVuYW1lX3RvX3VyaV8xPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX19nX2ZpbGVuYW1lX3RvX3VyaV8yPWNhc3Q9KEdFcnJvciAqKikKLQotT1NfX2dfZmlsZW5hbWVfdG9fdXRmOD0KLU9TX19nX2ZpbGVuYW1lX3RvX3V0ZjhfMD1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2dfZmlsZW5hbWVfdG9fdXRmOF8xPWNhc3Q9KGdzc2l6ZSkKLU9TX19nX2ZpbGVuYW1lX3RvX3V0ZjhfMj1jYXN0PShnc2l6ZSAqKQotT1NfX2dfZmlsZW5hbWVfdG9fdXRmOF8zPWNhc3Q9KGdzaXplICopCi1PU19fZ19maWxlbmFtZV90b191dGY4XzQ9Y2FzdD0oR0Vycm9yICoqKQotCi1PU19fZ19mcmVlPQotT1NfX2dfZnJlZV8wPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ19saXN0X2FwcGVuZD0KLU9TX19nX2xpc3RfYXBwZW5kXzA9Y2FzdD0oR0xpc3QgKikKLU9TX19nX2xpc3RfYXBwZW5kXzE9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19nX2xpc3RfZGF0YT0KLU9TX19nX2xpc3RfZGF0YV8wPWNhc3Q9KEdMaXN0ICopCi0KLU9TX19nX2xpc3RfZnJlZT0KLU9TX19nX2xpc3RfZnJlZV8wPWNhc3Q9KEdMaXN0ICopCi0KLU9TX19nX2xpc3RfZnJlZV8xPQotT1NfX2dfbGlzdF9mcmVlXzFfMD1jYXN0PShHTGlzdCAqKQotCi1PU19fZ19saXN0X2xlbmd0aD0KLU9TX19nX2xpc3RfbGVuZ3RoXzA9Y2FzdD0oR0xpc3QgKikKLQotT1NfX2dfbGlzdF9uZXh0PQotT1NfX2dfbGlzdF9uZXh0XzA9Ci0KLU9TX19nX2xpc3RfbnRoPQotT1NfX2dfbGlzdF9udGhfMD1jYXN0PShHTGlzdCAqKQotT1NfX2dfbGlzdF9udGhfMT1jYXN0PShndWludCkKLQotT1NfX2dfbGlzdF9udGhfZGF0YT0KLU9TX19nX2xpc3RfbnRoX2RhdGFfMD1jYXN0PShHTGlzdCAqKQotT1NfX2dfbGlzdF9udGhfZGF0YV8xPWNhc3Q9KGd1aW50KQotCi1PU19fZ19saXN0X3ByZXBlbmQ9Ci1PU19fZ19saXN0X3ByZXBlbmRfMD1jYXN0PShHTGlzdCAqKQotT1NfX2dfbGlzdF9wcmVwZW5kXzE9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19nX2xpc3RfcHJldmlvdXM9Ci1PU19fZ19saXN0X3ByZXZpb3VzXzA9Ci0KLU9TX19nX2xpc3RfcmVtb3ZlX2xpbms9Ci1PU19fZ19saXN0X3JlbW92ZV9saW5rXzA9Y2FzdD0oR0xpc3QgKikKLU9TX19nX2xpc3RfcmVtb3ZlX2xpbmtfMT1jYXN0PShHTGlzdCAqKQotCi1PU19fZ19saXN0X3JldmVyc2U9Ci1PU19fZ19saXN0X3JldmVyc2VfMD1jYXN0PShHTGlzdCAqKQotCi1PU19fZ19saXN0X3NldF9uZXh0PQotT1NfX2dfbGlzdF9zZXRfbmV4dF8wPWNhc3Q9KEdMaXN0ICopCi1PU19fZ19saXN0X3NldF9uZXh0XzE9Y2FzdD0oR0xpc3QgKikKLQotT1NfX2dfbGlzdF9zZXRfcHJldmlvdXM9Ci1PU19fZ19saXN0X3NldF9wcmV2aW91c18wPWNhc3Q9KEdMaXN0ICopCi1PU19fZ19saXN0X3NldF9wcmV2aW91c18xPWNhc3Q9KEdMaXN0ICopCi0KLU9TX19nX2xvY2FsZV9mcm9tX3V0Zjg9Ci1PU19fZ19sb2NhbGVfZnJvbV91dGY4XzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX19nX2xvY2FsZV9mcm9tX3V0ZjhfMT1jYXN0PShnc3NpemUpCi1PU19fZ19sb2NhbGVfZnJvbV91dGY4XzI9Y2FzdD0oZ3NpemUgKikKLU9TX19nX2xvY2FsZV9mcm9tX3V0ZjhfMz1jYXN0PShnc2l6ZSAqKQotT1NfX2dfbG9jYWxlX2Zyb21fdXRmOF80PWNhc3Q9KEdFcnJvciAqKikKLQotT1NfX2dfbG9jYWxlX3RvX3V0Zjg9Ci1PU19fZ19sb2NhbGVfdG9fdXRmOF8wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ19sb2NhbGVfdG9fdXRmOF8xPWNhc3Q9KGdzc2l6ZSkKLU9TX19nX2xvY2FsZV90b191dGY4XzI9Y2FzdD0oZ3NpemUgKikKLU9TX19nX2xvY2FsZV90b191dGY4XzM9Y2FzdD0oZ3NpemUgKikKLU9TX19nX2xvY2FsZV90b191dGY4XzQ9Y2FzdD0oR0Vycm9yICoqKQotCi1PU19fZ19sb2dfZGVmYXVsdF9oYW5kbGVyPQotT1NfX2dfbG9nX2RlZmF1bHRfaGFuZGxlcl8wPWNhc3Q9KGdjaGFyICopCi1PU19fZ19sb2dfZGVmYXVsdF9oYW5kbGVyXzE9Y2FzdD0oR0xvZ0xldmVsRmxhZ3MpCi1PU19fZ19sb2dfZGVmYXVsdF9oYW5kbGVyXzI9Y2FzdD0oZ2NoYXIgKikKLU9TX19nX2xvZ19kZWZhdWx0X2hhbmRsZXJfMz1jYXN0PShncG9pbnRlcikKLQotT1NfX2dfbG9nX3JlbW92ZV9oYW5kbGVyPQotT1NfX2dfbG9nX3JlbW92ZV9oYW5kbGVyXzA9Y2FzdD0oZ2NoYXIgKiksZmxhZ3M9bm9fb3V0Ci1PU19fZ19sb2dfcmVtb3ZlX2hhbmRsZXJfMT1jYXN0PShnaW50KQotCi1PU19fZ19sb2dfc2V0X2hhbmRsZXI9Ci1PU19fZ19sb2dfc2V0X2hhbmRsZXJfMD1jYXN0PShnY2hhciAqKSxmbGFncz1ub19vdXQKLU9TX19nX2xvZ19zZXRfaGFuZGxlcl8xPWNhc3Q9KEdMb2dMZXZlbEZsYWdzKQotT1NfX2dfbG9nX3NldF9oYW5kbGVyXzI9Y2FzdD0oR0xvZ0Z1bmMpCi1PU19fZ19sb2dfc2V0X2hhbmRsZXJfMz1jYXN0PShncG9pbnRlcikKLQotT1NfX2dfbWFpbl9jb250ZXh0X2FjcXVpcmU9Ci1PU19fZ19tYWluX2NvbnRleHRfYWNxdWlyZV8wPWNhc3Q9R01haW5Db250ZXh0ICoKLQotT1NfX2dfbWFpbl9jb250ZXh0X2NoZWNrPQotT1NfX2dfbWFpbl9jb250ZXh0X2NoZWNrXzA9Y2FzdD1HTWFpbkNvbnRleHQgKgotT1NfX2dfbWFpbl9jb250ZXh0X2NoZWNrXzE9Ci1PU19fZ19tYWluX2NvbnRleHRfY2hlY2tfMj1jYXN0PUdQb2xsRkQgKgotT1NfX2dfbWFpbl9jb250ZXh0X2NoZWNrXzM9Ci0KLU9TX19nX21haW5fY29udGV4dF9kZWZhdWx0PQotCi1PU19fZ19tYWluX2NvbnRleHRfZ2V0X3BvbGxfZnVuYz0KLU9TX19nX21haW5fY29udGV4dF9nZXRfcG9sbF9mdW5jXzA9Y2FzdD1HTWFpbkNvbnRleHQgKgotCi1PU19fZ19tYWluX2NvbnRleHRfaXRlcmF0aW9uPQotT1NfX2dfbWFpbl9jb250ZXh0X2l0ZXJhdGlvbl8wPWNhc3Q9R01haW5Db250ZXh0ICoKLU9TX19nX21haW5fY29udGV4dF9pdGVyYXRpb25fMT0KLQotT1NfX2dfbWFpbl9jb250ZXh0X3BlbmRpbmc9Ci1PU19fZ19tYWluX2NvbnRleHRfcGVuZGluZ18wPWNhc3Q9R01haW5Db250ZXh0ICoKLQotT1NfX2dfbWFpbl9jb250ZXh0X3ByZXBhcmU9Ci1PU19fZ19tYWluX2NvbnRleHRfcHJlcGFyZV8wPWNhc3Q9R01haW5Db250ZXh0ICoKLU9TX19nX21haW5fY29udGV4dF9wcmVwYXJlXzE9Ci0KLU9TX19nX21haW5fY29udGV4dF9xdWVyeT0KLU9TX19nX21haW5fY29udGV4dF9xdWVyeV8wPWNhc3Q9R01haW5Db250ZXh0ICoKLU9TX19nX21haW5fY29udGV4dF9xdWVyeV8xPQotT1NfX2dfbWFpbl9jb250ZXh0X3F1ZXJ5XzI9Ci1PU19fZ19tYWluX2NvbnRleHRfcXVlcnlfMz1jYXN0PUdQb2xsRkQgKgotT1NfX2dfbWFpbl9jb250ZXh0X3F1ZXJ5XzQ9Ci0KLU9TX19nX21haW5fY29udGV4dF9yZWxlYXNlPQotT1NfX2dfbWFpbl9jb250ZXh0X3JlbGVhc2VfMD1jYXN0PUdNYWluQ29udGV4dCAqCi0KLU9TX19nX21hbGxvYz0KLU9TX19nX21hbGxvY18wPWNhc3Q9KGd1bG9uZykKLQotT1NfX2dfb2JqZWN0X2dldD0KLU9TX19nX29iamVjdF9nZXRfMD1jYXN0PUdPYmplY3QgKgotT1NfX2dfb2JqZWN0X2dldF8xPWNhc3Q9KGNvbnN0IGdjaGFyICopLGZsYWdzPW5vX291dAotT1NfX2dfb2JqZWN0X2dldF8yPQotT1NfX2dfb2JqZWN0X2dldF8zPQotCi1PU19fZ19vYmplY3RfZ2V0X3FkYXRhPQotT1NfX2dfb2JqZWN0X2dldF9xZGF0YV8wPWNhc3Q9KEdPYmplY3QgKikKLU9TX19nX29iamVjdF9nZXRfcWRhdGFfMT1jYXN0PShHUXVhcmspCi0KLU9TX19nX29iamVjdF9uZXc9Ci1PU19fZ19vYmplY3RfbmV3XzA9Y2FzdD0oR1R5cGUpCi1PU19fZ19vYmplY3RfbmV3XzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2dfb2JqZWN0X3JlZj0KLU9TX19nX29iamVjdF9yZWZfMD1jYXN0PShncG9pbnRlcikKLQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQkZJPQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQkZJXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCRklfMT1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQKLU9TX18xZ18xb2JqZWN0XzFzZXRfX0lfM0JGSV8yPQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQkZJXzM9Ci0KLU9TX18xZ18xb2JqZWN0XzFzZXRfX0lfM0JJST0KLU9TX18xZ18xb2JqZWN0XzFzZXRfX0lfM0JJSV8wPWNhc3Q9KGdwb2ludGVyKQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQklJXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKiksZmxhZ3M9bm9fb3V0Ci1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCSUlfMj0KLU9TX18xZ18xb2JqZWN0XzFzZXRfX0lfM0JJSV8zPQotCi1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCSkk9Ci1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCSklfMD1jYXN0PShncG9pbnRlcikKLU9TX18xZ18xb2JqZWN0XzFzZXRfX0lfM0JKSV8xPWNhc3Q9KGNvbnN0IGdjaGFyICopLGZsYWdzPW5vX291dAotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQkpJXzI9Ci1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCSklfMz0KLQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQlpJPQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQlpJXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCWklfMT1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQKLU9TX18xZ18xb2JqZWN0XzFzZXRfX0lfM0JaSV8yPQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQlpJXzM9Ci0KLU9TX19nX29iamVjdF9zZXRfcWRhdGE9Ci1PU19fZ19vYmplY3Rfc2V0X3FkYXRhXzA9Y2FzdD0oR09iamVjdCAqKQotT1NfX2dfb2JqZWN0X3NldF9xZGF0YV8xPWNhc3Q9KEdRdWFyaykKLU9TX19nX29iamVjdF9zZXRfcWRhdGFfMj1jYXN0PShncG9pbnRlcikKLQotT1NfX2dfb2JqZWN0X3VucmVmPQotT1NfX2dfb2JqZWN0X3VucmVmXzA9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19nX3F1YXJrX2Zyb21fc3RyaW5nPQotT1NfX2dfcXVhcmtfZnJvbV9zdHJpbmdfMD1jYXN0PWNvbnN0IGdjaGFyICosZmxhZ3M9bm9fb3V0Ci0KLU9TX19nX3NldF9wcmduYW1lPQotT1NfX2dfc2V0X3ByZ25hbWVfMD1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQKLQotT1NfX2dfc2lnbmFsX2Nvbm5lY3Q9Ci1PU19fZ19zaWduYWxfY29ubmVjdF8wPWNhc3Q9KGdwb2ludGVyKQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfMT1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQKLU9TX19nX3NpZ25hbF9jb25uZWN0XzI9Y2FzdD0oR0NhbGxiYWNrKQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfMz1jYXN0PShncG9pbnRlcikKLQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfYWZ0ZXI9Ci1PU19fZ19zaWduYWxfY29ubmVjdF9hZnRlcl8wPWNhc3Q9KGdwb2ludGVyKQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfYWZ0ZXJfMT1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQKLU9TX19nX3NpZ25hbF9jb25uZWN0X2FmdGVyXzI9Y2FzdD0oR0NhbGxiYWNrKQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfYWZ0ZXJfMz1jYXN0PShncG9pbnRlcikKLQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfY2xvc3VyZT0KLU9TX19nX3NpZ25hbF9jb25uZWN0X2Nsb3N1cmVfMD1jYXN0PShncG9pbnRlcikKLU9TX19nX3NpZ25hbF9jb25uZWN0X2Nsb3N1cmVfMT1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfY2xvc3VyZV8yPWNhc3Q9KEdDbG9zdXJlICopCi1PU19fZ19zaWduYWxfY29ubmVjdF9jbG9zdXJlXzM9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19nX3NpZ25hbF9jb25uZWN0X2Nsb3N1cmVfYnlfaWQ9Ci1PU19fZ19zaWduYWxfY29ubmVjdF9jbG9zdXJlX2J5X2lkXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fZ19zaWduYWxfY29ubmVjdF9jbG9zdXJlX2J5X2lkXzE9Y2FzdD0oZ3VpbnQpCi1PU19fZ19zaWduYWxfY29ubmVjdF9jbG9zdXJlX2J5X2lkXzI9Y2FzdD0oR1F1YXJrKQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfY2xvc3VyZV9ieV9pZF8zPWNhc3Q9KEdDbG9zdXJlICopCi1PU19fZ19zaWduYWxfY29ubmVjdF9jbG9zdXJlX2J5X2lkXzQ9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX18xZ18xc2lnbmFsXzFlbWl0XzFieV8xbmFtZV9fSV8zQj0KLU9TX18xZ18xc2lnbmFsXzFlbWl0XzFieV8xbmFtZV9fSV8zQl8wPWNhc3Q9KGdwb2ludGVyKQotT1NfXzFnXzFzaWduYWxfMWVtaXRfMWJ5XzFuYW1lX19JXzNCXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX18xZ18xc2lnbmFsXzFlbWl0XzFieV8xbmFtZV9fSV8zQkk9Ci1PU19fMWdfMXNpZ25hbF8xZW1pdF8xYnlfMW5hbWVfX0lfM0JJXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fMWdfMXNpZ25hbF8xZW1pdF8xYnlfMW5hbWVfX0lfM0JJXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKiksZmxhZ3M9bm9fb3V0Ci1PU19fMWdfMXNpZ25hbF8xZW1pdF8xYnlfMW5hbWVfX0lfM0JJXzI9Ci0KLU9TX18xZ18xc2lnbmFsXzFlbWl0XzFieV8xbmFtZV9fSV8zQklJPQotT1NfXzFnXzFzaWduYWxfMWVtaXRfMWJ5XzFuYW1lX19JXzNCSUlfMD1jYXN0PShncG9pbnRlcikKLU9TX18xZ18xc2lnbmFsXzFlbWl0XzFieV8xbmFtZV9fSV8zQklJXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKiksZmxhZ3M9bm9fb3V0Ci1PU19fMWdfMXNpZ25hbF8xZW1pdF8xYnlfMW5hbWVfX0lfM0JJSV8yPQotT1NfXzFnXzFzaWduYWxfMWVtaXRfMWJ5XzFuYW1lX19JXzNCSUlfMz0KLQotT1NfXzFnXzFzaWduYWxfMWVtaXRfMWJ5XzFuYW1lX19JXzNCXzNCPQotT1NfXzFnXzFzaWduYWxfMWVtaXRfMWJ5XzFuYW1lX19JXzNCXzNCXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fMWdfMXNpZ25hbF8xZW1pdF8xYnlfMW5hbWVfX0lfM0JfM0JfMT1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQKLU9TX18xZ18xc2lnbmFsXzFlbWl0XzFieV8xbmFtZV9fSV8zQl8zQl8yPQotCi1PU19fZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0PQotT1NfX2dfc2lnbmFsX2hhbmRsZXJfZGlzY29ubmVjdF8wPWNhc3Q9KGdwb2ludGVyKQotT1NfX2dfc2lnbmFsX2hhbmRsZXJfZGlzY29ubmVjdF8xPWNhc3Q9KGd1bG9uZykKLQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX2Jsb2NrX21hdGNoZWQ9Ci1PU19fZ19zaWduYWxfaGFuZGxlcnNfYmxvY2tfbWF0Y2hlZF8wPWNhc3Q9KGdwb2ludGVyKQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX2Jsb2NrX21hdGNoZWRfMT1jYXN0PShHU2lnbmFsTWF0Y2hUeXBlKQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX2Jsb2NrX21hdGNoZWRfMj1jYXN0PShndWludCkKLU9TX19nX3NpZ25hbF9oYW5kbGVyc19ibG9ja19tYXRjaGVkXzM9Y2FzdD0oR1F1YXJrKQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX2Jsb2NrX21hdGNoZWRfND1jYXN0PShHQ2xvc3VyZSAqKQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX2Jsb2NrX21hdGNoZWRfNT1jYXN0PShncG9pbnRlcikKLU9TX19nX3NpZ25hbF9oYW5kbGVyc19ibG9ja19tYXRjaGVkXzY9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19nX3NpZ25hbF9oYW5kbGVyc19kaXNjb25uZWN0X21hdGNoZWQ9Ci1PU19fZ19zaWduYWxfaGFuZGxlcnNfZGlzY29ubmVjdF9tYXRjaGVkXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfZGlzY29ubmVjdF9tYXRjaGVkXzE9Y2FzdD0oR1NpZ25hbE1hdGNoVHlwZSkKLU9TX19nX3NpZ25hbF9oYW5kbGVyc19kaXNjb25uZWN0X21hdGNoZWRfMj1jYXN0PShndWludCkKLU9TX19nX3NpZ25hbF9oYW5kbGVyc19kaXNjb25uZWN0X21hdGNoZWRfMz1jYXN0PShHUXVhcmspCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfZGlzY29ubmVjdF9tYXRjaGVkXzQ9Y2FzdD0oR0Nsb3N1cmUgKikKLU9TX19nX3NpZ25hbF9oYW5kbGVyc19kaXNjb25uZWN0X21hdGNoZWRfNT1jYXN0PShncG9pbnRlcikKLU9TX19nX3NpZ25hbF9oYW5kbGVyc19kaXNjb25uZWN0X21hdGNoZWRfNj1jYXN0PShncG9pbnRlcikKLQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX3VuYmxvY2tfbWF0Y2hlZD0KLU9TX19nX3NpZ25hbF9oYW5kbGVyc191bmJsb2NrX21hdGNoZWRfMD1jYXN0PShncG9pbnRlcikKLU9TX19nX3NpZ25hbF9oYW5kbGVyc191bmJsb2NrX21hdGNoZWRfMT1jYXN0PShHU2lnbmFsTWF0Y2hUeXBlKQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX3VuYmxvY2tfbWF0Y2hlZF8yPWNhc3Q9KGd1aW50KQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX3VuYmxvY2tfbWF0Y2hlZF8zPWNhc3Q9KEdRdWFyaykKLU9TX19nX3NpZ25hbF9oYW5kbGVyc191bmJsb2NrX21hdGNoZWRfND1jYXN0PShHQ2xvc3VyZSAqKQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX3VuYmxvY2tfbWF0Y2hlZF81PWNhc3Q9KGdwb2ludGVyKQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX3VuYmxvY2tfbWF0Y2hlZF82PWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ19zaWduYWxfbG9va3VwPQotT1NfX2dfc2lnbmFsX2xvb2t1cF8wPWNhc3Q9Y29uc3QgZ2NoYXIgKixmbGFncz1ub19vdXQKLU9TX19nX3NpZ25hbF9sb29rdXBfMT0KLQotT1NfX2dfc2lnbmFsX3N0b3BfZW1pc3Npb25fYnlfbmFtZT0KLU9TX19nX3NpZ25hbF9zdG9wX2VtaXNzaW9uX2J5X25hbWVfMD1jYXN0PShncG9pbnRlcikKLU9TX19nX3NpZ25hbF9zdG9wX2VtaXNzaW9uX2J5X25hbWVfMT1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQKLQotT1NfX2dfc2xpc3RfZGF0YT0KLU9TX19nX3NsaXN0X2RhdGFfMD1jYXN0PShHU0xpc3QgKikKLQotT1NfX2dfc2xpc3RfZnJlZT0KLU9TX19nX3NsaXN0X2ZyZWVfMD1jYXN0PShHU0xpc3QgKikKLQotT1NfX2dfc2xpc3RfbGVuZ3RoPQotT1NfX2dfc2xpc3RfbGVuZ3RoXzA9Y2FzdD0oR1NMaXN0ICopCi0KLU9TX19nX3NsaXN0X25leHQ9Ci1PU19fZ19zbGlzdF9uZXh0XzA9Y2FzdD1HU0xpc3QgKgotCi1PU19fZ19zdHJmcmVldj0KLU9TX19nX3N0cmZyZWV2XzA9Y2FzdD0oZ2NoYXIgKiopCi0KLU9TX19nX3RocmVhZF9pbml0PQotT1NfX2dfdGhyZWFkX2luaXRfMD1jYXN0PUdUaHJlYWRGdW5jdGlvbnMgKgotCi1PU19fZ190aHJlYWRfc3VwcG9ydGVkPQotCi1PU19fZ190eXBlX2FkZF9pbnRlcmZhY2Vfc3RhdGljPQotT1NfX2dfdHlwZV9hZGRfaW50ZXJmYWNlX3N0YXRpY18wPWNhc3Q9KEdUeXBlKQotT1NfX2dfdHlwZV9hZGRfaW50ZXJmYWNlX3N0YXRpY18xPWNhc3Q9KEdUeXBlKQotT1NfX2dfdHlwZV9hZGRfaW50ZXJmYWNlX3N0YXRpY18yPWNhc3Q9KGNvbnN0IEdJbnRlcmZhY2VJbmZvICopCi0KLU9TX19nX3R5cGVfY2xhc3NfcGVlaz0KLU9TX19nX3R5cGVfY2xhc3NfcGVla18wPWNhc3Q9KEdUeXBlKQotCi1PU19fZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50PQotT1NfX2dfdHlwZV9jbGFzc19wZWVrX3BhcmVudF8wPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ190eXBlX2Zyb21fbmFtZT0KLU9TX19nX3R5cGVfZnJvbV9uYW1lXzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2dfdHlwZV9pbnRlcmZhY2VfcGVla19wYXJlbnQ9Ci1PU19fZ190eXBlX2ludGVyZmFjZV9wZWVrX3BhcmVudF8wPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ190eXBlX2lzX2E9Ci1PU19fZ190eXBlX2lzX2FfMD1jYXN0PShHVHlwZSkKLU9TX19nX3R5cGVfaXNfYV8xPWNhc3Q9KEdUeXBlKQotCi1PU19fZ190eXBlX25hbWU9Ci1PU19fZ190eXBlX25hbWVfMD1jYXN0PShHVHlwZSkKLQotT1NfX2dfdHlwZV9wYXJlbnQ9Ci1PU19fZ190eXBlX3BhcmVudF8wPWNhc3Q9KEdUeXBlKQotCi1PU19fZ190eXBlX3F1ZXJ5PQotT1NfX2dfdHlwZV9xdWVyeV8wPWNhc3Q9KEdUeXBlKQotT1NfX2dfdHlwZV9xdWVyeV8xPWNhc3Q9KEdUeXBlUXVlcnkgKikKLQotT1NfX2dfdHlwZV9yZWdpc3Rlcl9zdGF0aWM9Ci1PU19fZ190eXBlX3JlZ2lzdGVyX3N0YXRpY18wPWNhc3Q9KEdUeXBlKQotT1NfX2dfdHlwZV9yZWdpc3Rlcl9zdGF0aWNfMT1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2dfdHlwZV9yZWdpc3Rlcl9zdGF0aWNfMj1jYXN0PShjb25zdCBHVHlwZUluZm8gKikKLU9TX19nX3R5cGVfcmVnaXN0ZXJfc3RhdGljXzM9Y2FzdD0oR1R5cGVGbGFncykKLQotT1NfX2dfdXRmMTZfdG9fdXRmOD0KLU9TX19nX3V0ZjE2X3RvX3V0ZjhfMD1jYXN0PShjb25zdCBndW5pY2hhcjIgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19fZ191dGYxNl90b191dGY4XzE9Y2FzdD0oZ2xvbmcpCi1PU19fZ191dGYxNl90b191dGY4XzI9Y2FzdD0oZ2xvbmcgKiksZmxhZ3M9Y3JpdGljYWwKLU9TX19nX3V0ZjE2X3RvX3V0ZjhfMz1jYXN0PShnbG9uZyAqKSxmbGFncz1jcml0aWNhbAotT1NfX2dfdXRmMTZfdG9fdXRmOF80PWNhc3Q9KEdFcnJvciAqKiksZmxhZ3M9Y3JpdGljYWwKLQotT1NfX2dfdXRmOF9vZmZzZXRfdG9fcG9pbnRlcj0KLU9TX19nX3V0Zjhfb2Zmc2V0X3RvX3BvaW50ZXJfMD1jYXN0PWNvbnN0IGdjaGFyICoKLU9TX19nX3V0Zjhfb2Zmc2V0X3RvX3BvaW50ZXJfMT0KLQotT1NfX2dfdXRmOF9wb2ludGVyX3RvX29mZnNldD0KLU9TX19nX3V0ZjhfcG9pbnRlcl90b19vZmZzZXRfMD1jYXN0PWNvbnN0IGdjaGFyICoKLU9TX19nX3V0ZjhfcG9pbnRlcl90b19vZmZzZXRfMT1jYXN0PWNvbnN0IGdjaGFyICoKLQotT1NfX2dfdXRmOF9zdHJsZW49Ci1PU19fZ191dGY4X3N0cmxlbl8wPWNhc3Q9Y29uc3QgZ2NoYXIgKgotT1NfX2dfdXRmOF9zdHJsZW5fMT0KLQotT1NfXzFnXzF1dGY4XzF0b18xdXRmMTZfX0lJXzNJXzNJXzNJPQotT1NfXzFnXzF1dGY4XzF0b18xdXRmMTZfX0lJXzNJXzNJXzNJXzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX18xZ18xdXRmOF8xdG9fMXV0ZjE2X19JSV8zSV8zSV8zSV8xPWNhc3Q9KGdsb25nKQotT1NfXzFnXzF1dGY4XzF0b18xdXRmMTZfX0lJXzNJXzNJXzNJXzI9Y2FzdD0oZ2xvbmcgKiksZmxhZ3M9Y3JpdGljYWwKLU9TX18xZ18xdXRmOF8xdG9fMXV0ZjE2X19JSV8zSV8zSV8zSV8zPWNhc3Q9KGdsb25nICopLGZsYWdzPWNyaXRpY2FsCi1PU19fMWdfMXV0ZjhfMXRvXzF1dGYxNl9fSUlfM0lfM0lfM0lfND1jYXN0PShHRXJyb3IgKiopLGZsYWdzPWNyaXRpY2FsCi0KLU9TX18xZ18xdXRmOF8xdG9fMXV0ZjE2X19fM0JJXzNJXzNJXzNJPQotT1NfXzFnXzF1dGY4XzF0b18xdXRmMTZfX18zQklfM0lfM0lfM0lfMD1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX18xZ18xdXRmOF8xdG9fMXV0ZjE2X19fM0JJXzNJXzNJXzNJXzE9Y2FzdD0oZ2xvbmcpCi1PU19fMWdfMXV0ZjhfMXRvXzF1dGYxNl9fXzNCSV8zSV8zSV8zSV8yPWNhc3Q9KGdsb25nICopLGZsYWdzPWNyaXRpY2FsCi1PU19fMWdfMXV0ZjhfMXRvXzF1dGYxNl9fXzNCSV8zSV8zSV8zSV8zPWNhc3Q9KGdsb25nICopLGZsYWdzPWNyaXRpY2FsCi1PU19fMWdfMXV0ZjhfMXRvXzF1dGYxNl9fXzNCSV8zSV8zSV8zSV80PWNhc3Q9KEdFcnJvciAqKiksZmxhZ3M9Y3JpdGljYWwKLQotT1NfX2dka19hdG9tX2ludGVybj0KLU9TX19nZGtfYXRvbV9pbnRlcm5fMD1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX19nZGtfYXRvbV9pbnRlcm5fMT0KLQotT1NfX2dka19hdG9tX25hbWU9Ci1PU19fZ2RrX2F0b21fbmFtZV8wPWNhc3Q9KEdka0F0b20pCi0KLU9TX19nZGtfYmVlcD0KLQotT1NfX2dka19iaXRtYXBfY3JlYXRlX2Zyb21fZGF0YT0KLU9TX19nZGtfYml0bWFwX2NyZWF0ZV9mcm9tX2RhdGFfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfYml0bWFwX2NyZWF0ZV9mcm9tX2RhdGFfMT1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX19nZGtfYml0bWFwX2NyZWF0ZV9mcm9tX2RhdGFfMj1jYXN0PShnaW50KQotT1NfX2dka19iaXRtYXBfY3JlYXRlX2Zyb21fZGF0YV8zPWNhc3Q9KGdpbnQpCi0KLU9TX19nZGtfY29sb3Jfd2hpdGU9Ci1PU19fZ2RrX2NvbG9yX3doaXRlXzA9Y2FzdD0oR2RrQ29sb3JtYXAgKikKLU9TX19nZGtfY29sb3Jfd2hpdGVfMT1jYXN0PShHZGtDb2xvciAqKSxmbGFncz1ub19pbgotCi1PU19fZ2RrX2NvbG9ybWFwX2FsbG9jX2NvbG9yPQotT1NfX2dka19jb2xvcm1hcF9hbGxvY19jb2xvcl8wPWNhc3Q9KEdka0NvbG9ybWFwICopCi1PU19fZ2RrX2NvbG9ybWFwX2FsbG9jX2NvbG9yXzE9Y2FzdD0oR2RrQ29sb3IgKikKLU9TX19nZGtfY29sb3JtYXBfYWxsb2NfY29sb3JfMj1jYXN0PShnYm9vbGVhbikKLU9TX19nZGtfY29sb3JtYXBfYWxsb2NfY29sb3JfMz1jYXN0PShnYm9vbGVhbikKLQotT1NfX2dka19jb2xvcm1hcF9mcmVlX2NvbG9ycz0KLU9TX19nZGtfY29sb3JtYXBfZnJlZV9jb2xvcnNfMD1jYXN0PShHZGtDb2xvcm1hcCAqKQotT1NfX2dka19jb2xvcm1hcF9mcmVlX2NvbG9yc18xPWNhc3Q9KEdka0NvbG9yICopLGZsYWdzPW5vX291dAotT1NfX2dka19jb2xvcm1hcF9mcmVlX2NvbG9yc18yPWNhc3Q9KGdpbnQpCi0KLU9TX19nZGtfY29sb3JtYXBfZ2V0X3N5c3RlbT0KLQotT1NfX2dka19jb2xvcm1hcF9xdWVyeV9jb2xvcj0KLU9TX19nZGtfY29sb3JtYXBfcXVlcnlfY29sb3JfMD1jYXN0PShHZGtDb2xvcm1hcCAqKQotT1NfX2dka19jb2xvcm1hcF9xdWVyeV9jb2xvcl8xPWNhc3Q9KGd1bG9uZykKLU9TX19nZGtfY29sb3JtYXBfcXVlcnlfY29sb3JfMj1jYXN0PShHZGtDb2xvciAqKQotCi1PU19fZ2RrX2N1cnNvcl9kZXN0cm95PQotT1NfX2dka19jdXJzb3JfZGVzdHJveV8wPWNhc3Q9KEdka0N1cnNvciAqKQotCi1PU19fZ2RrX2N1cnNvcl9uZXc9Ci1PU19fZ2RrX2N1cnNvcl9uZXdfMD1jYXN0PShHZGtDdXJzb3JUeXBlKQotCi1PU19fZ2RrX2N1cnNvcl9uZXdfZnJvbV9waXhtYXA9Ci1PU19fZ2RrX2N1cnNvcl9uZXdfZnJvbV9waXhtYXBfMD1jYXN0PShHZGtQaXhtYXAgKikKLU9TX19nZGtfY3Vyc29yX25ld19mcm9tX3BpeG1hcF8xPWNhc3Q9KEdka1BpeG1hcCAqKQotT1NfX2dka19jdXJzb3JfbmV3X2Zyb21fcGl4bWFwXzI9Y2FzdD0oR2RrQ29sb3IgKiksZmxhZ3M9bm9fb3V0Ci1PU19fZ2RrX2N1cnNvcl9uZXdfZnJvbV9waXhtYXBfMz1jYXN0PShHZGtDb2xvciAqKSxmbGFncz1ub19vdXQKLU9TX19nZGtfY3Vyc29yX25ld19mcm9tX3BpeG1hcF80PWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2N1cnNvcl9uZXdfZnJvbV9waXhtYXBfNT1jYXN0PShnaW50KQotCi1PU19fZ2RrX2RyYWdfc3RhdHVzPQotT1NfX2dka19kcmFnX3N0YXR1c18wPWNhc3Q9KEdka0RyYWdDb250ZXh0ICopCi1PU19fZ2RrX2RyYWdfc3RhdHVzXzE9Y2FzdD0oR2RrRHJhZ0FjdGlvbikKLU9TX19nZGtfZHJhZ19zdGF0dXNfMj1jYXN0PShndWludDMyKQotCi1PU19fZ2RrX2RyYXdfYXJjPQotT1NfX2dka19kcmF3X2FyY18wPWNhc3Q9KEdka0RyYXdhYmxlICopCi1PU19fZ2RrX2RyYXdfYXJjXzE9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZHJhd19hcmNfMj1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2FyY18zPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfYXJjXzQ9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19hcmNfNT1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2FyY182PWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfYXJjXzc9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19hcmNfOD1jYXN0PShnaW50KQotCi1PU19fZ2RrX2RyYXdfZHJhd2FibGU9Ci1PU19fZ2RrX2RyYXdfZHJhd2FibGVfMD1jYXN0PShHZGtEcmF3YWJsZSAqKQotT1NfX2dka19kcmF3X2RyYXdhYmxlXzE9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZHJhd19kcmF3YWJsZV8yPWNhc3Q9KEdka0RyYXdhYmxlICopCi1PU19fZ2RrX2RyYXdfZHJhd2FibGVfMz1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2RyYXdhYmxlXzQ9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19kcmF3YWJsZV81PWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfZHJhd2FibGVfNj1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2RyYXdhYmxlXzc9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19kcmF3YWJsZV84PWNhc3Q9KGdpbnQpCi0KLU9TX19nZGtfZHJhd19pbWFnZT0KLU9TX19nZGtfZHJhd19pbWFnZV8wPWNhc3Q9KEdka0RyYXdhYmxlICopCi1PU19fZ2RrX2RyYXdfaW1hZ2VfMT1jYXN0PShHZGtHQyAqKQotT1NfX2dka19kcmF3X2ltYWdlXzI9Y2FzdD1HZGtJbWFnZSAqCi1PU19fZ2RrX2RyYXdfaW1hZ2VfMz0KLU9TX19nZGtfZHJhd19pbWFnZV80PQotT1NfX2dka19kcmF3X2ltYWdlXzU9Ci1PU19fZ2RrX2RyYXdfaW1hZ2VfNj0KLU9TX19nZGtfZHJhd19pbWFnZV83PQotT1NfX2dka19kcmF3X2ltYWdlXzg9Ci0KLU9TX19nZGtfZHJhd19sYXlvdXQ9Ci1PU19fZ2RrX2RyYXdfbGF5b3V0XzA9Y2FzdD0oR2RrRHJhd2FibGUgKikKLU9TX19nZGtfZHJhd19sYXlvdXRfMT1jYXN0PShHZGtHQyAqKQotT1NfX2dka19kcmF3X2xheW91dF8yPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfbGF5b3V0XzM9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19sYXlvdXRfND1jYXN0PShQYW5nb0xheW91dCAqKQotCi1PU19fZ2RrX2RyYXdfbGF5b3V0X3dpdGhfY29sb3JzPQotT1NfX2dka19kcmF3X2xheW91dF93aXRoX2NvbG9yc18wPWNhc3Q9R2RrRHJhd2FibGUgKgotT1NfX2dka19kcmF3X2xheW91dF93aXRoX2NvbG9yc18xPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2RyYXdfbGF5b3V0X3dpdGhfY29sb3JzXzI9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19sYXlvdXRfd2l0aF9jb2xvcnNfMz1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2xheW91dF93aXRoX2NvbG9yc180PWNhc3Q9KFBhbmdvTGF5b3V0ICopCi1PU19fZ2RrX2RyYXdfbGF5b3V0X3dpdGhfY29sb3JzXzU9ZmxhZ3M9bm9fb3V0Ci1PU19fZ2RrX2RyYXdfbGF5b3V0X3dpdGhfY29sb3JzXzY9ZmxhZ3M9bm9fb3V0Ci0KLU9TX19nZGtfZHJhd19saW5lPQotT1NfX2dka19kcmF3X2xpbmVfMD1jYXN0PShHZGtEcmF3YWJsZSAqKQotT1NfX2dka19kcmF3X2xpbmVfMT1jYXN0PShHZGtHQyAqKQotT1NfX2dka19kcmF3X2xpbmVfMj1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2xpbmVfMz1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2xpbmVfND1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2xpbmVfNT1jYXN0PShnaW50KQotCi1PU19fZ2RrX2RyYXdfbGluZXM9Ci1PU19fZ2RrX2RyYXdfbGluZXNfMD1jYXN0PShHZGtEcmF3YWJsZSAqKQotT1NfX2dka19kcmF3X2xpbmVzXzE9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZHJhd19saW5lc18yPWNhc3Q9KEdka1BvaW50ICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfX2dka19kcmF3X2xpbmVzXzM9Y2FzdD0oZ2ludCkKLQotT1NfX2dka19kcmF3X3BpeGJ1Zj1mbGFncz1keW5hbWljCi1PU19fZ2RrX2RyYXdfcGl4YnVmXzA9Y2FzdD0oR2RrRHJhd2FibGUgKikKLU9TX19nZGtfZHJhd19waXhidWZfMT1jYXN0PShHZGtHQyAqKQotT1NfX2dka19kcmF3X3BpeGJ1Zl8yPWNhc3Q9KEdka1BpeGJ1ZiAqKQotT1NfX2dka19kcmF3X3BpeGJ1Zl8zPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfcGl4YnVmXzQ9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19waXhidWZfNT1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X3BpeGJ1Zl82PWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfcGl4YnVmXzc9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19waXhidWZfOD1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X3BpeGJ1Zl85PWNhc3Q9KEdka1JnYkRpdGhlcikKLU9TX19nZGtfZHJhd19waXhidWZfMTA9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19waXhidWZfMTE9Y2FzdD0oZ2ludCkKLQotT1NfX2dka19kcmF3X3BvaW50PQotT1NfX2dka19kcmF3X3BvaW50XzA9Y2FzdD0oR2RrRHJhd2FibGUgKikKLU9TX19nZGtfZHJhd19wb2ludF8xPWNhc3Q9R2RrR0MgKgotT1NfX2dka19kcmF3X3BvaW50XzI9Ci1PU19fZ2RrX2RyYXdfcG9pbnRfMz0KLQotT1NfX2dka19kcmF3X3BvbHlnb249Ci1PU19fZ2RrX2RyYXdfcG9seWdvbl8wPWNhc3Q9KEdka0RyYXdhYmxlICopCi1PU19fZ2RrX2RyYXdfcG9seWdvbl8xPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2RyYXdfcG9seWdvbl8yPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfcG9seWdvbl8zPWNhc3Q9KEdka1BvaW50ICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfX2dka19kcmF3X3BvbHlnb25fND1jYXN0PShnaW50KQotCi1PU19fZ2RrX2RyYXdfcmVjdGFuZ2xlPQotT1NfX2dka19kcmF3X3JlY3RhbmdsZV8wPWNhc3Q9KEdka0RyYXdhYmxlICopCi1PU19fZ2RrX2RyYXdfcmVjdGFuZ2xlXzE9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZHJhd19yZWN0YW5nbGVfMj1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X3JlY3RhbmdsZV8zPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfcmVjdGFuZ2xlXzQ9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19yZWN0YW5nbGVfNT1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X3JlY3RhbmdsZV82PWNhc3Q9KGdpbnQpCi0KLU9TX19nZGtfZHJhd2FibGVfZ2V0X2RlcHRoPQotT1NfX2dka19kcmF3YWJsZV9nZXRfZGVwdGhfMD1jYXN0PShHZGtEcmF3YWJsZSAqKQotCi1PU19fZ2RrX2RyYXdhYmxlX2dldF9pbWFnZT0KLU9TX19nZGtfZHJhd2FibGVfZ2V0X2ltYWdlXzA9Y2FzdD0oR2RrRHJhd2FibGUgKikKLU9TX19nZGtfZHJhd2FibGVfZ2V0X2ltYWdlXzE9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd2FibGVfZ2V0X2ltYWdlXzI9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd2FibGVfZ2V0X2ltYWdlXzM9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd2FibGVfZ2V0X2ltYWdlXzQ9Y2FzdD0oZ2ludCkKLQotT1NfX2dka19kcmF3YWJsZV9nZXRfc2l6ZT0KLU9TX19nZGtfZHJhd2FibGVfZ2V0X3NpemVfMD1jYXN0PShHZGtEcmF3YWJsZSAqKQotT1NfX2dka19kcmF3YWJsZV9nZXRfc2l6ZV8xPWNhc3Q9KGdpbnQgKiksZmxhZ3M9bm9faW4gY3JpdGljYWwKLU9TX19nZGtfZHJhd2FibGVfZ2V0X3NpemVfMj1jYXN0PShnaW50ICopLGZsYWdzPW5vX2luIGNyaXRpY2FsCi0KLU9TX19nZGtfZHJhd2FibGVfZ2V0X3Zpc2libGVfcmVnaW9uPQotT1NfX2dka19kcmF3YWJsZV9nZXRfdmlzaWJsZV9yZWdpb25fMD1jYXN0PShHZGtEcmF3YWJsZSAqKQotCi1PU19fZ2RrX2Vycm9yX3RyYXBfcG9wPQotCi1PU19fZ2RrX2Vycm9yX3RyYXBfcHVzaD0KLQotT1NfX2dka19ldmVudF9jb3B5PQotT1NfX2dka19ldmVudF9jb3B5XzA9Y2FzdD0oR2RrRXZlbnQgKikKLQotT1NfX2dka19ldmVudF9mcmVlPQotT1NfX2dka19ldmVudF9mcmVlXzA9Y2FzdD0oR2RrRXZlbnQgKikKLQotT1NfX2dka19ldmVudF9nZXQ9Ci0KLU9TX19nZGtfZXZlbnRfZ2V0X2Nvb3Jkcz0KLU9TX19nZGtfZXZlbnRfZ2V0X2Nvb3Jkc18wPWNhc3Q9KEdka0V2ZW50ICopCi1PU19fZ2RrX2V2ZW50X2dldF9jb29yZHNfMT1jYXN0PShnZG91YmxlICopCi1PU19fZ2RrX2V2ZW50X2dldF9jb29yZHNfMj1jYXN0PShnZG91YmxlICopCi0KLU9TX19nZGtfZXZlbnRfZ2V0X2dyYXBoaWNzX2V4cG9zZT0KLU9TX19nZGtfZXZlbnRfZ2V0X2dyYXBoaWNzX2V4cG9zZV8wPWNhc3Q9KEdka1dpbmRvdyAqKQotCi1PU19fZ2RrX2V2ZW50X2dldF9yb290X2Nvb3Jkcz0KLU9TX19nZGtfZXZlbnRfZ2V0X3Jvb3RfY29vcmRzXzA9Y2FzdD0oR2RrRXZlbnQgKikKLU9TX19nZGtfZXZlbnRfZ2V0X3Jvb3RfY29vcmRzXzE9Y2FzdD0oZ2RvdWJsZSAqKQotT1NfX2dka19ldmVudF9nZXRfcm9vdF9jb29yZHNfMj1jYXN0PShnZG91YmxlICopCi0KLU9TX19nZGtfZXZlbnRfZ2V0X3N0YXRlPQotT1NfX2dka19ldmVudF9nZXRfc3RhdGVfMD1jYXN0PShHZGtFdmVudCAqKQotT1NfX2dka19ldmVudF9nZXRfc3RhdGVfMT1jYXN0PShHZGtNb2RpZmllclR5cGUgKikKLQotT1NfX2dka19ldmVudF9nZXRfdGltZT0KLU9TX19nZGtfZXZlbnRfZ2V0X3RpbWVfMD1jYXN0PShHZGtFdmVudCAqKQotCi1PU19fZ2RrX2V2ZW50X2hhbmRsZXJfc2V0PQotT1NfX2dka19ldmVudF9oYW5kbGVyX3NldF8wPWNhc3Q9KEdka0V2ZW50RnVuYykKLU9TX19nZGtfZXZlbnRfaGFuZGxlcl9zZXRfMT1jYXN0PShncG9pbnRlcikKLU9TX19nZGtfZXZlbnRfaGFuZGxlcl9zZXRfMj1jYXN0PShHRGVzdHJveU5vdGlmeSkKLQotT1NfX2dka19ldmVudF9wdXQ9Ci1PU19fZ2RrX2V2ZW50X3B1dF8wPWNhc3Q9KEdka0V2ZW50ICopCi0KLU9TX19nZGtfZmx1c2g9Ci0KLU9TX19nZGtfZnJlZV90ZXh0X2xpc3Q9Ci1PU19fZ2RrX2ZyZWVfdGV4dF9saXN0XzA9Y2FzdD0oZ2NoYXIgKiopCi0KLU9TX19nZGtfZ2NfZ2V0X3ZhbHVlcz0KLU9TX19nZGtfZ2NfZ2V0X3ZhbHVlc18wPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2djX2dldF92YWx1ZXNfMT1jYXN0PShHZGtHQ1ZhbHVlcyAqKSxmbGFncz1ub19pbgotCi1PU19fZ2RrX2djX25ldz0KLU9TX19nZGtfZ2NfbmV3XzA9Y2FzdD0oR2RrRHJhd2FibGUgKikKLQotT1NfX2dka19nY19zZXRfYmFja2dyb3VuZD0KLU9TX19nZGtfZ2Nfc2V0X2JhY2tncm91bmRfMD1jYXN0PShHZGtHQyAqKQotT1NfX2dka19nY19zZXRfYmFja2dyb3VuZF8xPWNhc3Q9KEdka0NvbG9yICopLGZsYWdzPW5vX291dAotCi1PU19fZ2RrX2djX3NldF9jbGlwX21hc2s9Ci1PU19fZ2RrX2djX3NldF9jbGlwX21hc2tfMD1jYXN0PShHZGtHQyAqKQotT1NfX2dka19nY19zZXRfY2xpcF9tYXNrXzE9Y2FzdD0oR2RrQml0bWFwICopCi0KLU9TX19nZGtfZ2Nfc2V0X2NsaXBfb3JpZ2luPQotT1NfX2dka19nY19zZXRfY2xpcF9vcmlnaW5fMD1jYXN0PShHZGtHQyAqKQotT1NfX2dka19nY19zZXRfY2xpcF9vcmlnaW5fMT1jYXN0PShnaW50KQotT1NfX2dka19nY19zZXRfY2xpcF9vcmlnaW5fMj1jYXN0PShnaW50KQotCi1PU19fZ2RrX2djX3NldF9jbGlwX3JlY3RhbmdsZT0KLU9TX19nZGtfZ2Nfc2V0X2NsaXBfcmVjdGFuZ2xlXzA9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZ2Nfc2V0X2NsaXBfcmVjdGFuZ2xlXzE9Y2FzdD0oR2RrUmVjdGFuZ2xlICopLGZsYWdzPW5vX291dAotCi1PU19fZ2RrX2djX3NldF9jbGlwX3JlZ2lvbj0KLU9TX19nZGtfZ2Nfc2V0X2NsaXBfcmVnaW9uXzA9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZ2Nfc2V0X2NsaXBfcmVnaW9uXzE9Y2FzdD0oR2RrUmVnaW9uICopCi0KLU9TX19nZGtfZ2Nfc2V0X2Rhc2hlcz0KLU9TX19nZGtfZ2Nfc2V0X2Rhc2hlc18wPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2djX3NldF9kYXNoZXNfMT1jYXN0PShnaW50KQotT1NfX2dka19nY19zZXRfZGFzaGVzXzI9Y2FzdD0oZ2ludDggKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19fZ2RrX2djX3NldF9kYXNoZXNfMz1jYXN0PShnaW50KQotCi1PU19fZ2RrX2djX3NldF9leHBvc3VyZXM9Ci1PU19fZ2RrX2djX3NldF9leHBvc3VyZXNfMD1jYXN0PShHZGtHQyAqKQotT1NfX2dka19nY19zZXRfZXhwb3N1cmVzXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19nZGtfZ2Nfc2V0X2ZpbGw9Ci1PU19fZ2RrX2djX3NldF9maWxsXzA9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZ2Nfc2V0X2ZpbGxfMT1jYXN0PShHZGtGaWxsKQotCi1PU19fZ2RrX2djX3NldF9mb3JlZ3JvdW5kPQotT1NfX2dka19nY19zZXRfZm9yZWdyb3VuZF8wPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2djX3NldF9mb3JlZ3JvdW5kXzE9Y2FzdD0oR2RrQ29sb3IgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX19nZGtfZ2Nfc2V0X2Z1bmN0aW9uPQotT1NfX2dka19nY19zZXRfZnVuY3Rpb25fMD1jYXN0PShHZGtHQyAqKQotT1NfX2dka19nY19zZXRfZnVuY3Rpb25fMT1jYXN0PShHZGtGdW5jdGlvbikKLQotT1NfX2dka19nY19zZXRfbGluZV9hdHRyaWJ1dGVzPQotT1NfX2dka19nY19zZXRfbGluZV9hdHRyaWJ1dGVzXzA9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZ2Nfc2V0X2xpbmVfYXR0cmlidXRlc18xPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2djX3NldF9saW5lX2F0dHJpYnV0ZXNfMj1jYXN0PShHZGtMaW5lU3R5bGUpCi1PU19fZ2RrX2djX3NldF9saW5lX2F0dHJpYnV0ZXNfMz1jYXN0PShHZGtDYXBTdHlsZSkKLU9TX19nZGtfZ2Nfc2V0X2xpbmVfYXR0cmlidXRlc180PWNhc3Q9KEdka0pvaW5TdHlsZSkKLQotT1NfX2dka19nY19zZXRfc3RpcHBsZT0KLU9TX19nZGtfZ2Nfc2V0X3N0aXBwbGVfMD1jYXN0PShHZGtHQyAqKQotT1NfX2dka19nY19zZXRfc3RpcHBsZV8xPWNhc3Q9KEdka1BpeG1hcCAqKQotCi1PU19fZ2RrX2djX3NldF9zdWJ3aW5kb3c9Ci1PU19fZ2RrX2djX3NldF9zdWJ3aW5kb3dfMD1jYXN0PShHZGtHQyAqKQotT1NfX2dka19nY19zZXRfc3Vid2luZG93XzE9Y2FzdD0oR2RrU3Vid2luZG93TW9kZSkKLQotT1NfX2dka19nY19zZXRfdmFsdWVzPQotT1NfX2dka19nY19zZXRfdmFsdWVzXzA9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZ2Nfc2V0X3ZhbHVlc18xPWNhc3Q9KEdka0dDVmFsdWVzICopLGZsYWdzPW5vX291dAotT1NfX2dka19nY19zZXRfdmFsdWVzXzI9Y2FzdD0oR2RrR0NWYWx1ZXNNYXNrKQotCi1PU19fZ2RrX2tleWJvYXJkX3VuZ3JhYj0KLU9TX19nZGtfa2V5Ym9hcmRfdW5ncmFiXzA9Ci0KLU9TX19nZGtfa2V5bWFwX2dldF9kZWZhdWx0PQotCi1PU19fZ2RrX2tleW1hcF90cmFuc2xhdGVfa2V5Ym9hcmRfc3RhdGU9Ci1PU19fZ2RrX2tleW1hcF90cmFuc2xhdGVfa2V5Ym9hcmRfc3RhdGVfMD1jYXN0PUdka0tleW1hcCoKLU9TX19nZGtfa2V5bWFwX3RyYW5zbGF0ZV9rZXlib2FyZF9zdGF0ZV8xPQotT1NfX2dka19rZXltYXBfdHJhbnNsYXRlX2tleWJvYXJkX3N0YXRlXzI9Y2FzdD1HZGtNb2RpZmllclR5cGUKLU9TX19nZGtfa2V5bWFwX3RyYW5zbGF0ZV9rZXlib2FyZF9zdGF0ZV8zPQotT1NfX2dka19rZXltYXBfdHJhbnNsYXRlX2tleWJvYXJkX3N0YXRlXzQ9Y2FzdD1ndWludCoKLU9TX19nZGtfa2V5bWFwX3RyYW5zbGF0ZV9rZXlib2FyZF9zdGF0ZV81PWNhc3Q9Z2ludCoKLU9TX19nZGtfa2V5bWFwX3RyYW5zbGF0ZV9rZXlib2FyZF9zdGF0ZV82PWNhc3Q9Z2ludCoKLU9TX19nZGtfa2V5bWFwX3RyYW5zbGF0ZV9rZXlib2FyZF9zdGF0ZV83PWNhc3Q9R2RrTW9kaWZpZXJUeXBlICoKLQotT1NfX2dka19rZXl2YWxfdG9fbG93ZXI9Ci1PU19fZ2RrX2tleXZhbF90b19sb3dlcl8wPQotCi1PU19fZ2RrX2tleXZhbF90b191bmljb2RlPQotT1NfX2dka19rZXl2YWxfdG9fdW5pY29kZV8wPQotCi1PU19fZ2RrX3BhbmdvX2NvbnRleHRfZ2V0PQotCi1PU19fZ2RrX3BhbmdvX2NvbnRleHRfc2V0X2NvbG9ybWFwPQotT1NfX2dka19wYW5nb19jb250ZXh0X3NldF9jb2xvcm1hcF8wPWNhc3Q9UGFuZ29Db250ZXh0ICoKLU9TX19nZGtfcGFuZ29fY29udGV4dF9zZXRfY29sb3JtYXBfMT1jYXN0PShHZGtDb2xvcm1hcCAqKQotCi1PU19fZ2RrX3BhbmdvX2xheW91dF9nZXRfY2xpcF9yZWdpb249Ci1PU19fZ2RrX3BhbmdvX2xheW91dF9nZXRfY2xpcF9yZWdpb25fMD1jYXN0PShQYW5nb0xheW91dCAqKQotT1NfX2dka19wYW5nb19sYXlvdXRfZ2V0X2NsaXBfcmVnaW9uXzE9Ci1PU19fZ2RrX3BhbmdvX2xheW91dF9nZXRfY2xpcF9yZWdpb25fMj0KLU9TX19nZGtfcGFuZ29fbGF5b3V0X2dldF9jbGlwX3JlZ2lvbl8zPQotT1NfX2dka19wYW5nb19sYXlvdXRfZ2V0X2NsaXBfcmVnaW9uXzQ9Ci0KLU9TX19nZGtfcGl4YnVmX2NvcHlfYXJlYT0KLU9TX19nZGtfcGl4YnVmX2NvcHlfYXJlYV8wPWNhc3Q9KEdka1BpeGJ1ZiAqKQotT1NfX2dka19waXhidWZfY29weV9hcmVhXzE9Ci1PU19fZ2RrX3BpeGJ1Zl9jb3B5X2FyZWFfMj0KLU9TX19nZGtfcGl4YnVmX2NvcHlfYXJlYV8zPQotT1NfX2dka19waXhidWZfY29weV9hcmVhXzQ9Ci1PU19fZ2RrX3BpeGJ1Zl9jb3B5X2FyZWFfNT1jYXN0PShHZGtQaXhidWYgKikKLU9TX19nZGtfcGl4YnVmX2NvcHlfYXJlYV82PQotT1NfX2dka19waXhidWZfY29weV9hcmVhXzc9Ci0KLU9TX19nZGtfcGl4YnVmX2dldF9mcm9tX2RyYXdhYmxlPQotT1NfX2dka19waXhidWZfZ2V0X2Zyb21fZHJhd2FibGVfMD1jYXN0PShHZGtQaXhidWYgKikKLU9TX19nZGtfcGl4YnVmX2dldF9mcm9tX2RyYXdhYmxlXzE9Y2FzdD0oR2RrRHJhd2FibGUgKikKLU9TX19nZGtfcGl4YnVmX2dldF9mcm9tX2RyYXdhYmxlXzI9Y2FzdD0oR2RrQ29sb3JtYXAgKikKLU9TX19nZGtfcGl4YnVmX2dldF9mcm9tX2RyYXdhYmxlXzM9Ci1PU19fZ2RrX3BpeGJ1Zl9nZXRfZnJvbV9kcmF3YWJsZV80PQotT1NfX2dka19waXhidWZfZ2V0X2Zyb21fZHJhd2FibGVfNT0KLU9TX19nZGtfcGl4YnVmX2dldF9mcm9tX2RyYXdhYmxlXzY9Ci1PU19fZ2RrX3BpeGJ1Zl9nZXRfZnJvbV9kcmF3YWJsZV83PQotT1NfX2dka19waXhidWZfZ2V0X2Zyb21fZHJhd2FibGVfOD0KLQotT1NfX2dka19waXhidWZfZ2V0X2hhc19hbHBoYT0KLU9TX19nZGtfcGl4YnVmX2dldF9oYXNfYWxwaGFfMD1jYXN0PShjb25zdCBHZGtQaXhidWYgKikKLQotT1NfX2dka19waXhidWZfZ2V0X2hlaWdodD0KLU9TX19nZGtfcGl4YnVmX2dldF9oZWlnaHRfMD1jYXN0PShjb25zdCBHZGtQaXhidWYgKikKLQotT1NfX2dka19waXhidWZfZ2V0X3BpeGVscz0KLU9TX19nZGtfcGl4YnVmX2dldF9waXhlbHNfMD1jYXN0PShjb25zdCBHZGtQaXhidWYgKikKLQotT1NfX2dka19waXhidWZfZ2V0X3Jvd3N0cmlkZT0KLU9TX19nZGtfcGl4YnVmX2dldF9yb3dzdHJpZGVfMD1jYXN0PShjb25zdCBHZGtQaXhidWYgKikKLQotT1NfX2dka19waXhidWZfZ2V0X3dpZHRoPQotT1NfX2dka19waXhidWZfZ2V0X3dpZHRoXzA9Y2FzdD0oY29uc3QgR2RrUGl4YnVmICopCi0KLU9TX19nZGtfcGl4YnVmX25ldz0KLU9TX19nZGtfcGl4YnVmX25ld18wPWNhc3Q9KEdka0NvbG9yc3BhY2UpCi1PU19fZ2RrX3BpeGJ1Zl9uZXdfMT1jYXN0PShnYm9vbGVhbikKLU9TX19nZGtfcGl4YnVmX25ld18yPQotT1NfX2dka19waXhidWZfbmV3XzM9Ci1PU19fZ2RrX3BpeGJ1Zl9uZXdfND0KLQotT1NfX2dka19waXhidWZfcmVuZGVyX3BpeG1hcF9hbmRfbWFzaz0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl9waXhtYXBfYW5kX21hc2tfMD1jYXN0PShHZGtQaXhidWYgKikKLU9TX19nZGtfcGl4YnVmX3JlbmRlcl9waXhtYXBfYW5kX21hc2tfMT1jYXN0PShHZGtEcmF3YWJsZSAqKikKLU9TX19nZGtfcGl4YnVmX3JlbmRlcl9waXhtYXBfYW5kX21hc2tfMj1jYXN0PShHZGtCaXRtYXAgKiopCi1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfcGl4bWFwX2FuZF9tYXNrXzM9Ci0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZT0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV8wPWNhc3Q9KEdka1BpeGJ1ZiAqKQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlXzE9Y2FzdD0oR2RrRHJhd2FibGUgKikKLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV8yPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfMz0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV80PQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlXzU9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfNj0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV83PQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlXzg9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfOT1jYXN0PShHZGtSZ2JEaXRoZXIpCi1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfMTA9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfMTE9Ci0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV9hbHBoYT0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV9hbHBoYV8wPWNhc3Q9KEdka1BpeGJ1ZiAqKQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlX2FscGhhXzE9Y2FzdD0oR2RrRHJhd2FibGUgKikKLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV9hbHBoYV8yPQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlX2FscGhhXzM9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfYWxwaGFfND0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV9hbHBoYV81PQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlX2FscGhhXzY9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfYWxwaGFfNz0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV9hbHBoYV84PWNhc3Q9KEdka1BpeGJ1ZkFscGhhTW9kZSkKLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV9hbHBoYV85PQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlX2FscGhhXzEwPWNhc3Q9KEdka1JnYkRpdGhlcikKLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV9hbHBoYV8xMT0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV9hbHBoYV8xMj0KLQotT1NfX2dka19waXhidWZfc2NhbGU9Ci1PU19fZ2RrX3BpeGJ1Zl9zY2FsZV8wPWNhc3Q9KGNvbnN0IEdka1BpeGJ1ZiAqKQotT1NfX2dka19waXhidWZfc2NhbGVfMT1jYXN0PShHZGtQaXhidWYgKikKLU9TX19nZGtfcGl4YnVmX3NjYWxlXzI9Ci1PU19fZ2RrX3BpeGJ1Zl9zY2FsZV8zPQotT1NfX2dka19waXhidWZfc2NhbGVfND0KLU9TX19nZGtfcGl4YnVmX3NjYWxlXzU9Ci1PU19fZ2RrX3BpeGJ1Zl9zY2FsZV82PWNhc3Q9KGRvdWJsZSkKLU9TX19nZGtfcGl4YnVmX3NjYWxlXzc9Y2FzdD0oZG91YmxlKQotT1NfX2dka19waXhidWZfc2NhbGVfOD1jYXN0PShkb3VibGUpCi1PU19fZ2RrX3BpeGJ1Zl9zY2FsZV85PWNhc3Q9KGRvdWJsZSkKLU9TX19nZGtfcGl4YnVmX3NjYWxlXzEwPQotCi1PU19fZ2RrX3BpeGJ1Zl9zY2FsZV9zaW1wbGU9Ci1PU19fZ2RrX3BpeGJ1Zl9zY2FsZV9zaW1wbGVfMD1jYXN0PShjb25zdCBHZGtQaXhidWYgKikKLU9TX19nZGtfcGl4YnVmX3NjYWxlX3NpbXBsZV8xPQotT1NfX2dka19waXhidWZfc2NhbGVfc2ltcGxlXzI9Ci1PU19fZ2RrX3BpeGJ1Zl9zY2FsZV9zaW1wbGVfMz1jYXN0PShHZGtJbnRlcnBUeXBlKQotCi1PU19fZ2RrX3BpeG1hcF9mb3JlaWduX25ldz0KLU9TX19nZGtfcGl4bWFwX2ZvcmVpZ25fbmV3XzA9Ci0KLU9TX19nZGtfcGl4bWFwX25ldz0KLU9TX19nZGtfcGl4bWFwX25ld18wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka19waXhtYXBfbmV3XzE9Y2FzdD0oZ2ludCkKLU9TX19nZGtfcGl4bWFwX25ld18yPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX3BpeG1hcF9uZXdfMz1jYXN0PShnaW50KQotCi1PU19fZ2RrX3BvaW50ZXJfZ3JhYj0KLU9TX19nZGtfcG9pbnRlcl9ncmFiXzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3BvaW50ZXJfZ3JhYl8xPWNhc3Q9KGdib29sZWFuKQotT1NfX2dka19wb2ludGVyX2dyYWJfMj1jYXN0PShHZGtFdmVudE1hc2spCi1PU19fZ2RrX3BvaW50ZXJfZ3JhYl8zPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka19wb2ludGVyX2dyYWJfND1jYXN0PShHZGtDdXJzb3IgKikKLU9TX19nZGtfcG9pbnRlcl9ncmFiXzU9Y2FzdD0oZ3VpbnQzMikKLQotT1NfX2dka19wb2ludGVyX2lzX2dyYWJiZWQ9Ci0KLU9TX19nZGtfcG9pbnRlcl91bmdyYWI9Ci1PU19fZ2RrX3BvaW50ZXJfdW5ncmFiXzA9Y2FzdD0oZ3VpbnQzMikKLQotT1NfX2dka19wcm9wZXJ0eV9nZXQ9Ci1PU19fZ2RrX3Byb3BlcnR5X2dldF8wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka19wcm9wZXJ0eV9nZXRfMT1jYXN0PShHZGtBdG9tKQotT1NfX2dka19wcm9wZXJ0eV9nZXRfMj1jYXN0PShHZGtBdG9tKQotT1NfX2dka19wcm9wZXJ0eV9nZXRfMz0KLU9TX19nZGtfcHJvcGVydHlfZ2V0XzQ9Ci1PU19fZ2RrX3Byb3BlcnR5X2dldF81PQotT1NfX2dka19wcm9wZXJ0eV9nZXRfNj1jYXN0PShHZGtBdG9tICopCi1PU19fZ2RrX3Byb3BlcnR5X2dldF83PWNhc3Q9KGdpbnQgKikKLU9TX19nZGtfcHJvcGVydHlfZ2V0Xzg9Y2FzdD0oZ2ludCAqKQotT1NfX2dka19wcm9wZXJ0eV9nZXRfOT1jYXN0PShndWNoYXIgKiopCi0KLU9TX19nZGtfcmVnaW9uX2Rlc3Ryb3k9Ci1PU19fZ2RrX3JlZ2lvbl9kZXN0cm95XzA9Y2FzdD0oR2RrUmVnaW9uICopCi0KLU9TX19nZGtfcmVnaW9uX2VtcHR5PQotT1NfX2dka19yZWdpb25fZW1wdHlfMD1jYXN0PShHZGtSZWdpb24gKikKLQotT1NfX2dka19yZWdpb25fZ2V0X2NsaXBib3g9Ci1PU19fZ2RrX3JlZ2lvbl9nZXRfY2xpcGJveF8wPWNhc3Q9KEdka1JlZ2lvbiAqKQotT1NfX2dka19yZWdpb25fZ2V0X2NsaXBib3hfMT1jYXN0PShHZGtSZWN0YW5nbGUgKiksZmxhZ3M9bm9faW4KLQotT1NfX2dka19yZWdpb25fZ2V0X3JlY3RhbmdsZXM9Ci1PU19fZ2RrX3JlZ2lvbl9nZXRfcmVjdGFuZ2xlc18wPWNhc3Q9KEdka1JlZ2lvbiAqKQotT1NfX2dka19yZWdpb25fZ2V0X3JlY3RhbmdsZXNfMT1jYXN0PShHZGtSZWN0YW5nbGUgKiopCi1PU19fZ2RrX3JlZ2lvbl9nZXRfcmVjdGFuZ2xlc18yPWNhc3Q9KGdpbnQgKikKLQotT1NfX2dka19yZWdpb25faW50ZXJzZWN0PQotT1NfX2dka19yZWdpb25faW50ZXJzZWN0XzA9Y2FzdD0oR2RrUmVnaW9uICopCi1PU19fZ2RrX3JlZ2lvbl9pbnRlcnNlY3RfMT1jYXN0PShHZGtSZWdpb24gKikKLQotT1NfX2dka19yZWdpb25fbmV3PQotCi1PU19fZ2RrX3JlZ2lvbl9vZmZzZXQ9Ci1PU19fZ2RrX3JlZ2lvbl9vZmZzZXRfMD1jYXN0PShHZGtSZWdpb24gKikKLU9TX19nZGtfcmVnaW9uX29mZnNldF8xPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX3JlZ2lvbl9vZmZzZXRfMj1jYXN0PShnaW50KQotCi1PU19fZ2RrX3JlZ2lvbl9wb2ludF9pbj0KLU9TX19nZGtfcmVnaW9uX3BvaW50X2luXzA9Y2FzdD0oR2RrUmVnaW9uICopCi1PU19fZ2RrX3JlZ2lvbl9wb2ludF9pbl8xPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX3JlZ2lvbl9wb2ludF9pbl8yPWNhc3Q9KGdpbnQpCi0KLU9TX19nZGtfcmVnaW9uX3BvbHlnb249Ci1PU19fZ2RrX3JlZ2lvbl9wb2x5Z29uXzA9Y2FzdD0oR2RrUG9pbnQgKikKLU9TX19nZGtfcmVnaW9uX3BvbHlnb25fMT0KLU9TX19nZGtfcmVnaW9uX3BvbHlnb25fMj1jYXN0PShHZGtGaWxsUnVsZSkKLQotT1NfX2dka19yZWdpb25fcmVjdF9pbj0KLU9TX19nZGtfcmVnaW9uX3JlY3RfaW5fMD1jYXN0PShHZGtSZWdpb24gKikKLU9TX19nZGtfcmVnaW9uX3JlY3RfaW5fMT1jYXN0PShHZGtSZWN0YW5nbGUgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX19nZGtfcmVnaW9uX3JlY3RhbmdsZT0KLU9TX19nZGtfcmVnaW9uX3JlY3RhbmdsZV8wPWZsYWdzPW5vX291dAotCi1PU19fZ2RrX3JlZ2lvbl9zdWJ0cmFjdD0KLU9TX19nZGtfcmVnaW9uX3N1YnRyYWN0XzA9Y2FzdD0oR2RrUmVnaW9uICopCi1PU19fZ2RrX3JlZ2lvbl9zdWJ0cmFjdF8xPWNhc3Q9KEdka1JlZ2lvbiAqKQotCi1PU19fZ2RrX3JlZ2lvbl91bmlvbj0KLU9TX19nZGtfcmVnaW9uX3VuaW9uXzA9Y2FzdD0oR2RrUmVnaW9uICopCi1PU19fZ2RrX3JlZ2lvbl91bmlvbl8xPWNhc3Q9KEdka1JlZ2lvbiAqKQotCi1PU19fZ2RrX3JlZ2lvbl91bmlvbl93aXRoX3JlY3Q9Ci1PU19fZ2RrX3JlZ2lvbl91bmlvbl93aXRoX3JlY3RfMD1jYXN0PShHZGtSZWdpb24gKikKLU9TX19nZGtfcmVnaW9uX3VuaW9uX3dpdGhfcmVjdF8xPWNhc3Q9KEdka1JlY3RhbmdsZSAqKSxmbGFncz1ub19vdXQKLQotT1NfX2dka19yZ2JfaW5pdD0KLQotT1NfX2dka19zY3JlZW5fZ2V0X2RlZmF1bHQ9ZmxhZ3M9ZHluYW1pYwotCi1PU19fZ2RrX3NjcmVlbl9nZXRfbW9uaXRvcl9hdF93aW5kb3c9ZmxhZ3M9ZHluYW1pYwotT1NfX2dka19zY3JlZW5fZ2V0X21vbml0b3JfYXRfd2luZG93XzA9Y2FzdD0oR2RrU2NyZWVuICopCi1PU19fZ2RrX3NjcmVlbl9nZXRfbW9uaXRvcl9hdF93aW5kb3dfMT1jYXN0PShHZGtXaW5kb3cgKikKLQotT1NfX2dka19zY3JlZW5fZ2V0X21vbml0b3JfZ2VvbWV0cnk9ZmxhZ3M9ZHluYW1pYwotT1NfX2dka19zY3JlZW5fZ2V0X21vbml0b3JfZ2VvbWV0cnlfMD1jYXN0PShHZGtTY3JlZW4gKikKLU9TX19nZGtfc2NyZWVuX2dldF9tb25pdG9yX2dlb21ldHJ5XzE9Ci1PU19fZ2RrX3NjcmVlbl9nZXRfbW9uaXRvcl9nZW9tZXRyeV8yPWZsYWdzPW5vX2luCi0KLU9TX19nZGtfc2NyZWVuX2dldF9uX21vbml0b3JzPWZsYWdzPWR5bmFtaWMKLU9TX19nZGtfc2NyZWVuX2dldF9uX21vbml0b3JzXzA9Y2FzdD0oR2RrU2NyZWVuICopCi0KLU9TX19nZGtfc2NyZWVuX2dldF9udW1iZXI9ZmxhZ3M9ZHluYW1pYwotT1NfX2dka19zY3JlZW5fZ2V0X251bWJlcl8wPWNhc3Q9KEdka1NjcmVlbiAqKQotCi1PU19fZ2RrX3NjcmVlbl9oZWlnaHQ9Ci0KLU9TX19nZGtfc2NyZWVuX3dpZHRoPQotCi1PU19fZ2RrX3NjcmVlbl93aWR0aF9tbT0KLQotT1NfX2dka19zZXRfcHJvZ3JhbV9jbGFzcz0KLU9TX19nZGtfc2V0X3Byb2dyYW1fY2xhc3NfMD1jYXN0PShjb25zdCBjaGFyICopCi0KLU9TX19nZGtfdGV4dF9wcm9wZXJ0eV90b191dGY4X2xpc3Q9Ci1PU19fZ2RrX3RleHRfcHJvcGVydHlfdG9fdXRmOF9saXN0XzA9Y2FzdD0oR2RrQXRvbSkKLU9TX19nZGtfdGV4dF9wcm9wZXJ0eV90b191dGY4X2xpc3RfMT0KLU9TX19nZGtfdGV4dF9wcm9wZXJ0eV90b191dGY4X2xpc3RfMj1jYXN0PShndWNoYXIgKikKLU9TX19nZGtfdGV4dF9wcm9wZXJ0eV90b191dGY4X2xpc3RfMz0KLU9TX19nZGtfdGV4dF9wcm9wZXJ0eV90b191dGY4X2xpc3RfND1jYXN0PShnY2hhciAqKiopCi0KLU9TX19nZGtfdW5pY29kZV90b19rZXl2YWw9Ci1PU19fZ2RrX3VuaWNvZGVfdG9fa2V5dmFsXzA9Ci0KLU9TX19nZGtfdXRmOF90b19jb21wb3VuZF90ZXh0PQotT1NfX2dka191dGY4X3RvX2NvbXBvdW5kX3RleHRfMD1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2dka191dGY4X3RvX2NvbXBvdW5kX3RleHRfMT1jYXN0PShHZGtBdG9tICopCi1PU19fZ2RrX3V0ZjhfdG9fY29tcG91bmRfdGV4dF8yPWNhc3Q9KGdpbnQgKikKLU9TX19nZGtfdXRmOF90b19jb21wb3VuZF90ZXh0XzM9Y2FzdD0oZ3VjaGFyICoqKQotT1NfX2dka191dGY4X3RvX2NvbXBvdW5kX3RleHRfND1jYXN0PShnaW50ICopCi0KLU9TX19nZGtfdmlzdWFsX2dldF9zeXN0ZW09Ci0KLU9TX19nZGtfd2luZG93X2FkZF9maWx0ZXI9Ci1PU19fZ2RrX3dpbmRvd19hZGRfZmlsdGVyXzA9Y2FzdD1HZGtXaW5kb3cgKgotT1NfX2dka193aW5kb3dfYWRkX2ZpbHRlcl8xPWNhc3Q9R2RrRmlsdGVyRnVuYwotT1NfX2dka193aW5kb3dfYWRkX2ZpbHRlcl8yPWNhc3Q9Z3BvaW50ZXIKLQotT1NfX2dka193aW5kb3dfYXRfcG9pbnRlcj0KLU9TX19nZGtfd2luZG93X2F0X3BvaW50ZXJfMD1jYXN0PShnaW50ICopCi1PU19fZ2RrX3dpbmRvd19hdF9wb2ludGVyXzE9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ2RrX3dpbmRvd19iZWdpbl9wYWludF9yZWN0PQotT1NfX2dka193aW5kb3dfYmVnaW5fcGFpbnRfcmVjdF8wPWNhc3Q9R2RrV2luZG93ICoKLU9TX19nZGtfd2luZG93X2JlZ2luX3BhaW50X3JlY3RfMT1jYXN0PUdka1JlY3RhbmdsZSAqLGZsYWdzPW5vX291dAotCi1PU19fZ2RrX3dpbmRvd19kZXN0cm95PQotT1NfX2dka193aW5kb3dfZGVzdHJveV8wPWNhc3Q9R2RrV2luZG93ICoKLQotT1NfX2dka193aW5kb3dfZW5kX3BhaW50PQotT1NfX2dka193aW5kb3dfZW5kX3BhaW50XzA9Y2FzdD1HZGtXaW5kb3cgKgotCi1PU19fZ2RrX3dpbmRvd19mb2N1cz0KLU9TX19nZGtfd2luZG93X2ZvY3VzXzA9Y2FzdD1HZGtXaW5kb3cgKgotT1NfX2dka193aW5kb3dfZm9jdXNfMT0KLQotT1NfX2dka193aW5kb3dfZnJlZXplX3VwZGF0ZXM9Ci1PU19fZ2RrX3dpbmRvd19mcmVlemVfdXBkYXRlc18wPWNhc3Q9R2RrV2luZG93ICoKLQotT1NfX2dka193aW5kb3dfZ2V0X2NoaWxkcmVuPQotT1NfX2dka193aW5kb3dfZ2V0X2NoaWxkcmVuXzA9Y2FzdD1HZGtXaW5kb3cgKgotCi1PU19fZ2RrX3dpbmRvd19nZXRfZXZlbnRzPQotT1NfX2dka193aW5kb3dfZ2V0X2V2ZW50c18wPWNhc3Q9R2RrV2luZG93ICoKLQotT1NfX2dka193aW5kb3dfZ2V0X2ZyYW1lX2V4dGVudHM9Ci1PU19fZ2RrX3dpbmRvd19nZXRfZnJhbWVfZXh0ZW50c18wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfZ2V0X2ZyYW1lX2V4dGVudHNfMT1jYXN0PShHZGtSZWN0YW5nbGUgKiksZmxhZ3M9bm9faW4KLQotT1NfX2dka193aW5kb3dfZ2V0X2ludGVybmFsX3BhaW50X2luZm89Ci1PU19fZ2RrX3dpbmRvd19nZXRfaW50ZXJuYWxfcGFpbnRfaW5mb18wPWNhc3Q9R2RrV2luZG93ICoKLU9TX19nZGtfd2luZG93X2dldF9pbnRlcm5hbF9wYWludF9pbmZvXzE9Y2FzdD1HZGtEcmF3YWJsZSAqKgotT1NfX2dka193aW5kb3dfZ2V0X2ludGVybmFsX3BhaW50X2luZm9fMj1jYXN0PWdpbnQgKgotT1NfX2dka193aW5kb3dfZ2V0X2ludGVybmFsX3BhaW50X2luZm9fMz1jYXN0PWdpbnQgKgotCi1PU19fZ2RrX3dpbmRvd19nZXRfb3JpZ2luPQotT1NfX2dka193aW5kb3dfZ2V0X29yaWdpbl8wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfZ2V0X29yaWdpbl8xPWNhc3Q9KGdpbnQgKikKLU9TX19nZGtfd2luZG93X2dldF9vcmlnaW5fMj1jYXN0PShnaW50ICopCi0KLU9TX19nZGtfd2luZG93X2dldF9wYXJlbnQ9Ci1PU19fZ2RrX3dpbmRvd19nZXRfcGFyZW50XzA9Y2FzdD0oR2RrV2luZG93ICopCi0KLU9TX19nZGtfd2luZG93X2dldF9wb2ludGVyPQotT1NfX2dka193aW5kb3dfZ2V0X3BvaW50ZXJfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfd2luZG93X2dldF9wb2ludGVyXzE9Y2FzdD0oZ2ludCAqKQotT1NfX2dka193aW5kb3dfZ2V0X3BvaW50ZXJfMj1jYXN0PShnaW50ICopCi1PU19fZ2RrX3dpbmRvd19nZXRfcG9pbnRlcl8zPWNhc3Q9KEdka01vZGlmaWVyVHlwZSAqKQotCi1PU19fZ2RrX3dpbmRvd19nZXRfdXNlcl9kYXRhPQotT1NfX2dka193aW5kb3dfZ2V0X3VzZXJfZGF0YV8wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfZ2V0X3VzZXJfZGF0YV8xPWNhc3Q9KGdwb2ludGVyICopCi0KLU9TX19nZGtfd2luZG93X2hpZGU9Ci1PU19fZ2RrX3dpbmRvd19oaWRlXzA9Y2FzdD0oR2RrV2luZG93ICopCi0KLU9TX19nZGtfd2luZG93X2ludmFsaWRhdGVfcmVjdD0KLU9TX19nZGtfd2luZG93X2ludmFsaWRhdGVfcmVjdF8wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfaW52YWxpZGF0ZV9yZWN0XzE9Y2FzdD0oR2RrUmVjdGFuZ2xlICopLGZsYWdzPW5vX291dAotT1NfX2dka193aW5kb3dfaW52YWxpZGF0ZV9yZWN0XzI9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19nZGtfd2luZG93X2ludmFsaWRhdGVfcmVnaW9uPQotT1NfX2dka193aW5kb3dfaW52YWxpZGF0ZV9yZWdpb25fMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfd2luZG93X2ludmFsaWRhdGVfcmVnaW9uXzE9Y2FzdD0oR2RrUmVnaW9uICopCi1PU19fZ2RrX3dpbmRvd19pbnZhbGlkYXRlX3JlZ2lvbl8yPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ2RrX3dpbmRvd19sb29rdXA9Ci1PU19fZ2RrX3dpbmRvd19sb29rdXBfMD0KLQotT1NfX2dka193aW5kb3dfbG93ZXI9Ci1PU19fZ2RrX3dpbmRvd19sb3dlcl8wPWNhc3Q9KEdka1dpbmRvdyAqKQotCi1PU19fZ2RrX3dpbmRvd19tb3ZlPQotT1NfX2dka193aW5kb3dfbW92ZV8wPWNhc3Q9R2RrV2luZG93ICoKLU9TX19nZGtfd2luZG93X21vdmVfMT0KLU9TX19nZGtfd2luZG93X21vdmVfMj0KLQotT1NfX2dka193aW5kb3dfbmV3PQotT1NfX2dka193aW5kb3dfbmV3XzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3dpbmRvd19uZXdfMT1mbGFncz1ub19vdXQKLU9TX19nZGtfd2luZG93X25ld18yPQotCi1PU19fZ2RrX3dpbmRvd19wcm9jZXNzX2FsbF91cGRhdGVzPQotCi1PU19fZ2RrX3dpbmRvd19wcm9jZXNzX3VwZGF0ZXM9Ci1PU19fZ2RrX3dpbmRvd19wcm9jZXNzX3VwZGF0ZXNfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfd2luZG93X3Byb2Nlc3NfdXBkYXRlc18xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ2RrX3dpbmRvd19yYWlzZT0KLU9TX19nZGtfd2luZG93X3JhaXNlXzA9Y2FzdD0oR2RrV2luZG93ICopCi0KLU9TX19nZGtfd2luZG93X3JlbW92ZV9maWx0ZXI9Ci1PU19fZ2RrX3dpbmRvd19yZW1vdmVfZmlsdGVyXzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3dpbmRvd19yZW1vdmVfZmlsdGVyXzE9Y2FzdD0oR2RrRmlsdGVyRnVuYykKLU9TX19nZGtfd2luZG93X3JlbW92ZV9maWx0ZXJfMj1jYXN0PShncG9pbnRlcikKLQotT1NfX2dka193aW5kb3dfcmVzaXplPQotT1NfX2dka193aW5kb3dfcmVzaXplXzA9Y2FzdD1HZGtXaW5kb3cgKgotT1NfX2dka193aW5kb3dfcmVzaXplXzE9Ci1PU19fZ2RrX3dpbmRvd19yZXNpemVfMj0KLQotT1NfX2dka193aW5kb3dfc2Nyb2xsPQotT1NfX2dka193aW5kb3dfc2Nyb2xsXzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3dpbmRvd19zY3JvbGxfMT0KLU9TX19nZGtfd2luZG93X3Njcm9sbF8yPQotCi1PU19fZ2RrX3dpbmRvd19zZXRfYWNjZXB0X2ZvY3VzPWZsYWdzPWR5bmFtaWMKLU9TX19nZGtfd2luZG93X3NldF9hY2NlcHRfZm9jdXNfMD1jYXN0PUdka1dpbmRvdyAqCi1PU19fZ2RrX3dpbmRvd19zZXRfYWNjZXB0X2ZvY3VzXzE9Y2FzdD1nYm9vbGVhbgotCi1PU19fZ2RrX3dpbmRvd19zZXRfYmFja19waXhtYXA9Ci1PU19fZ2RrX3dpbmRvd19zZXRfYmFja19waXhtYXBfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfd2luZG93X3NldF9iYWNrX3BpeG1hcF8xPWNhc3Q9KEdka1BpeG1hcCAqKQotT1NfX2dka193aW5kb3dfc2V0X2JhY2tfcGl4bWFwXzI9Y2FzdD1nYm9vbGVhbgotCi1PU19fZ2RrX3dpbmRvd19zZXRfY3Vyc29yPQotT1NfX2dka193aW5kb3dfc2V0X2N1cnNvcl8wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfc2V0X2N1cnNvcl8xPWNhc3Q9KEdka0N1cnNvciAqKQotCi1PU19fZ2RrX3dpbmRvd19zZXRfZGVidWdfdXBkYXRlcz0KLU9TX19nZGtfd2luZG93X3NldF9kZWJ1Z191cGRhdGVzXzA9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19nZGtfd2luZG93X3NldF9kZWNvcmF0aW9ucz0KLU9TX19nZGtfd2luZG93X3NldF9kZWNvcmF0aW9uc18wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfc2V0X2RlY29yYXRpb25zXzE9Y2FzdD0oR2RrV01EZWNvcmF0aW9uKQotCi1PU19fZ2RrX3dpbmRvd19zZXRfZXZlbnRzPQotT1NfX2dka193aW5kb3dfc2V0X2V2ZW50c18wPWNhc3Q9R2RrV2luZG93ICoKLU9TX19nZGtfd2luZG93X3NldF9ldmVudHNfMT0KLQotT1NfX2dka193aW5kb3dfc2V0X2ljb249Ci1PU19fZ2RrX3dpbmRvd19zZXRfaWNvbl8wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfc2V0X2ljb25fMT1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfd2luZG93X3NldF9pY29uXzI9Y2FzdD0oR2RrUGl4bWFwICopCi1PU19fZ2RrX3dpbmRvd19zZXRfaWNvbl8zPWNhc3Q9KEdka0JpdG1hcCAqKQotCi1PU19fZ2RrX3dpbmRvd19zZXRfaWNvbl9saXN0PQotT1NfX2dka193aW5kb3dfc2V0X2ljb25fbGlzdF8wPWNhc3Q9R2RrV2luZG93ICoKLU9TX19nZGtfd2luZG93X3NldF9pY29uX2xpc3RfMT1jYXN0PUdMaXN0ICoKLQotT1NfX2dka193aW5kb3dfc2V0X2tlZXBfYWJvdmU9ZmxhZ3M9ZHluYW1pYwotT1NfX2dka193aW5kb3dfc2V0X2tlZXBfYWJvdmVfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfd2luZG93X3NldF9rZWVwX2Fib3ZlXzE9Y2FzdD1nYm9vbGVhbgotCi1PU19fZ2RrX3dpbmRvd19zZXRfb3ZlcnJpZGVfcmVkaXJlY3Q9Ci1PU19fZ2RrX3dpbmRvd19zZXRfb3ZlcnJpZGVfcmVkaXJlY3RfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfd2luZG93X3NldF9vdmVycmlkZV9yZWRpcmVjdF8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ2RrX3dpbmRvd19zZXRfdXNlcl9kYXRhPQotT1NfX2dka193aW5kb3dfc2V0X3VzZXJfZGF0YV8wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfc2V0X3VzZXJfZGF0YV8xPWNhc3Q9Z3BvaW50ZXIKLQotT1NfX2dka193aW5kb3dfc2hhcGVfY29tYmluZV9yZWdpb249Ci1PU19fZ2RrX3dpbmRvd19zaGFwZV9jb21iaW5lX3JlZ2lvbl8wPWNhc3Q9R2RrV2luZG93ICoKLU9TX19nZGtfd2luZG93X3NoYXBlX2NvbWJpbmVfcmVnaW9uXzE9Y2FzdD0oR2RrUmVnaW9uICopCi1PU19fZ2RrX3dpbmRvd19zaGFwZV9jb21iaW5lX3JlZ2lvbl8yPQotT1NfX2dka193aW5kb3dfc2hhcGVfY29tYmluZV9yZWdpb25fMz0KLQotT1NfX2dka193aW5kb3dfc2hvdz0KLU9TX19nZGtfd2luZG93X3Nob3dfMD1jYXN0PShHZGtXaW5kb3cgKikKLQotT1NfX2dka193aW5kb3dfc2hvd191bnJhaXNlZD0KLU9TX19nZGtfd2luZG93X3Nob3dfdW5yYWlzZWRfMD1jYXN0PShHZGtXaW5kb3cgKikKLQotT1NfX2dka193aW5kb3dfdGhhd191cGRhdGVzPQotT1NfX2dka193aW5kb3dfdGhhd191cGRhdGVzXzA9Y2FzdD1HZGtXaW5kb3cgKgotCi1PU19fZ2RrX3gxMV9hdG9tX3RvX3hhdG9tPQotT1NfX2dka194MTFfYXRvbV90b194YXRvbV8wPWNhc3Q9KEdka0F0b20pCi0KLU9TX19nZGtfeDExX2NvbG9ybWFwX2dldF94Y29sb3JtYXA9Ci1PU19fZ2RrX3gxMV9jb2xvcm1hcF9nZXRfeGNvbG9ybWFwXzA9Y2FzdD1HZGtDb2xvcm1hcCAqCi0KLU9TX19nZGtfeDExX2RyYXdhYmxlX2dldF94ZGlzcGxheT0KLU9TX19nZGtfeDExX2RyYXdhYmxlX2dldF94ZGlzcGxheV8wPWNhc3Q9R2RrRHJhd2FibGUgKgotCi1PU19fZ2RrX3gxMV9kcmF3YWJsZV9nZXRfeGlkPQotT1NfX2dka194MTFfZHJhd2FibGVfZ2V0X3hpZF8wPWNhc3Q9R2RrRHJhd2FibGUgKgotCi1PU19fZ2RrX3gxMV9zY3JlZW5fZ2V0X3dpbmRvd19tYW5hZ2VyX25hbWU9ZmxhZ3M9ZHluYW1pYwotT1NfX2dka194MTFfc2NyZWVuX2dldF93aW5kb3dfbWFuYWdlcl9uYW1lXzA9Y2FzdD0oR2RrU2NyZWVuICopCi0KLU9TX19nZGtfeDExX3NjcmVlbl9sb29rdXBfdmlzdWFsPWZsYWdzPWR5bmFtaWMKLU9TX19nZGtfeDExX3NjcmVlbl9sb29rdXBfdmlzdWFsXzA9Y2FzdD0oR2RrU2NyZWVuICopCi1PU19fZ2RrX3gxMV9zY3JlZW5fbG9va3VwX3Zpc3VhbF8xPWNhc3Q9KFZpc3VhbElEKQotCi1PU19fZ2RrX3gxMV92aXN1YWxfZ2V0X3h2aXN1YWw9Ci1PU19fZ2RrX3gxMV92aXN1YWxfZ2V0X3h2aXN1YWxfMD1jYXN0PUdka1Zpc3VhbCAqCi0KLU9TX19ndGtfYWNjZWxfZ3JvdXBfbmV3PQotCi1PU19fZ3RrX2FjY2VsX2dyb3Vwc19hY3RpdmF0ZT0KLU9TX19ndGtfYWNjZWxfZ3JvdXBzX2FjdGl2YXRlXzA9Y2FzdD0oR09iamVjdCAqKQotT1NfX2d0a19hY2NlbF9ncm91cHNfYWN0aXZhdGVfMT1jYXN0PShndWludCkKLU9TX19ndGtfYWNjZWxfZ3JvdXBzX2FjdGl2YXRlXzI9Y2FzdD0oR2RrTW9kaWZpZXJUeXBlKQotCi1PU19fZ3RrX2FjY2VsX2xhYmVsX3NldF9hY2NlbF93aWRnZXQ9Ci1PU19fZ3RrX2FjY2VsX2xhYmVsX3NldF9hY2NlbF93aWRnZXRfMD1jYXN0PShHdGtBY2NlbExhYmVsICopCi1PU19fZ3RrX2FjY2VsX2xhYmVsX3NldF9hY2NlbF93aWRnZXRfMT1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a19hZGp1c3RtZW50X2NoYW5nZWQ9Ci1PU19fZ3RrX2FkanVzdG1lbnRfY2hhbmdlZF8wPWNhc3Q9KEd0a0FkanVzdG1lbnQgKikKLQotT1NfX2d0a19hZGp1c3RtZW50X25ldz0KLU9TX19ndGtfYWRqdXN0bWVudF9uZXdfMD1jYXN0PShnZG91YmxlKQotT1NfX2d0a19hZGp1c3RtZW50X25ld18xPWNhc3Q9KGdkb3VibGUpCi1PU19fZ3RrX2FkanVzdG1lbnRfbmV3XzI9Y2FzdD0oZ2RvdWJsZSkKLU9TX19ndGtfYWRqdXN0bWVudF9uZXdfMz1jYXN0PShnZG91YmxlKQotT1NfX2d0a19hZGp1c3RtZW50X25ld180PWNhc3Q9KGdkb3VibGUpCi1PU19fZ3RrX2FkanVzdG1lbnRfbmV3XzU9Ci0KLU9TX19ndGtfYWRqdXN0bWVudF9zZXRfdmFsdWU9Ci1PU19fZ3RrX2FkanVzdG1lbnRfc2V0X3ZhbHVlXzA9Y2FzdD0oR3RrQWRqdXN0bWVudCAqKQotT1NfX2d0a19hZGp1c3RtZW50X3NldF92YWx1ZV8xPWNhc3Q9KGdkb3VibGUpCi0KLU9TX19ndGtfYWRqdXN0bWVudF92YWx1ZV9jaGFuZ2VkPQotT1NfX2d0a19hZGp1c3RtZW50X3ZhbHVlX2NoYW5nZWRfMD1jYXN0PShHdGtBZGp1c3RtZW50ICopCi0KLU9TX19ndGtfYXJyb3dfbmV3PQotT1NfX2d0a19hcnJvd19uZXdfMD1jYXN0PShHdGtBcnJvd1R5cGUpCi1PU19fZ3RrX2Fycm93X25ld18xPWNhc3Q9KEd0a0Fycm93VHlwZSkKLQotT1NfX2d0a19hcnJvd19zZXQ9Ci1PU19fZ3RrX2Fycm93X3NldF8wPWNhc3Q9KEd0a0Fycm93ICopCi1PU19fZ3RrX2Fycm93X3NldF8xPWNhc3Q9KEd0a0Fycm93VHlwZSkKLU9TX19ndGtfYXJyb3dfc2V0XzI9Y2FzdD0oR3RrQXJyb3dUeXBlKQotCi1PU19fZ3RrX2Jpbl9nZXRfY2hpbGQ9Ci1PU19fZ3RrX2Jpbl9nZXRfY2hpbGRfMD1jYXN0PShHdGtCaW4gKikKLQotT1NfX2d0a19ib3hfc2V0X2NoaWxkX3BhY2tpbmc9Ci1PU19fZ3RrX2JveF9zZXRfY2hpbGRfcGFja2luZ18wPWNhc3Q9KEd0a0JveCAqKQotT1NfX2d0a19ib3hfc2V0X2NoaWxkX3BhY2tpbmdfMT1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfYm94X3NldF9jaGlsZF9wYWNraW5nXzI9Ci1PU19fZ3RrX2JveF9zZXRfY2hpbGRfcGFja2luZ18zPQotT1NfX2d0a19ib3hfc2V0X2NoaWxkX3BhY2tpbmdfND0KLU9TX19ndGtfYm94X3NldF9jaGlsZF9wYWNraW5nXzU9Ci0KLU9TX19ndGtfYnV0dG9uX2NsaWNrZWQ9Ci1PU19fZ3RrX2J1dHRvbl9jbGlja2VkXzA9Y2FzdD0oR3RrQnV0dG9uICopCi0KLU9TX19ndGtfYnV0dG9uX25ldz0KLQotT1NfX2d0a19idXR0b25fc2V0X3JlbGllZj0KLU9TX19ndGtfYnV0dG9uX3NldF9yZWxpZWZfMD1jYXN0PShHdGtCdXR0b24gKikKLU9TX19ndGtfYnV0dG9uX3NldF9yZWxpZWZfMT1jYXN0PShHdGtSZWxpZWZTdHlsZSkKLQotT1NfX2d0a19jZWxsX3JlbmRlcmVyX2dldF9zaXplPQotT1NfX2d0a19jZWxsX3JlbmRlcmVyX2dldF9zaXplXzA9Y2FzdD0oR3RrQ2VsbFJlbmRlcmVyICopCi1PU19fZ3RrX2NlbGxfcmVuZGVyZXJfZ2V0X3NpemVfMT1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfY2VsbF9yZW5kZXJlcl9nZXRfc2l6ZV8yPWNhc3Q9KEdka1JlY3RhbmdsZSAqKSxmbGFncz1ub19pbgotT1NfX2d0a19jZWxsX3JlbmRlcmVyX2dldF9zaXplXzM9Y2FzdD0oZ2ludCAqKQotT1NfX2d0a19jZWxsX3JlbmRlcmVyX2dldF9zaXplXzQ9Y2FzdD0oZ2ludCAqKQotT1NfX2d0a19jZWxsX3JlbmRlcmVyX2dldF9zaXplXzU9Y2FzdD0oZ2ludCAqKQotT1NfX2d0a19jZWxsX3JlbmRlcmVyX2dldF9zaXplXzY9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX2NlbGxfcmVuZGVyZXJfcGl4YnVmX25ldz0KLQotT1NfX2d0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3PQotCi1PU19fZ3RrX2NlbGxfcmVuZGVyZXJfdG9nZ2xlX25ldz0KLQotT1NfX2d0a19jaGVja19idXR0b25fbmV3PQotCi1PU19fZ3RrX2NoZWNrX21lbnVfaXRlbV9nZXRfYWN0aXZlPQotT1NfX2d0a19jaGVja19tZW51X2l0ZW1fZ2V0X2FjdGl2ZV8wPWNhc3Q9KEd0a0NoZWNrTWVudUl0ZW0gKikKLQotT1NfX2d0a19jaGVja19tZW51X2l0ZW1fbmV3X3dpdGhfbGFiZWw9Ci1PU19fZ3RrX2NoZWNrX21lbnVfaXRlbV9uZXdfd2l0aF9sYWJlbF8wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfY2hlY2tfbWVudV9pdGVtX3NldF9hY3RpdmU9Ci1PU19fZ3RrX2NoZWNrX21lbnVfaXRlbV9zZXRfYWN0aXZlXzA9Y2FzdD0oR3RrQ2hlY2tNZW51SXRlbSAqKQotT1NfX2d0a19jaGVja19tZW51X2l0ZW1fc2V0X2FjdGl2ZV8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX2NoZWNrX3ZlcnNpb249Ci1PU19fZ3RrX2NoZWNrX3ZlcnNpb25fMD0KLU9TX19ndGtfY2hlY2tfdmVyc2lvbl8xPQotT1NfX2d0a19jaGVja192ZXJzaW9uXzI9Ci0KLU9TX19ndGtfY2xpcGJvYXJkX2NsZWFyPQotT1NfX2d0a19jbGlwYm9hcmRfY2xlYXJfMD1jYXN0PShHdGtDbGlwYm9hcmQgKikKLQotT1NfX2d0a19jbGlwYm9hcmRfZ2V0PQotT1NfX2d0a19jbGlwYm9hcmRfZ2V0XzA9Y2FzdD0oR2RrQXRvbSkKLQotT1NfX2d0a19jbGlwYm9hcmRfc2V0X3dpdGhfZGF0YT0KLU9TX19ndGtfY2xpcGJvYXJkX3NldF93aXRoX2RhdGFfMD1jYXN0PShHdGtDbGlwYm9hcmQgKikKLU9TX19ndGtfY2xpcGJvYXJkX3NldF93aXRoX2RhdGFfMT1jYXN0PShjb25zdCBHdGtUYXJnZXRFbnRyeSAqKQotT1NfX2d0a19jbGlwYm9hcmRfc2V0X3dpdGhfZGF0YV8yPWNhc3Q9KGd1aW50KQotT1NfX2d0a19jbGlwYm9hcmRfc2V0X3dpdGhfZGF0YV8zPWNhc3Q9KEd0a0NsaXBib2FyZEdldEZ1bmMpCi1PU19fZ3RrX2NsaXBib2FyZF9zZXRfd2l0aF9kYXRhXzQ9Y2FzdD0oR3RrQ2xpcGJvYXJkQ2xlYXJGdW5jKQotT1NfX2d0a19jbGlwYm9hcmRfc2V0X3dpdGhfZGF0YV81PWNhc3Q9KEdPYmplY3QgKikKLQotT1NfX2d0a19jbGlwYm9hcmRfd2FpdF9mb3JfY29udGVudHM9Ci1PU19fZ3RrX2NsaXBib2FyZF93YWl0X2Zvcl9jb250ZW50c18wPWNhc3Q9KEd0a0NsaXBib2FyZCAqKQotT1NfX2d0a19jbGlwYm9hcmRfd2FpdF9mb3JfY29udGVudHNfMT1jYXN0PShHZGtBdG9tKQotCi1PU19fZ3RrX2NvbG9yX3NlbGVjdGlvbl9kaWFsb2dfbmV3PQotT1NfX2d0a19jb2xvcl9zZWxlY3Rpb25fZGlhbG9nX25ld18wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfY29sb3Jfc2VsZWN0aW9uX2dldF9jdXJyZW50X2NvbG9yPQotT1NfX2d0a19jb2xvcl9zZWxlY3Rpb25fZ2V0X2N1cnJlbnRfY29sb3JfMD1jYXN0PShHdGtDb2xvclNlbGVjdGlvbiAqKQotT1NfX2d0a19jb2xvcl9zZWxlY3Rpb25fZ2V0X2N1cnJlbnRfY29sb3JfMT1jYXN0PShHZGtDb2xvciAqKSxmbGFncz1ub19pbgotCi1PU19fZ3RrX2NvbG9yX3NlbGVjdGlvbl9zZXRfY3VycmVudF9jb2xvcj0KLU9TX19ndGtfY29sb3Jfc2VsZWN0aW9uX3NldF9jdXJyZW50X2NvbG9yXzA9Y2FzdD0oR3RrQ29sb3JTZWxlY3Rpb24gKikKLU9TX19ndGtfY29sb3Jfc2VsZWN0aW9uX3NldF9jdXJyZW50X2NvbG9yXzE9Y2FzdD0oR2RrQ29sb3IgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX19ndGtfY29sb3Jfc2VsZWN0aW9uX3NldF9oYXNfcGFsZXR0ZT0KLU9TX19ndGtfY29sb3Jfc2VsZWN0aW9uX3NldF9oYXNfcGFsZXR0ZV8wPWNhc3Q9KEd0a0NvbG9yU2VsZWN0aW9uICopCi1PU19fZ3RrX2NvbG9yX3NlbGVjdGlvbl9zZXRfaGFzX3BhbGV0dGVfMT0KLQotT1NfX2d0a19jb21ib19kaXNhYmxlX2FjdGl2YXRlPQotT1NfX2d0a19jb21ib19kaXNhYmxlX2FjdGl2YXRlXzA9Y2FzdD0oR3RrQ29tYm8gKikKLQotT1NfX2d0a19jb21ib19uZXc9Ci0KLU9TX19ndGtfY29tYm9fc2V0X2Nhc2Vfc2Vuc2l0aXZlPQotT1NfX2d0a19jb21ib19zZXRfY2FzZV9zZW5zaXRpdmVfMD1jYXN0PShHdGtDb21ibyAqKQotT1NfX2d0a19jb21ib19zZXRfY2FzZV9zZW5zaXRpdmVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a19jb21ib19zZXRfcG9wZG93bl9zdHJpbmdzPQotT1NfX2d0a19jb21ib19zZXRfcG9wZG93bl9zdHJpbmdzXzA9Y2FzdD0oR3RrQ29tYm8gKikKLU9TX19ndGtfY29tYm9fc2V0X3BvcGRvd25fc3RyaW5nc18xPWNhc3Q9KEdMaXN0ICopCi0KLU9TX19ndGtfY29udGFpbmVyX2FkZD0KLU9TX19ndGtfY29udGFpbmVyX2FkZF8wPWNhc3Q9KEd0a0NvbnRhaW5lciAqKQotT1NfX2d0a19jb250YWluZXJfYWRkXzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfY29udGFpbmVyX2ZvcmFsbD0KLU9TX19ndGtfY29udGFpbmVyX2ZvcmFsbF8wPWNhc3Q9KEd0a0NvbnRhaW5lciAqKQotT1NfX2d0a19jb250YWluZXJfZm9yYWxsXzE9Y2FzdD1HdGtDYWxsYmFjawotT1NfX2d0a19jb250YWluZXJfZm9yYWxsXzI9Y2FzdD1ncG9pbnRlcgotCi1PU19fZ3RrX2NvbnRhaW5lcl9nZXRfYm9yZGVyX3dpZHRoPQotT1NfX2d0a19jb250YWluZXJfZ2V0X2JvcmRlcl93aWR0aF8wPWNhc3Q9KEd0a0NvbnRhaW5lciAqKQotCi1PU19fZ3RrX2NvbnRhaW5lcl9nZXRfY2hpbGRyZW49Ci1PU19fZ3RrX2NvbnRhaW5lcl9nZXRfY2hpbGRyZW5fMD1jYXN0PShHdGtDb250YWluZXIgKikKLQotT1NfX2d0a19jb250YWluZXJfcmVtb3ZlPQotT1NfX2d0a19jb250YWluZXJfcmVtb3ZlXzA9Y2FzdD0oR3RrQ29udGFpbmVyICopCi1PU19fZ3RrX2NvbnRhaW5lcl9yZW1vdmVfMT1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a19jb250YWluZXJfcmVzaXplX2NoaWxkcmVuPQotT1NfX2d0a19jb250YWluZXJfcmVzaXplX2NoaWxkcmVuXzA9Y2FzdD0oR3RrQ29udGFpbmVyICopCi0KLU9TX19ndGtfY29udGFpbmVyX3NldF9ib3JkZXJfd2lkdGg9Ci1PU19fZ3RrX2NvbnRhaW5lcl9zZXRfYm9yZGVyX3dpZHRoXzA9Y2FzdD0oR3RrQ29udGFpbmVyICopCi1PU19fZ3RrX2NvbnRhaW5lcl9zZXRfYm9yZGVyX3dpZHRoXzE9Y2FzdD0oZ3VpbnQpCi0KLU9TX19ndGtfZGlhbG9nX2FkZF9idXR0b249Ci1PU19fZ3RrX2RpYWxvZ19hZGRfYnV0dG9uXzA9Y2FzdD0oR3RrRGlhbG9nICopCi1PU19fZ3RrX2RpYWxvZ19hZGRfYnV0dG9uXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX19ndGtfZGlhbG9nX2FkZF9idXR0b25fMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX2RpYWxvZ19ydW49Ci1PU19fZ3RrX2RpYWxvZ19ydW5fMD1jYXN0PShHdGtEaWFsb2cgKikKLQotT1NfX2d0a19kcmFnX2JlZ2luPQotT1NfX2d0a19kcmFnX2JlZ2luXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX2RyYWdfYmVnaW5fMT1jYXN0PShHdGtUYXJnZXRMaXN0ICopCi1PU19fZ3RrX2RyYWdfYmVnaW5fMj1jYXN0PShHZGtEcmFnQWN0aW9uKQotT1NfX2d0a19kcmFnX2JlZ2luXzM9Y2FzdD0oZ2ludCkKLU9TX19ndGtfZHJhZ19iZWdpbl80PWNhc3Q9KEdka0V2ZW50ICopCi0KLU9TX19ndGtfZHJhZ19jaGVja190aHJlc2hvbGQ9Ci1PU19fZ3RrX2RyYWdfY2hlY2tfdGhyZXNob2xkXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX2RyYWdfY2hlY2tfdGhyZXNob2xkXzE9Y2FzdD0oZ2ludCkKLU9TX19ndGtfZHJhZ19jaGVja190aHJlc2hvbGRfMj1jYXN0PShnaW50KQotT1NfX2d0a19kcmFnX2NoZWNrX3RocmVzaG9sZF8zPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX2RyYWdfY2hlY2tfdGhyZXNob2xkXzQ9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a19kcmFnX2Rlc3RfZmluZF90YXJnZXQ9Ci1PU19fZ3RrX2RyYWdfZGVzdF9maW5kX3RhcmdldF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19kcmFnX2Rlc3RfZmluZF90YXJnZXRfMT1jYXN0PShHZGtEcmFnQ29udGV4dCAqKQotT1NfX2d0a19kcmFnX2Rlc3RfZmluZF90YXJnZXRfMj1jYXN0PShHdGtUYXJnZXRMaXN0ICopCi0KLU9TX19ndGtfZHJhZ19kZXN0X3NldD0KLU9TX19ndGtfZHJhZ19kZXN0X3NldF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19kcmFnX2Rlc3Rfc2V0XzE9Y2FzdD0oR3RrRGVzdERlZmF1bHRzKQotT1NfX2d0a19kcmFnX2Rlc3Rfc2V0XzI9Y2FzdD0oY29uc3QgR3RrVGFyZ2V0RW50cnkgKikKLU9TX19ndGtfZHJhZ19kZXN0X3NldF8zPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX2RyYWdfZGVzdF9zZXRfND1jYXN0PShHZGtEcmFnQWN0aW9uKQotCi1PU19fZ3RrX2RyYWdfZGVzdF91bnNldD0KLU9TX19ndGtfZHJhZ19kZXN0X3Vuc2V0XzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfZHJhZ19maW5pc2g9Ci1PU19fZ3RrX2RyYWdfZmluaXNoXzA9Y2FzdD0oR2RrRHJhZ0NvbnRleHQgKikKLU9TX19ndGtfZHJhZ19maW5pc2hfMT1jYXN0PShnYm9vbGVhbikKLU9TX19ndGtfZHJhZ19maW5pc2hfMj1jYXN0PShnYm9vbGVhbikKLU9TX19ndGtfZHJhZ19maW5pc2hfMz1jYXN0PShndWludDMyKQotCi1PU19fZ3RrX2RyYWdfZ2V0X2RhdGE9Ci1PU19fZ3RrX2RyYWdfZ2V0X2RhdGFfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfZHJhZ19nZXRfZGF0YV8xPWNhc3Q9KEdka0RyYWdDb250ZXh0ICopCi1PU19fZ3RrX2RyYWdfZ2V0X2RhdGFfMj1jYXN0PShHZGtBdG9tKQotT1NfX2d0a19kcmFnX2dldF9kYXRhXzM9Y2FzdD0oZ3VpbnQzMikKLQotT1NfX2d0a19kcmF3aW5nX2FyZWFfbmV3PQotCi1PU19fZ3RrX2VkaXRhYmxlX2NvcHlfY2xpcGJvYXJkPQotT1NfX2d0a19lZGl0YWJsZV9jb3B5X2NsaXBib2FyZF8wPWNhc3Q9KEd0a0VkaXRhYmxlICopCi0KLU9TX19ndGtfZWRpdGFibGVfY3V0X2NsaXBib2FyZD0KLU9TX19ndGtfZWRpdGFibGVfY3V0X2NsaXBib2FyZF8wPWNhc3Q9KEd0a0VkaXRhYmxlICopCi0KLU9TX19ndGtfZWRpdGFibGVfZGVsZXRlX3NlbGVjdGlvbj0KLU9TX19ndGtfZWRpdGFibGVfZGVsZXRlX3NlbGVjdGlvbl8wPWNhc3Q9KEd0a0VkaXRhYmxlICopCi0KLU9TX19ndGtfZWRpdGFibGVfZGVsZXRlX3RleHQ9Ci1PU19fZ3RrX2VkaXRhYmxlX2RlbGV0ZV90ZXh0XzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLU9TX19ndGtfZWRpdGFibGVfZGVsZXRlX3RleHRfMT1jYXN0PShnaW50KQotT1NfX2d0a19lZGl0YWJsZV9kZWxldGVfdGV4dF8yPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfZWRpdGFibGVfZ2V0X2NoYXJzPQotT1NfX2d0a19lZGl0YWJsZV9nZXRfY2hhcnNfMD1jYXN0PShHdGtFZGl0YWJsZSAqKQotT1NfX2d0a19lZGl0YWJsZV9nZXRfY2hhcnNfMT1jYXN0PShnaW50KQotT1NfX2d0a19lZGl0YWJsZV9nZXRfY2hhcnNfMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX2VkaXRhYmxlX2dldF9lZGl0YWJsZT0KLU9TX19ndGtfZWRpdGFibGVfZ2V0X2VkaXRhYmxlXzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLQotT1NfX2d0a19lZGl0YWJsZV9nZXRfcG9zaXRpb249Ci1PU19fZ3RrX2VkaXRhYmxlX2dldF9wb3NpdGlvbl8wPWNhc3Q9KEd0a0VkaXRhYmxlICopCi0KLU9TX19ndGtfZWRpdGFibGVfZ2V0X3NlbGVjdGlvbl9ib3VuZHM9Ci1PU19fZ3RrX2VkaXRhYmxlX2dldF9zZWxlY3Rpb25fYm91bmRzXzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLU9TX19ndGtfZWRpdGFibGVfZ2V0X3NlbGVjdGlvbl9ib3VuZHNfMT1jYXN0PShnaW50ICopCi1PU19fZ3RrX2VkaXRhYmxlX2dldF9zZWxlY3Rpb25fYm91bmRzXzI9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX2VkaXRhYmxlX2luc2VydF90ZXh0PQotT1NfX2d0a19lZGl0YWJsZV9pbnNlcnRfdGV4dF8wPWNhc3Q9KEd0a0VkaXRhYmxlICopCi1PU19fZ3RrX2VkaXRhYmxlX2luc2VydF90ZXh0XzE9Y2FzdD0oZ2NoYXIgKikKLU9TX19ndGtfZWRpdGFibGVfaW5zZXJ0X3RleHRfMj1jYXN0PShnaW50KQotT1NfX2d0a19lZGl0YWJsZV9pbnNlcnRfdGV4dF8zPWNhc3Q9KGdpbnQgKikKLQotT1NfX2d0a19lZGl0YWJsZV9wYXN0ZV9jbGlwYm9hcmQ9Ci1PU19fZ3RrX2VkaXRhYmxlX3Bhc3RlX2NsaXBib2FyZF8wPWNhc3Q9KEd0a0VkaXRhYmxlICopCi0KLU9TX19ndGtfZWRpdGFibGVfc2VsZWN0X3JlZ2lvbj0KLU9TX19ndGtfZWRpdGFibGVfc2VsZWN0X3JlZ2lvbl8wPWNhc3Q9KEd0a0VkaXRhYmxlICopCi1PU19fZ3RrX2VkaXRhYmxlX3NlbGVjdF9yZWdpb25fMT1jYXN0PShnaW50KQotT1NfX2d0a19lZGl0YWJsZV9zZWxlY3RfcmVnaW9uXzI9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a19lZGl0YWJsZV9zZXRfZWRpdGFibGU9Ci1PU19fZ3RrX2VkaXRhYmxlX3NldF9lZGl0YWJsZV8wPWNhc3Q9KEd0a0VkaXRhYmxlICopCi1PU19fZ3RrX2VkaXRhYmxlX3NldF9lZGl0YWJsZV8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX2VkaXRhYmxlX3NldF9wb3NpdGlvbj0KLU9TX19ndGtfZWRpdGFibGVfc2V0X3Bvc2l0aW9uXzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLU9TX19ndGtfZWRpdGFibGVfc2V0X3Bvc2l0aW9uXzE9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a19lbnRyeV9nZXRfaW52aXNpYmxlX2NoYXI9Ci1PU19fZ3RrX2VudHJ5X2dldF9pbnZpc2libGVfY2hhcl8wPWNhc3Q9KEd0a0VudHJ5ICopCi0KLU9TX19ndGtfZW50cnlfZ2V0X2xheW91dD0KLU9TX19ndGtfZW50cnlfZ2V0X2xheW91dF8wPWNhc3Q9KEd0a0VudHJ5ICopCi0KLU9TX19ndGtfZW50cnlfZ2V0X21heF9sZW5ndGg9Ci1PU19fZ3RrX2VudHJ5X2dldF9tYXhfbGVuZ3RoXzA9Y2FzdD0oR3RrRW50cnkgKikKLQotT1NfX2d0a19lbnRyeV9nZXRfdGV4dD0KLU9TX19ndGtfZW50cnlfZ2V0X3RleHRfMD1jYXN0PShHdGtFbnRyeSAqKQotCi1PU19fZ3RrX2VudHJ5X2dldF92aXNpYmlsaXR5PQotT1NfX2d0a19lbnRyeV9nZXRfdmlzaWJpbGl0eV8wPWNhc3Q9KEd0a0VudHJ5ICopCi0KLU9TX19ndGtfZW50cnlfbmV3PQotCi1PU19fZ3RrX2VudHJ5X3NldF9hY3RpdmF0ZXNfZGVmYXVsdD0KLU9TX19ndGtfZW50cnlfc2V0X2FjdGl2YXRlc19kZWZhdWx0XzA9Y2FzdD0oR3RrRW50cnkgKikKLU9TX19ndGtfZW50cnlfc2V0X2FjdGl2YXRlc19kZWZhdWx0XzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfZW50cnlfc2V0X2FsaWdubWVudD1mbGFncz1keW5hbWljCi1PU19fZ3RrX2VudHJ5X3NldF9hbGlnbm1lbnRfMD1jYXN0PShHdGtFbnRyeSAqKQotT1NfX2d0a19lbnRyeV9zZXRfYWxpZ25tZW50XzE9Y2FzdD0oZ2Zsb2F0KQotCi1PU19fZ3RrX2VudHJ5X3NldF9oYXNfZnJhbWU9Ci1PU19fZ3RrX2VudHJ5X3NldF9oYXNfZnJhbWVfMD1jYXN0PShHdGtFbnRyeSAqKQotT1NfX2d0a19lbnRyeV9zZXRfaGFzX2ZyYW1lXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfZW50cnlfc2V0X2ludmlzaWJsZV9jaGFyPQotT1NfX2d0a19lbnRyeV9zZXRfaW52aXNpYmxlX2NoYXJfMD1jYXN0PShHdGtFbnRyeSAqKQotT1NfX2d0a19lbnRyeV9zZXRfaW52aXNpYmxlX2NoYXJfMT1jYXN0PShnaW50KQotCi1PU19fZ3RrX2VudHJ5X3NldF9tYXhfbGVuZ3RoPQotT1NfX2d0a19lbnRyeV9zZXRfbWF4X2xlbmd0aF8wPWNhc3Q9KEd0a0VudHJ5ICopCi1PU19fZ3RrX2VudHJ5X3NldF9tYXhfbGVuZ3RoXzE9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a19lbnRyeV9zZXRfdGV4dD0KLU9TX19ndGtfZW50cnlfc2V0X3RleHRfMD1jYXN0PShHdGtFbnRyeSAqKQotT1NfX2d0a19lbnRyeV9zZXRfdGV4dF8xPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfZW50cnlfc2V0X3Zpc2liaWxpdHk9Ci1PU19fZ3RrX2VudHJ5X3NldF92aXNpYmlsaXR5XzA9Y2FzdD0oR3RrRW50cnkgKikKLU9TX19ndGtfZW50cnlfc2V0X3Zpc2liaWxpdHlfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a19ldmVudHNfcGVuZGluZz0KLQotT1NfX2d0a19maWxlX2Nob29zZXJfYWRkX2ZpbHRlcj1mbGFncz1keW5hbWljCi1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9hZGRfZmlsdGVyXzA9Ci1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9hZGRfZmlsdGVyXzE9Ci0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2RpYWxvZ19uZXc9ZmxhZ3M9bm9fZ2VuCi1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9kaWFsb2dfbmV3XzA9Ci1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9kaWFsb2dfbmV3XzE9Ci1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9kaWFsb2dfbmV3XzI9Ci1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9kaWFsb2dfbmV3XzM9Ci1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9kaWFsb2dfbmV3XzQ9Ci1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9kaWFsb2dfbmV3XzU9Ci1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9kaWFsb2dfbmV3XzY9Ci1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9kaWFsb2dfbmV3Xzc9Ci0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2dldF9jdXJyZW50X2ZvbGRlcj1mbGFncz1keW5hbWljCi1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9nZXRfY3VycmVudF9mb2xkZXJfMD0KLQotT1NfX2d0a19maWxlX2Nob29zZXJfZ2V0X2ZpbGVuYW1lPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfZmlsZV9jaG9vc2VyX2dldF9maWxlbmFtZV8wPQotCi1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9nZXRfZmlsZW5hbWVzPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfZmlsZV9jaG9vc2VyX2dldF9maWxlbmFtZXNfMD0KLQotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X2N1cnJlbnRfZm9sZGVyPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfZmlsZV9jaG9vc2VyX3NldF9jdXJyZW50X2ZvbGRlcl8wPQotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X2N1cnJlbnRfZm9sZGVyXzE9Ci0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX3NldF9jdXJyZW50X25hbWU9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X2N1cnJlbnRfbmFtZV8wPQotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X2N1cnJlbnRfbmFtZV8xPQotCi1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9zZXRfZXh0cmFfd2lkZ2V0PWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfZmlsZV9jaG9vc2VyX3NldF9leHRyYV93aWRnZXRfMD0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX3NldF9leHRyYV93aWRnZXRfMT0KLQotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X2ZpbGVuYW1lPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfZmlsZV9jaG9vc2VyX3NldF9maWxlbmFtZV8wPQotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X2ZpbGVuYW1lXzE9Ci0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX3NldF9zZWxlY3RfbXVsdGlwbGU9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X3NlbGVjdF9tdWx0aXBsZV8wPQotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X3NlbGVjdF9tdWx0aXBsZV8xPQotCi1PU19fZ3RrX2ZpbGVfZmlsdGVyX2FkZF9wYXR0ZXJuPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfZmlsZV9maWx0ZXJfYWRkX3BhdHRlcm5fMD0KLU9TX19ndGtfZmlsZV9maWx0ZXJfYWRkX3BhdHRlcm5fMT0KLQotT1NfX2d0a19maWxlX2ZpbHRlcl9uZXc9ZmxhZ3M9ZHluYW1pYwotCi1PU19fZ3RrX2ZpbGVfZmlsdGVyX3NldF9uYW1lPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfZmlsZV9maWx0ZXJfc2V0X25hbWVfMD0KLU9TX19ndGtfZmlsZV9maWx0ZXJfc2V0X25hbWVfMT0KLQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9nZXRfZmlsZW5hbWU9Ci1PU19fZ3RrX2ZpbGVfc2VsZWN0aW9uX2dldF9maWxlbmFtZV8wPWNhc3Q9KEd0a0ZpbGVTZWxlY3Rpb24gKikKLQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9nZXRfc2VsZWN0aW9ucz0KLU9TX19ndGtfZmlsZV9zZWxlY3Rpb25fZ2V0X3NlbGVjdGlvbnNfMD1jYXN0PShHdGtGaWxlU2VsZWN0aW9uICopCi0KLU9TX19ndGtfZmlsZV9zZWxlY3Rpb25faGlkZV9maWxlb3BfYnV0dG9ucz0KLU9TX19ndGtfZmlsZV9zZWxlY3Rpb25faGlkZV9maWxlb3BfYnV0dG9uc18wPWNhc3Q9KEd0a0ZpbGVTZWxlY3Rpb24gKikKLQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9uZXc9Ci1PU19fZ3RrX2ZpbGVfc2VsZWN0aW9uX25ld18wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfZmlsZV9zZWxlY3Rpb25fc2V0X2ZpbGVuYW1lPQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9zZXRfZmlsZW5hbWVfMD1jYXN0PShHdGtGaWxlU2VsZWN0aW9uICopCi1PU19fZ3RrX2ZpbGVfc2VsZWN0aW9uX3NldF9maWxlbmFtZV8xPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfZmlsZV9zZWxlY3Rpb25fc2V0X3NlbGVjdF9tdWx0aXBsZT0KLU9TX19ndGtfZmlsZV9zZWxlY3Rpb25fc2V0X3NlbGVjdF9tdWx0aXBsZV8wPWNhc3Q9KEd0a0ZpbGVTZWxlY3Rpb24gKikKLU9TX19ndGtfZmlsZV9zZWxlY3Rpb25fc2V0X3NlbGVjdF9tdWx0aXBsZV8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX2ZpeGVkX21vdmU9Ci1PU19fZ3RrX2ZpeGVkX21vdmVfMD1jYXN0PShHdGtGaXhlZCAqKQotT1NfX2d0a19maXhlZF9tb3ZlXzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX2ZpeGVkX21vdmVfMj1jYXN0PShnaW50KQotT1NfX2d0a19maXhlZF9tb3ZlXzM9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a19maXhlZF9uZXc9Ci0KLU9TX19ndGtfZml4ZWRfc2V0X2hhc193aW5kb3c9Ci1PU19fZ3RrX2ZpeGVkX3NldF9oYXNfd2luZG93XzA9Y2FzdD0oR3RrRml4ZWQgKikKLU9TX19ndGtfZml4ZWRfc2V0X2hhc193aW5kb3dfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a19mb250X3NlbGVjdGlvbl9kaWFsb2dfZ2V0X2ZvbnRfbmFtZT0KLU9TX19ndGtfZm9udF9zZWxlY3Rpb25fZGlhbG9nX2dldF9mb250X25hbWVfMD1jYXN0PShHdGtGb250U2VsZWN0aW9uRGlhbG9nICopCi0KLU9TX19ndGtfZm9udF9zZWxlY3Rpb25fZGlhbG9nX25ldz0KLU9TX19ndGtfZm9udF9zZWxlY3Rpb25fZGlhbG9nX25ld18wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfZm9udF9zZWxlY3Rpb25fZGlhbG9nX3NldF9mb250X25hbWU9Ci1PU19fZ3RrX2ZvbnRfc2VsZWN0aW9uX2RpYWxvZ19zZXRfZm9udF9uYW1lXzA9Y2FzdD0oR3RrRm9udFNlbGVjdGlvbkRpYWxvZyAqKQotT1NfX2d0a19mb250X3NlbGVjdGlvbl9kaWFsb2dfc2V0X2ZvbnRfbmFtZV8xPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfZnJhbWVfZ2V0X2xhYmVsX3dpZGdldD0KLU9TX19ndGtfZnJhbWVfZ2V0X2xhYmVsX3dpZGdldF8wPWNhc3Q9KEd0a0ZyYW1lICopCi0KLU9TX19ndGtfZnJhbWVfbmV3PQotT1NfX2d0a19mcmFtZV9uZXdfMD1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX2ZyYW1lX3NldF9sYWJlbD0KLU9TX19ndGtfZnJhbWVfc2V0X2xhYmVsXzA9Y2FzdD0oR3RrRnJhbWUgKikKLU9TX19ndGtfZnJhbWVfc2V0X2xhYmVsXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19mcmFtZV9zZXRfbGFiZWxfd2lkZ2V0PQotT1NfX2d0a19mcmFtZV9zZXRfbGFiZWxfd2lkZ2V0XzA9Y2FzdD0oR3RrRnJhbWUgKikKLU9TX19ndGtfZnJhbWVfc2V0X2xhYmVsX3dpZGdldF8xPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX2ZyYW1lX3NldF9zaGFkb3dfdHlwZT0KLU9TX19ndGtfZnJhbWVfc2V0X3NoYWRvd190eXBlXzA9Y2FzdD0oR3RrRnJhbWUgKikKLU9TX19ndGtfZnJhbWVfc2V0X3NoYWRvd190eXBlXzE9Y2FzdD0oR3RrU2hhZG93VHlwZSkKLQotT1NfX2d0a19nZXRfY3VycmVudF9ldmVudD0KLQotT1NfX2d0a19nZXRfY3VycmVudF9ldmVudF9zdGF0ZT0KLU9TX19ndGtfZ2V0X2N1cnJlbnRfZXZlbnRfc3RhdGVfMD1jYXN0PUdka01vZGlmaWVyVHlwZSoKLQotT1NfX2d0a19nZXRfY3VycmVudF9ldmVudF90aW1lPQotCi1PU19fZ3RrX2dldF9kZWZhdWx0X2xhbmd1YWdlPQotCi1PU19fZ3RrX2dldF9ldmVudF93aWRnZXQ9Ci1PU19fZ3RrX2dldF9ldmVudF93aWRnZXRfMD1jYXN0PUdka0V2ZW50ICoKLQotT1NfX2d0a19ncmFiX2FkZD0KLU9TX19ndGtfZ3JhYl9hZGRfMD1jYXN0PUd0a1dpZGdldCAqCi0KLU9TX19ndGtfZ3JhYl9nZXRfY3VycmVudD0KLQotT1NfX2d0a19ncmFiX3JlbW92ZT0KLU9TX19ndGtfZ3JhYl9yZW1vdmVfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a19oYm94X25ldz0KLU9TX19ndGtfaGJveF9uZXdfMD1jYXN0PShnYm9vbGVhbikKLU9TX19ndGtfaGJveF9uZXdfMT1jYXN0PShnaW50KQotCi1PU19fZ3RrX2hzY2FsZV9uZXc9Ci1PU19fZ3RrX2hzY2FsZV9uZXdfMD1jYXN0PShHdGtBZGp1c3RtZW50ICopCi0KLU9TX19ndGtfaHNjcm9sbGJhcl9uZXc9Ci1PU19fZ3RrX2hzY3JvbGxiYXJfbmV3XzA9Y2FzdD0oR3RrQWRqdXN0bWVudCAqKQotCi1PU19fZ3RrX2hzZXBhcmF0b3JfbmV3PQotCi1PU19fZ3RrX2ljb25fZmFjdG9yeV9sb29rdXBfZGVmYXVsdD0KLU9TX19ndGtfaWNvbl9mYWN0b3J5X2xvb2t1cF9kZWZhdWx0XzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19pY29uX3NldF9yZW5kZXJfaWNvbj0KLU9TX19ndGtfaWNvbl9zZXRfcmVuZGVyX2ljb25fMD1jYXN0PShHdGtJY29uU2V0ICopCi1PU19fZ3RrX2ljb25fc2V0X3JlbmRlcl9pY29uXzE9Y2FzdD0oR3RrU3R5bGUgKikKLU9TX19ndGtfaWNvbl9zZXRfcmVuZGVyX2ljb25fMj1jYXN0PUd0a1RleHREaXJlY3Rpb24pCi1PU19fZ3RrX2ljb25fc2V0X3JlbmRlcl9pY29uXzM9Y2FzdD0oR3RrU3RhdGVUeXBlKQotT1NfX2d0a19pY29uX3NldF9yZW5kZXJfaWNvbl80PWNhc3Q9KEd0a0ljb25TaXplKQotT1NfX2d0a19pY29uX3NldF9yZW5kZXJfaWNvbl81PWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19pY29uX3NldF9yZW5kZXJfaWNvbl82PWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotT1NfX2d0a19pbV9jb250ZXh0X2ZpbHRlcl9rZXlwcmVzcz0KLU9TX19ndGtfaW1fY29udGV4dF9maWx0ZXJfa2V5cHJlc3NfMD1jYXN0PShHdGtJTUNvbnRleHQgKikKLU9TX19ndGtfaW1fY29udGV4dF9maWx0ZXJfa2V5cHJlc3NfMT1jYXN0PShHZGtFdmVudEtleSAqKQotCi1PU19fZ3RrX2ltX2NvbnRleHRfZm9jdXNfaW49Ci1PU19fZ3RrX2ltX2NvbnRleHRfZm9jdXNfaW5fMD1jYXN0PShHdGtJTUNvbnRleHQgKikKLQotT1NfX2d0a19pbV9jb250ZXh0X2ZvY3VzX291dD0KLU9TX19ndGtfaW1fY29udGV4dF9mb2N1c19vdXRfMD1jYXN0PShHdGtJTUNvbnRleHQgKikKLQotT1NfX2d0a19pbV9jb250ZXh0X2dldF9wcmVlZGl0X3N0cmluZz0KLU9TX19ndGtfaW1fY29udGV4dF9nZXRfcHJlZWRpdF9zdHJpbmdfMD1jYXN0PShHdGtJTUNvbnRleHQgKikKLU9TX19ndGtfaW1fY29udGV4dF9nZXRfcHJlZWRpdF9zdHJpbmdfMT1jYXN0PShnY2hhciAqKikKLU9TX19ndGtfaW1fY29udGV4dF9nZXRfcHJlZWRpdF9zdHJpbmdfMj1jYXN0PShQYW5nb0F0dHJMaXN0ICoqKQotT1NfX2d0a19pbV9jb250ZXh0X2dldF9wcmVlZGl0X3N0cmluZ18zPWNhc3Q9KGdpbnQgKikKLQotT1NfX2d0a19pbV9jb250ZXh0X2dldF90eXBlPQotCi1PU19fZ3RrX2ltX2NvbnRleHRfcmVzZXQ9Ci1PU19fZ3RrX2ltX2NvbnRleHRfcmVzZXRfMD1jYXN0PShHdGtJTUNvbnRleHQgKikKLQotT1NfX2d0a19pbV9jb250ZXh0X3NldF9jbGllbnRfd2luZG93PQotT1NfX2d0a19pbV9jb250ZXh0X3NldF9jbGllbnRfd2luZG93XzA9Y2FzdD0oR3RrSU1Db250ZXh0ICopCi1PU19fZ3RrX2ltX2NvbnRleHRfc2V0X2NsaWVudF93aW5kb3dfMT1jYXN0PShHZGtXaW5kb3cgKikKLQotT1NfX2d0a19pbV9jb250ZXh0X3NldF9jdXJzb3JfbG9jYXRpb249Ci1PU19fZ3RrX2ltX2NvbnRleHRfc2V0X2N1cnNvcl9sb2NhdGlvbl8wPWNhc3Q9KEd0a0lNQ29udGV4dCAqKQotT1NfX2d0a19pbV9jb250ZXh0X3NldF9jdXJzb3JfbG9jYXRpb25fMT1jYXN0PShHZGtSZWN0YW5nbGUgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX19ndGtfaW1fbXVsdGljb250ZXh0X2FwcGVuZF9tZW51aXRlbXM9Ci1PU19fZ3RrX2ltX211bHRpY29udGV4dF9hcHBlbmRfbWVudWl0ZW1zXzA9Y2FzdD0oR3RrSU1NdWx0aWNvbnRleHQgKikKLU9TX19ndGtfaW1fbXVsdGljb250ZXh0X2FwcGVuZF9tZW51aXRlbXNfMT1jYXN0PShHdGtNZW51U2hlbGwgKikKLQotT1NfX2d0a19pbV9tdWx0aWNvbnRleHRfbmV3PQotCi1PU19fZ3RrX2ltYWdlX21lbnVfaXRlbV9uZXdfd2l0aF9sYWJlbD0KLU9TX19ndGtfaW1hZ2VfbWVudV9pdGVtX25ld193aXRoX2xhYmVsXzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19pbWFnZV9tZW51X2l0ZW1fc2V0X2ltYWdlPQotT1NfX2d0a19pbWFnZV9tZW51X2l0ZW1fc2V0X2ltYWdlXzA9Y2FzdD0oR3RrSW1hZ2VNZW51SXRlbSAqKQotT1NfX2d0a19pbWFnZV9tZW51X2l0ZW1fc2V0X2ltYWdlXzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfaW1hZ2VfbmV3PQotCi1PU19fZ3RrX2ltYWdlX25ld19mcm9tX3BpeGJ1Zj0KLU9TX19ndGtfaW1hZ2VfbmV3X2Zyb21fcGl4YnVmXzA9Y2FzdD1HZGtQaXhidWYgKgotCi1PU19fZ3RrX2ltYWdlX25ld19mcm9tX3BpeG1hcD0KLU9TX19ndGtfaW1hZ2VfbmV3X2Zyb21fcGl4bWFwXzA9Y2FzdD0oR2RrUGl4bWFwICopCi1PU19fZ3RrX2ltYWdlX25ld19mcm9tX3BpeG1hcF8xPWNhc3Q9KEdka0JpdG1hcCAqKQotCi1PU19fZ3RrX2ltYWdlX3NldF9mcm9tX3BpeGJ1Zj0KLU9TX19ndGtfaW1hZ2Vfc2V0X2Zyb21fcGl4YnVmXzA9Y2FzdD0oR3RrSW1hZ2UgKikKLU9TX19ndGtfaW1hZ2Vfc2V0X2Zyb21fcGl4YnVmXzE9Y2FzdD0oR2RrUGl4YnVmICopCi0KLU9TX19ndGtfaW1hZ2Vfc2V0X2Zyb21fcGl4bWFwPQotT1NfX2d0a19pbWFnZV9zZXRfZnJvbV9waXhtYXBfMD1jYXN0PShHdGtJbWFnZSAqKQotT1NfX2d0a19pbWFnZV9zZXRfZnJvbV9waXhtYXBfMT1jYXN0PShHZGtCaXRtYXAgKikKLU9TX19ndGtfaW1hZ2Vfc2V0X2Zyb21fcGl4bWFwXzI9Y2FzdD0oR2RrQml0bWFwICopCi0KLU9TX19ndGtfaW5pdF9jaGVjaz0KLU9TX19ndGtfaW5pdF9jaGVja18wPWNhc3Q9KGludCAqKQotT1NfX2d0a19pbml0X2NoZWNrXzE9Y2FzdD0oY2hhciAqKiopCi0KLU9TX19ndGtfbGFiZWxfZ2V0X21uZW1vbmljX2tleXZhbD0KLU9TX19ndGtfbGFiZWxfZ2V0X21uZW1vbmljX2tleXZhbF8wPWNhc3Q9R3RrTGFiZWwgKgotCi1PU19fZ3RrX2xhYmVsX25ldz0KLU9TX19ndGtfbGFiZWxfbmV3XzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19sYWJlbF9uZXdfd2l0aF9tbmVtb25pYz0KLU9TX19ndGtfbGFiZWxfbmV3X3dpdGhfbW5lbW9uaWNfMD1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX2xhYmVsX3NldF9hdHRyaWJ1dGVzPQotT1NfX2d0a19sYWJlbF9zZXRfYXR0cmlidXRlc18wPWNhc3Q9KEd0a0xhYmVsICopCi1PU19fZ3RrX2xhYmVsX3NldF9hdHRyaWJ1dGVzXzE9Y2FzdD0oUGFuZ29BdHRyTGlzdCAqKQotCi1PU19fZ3RrX2xhYmVsX3NldF9qdXN0aWZ5PQotT1NfX2d0a19sYWJlbF9zZXRfanVzdGlmeV8wPWNhc3Q9KEd0a0xhYmVsICopCi1PU19fZ3RrX2xhYmVsX3NldF9qdXN0aWZ5XzE9Y2FzdD0oR3RrSnVzdGlmaWNhdGlvbikKLQotT1NfX2d0a19sYWJlbF9zZXRfbGluZV93cmFwPQotT1NfX2d0a19sYWJlbF9zZXRfbGluZV93cmFwXzA9Y2FzdD0oR3RrTGFiZWwgKikKLU9TX19ndGtfbGFiZWxfc2V0X2xpbmVfd3JhcF8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fMWd0a18xbGFiZWxfMXNldF8xdGV4dF9fSUk9Ci1PU19fMWd0a18xbGFiZWxfMXNldF8xdGV4dF9fSUlfMD1jYXN0PShHdGtMYWJlbCAqKQotT1NfXzFndGtfMWxhYmVsXzFzZXRfMXRleHRfX0lJXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfXzFndGtfMWxhYmVsXzFzZXRfMXRleHRfX0lfM0I9Ci1PU19fMWd0a18xbGFiZWxfMXNldF8xdGV4dF9fSV8zQl8wPWNhc3Q9KEd0a0xhYmVsICopCi1PU19fMWd0a18xbGFiZWxfMXNldF8xdGV4dF9fSV8zQl8xPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfbGFiZWxfc2V0X3RleHRfd2l0aF9tbmVtb25pYz0KLU9TX19ndGtfbGFiZWxfc2V0X3RleHRfd2l0aF9tbmVtb25pY18wPWNhc3Q9KEd0a0xhYmVsICopCi1PU19fZ3RrX2xhYmVsX3NldF90ZXh0X3dpdGhfbW5lbW9uaWNfMT1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX2xpc3RfYXBwZW5kX2l0ZW1zPQotT1NfX2d0a19saXN0X2FwcGVuZF9pdGVtc18wPWNhc3Q9KEd0a0xpc3QgKikKLU9TX19ndGtfbGlzdF9hcHBlbmRfaXRlbXNfMT1jYXN0PShHTGlzdCAqKQotCi1PU19fZ3RrX2xpc3RfY2xlYXJfaXRlbXM9Ci1PU19fZ3RrX2xpc3RfY2xlYXJfaXRlbXNfMD1jYXN0PShHdGtMaXN0ICopCi1PU19fZ3RrX2xpc3RfY2xlYXJfaXRlbXNfMT0KLU9TX19ndGtfbGlzdF9jbGVhcl9pdGVtc18yPQotCi1PU19fZ3RrX2xpc3RfaW5zZXJ0X2l0ZW1zPQotT1NfX2d0a19saXN0X2luc2VydF9pdGVtc18wPWNhc3Q9KEd0a0xpc3QgKikKLU9TX19ndGtfbGlzdF9pbnNlcnRfaXRlbXNfMT1jYXN0PShHTGlzdCAqKQotT1NfX2d0a19saXN0X2luc2VydF9pdGVtc18yPQotCi1PU19fZ3RrX2xpc3RfaXRlbV9uZXdfd2l0aF9sYWJlbD0KLU9TX19ndGtfbGlzdF9pdGVtX25ld193aXRoX2xhYmVsXzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19saXN0X3JlbW92ZV9pdGVtcz0KLU9TX19ndGtfbGlzdF9yZW1vdmVfaXRlbXNfMD1jYXN0PShHdGtMaXN0ICopCi1PU19fZ3RrX2xpc3RfcmVtb3ZlX2l0ZW1zXzE9Y2FzdD0oR0xpc3QgKikKLQotT1NfX2d0a19saXN0X3NlbGVjdF9pdGVtPQotT1NfX2d0a19saXN0X3NlbGVjdF9pdGVtXzA9Y2FzdD0oR3RrTGlzdCAqKQotT1NfX2d0a19saXN0X3NlbGVjdF9pdGVtXzE9Ci0KLU9TX19ndGtfbGlzdF9zdG9yZV9hcHBlbmQ9Ci1PU19fZ3RrX2xpc3Rfc3RvcmVfYXBwZW5kXzA9Y2FzdD0oR3RrTGlzdFN0b3JlICopCi1PU19fZ3RrX2xpc3Rfc3RvcmVfYXBwZW5kXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLQotT1NfX2d0a19saXN0X3N0b3JlX2NsZWFyPQotT1NfX2d0a19saXN0X3N0b3JlX2NsZWFyXzA9Y2FzdD0oR3RrTGlzdFN0b3JlICopCi0KLU9TX19ndGtfbGlzdF9zdG9yZV9pbnNlcnQ9Ci1PU19fZ3RrX2xpc3Rfc3RvcmVfaW5zZXJ0XzA9Y2FzdD0oR3RrTGlzdFN0b3JlICopCi1PU19fZ3RrX2xpc3Rfc3RvcmVfaW5zZXJ0XzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX19ndGtfbGlzdF9zdG9yZV9pbnNlcnRfMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX2xpc3Rfc3RvcmVfbmV3dj0KLU9TX19ndGtfbGlzdF9zdG9yZV9uZXd2XzA9Y2FzdD0oZ2ludCkKLU9TX19ndGtfbGlzdF9zdG9yZV9uZXd2XzE9Y2FzdD0oR1R5cGUgKikKLQotT1NfX2d0a19saXN0X3N0b3JlX3JlbW92ZT0KLU9TX19ndGtfbGlzdF9zdG9yZV9yZW1vdmVfMD1jYXN0PShHdGtMaXN0U3RvcmUgKikKLU9TX19ndGtfbGlzdF9zdG9yZV9yZW1vdmVfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotCi1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJSUk9Ci1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJSUlfMD1jYXN0PShHdGtMaXN0U3RvcmUgKikKLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlJSV8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJSUlfMj0KLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlJSV8zPQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUlJXzQ9Ci0KLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlKST0KLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlKSV8wPWNhc3Q9KEd0a0xpc3RTdG9yZSAqKQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUpJXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlKSV8yPQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUpJXzM9Ci1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJSklfND0KLQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJPQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJXzA9Y2FzdD0oR3RrTGlzdFN0b3JlICopCi1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMklfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJXzI9Ci1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMklfMz1mbGFncz1ub19vdXQKLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtDb2xvcl8ySV80PQotCi1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJWkk9Ci1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJWklfMD1jYXN0PShHdGtMaXN0U3RvcmUgKikKLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlaSV8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJWklfMj0KLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlaSV8zPQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSVpJXzQ9Ci0KLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlfM0JJPQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSV8zQklfMD1jYXN0PShHdGtMaXN0U3RvcmUgKikKLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlfM0JJXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlfM0JJXzI9Ci1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJXzNCSV8zPQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSV8zQklfND0KLQotT1NfX2d0a19saXN0X3Vuc2VsZWN0X2FsbD0KLU9TX19ndGtfbGlzdF91bnNlbGVjdF9hbGxfMD1jYXN0PShHdGtMaXN0ICopCi0KLU9TX19ndGtfbGlzdF91bnNlbGVjdF9pdGVtPQotT1NfX2d0a19saXN0X3Vuc2VsZWN0X2l0ZW1fMD1jYXN0PShHdGtMaXN0ICopCi1PU19fZ3RrX2xpc3RfdW5zZWxlY3RfaXRlbV8xPQotCi1PU19fZ3RrX21haW49Ci0KLU9TX19ndGtfbWFpbl9kb19ldmVudD0KLU9TX19ndGtfbWFpbl9kb19ldmVudF8wPWNhc3Q9KEdka0V2ZW50ICopCi0KLU9TX19ndGtfbWFpbl9pdGVyYXRpb249Ci0KLU9TX19ndGtfbWFqb3JfdmVyc2lvbj1mbGFncz1jb25zdAotCi1PU19fZ3RrX21lbnVfYmFyX25ldz0KLQotT1NfX2d0a19tZW51X2l0ZW1fcmVtb3ZlX3N1Ym1lbnU9Ci1PU19fZ3RrX21lbnVfaXRlbV9yZW1vdmVfc3VibWVudV8wPWNhc3Q9KEd0a01lbnVJdGVtICopCi0KLU9TX19ndGtfbWVudV9pdGVtX3NldF9zdWJtZW51PQotT1NfX2d0a19tZW51X2l0ZW1fc2V0X3N1Ym1lbnVfMD1jYXN0PShHdGtNZW51SXRlbSAqKQotT1NfX2d0a19tZW51X2l0ZW1fc2V0X3N1Ym1lbnVfMT1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a19tZW51X25ldz0KLQotT1NfX2d0a19tZW51X3BvcGRvd249Ci1PU19fZ3RrX21lbnVfcG9wZG93bl8wPWNhc3Q9KEd0a01lbnUgKikKLQotT1NfX2d0a19tZW51X3BvcHVwPQotT1NfX2d0a19tZW51X3BvcHVwXzA9Y2FzdD0oR3RrTWVudSAqKQotT1NfX2d0a19tZW51X3BvcHVwXzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX21lbnVfcG9wdXBfMj1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfbWVudV9wb3B1cF8zPWNhc3Q9KEd0a01lbnVQb3NpdGlvbkZ1bmMpCi1PU19fZ3RrX21lbnVfcG9wdXBfND1jYXN0PShncG9pbnRlcikKLU9TX19ndGtfbWVudV9wb3B1cF81PWNhc3Q9KGd1aW50KQotT1NfX2d0a19tZW51X3BvcHVwXzY9Y2FzdD0oZ3VpbnQzMikKLQotT1NfX2d0a19tZW51X3NoZWxsX2RlYWN0aXZhdGU9Ci1PU19fZ3RrX21lbnVfc2hlbGxfZGVhY3RpdmF0ZV8wPWNhc3Q9KEd0a01lbnVTaGVsbCAqKQotCi1PU19fZ3RrX21lbnVfc2hlbGxfaW5zZXJ0PQotT1NfX2d0a19tZW51X3NoZWxsX2luc2VydF8wPWNhc3Q9KEd0a01lbnVTaGVsbCAqKQotT1NfX2d0a19tZW51X3NoZWxsX2luc2VydF8xPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19tZW51X3NoZWxsX2luc2VydF8yPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfbWVudV9zaGVsbF9zZWxlY3RfaXRlbT0KLU9TX19ndGtfbWVudV9zaGVsbF9zZWxlY3RfaXRlbV8wPWNhc3Q9KEd0a01lbnVTaGVsbCAqKQotT1NfX2d0a19tZW51X3NoZWxsX3NlbGVjdF9pdGVtXzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfbWVzc2FnZV9kaWFsb2dfbmV3PQotT1NfX2d0a19tZXNzYWdlX2RpYWxvZ19uZXdfMD1jYXN0PShHdGtXaW5kb3cgKikKLU9TX19ndGtfbWVzc2FnZV9kaWFsb2dfbmV3XzE9Y2FzdD0oR3RrRGlhbG9nRmxhZ3MpCi1PU19fZ3RrX21lc3NhZ2VfZGlhbG9nX25ld18yPWNhc3Q9KEd0a01lc3NhZ2VUeXBlKQotT1NfX2d0a19tZXNzYWdlX2RpYWxvZ19uZXdfMz1jYXN0PShHdGtCdXR0b25zVHlwZSkKLU9TX19ndGtfbWVzc2FnZV9kaWFsb2dfbmV3XzQ9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19taWNyb192ZXJzaW9uPWZsYWdzPWNvbnN0Ci0KLU9TX19ndGtfbWlub3JfdmVyc2lvbj1mbGFncz1jb25zdAotCi1PU19fZ3RrX21pc2Nfc2V0X2FsaWdubWVudD0KLU9TX19ndGtfbWlzY19zZXRfYWxpZ25tZW50XzA9Y2FzdD0oR3RrTWlzYyAqKQotT1NfX2d0a19taXNjX3NldF9hbGlnbm1lbnRfMT1jYXN0PShnZmxvYXQpCi1PU19fZ3RrX21pc2Nfc2V0X2FsaWdubWVudF8yPWNhc3Q9KGdmbG9hdCkKLQotT1NfX2d0a19ub3RlYm9va19nZXRfY3VycmVudF9wYWdlPQotT1NfX2d0a19ub3RlYm9va19nZXRfY3VycmVudF9wYWdlXzA9Y2FzdD0oR3RrTm90ZWJvb2sgKikKLQotT1NfX2d0a19ub3RlYm9va19nZXRfc2Nyb2xsYWJsZT0KLU9TX19ndGtfbm90ZWJvb2tfZ2V0X3Njcm9sbGFibGVfMD1jYXN0PShHdGtOb3RlYm9vayAqKQotCi1PU19fZ3RrX25vdGVib29rX2luc2VydF9wYWdlPQotT1NfX2d0a19ub3RlYm9va19pbnNlcnRfcGFnZV8wPWNhc3Q9KEd0a05vdGVib29rICopCi1PU19fZ3RrX25vdGVib29rX2luc2VydF9wYWdlXzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX25vdGVib29rX2luc2VydF9wYWdlXzI9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX25vdGVib29rX2luc2VydF9wYWdlXzM9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a19ub3RlYm9va19uZXc9Ci0KLU9TX19ndGtfbm90ZWJvb2tfcmVtb3ZlX3BhZ2U9Ci1PU19fZ3RrX25vdGVib29rX3JlbW92ZV9wYWdlXzA9Y2FzdD0oR3RrTm90ZWJvb2sgKikKLU9TX19ndGtfbm90ZWJvb2tfcmVtb3ZlX3BhZ2VfMT1jYXN0PShnaW50KQotCi1PU19fZ3RrX25vdGVib29rX3NldF9jdXJyZW50X3BhZ2U9Ci1PU19fZ3RrX25vdGVib29rX3NldF9jdXJyZW50X3BhZ2VfMD1jYXN0PShHdGtOb3RlYm9vayAqKQotT1NfX2d0a19ub3RlYm9va19zZXRfY3VycmVudF9wYWdlXzE9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a19ub3RlYm9va19zZXRfc2Nyb2xsYWJsZT0KLU9TX19ndGtfbm90ZWJvb2tfc2V0X3Njcm9sbGFibGVfMD1jYXN0PShHdGtOb3RlYm9vayAqKQotT1NfX2d0a19ub3RlYm9va19zZXRfc2Nyb2xsYWJsZV8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX25vdGVib29rX3NldF9zaG93X3RhYnM9Ci1PU19fZ3RrX25vdGVib29rX3NldF9zaG93X3RhYnNfMD1jYXN0PShHdGtOb3RlYm9vayAqKQotT1NfX2d0a19ub3RlYm9va19zZXRfc2hvd190YWJzXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfbm90ZWJvb2tfc2V0X3RhYl9wb3M9Ci1PU19fZ3RrX25vdGVib29rX3NldF90YWJfcG9zXzA9Y2FzdD0oR3RrTm90ZWJvb2sgKikKLU9TX19ndGtfbm90ZWJvb2tfc2V0X3RhYl9wb3NfMT1jYXN0PShHdGtQb3NpdGlvblR5cGUpCi0KLU9TX19ndGtfb2JqZWN0X3Npbms9Ci1PU19fZ3RrX29iamVjdF9zaW5rXzA9Y2FzdD0oR3RrT2JqZWN0ICopCi0KLU9TX19ndGtfcGFpbnRfZm9jdXM9Ci1PU19fZ3RrX3BhaW50X2ZvY3VzXzA9Y2FzdD0oR3RrU3R5bGUgKikKLU9TX19ndGtfcGFpbnRfZm9jdXNfMT1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19ndGtfcGFpbnRfZm9jdXNfMj0KLU9TX19ndGtfcGFpbnRfZm9jdXNfMz1mbGFncz1ub19vdXQKLU9TX19ndGtfcGFpbnRfZm9jdXNfND1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfcGFpbnRfZm9jdXNfNT1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2d0a19wYWludF9mb2N1c182PQotT1NfX2d0a19wYWludF9mb2N1c183PQotT1NfX2d0a19wYWludF9mb2N1c184PQotT1NfX2d0a19wYWludF9mb2N1c185PQotCi1PU19fZ3RrX3BhaW50X2hhbmRsZT0KLU9TX19ndGtfcGFpbnRfaGFuZGxlXzA9Y2FzdD1HdGtTdHlsZSAqCi1PU19fZ3RrX3BhaW50X2hhbmRsZV8xPWNhc3Q9R2RrV2luZG93ICoKLU9TX19ndGtfcGFpbnRfaGFuZGxlXzI9Ci1PU19fZ3RrX3BhaW50X2hhbmRsZV8zPQotT1NfX2d0a19wYWludF9oYW5kbGVfND1mbGFncz1ub19vdXQKLU9TX19ndGtfcGFpbnRfaGFuZGxlXzU9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3BhaW50X2hhbmRsZV82PWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ3RrX3BhaW50X2hhbmRsZV83PQotT1NfX2d0a19wYWludF9oYW5kbGVfOD0KLU9TX19ndGtfcGFpbnRfaGFuZGxlXzk9Ci1PU19fZ3RrX3BhaW50X2hhbmRsZV8xMD0KLU9TX19ndGtfcGFpbnRfaGFuZGxlXzExPQotCi1PU19fZ3RrX3BsdWdfZ2V0X2lkPQotT1NfX2d0a19wbHVnX2dldF9pZF8wPWNhc3Q9KEd0a1BsdWcgKikKLQotT1NfX2d0a19wbHVnX25ldz0KLU9TX19ndGtfcGx1Z19uZXdfMD0KLQotT1NfX2d0a19wcm9ncmVzc19iYXJfbmV3PQotCi1PU19fZ3RrX3Byb2dyZXNzX2Jhcl9wdWxzZT0KLU9TX19ndGtfcHJvZ3Jlc3NfYmFyX3B1bHNlXzA9Y2FzdD0oR3RrUHJvZ3Jlc3NCYXIgKikKLQotT1NfX2d0a19wcm9ncmVzc19iYXJfc2V0X2ZyYWN0aW9uPQotT1NfX2d0a19wcm9ncmVzc19iYXJfc2V0X2ZyYWN0aW9uXzA9Y2FzdD0oR3RrUHJvZ3Jlc3NCYXIgKikKLU9TX19ndGtfcHJvZ3Jlc3NfYmFyX3NldF9mcmFjdGlvbl8xPWNhc3Q9KGdkb3VibGUpCi0KLU9TX19ndGtfcHJvZ3Jlc3NfYmFyX3NldF9vcmllbnRhdGlvbj0KLU9TX19ndGtfcHJvZ3Jlc3NfYmFyX3NldF9vcmllbnRhdGlvbl8wPWNhc3Q9KEd0a1Byb2dyZXNzQmFyICopCi1PU19fZ3RrX3Byb2dyZXNzX2Jhcl9zZXRfb3JpZW50YXRpb25fMT1jYXN0PShHdGtQcm9ncmVzc0Jhck9yaWVudGF0aW9uKQotCi1PU19fZ3RrX3JhZGlvX2J1dHRvbl9nZXRfZ3JvdXA9Ci1PU19fZ3RrX3JhZGlvX2J1dHRvbl9nZXRfZ3JvdXBfMD1jYXN0PShHdGtSYWRpb0J1dHRvbiAqKQotCi1PU19fZ3RrX3JhZGlvX2J1dHRvbl9uZXc9Ci1PU19fZ3RrX3JhZGlvX2J1dHRvbl9uZXdfMD1jYXN0PShHU0xpc3QgKikKLQotT1NfX2d0a19yYWRpb19tZW51X2l0ZW1fZ2V0X2dyb3VwPQotT1NfX2d0a19yYWRpb19tZW51X2l0ZW1fZ2V0X2dyb3VwXzA9Y2FzdD1HdGtSYWRpb01lbnVJdGVtICoKLQotT1NfX2d0a19yYWRpb19tZW51X2l0ZW1fbmV3PQotT1NfX2d0a19yYWRpb19tZW51X2l0ZW1fbmV3XzA9Y2FzdD0oR1NMaXN0ICopCi0KLU9TX19ndGtfcmFkaW9fbWVudV9pdGVtX25ld193aXRoX2xhYmVsPQotT1NfX2d0a19yYWRpb19tZW51X2l0ZW1fbmV3X3dpdGhfbGFiZWxfMD1jYXN0PShHU0xpc3QgKikKLU9TX19ndGtfcmFkaW9fbWVudV9pdGVtX25ld193aXRoX2xhYmVsXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19yYW5nZV9nZXRfYWRqdXN0bWVudD0KLU9TX19ndGtfcmFuZ2VfZ2V0X2FkanVzdG1lbnRfMD1jYXN0PShHdGtSYW5nZSAqKQotCi1PU19fZ3RrX3JhbmdlX3NldF9pbmNyZW1lbnRzPQotT1NfX2d0a19yYW5nZV9zZXRfaW5jcmVtZW50c18wPWNhc3Q9KEd0a1JhbmdlICopCi1PU19fZ3RrX3JhbmdlX3NldF9pbmNyZW1lbnRzXzE9Ci1PU19fZ3RrX3JhbmdlX3NldF9pbmNyZW1lbnRzXzI9Ci0KLU9TX19ndGtfcmFuZ2Vfc2V0X2ludmVydGVkPQotT1NfX2d0a19yYW5nZV9zZXRfaW52ZXJ0ZWRfMD1jYXN0PShHdGtSYW5nZSAqKQotT1NfX2d0a19yYW5nZV9zZXRfaW52ZXJ0ZWRfMT0KLQotT1NfX2d0a19yYW5nZV9zZXRfcmFuZ2U9Ci1PU19fZ3RrX3JhbmdlX3NldF9yYW5nZV8wPWNhc3Q9KEd0a1JhbmdlICopCi1PU19fZ3RrX3JhbmdlX3NldF9yYW5nZV8xPQotT1NfX2d0a19yYW5nZV9zZXRfcmFuZ2VfMj0KLQotT1NfX2d0a19yYW5nZV9zZXRfdmFsdWU9Ci1PU19fZ3RrX3JhbmdlX3NldF92YWx1ZV8wPWNhc3Q9KEd0a1JhbmdlICopCi1PU19fZ3RrX3JhbmdlX3NldF92YWx1ZV8xPQotCi1PU19fZ3RrX3JjX3BhcnNlX3N0cmluZz0KLU9TX19ndGtfcmNfcGFyc2Vfc3RyaW5nXzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19yY19zdHlsZV9nZXRfYmdfcGl4bWFwX25hbWU9Ci1PU19fZ3RrX3JjX3N0eWxlX2dldF9iZ19waXhtYXBfbmFtZV8wPWNhc3Q9KEd0a1JjU3R5bGUgKikKLU9TX19ndGtfcmNfc3R5bGVfZ2V0X2JnX3BpeG1hcF9uYW1lXzE9Ci0KLU9TX19ndGtfcmNfc3R5bGVfZ2V0X2NvbG9yX2ZsYWdzPQotT1NfX2d0a19yY19zdHlsZV9nZXRfY29sb3JfZmxhZ3NfMD1jYXN0PShHdGtSY1N0eWxlICopCi1PU19fZ3RrX3JjX3N0eWxlX2dldF9jb2xvcl9mbGFnc18xPQotCi1PU19fZ3RrX3JjX3N0eWxlX3NldF9iZz0KLU9TX19ndGtfcmNfc3R5bGVfc2V0X2JnXzA9Y2FzdD0oR3RrUmNTdHlsZSAqKQotT1NfX2d0a19yY19zdHlsZV9zZXRfYmdfMT0KLU9TX19ndGtfcmNfc3R5bGVfc2V0X2JnXzI9ZmxhZ3M9bm9fb3V0Ci0KLU9TX19ndGtfcmNfc3R5bGVfc2V0X2JnX3BpeG1hcF9uYW1lPQotT1NfX2d0a19yY19zdHlsZV9zZXRfYmdfcGl4bWFwX25hbWVfMD1jYXN0PShHdGtSY1N0eWxlICopCi1PU19fZ3RrX3JjX3N0eWxlX3NldF9iZ19waXhtYXBfbmFtZV8xPQotT1NfX2d0a19yY19zdHlsZV9zZXRfYmdfcGl4bWFwX25hbWVfMj1jYXN0PShjaGFyICopCi0KLU9TX19ndGtfcmNfc3R5bGVfc2V0X2NvbG9yX2ZsYWdzPQotT1NfX2d0a19yY19zdHlsZV9zZXRfY29sb3JfZmxhZ3NfMD1jYXN0PShHdGtSY1N0eWxlICopCi1PU19fZ3RrX3JjX3N0eWxlX3NldF9jb2xvcl9mbGFnc18xPQotT1NfX2d0a19yY19zdHlsZV9zZXRfY29sb3JfZmxhZ3NfMj0KLQotT1NfX2d0a19zY2FsZV9zZXRfZGlnaXRzPQotT1NfX2d0a19zY2FsZV9zZXRfZGlnaXRzXzA9Y2FzdD0oR3RrU2NhbGUgKikKLU9TX19ndGtfc2NhbGVfc2V0X2RpZ2l0c18xPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfc2NhbGVfc2V0X2RyYXdfdmFsdWU9Ci1PU19fZ3RrX3NjYWxlX3NldF9kcmF3X3ZhbHVlXzA9Y2FzdD0oR3RrU2NhbGUgKikKLU9TX19ndGtfc2NhbGVfc2V0X2RyYXdfdmFsdWVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfZ2V0X2hhZGp1c3RtZW50PQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfZ2V0X2hhZGp1c3RtZW50XzA9Y2FzdD0oR3RrU2Nyb2xsZWRXaW5kb3cgKikKLQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfZ2V0X3BvbGljeT0KLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X2dldF9wb2xpY3lfMD1jYXN0PShHdGtTY3JvbGxlZFdpbmRvdyAqKQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfZ2V0X3BvbGljeV8xPWNhc3Q9KEd0a1BvbGljeVR5cGUgKikKLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X2dldF9wb2xpY3lfMj1jYXN0PShHdGtQb2xpY3lUeXBlICopCi0KLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X2dldF9zaGFkb3dfdHlwZT0KLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X2dldF9zaGFkb3dfdHlwZV8wPWNhc3Q9KEd0a1Njcm9sbGVkV2luZG93ICopCi0KLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X2dldF92YWRqdXN0bWVudD0KLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X2dldF92YWRqdXN0bWVudF8wPWNhc3Q9KEd0a1Njcm9sbGVkV2luZG93ICopCi0KLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X25ldz0KLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X25ld18wPWNhc3Q9KEd0a0FkanVzdG1lbnQgKikKLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X25ld18xPWNhc3Q9KEd0a0FkanVzdG1lbnQgKikKLQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfc2V0X3BsYWNlbWVudD0KLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X3NldF9wbGFjZW1lbnRfMD1jYXN0PShHdGtTY3JvbGxlZFdpbmRvdyAqKQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfc2V0X3BsYWNlbWVudF8xPWNhc3Q9KEd0a0Nvcm5lclR5cGUpCi0KLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X3NldF9wb2xpY3k9Ci1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19zZXRfcG9saWN5XzA9Y2FzdD0oR3RrU2Nyb2xsZWRXaW5kb3cgKikKLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X3NldF9wb2xpY3lfMT1jYXN0PShHdGtQb2xpY3lUeXBlKQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfc2V0X3BvbGljeV8yPWNhc3Q9KEd0a1BvbGljeVR5cGUpCi0KLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X3NldF9zaGFkb3dfdHlwZT0KLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X3NldF9zaGFkb3dfdHlwZV8wPWNhc3Q9KEd0a1Njcm9sbGVkV2luZG93ICopCi1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19zZXRfc2hhZG93X3R5cGVfMT1jYXN0PShHdGtTaGFkb3dUeXBlKQotCi1PU19fZ3RrX3NlbGVjdGlvbl9kYXRhX2ZyZWU9Ci1PU19fZ3RrX3NlbGVjdGlvbl9kYXRhX2ZyZWVfMD1jYXN0PShHdGtTZWxlY3Rpb25EYXRhICopCi0KLU9TX19ndGtfc2VsZWN0aW9uX2RhdGFfc2V0PQotT1NfX2d0a19zZWxlY3Rpb25fZGF0YV9zZXRfMD1jYXN0PShHdGtTZWxlY3Rpb25EYXRhICopCi1PU19fZ3RrX3NlbGVjdGlvbl9kYXRhX3NldF8xPWNhc3Q9KEdka0F0b20pCi1PU19fZ3RrX3NlbGVjdGlvbl9kYXRhX3NldF8yPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX3NlbGVjdGlvbl9kYXRhX3NldF8zPWNhc3Q9KGNvbnN0IGd1Y2hhciAqKQotT1NfX2d0a19zZWxlY3Rpb25fZGF0YV9zZXRfND1jYXN0PShnaW50KQotCi1PU19fZ3RrX3NlcGFyYXRvcl9tZW51X2l0ZW1fbmV3PQotCi1PU19fZ3RrX3NldF9sb2NhbGU9Ci0KLU9TX19ndGtfc2V0dGluZ3NfZ2V0X2RlZmF1bHQ9Ci0KLU9TX19ndGtfc29ja2V0X2dldF9pZD0KLU9TX19ndGtfc29ja2V0X2dldF9pZF8wPWNhc3Q9R3RrU29ja2V0ICoKLQotT1NfX2d0a19zb2NrZXRfbmV3PQotCi1PU19fZ3RrX3NwaW5fYnV0dG9uX2dldF9hZGp1c3RtZW50PQotT1NfX2d0a19zcGluX2J1dHRvbl9nZXRfYWRqdXN0bWVudF8wPWNhc3Q9R3RrU3BpbkJ1dHRvbioKLQotT1NfX2d0a19zcGluX2J1dHRvbl9nZXRfZGlnaXRzPQotT1NfX2d0a19zcGluX2J1dHRvbl9nZXRfZGlnaXRzXzA9Y2FzdD1HdGtTcGluQnV0dG9uKgotCi1PU19fZ3RrX3NwaW5fYnV0dG9uX25ldz0KLU9TX19ndGtfc3Bpbl9idXR0b25fbmV3XzA9Y2FzdD1HdGtBZGp1c3RtZW50ICoKLU9TX19ndGtfc3Bpbl9idXR0b25fbmV3XzE9Ci1PU19fZ3RrX3NwaW5fYnV0dG9uX25ld18yPQotCi1PU19fZ3RrX3NwaW5fYnV0dG9uX3NldF9kaWdpdHM9Ci1PU19fZ3RrX3NwaW5fYnV0dG9uX3NldF9kaWdpdHNfMD1jYXN0PUd0a1NwaW5CdXR0b24qCi1PU19fZ3RrX3NwaW5fYnV0dG9uX3NldF9kaWdpdHNfMT0KLQotT1NfX2d0a19zcGluX2J1dHRvbl9zZXRfaW5jcmVtZW50cz0KLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X2luY3JlbWVudHNfMD1jYXN0PUd0a1NwaW5CdXR0b24qCi1PU19fZ3RrX3NwaW5fYnV0dG9uX3NldF9pbmNyZW1lbnRzXzE9Ci1PU19fZ3RrX3NwaW5fYnV0dG9uX3NldF9pbmNyZW1lbnRzXzI9Ci0KLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X3JhbmdlPQotT1NfX2d0a19zcGluX2J1dHRvbl9zZXRfcmFuZ2VfMD1jYXN0PUd0a1NwaW5CdXR0b24qCi1PU19fZ3RrX3NwaW5fYnV0dG9uX3NldF9yYW5nZV8xPQotT1NfX2d0a19zcGluX2J1dHRvbl9zZXRfcmFuZ2VfMj0KLQotT1NfX2d0a19zcGluX2J1dHRvbl9zZXRfdmFsdWU9Ci1PU19fZ3RrX3NwaW5fYnV0dG9uX3NldF92YWx1ZV8wPWNhc3Q9R3RrU3BpbkJ1dHRvbioKLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X3ZhbHVlXzE9Ci0KLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X3dyYXA9Ci1PU19fZ3RrX3NwaW5fYnV0dG9uX3NldF93cmFwXzA9Y2FzdD1HdGtTcGluQnV0dG9uKgotT1NfX2d0a19zcGluX2J1dHRvbl9zZXRfd3JhcF8xPQotCi1PU19fZ3RrX3N0eWxlX2dldF9iYXNlPQotT1NfX2d0a19zdHlsZV9nZXRfYmFzZV8wPWNhc3Q9KEd0a1N0eWxlICopCi1PU19fZ3RrX3N0eWxlX2dldF9iYXNlXzE9Ci1PU19fZ3RrX3N0eWxlX2dldF9iYXNlXzI9ZmxhZ3M9bm9faW4KLQotT1NfX2d0a19zdHlsZV9nZXRfYmc9Ci1PU19fZ3RrX3N0eWxlX2dldF9iZ18wPWNhc3Q9KEd0a1N0eWxlICopCi1PU19fZ3RrX3N0eWxlX2dldF9iZ18xPQotT1NfX2d0a19zdHlsZV9nZXRfYmdfMj1mbGFncz1ub19pbgotCi1PU19fZ3RrX3N0eWxlX2dldF9ibGFjaz0KLU9TX19ndGtfc3R5bGVfZ2V0X2JsYWNrXzA9Y2FzdD0oR3RrU3R5bGUgKikKLU9TX19ndGtfc3R5bGVfZ2V0X2JsYWNrXzE9ZmxhZ3M9bm9faW4KLQotT1NfX2d0a19zdHlsZV9nZXRfZGFyaz0KLU9TX19ndGtfc3R5bGVfZ2V0X2RhcmtfMD1jYXN0PShHdGtTdHlsZSAqKQotT1NfX2d0a19zdHlsZV9nZXRfZGFya18xPQotT1NfX2d0a19zdHlsZV9nZXRfZGFya18yPWZsYWdzPW5vX2luCi0KLU9TX19ndGtfc3R5bGVfZ2V0X2ZnPQotT1NfX2d0a19zdHlsZV9nZXRfZmdfMD1jYXN0PShHdGtTdHlsZSAqKQotT1NfX2d0a19zdHlsZV9nZXRfZmdfMT0KLU9TX19ndGtfc3R5bGVfZ2V0X2ZnXzI9ZmxhZ3M9bm9faW4KLQotT1NfX2d0a19zdHlsZV9nZXRfZm9udF9kZXNjPQotT1NfX2d0a19zdHlsZV9nZXRfZm9udF9kZXNjXzA9Y2FzdD0oR3RrU3R5bGUgKikKLQotT1NfX2d0a19zdHlsZV9nZXRfbGlnaHQ9Ci1PU19fZ3RrX3N0eWxlX2dldF9saWdodF8wPWNhc3Q9KEd0a1N0eWxlICopCi1PU19fZ3RrX3N0eWxlX2dldF9saWdodF8xPQotT1NfX2d0a19zdHlsZV9nZXRfbGlnaHRfMj1mbGFncz1ub19pbgotCi1PU19fZ3RrX3N0eWxlX2dldF90ZXh0PQotT1NfX2d0a19zdHlsZV9nZXRfdGV4dF8wPWNhc3Q9KEd0a1N0eWxlICopCi1PU19fZ3RrX3N0eWxlX2dldF90ZXh0XzE9Ci1PU19fZ3RrX3N0eWxlX2dldF90ZXh0XzI9ZmxhZ3M9bm9faW4KLQotT1NfX2d0a19zdHlsZV9nZXRfeHRoaWNrbmVzcz0KLU9TX19ndGtfc3R5bGVfZ2V0X3h0aGlja25lc3NfMD1jYXN0PShHdGtTdHlsZSAqKQotCi1PU19fZ3RrX3N0eWxlX2dldF95dGhpY2tuZXNzPQotT1NfX2d0a19zdHlsZV9nZXRfeXRoaWNrbmVzc18wPWNhc3Q9KEd0a1N0eWxlICopCi0KLU9TX19ndGtfdGFyZ2V0X2xpc3RfbmV3PQotT1NfX2d0a190YXJnZXRfbGlzdF9uZXdfMD1jYXN0PShjb25zdCBHdGtUYXJnZXRFbnRyeSAqKQotT1NfX2d0a190YXJnZXRfbGlzdF9uZXdfMT1jYXN0PShndWludCkKLQotT1NfX2d0a190YXJnZXRfbGlzdF91bnJlZj0KLU9TX19ndGtfdGFyZ2V0X2xpc3RfdW5yZWZfMD1jYXN0PShHdGtUYXJnZXRMaXN0ICopCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfY29weV9jbGlwYm9hcmQ9Ci1PU19fZ3RrX3RleHRfYnVmZmVyX2NvcHlfY2xpcGJvYXJkXzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9jb3B5X2NsaXBib2FyZF8xPWNhc3Q9KEd0a0NsaXBib2FyZCAqKQotCi1PU19fZ3RrX3RleHRfYnVmZmVyX2N1dF9jbGlwYm9hcmQ9Ci1PU19fZ3RrX3RleHRfYnVmZmVyX2N1dF9jbGlwYm9hcmRfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2N1dF9jbGlwYm9hcmRfMT1jYXN0PShHdGtDbGlwYm9hcmQgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfY3V0X2NsaXBib2FyZF8yPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX3RleHRfYnVmZmVyX2RlbGV0ZT0KLU9TX19ndGtfdGV4dF9idWZmZXJfZGVsZXRlXzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9kZWxldGVfMT1jYXN0PShHdGtUZXh0SXRlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9kZWxldGVfMj1jYXN0PShHdGtUZXh0SXRlciAqKQotCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9ib3VuZHM9Ci1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9ib3VuZHNfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9ib3VuZHNfMT1jYXN0PShHdGtUZXh0SXRlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfYm91bmRzXzI9Y2FzdD0oR3RrVGV4dEl0ZXIgKikKLQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfY2hhcl9jb3VudD0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2NoYXJfY291bnRfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2VuZF9pdGVyPQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfZW5kX2l0ZXJfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9lbmRfaXRlcl8xPWNhc3Q9KEd0a1RleHRJdGVyICopCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2luc2VydD0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2luc2VydF8wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfaXRlcl9hdF9saW5lPQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfaXRlcl9hdF9saW5lXzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfaXRlcl9hdF9saW5lXzE9Y2FzdD0oR3RrVGV4dEl0ZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2l0ZXJfYXRfbGluZV8yPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2l0ZXJfYXRfbWFyaz0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2l0ZXJfYXRfbWFya18wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2l0ZXJfYXRfbWFya18xPWNhc3Q9KEd0a1RleHRJdGVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9pdGVyX2F0X21hcmtfMj1jYXN0PShHdGtUZXh0TWFyayAqKQotCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9pdGVyX2F0X29mZnNldD0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2l0ZXJfYXRfb2Zmc2V0XzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfaXRlcl9hdF9vZmZzZXRfMT1jYXN0PShHdGtUZXh0SXRlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfaXRlcl9hdF9vZmZzZXRfMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9saW5lX2NvdW50PQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfbGluZV9jb3VudF8wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfc2VsZWN0aW9uX2JvdW5kPQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfc2VsZWN0aW9uX2JvdW5kXzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9zZWxlY3Rpb25fYm91bmRzPQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfc2VsZWN0aW9uX2JvdW5kc18wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X3NlbGVjdGlvbl9ib3VuZHNfMT1jYXN0PShHdGtUZXh0SXRlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfc2VsZWN0aW9uX2JvdW5kc18yPWNhc3Q9KEd0a1RleHRJdGVyICopCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X3RleHQ9Ci1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF90ZXh0XzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfdGV4dF8xPWNhc3Q9KEd0a1RleHRJdGVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF90ZXh0XzI9Y2FzdD0oR3RrVGV4dEl0ZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X3RleHRfMz1jYXN0PShnYm9vbGVhbikKLQotT1NfXzFndGtfMXRleHRfMWJ1ZmZlcl8xaW5zZXJ0X19JSV8zQkk9Ci1PU19fMWd0a18xdGV4dF8xYnVmZmVyXzFpbnNlcnRfX0lJXzNCSV8wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLU9TX18xZ3RrXzF0ZXh0XzFidWZmZXJfMWluc2VydF9fSUlfM0JJXzE9Y2FzdD0oR3RrVGV4dEl0ZXIgKikKLU9TX18xZ3RrXzF0ZXh0XzFidWZmZXJfMWluc2VydF9fSUlfM0JJXzI9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX18xZ3RrXzF0ZXh0XzFidWZmZXJfMWluc2VydF9fSUlfM0JJXzM9Y2FzdD0oZ2ludCkKLQotT1NfXzFndGtfMXRleHRfMWJ1ZmZlcl8xaW5zZXJ0X19JXzNCXzNCST0KLU9TX18xZ3RrXzF0ZXh0XzFidWZmZXJfMWluc2VydF9fSV8zQl8zQklfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fMWd0a18xdGV4dF8xYnVmZmVyXzFpbnNlcnRfX0lfM0JfM0JJXzE9Y2FzdD0oR3RrVGV4dEl0ZXIgKikKLU9TX18xZ3RrXzF0ZXh0XzFidWZmZXJfMWluc2VydF9fSV8zQl8zQklfMj1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfXzFndGtfMXRleHRfMWJ1ZmZlcl8xaW5zZXJ0X19JXzNCXzNCSV8zPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfbW92ZV9tYXJrPQotT1NfX2d0a190ZXh0X2J1ZmZlcl9tb3ZlX21hcmtfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX21vdmVfbWFya18xPWNhc3Q9KEd0a1RleHRNYXJrICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX21vdmVfbWFya18yPWNhc3Q9KGNvbnN0IEd0a1RleHRJdGVyICopCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfcGFzdGVfY2xpcGJvYXJkPQotT1NfX2d0a190ZXh0X2J1ZmZlcl9wYXN0ZV9jbGlwYm9hcmRfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX3Bhc3RlX2NsaXBib2FyZF8xPWNhc3Q9KEd0a0NsaXBib2FyZCAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9wYXN0ZV9jbGlwYm9hcmRfMj1jYXN0PShHdGtUZXh0SXRlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9wYXN0ZV9jbGlwYm9hcmRfMz1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a190ZXh0X2J1ZmZlcl9wbGFjZV9jdXJzb3I9Ci1PU19fZ3RrX3RleHRfYnVmZmVyX3BsYWNlX2N1cnNvcl8wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfcGxhY2VfY3Vyc29yXzE9Y2FzdD0oY29uc3QgR3RrVGV4dEl0ZXIgKikKLQotT1NfX2d0a190ZXh0X2J1ZmZlcl9zZXRfdGV4dD0KLU9TX19ndGtfdGV4dF9idWZmZXJfc2V0X3RleHRfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX3NldF90ZXh0XzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfc2V0X3RleHRfMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX3RleHRfaXRlcl9nZXRfbGluZT0KLU9TX19ndGtfdGV4dF9pdGVyX2dldF9saW5lXzA9Y2FzdD0oY29uc3QgR3RrVGV4dEl0ZXIgKikKLQotT1NfX2d0a190ZXh0X2l0ZXJfZ2V0X29mZnNldD0KLU9TX19ndGtfdGV4dF9pdGVyX2dldF9vZmZzZXRfMD1jYXN0PShjb25zdCBHdGtUZXh0SXRlciAqKQotCi1PU19fZ3RrX3RleHRfdmlld19idWZmZXJfdG9fd2luZG93X2Nvb3Jkcz0KLU9TX19ndGtfdGV4dF92aWV3X2J1ZmZlcl90b193aW5kb3dfY29vcmRzXzA9Y2FzdD0oR3RrVGV4dFZpZXcgKikKLU9TX19ndGtfdGV4dF92aWV3X2J1ZmZlcl90b193aW5kb3dfY29vcmRzXzE9Y2FzdD0oR3RrVGV4dFdpbmRvd1R5cGUpCi1PU19fZ3RrX3RleHRfdmlld19idWZmZXJfdG9fd2luZG93X2Nvb3Jkc18yPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX3RleHRfdmlld19idWZmZXJfdG9fd2luZG93X2Nvb3Jkc18zPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX3RleHRfdmlld19idWZmZXJfdG9fd2luZG93X2Nvb3Jkc180PWNhc3Q9KGdpbnQgKikKLU9TX19ndGtfdGV4dF92aWV3X2J1ZmZlcl90b193aW5kb3dfY29vcmRzXzU9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX3RleHRfdmlld19nZXRfYnVmZmVyPQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X2J1ZmZlcl8wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi0KLU9TX19ndGtfdGV4dF92aWV3X2dldF9lZGl0YWJsZT0KLU9TX19ndGtfdGV4dF92aWV3X2dldF9lZGl0YWJsZV8wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi0KLU9TX19ndGtfdGV4dF92aWV3X2dldF9pdGVyX2F0X2xvY2F0aW9uPQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X2l0ZXJfYXRfbG9jYXRpb25fMD1jYXN0PUd0a1RleHRWaWV3ICoKLU9TX19ndGtfdGV4dF92aWV3X2dldF9pdGVyX2F0X2xvY2F0aW9uXzE9Y2FzdD1HdGtUZXh0SXRlciAqCi1PU19fZ3RrX3RleHRfdmlld19nZXRfaXRlcl9hdF9sb2NhdGlvbl8yPWNhc3Q9Z2ludAotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X2l0ZXJfYXRfbG9jYXRpb25fMz1jYXN0PWdpbnQKLQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X2l0ZXJfbG9jYXRpb249Ci1PU19fZ3RrX3RleHRfdmlld19nZXRfaXRlcl9sb2NhdGlvbl8wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi1PU19fZ3RrX3RleHRfdmlld19nZXRfaXRlcl9sb2NhdGlvbl8xPWNhc3Q9KGNvbnN0IEd0a1RleHRJdGVyICopCi1PU19fZ3RrX3RleHRfdmlld19nZXRfaXRlcl9sb2NhdGlvbl8yPWNhc3Q9KEdka1JlY3RhbmdsZSAqKSxmbGFncz1ub19pbgotCi1PU19fZ3RrX3RleHRfdmlld19nZXRfbGluZV9hdF95PQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X2xpbmVfYXRfeV8wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi1PU19fZ3RrX3RleHRfdmlld19nZXRfbGluZV9hdF95XzE9Y2FzdD0oR3RrVGV4dEl0ZXIgKikKLU9TX19ndGtfdGV4dF92aWV3X2dldF9saW5lX2F0X3lfMj1jYXN0PShnaW50KQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X2xpbmVfYXRfeV8zPWNhc3Q9KGdpbnQgKikKLQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X3Zpc2libGVfcmVjdD0KLU9TX19ndGtfdGV4dF92aWV3X2dldF92aXNpYmxlX3JlY3RfMD1jYXN0PShHdGtUZXh0VmlldyAqKQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X3Zpc2libGVfcmVjdF8xPWNhc3Q9KEdka1JlY3RhbmdsZSAqKSxmbGFncz1ub19pbgotCi1PU19fZ3RrX3RleHRfdmlld19nZXRfd2luZG93PQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X3dpbmRvd18wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi1PU19fZ3RrX3RleHRfdmlld19nZXRfd2luZG93XzE9Y2FzdD0oR3RrVGV4dFdpbmRvd1R5cGUpCi0KLU9TX19ndGtfdGV4dF92aWV3X25ldz0KLQotT1NfX2d0a190ZXh0X3ZpZXdfc2Nyb2xsX21hcmtfb25zY3JlZW49Ci1PU19fZ3RrX3RleHRfdmlld19zY3JvbGxfbWFya19vbnNjcmVlbl8wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi1PU19fZ3RrX3RleHRfdmlld19zY3JvbGxfbWFya19vbnNjcmVlbl8xPWNhc3Q9KEd0a1RleHRNYXJrICopCi0KLU9TX19ndGtfdGV4dF92aWV3X3Njcm9sbF90b19pdGVyPQotT1NfX2d0a190ZXh0X3ZpZXdfc2Nyb2xsX3RvX2l0ZXJfMD1jYXN0PShHdGtUZXh0VmlldyAqKQotT1NfX2d0a190ZXh0X3ZpZXdfc2Nyb2xsX3RvX2l0ZXJfMT1jYXN0PShHdGtUZXh0SXRlciAqKQotT1NfX2d0a190ZXh0X3ZpZXdfc2Nyb2xsX3RvX2l0ZXJfMj1jYXN0PShnZG91YmxlKQotT1NfX2d0a190ZXh0X3ZpZXdfc2Nyb2xsX3RvX2l0ZXJfMz1jYXN0PShnYm9vbGVhbikKLU9TX19ndGtfdGV4dF92aWV3X3Njcm9sbF90b19pdGVyXzQ9Y2FzdD0oZ2RvdWJsZSkKLU9TX19ndGtfdGV4dF92aWV3X3Njcm9sbF90b19pdGVyXzU9Y2FzdD0oZ2RvdWJsZSkKLQotT1NfX2d0a190ZXh0X3ZpZXdfc2V0X2VkaXRhYmxlPQotT1NfX2d0a190ZXh0X3ZpZXdfc2V0X2VkaXRhYmxlXzA9Y2FzdD0oR3RrVGV4dFZpZXcgKikKLU9TX19ndGtfdGV4dF92aWV3X3NldF9lZGl0YWJsZV8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX3RleHRfdmlld19zZXRfanVzdGlmaWNhdGlvbj0KLU9TX19ndGtfdGV4dF92aWV3X3NldF9qdXN0aWZpY2F0aW9uXzA9Y2FzdD0oR3RrVGV4dFZpZXcgKikKLU9TX19ndGtfdGV4dF92aWV3X3NldF9qdXN0aWZpY2F0aW9uXzE9Ci0KLU9TX19ndGtfdGV4dF92aWV3X3NldF90YWJzPQotT1NfX2d0a190ZXh0X3ZpZXdfc2V0X3RhYnNfMD1jYXN0PShHdGtUZXh0VmlldyAqKQotT1NfX2d0a190ZXh0X3ZpZXdfc2V0X3RhYnNfMT1jYXN0PShQYW5nb1RhYkFycmF5ICopCi0KLU9TX19ndGtfdGV4dF92aWV3X3NldF93cmFwX21vZGU9Ci1PU19fZ3RrX3RleHRfdmlld19zZXRfd3JhcF9tb2RlXzA9Y2FzdD0oR3RrVGV4dFZpZXcgKikKLU9TX19ndGtfdGV4dF92aWV3X3NldF93cmFwX21vZGVfMT0KLQotT1NfX2d0a190ZXh0X3ZpZXdfd2luZG93X3RvX2J1ZmZlcl9jb29yZHM9Ci1PU19fZ3RrX3RleHRfdmlld193aW5kb3dfdG9fYnVmZmVyX2Nvb3Jkc18wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi1PU19fZ3RrX3RleHRfdmlld193aW5kb3dfdG9fYnVmZmVyX2Nvb3Jkc18xPWNhc3Q9R3RrVGV4dFdpbmRvd1R5cGUKLU9TX19ndGtfdGV4dF92aWV3X3dpbmRvd190b19idWZmZXJfY29vcmRzXzI9Y2FzdD1naW50Ci1PU19fZ3RrX3RleHRfdmlld193aW5kb3dfdG9fYnVmZmVyX2Nvb3Jkc18zPWNhc3Q9Z2ludAotT1NfX2d0a190ZXh0X3ZpZXdfd2luZG93X3RvX2J1ZmZlcl9jb29yZHNfND1jYXN0PShnaW50ICopCi1PU19fZ3RrX3RleHRfdmlld193aW5kb3dfdG9fYnVmZmVyX2Nvb3Jkc181PWNhc3Q9KGdpbnQgKikKLQotT1NfX2d0a190aW1lb3V0X2FkZD0KLU9TX19ndGtfdGltZW91dF9hZGRfMD1jYXN0PShndWludDMyKQotT1NfX2d0a190aW1lb3V0X2FkZF8xPWNhc3Q9KEd0a0Z1bmN0aW9uKQotT1NfX2d0a190aW1lb3V0X2FkZF8yPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ3RrX3RpbWVvdXRfcmVtb3ZlPQotT1NfX2d0a190aW1lb3V0X3JlbW92ZV8wPWNhc3Q9KGd1aW50KQotCi1PU19fZ3RrX3RvZ2dsZV9idXR0b25fZ2V0X2FjdGl2ZT0KLU9TX19ndGtfdG9nZ2xlX2J1dHRvbl9nZXRfYWN0aXZlXzA9Y2FzdD0oR3RrVG9nZ2xlQnV0dG9uICopCi0KLU9TX19ndGtfdG9nZ2xlX2J1dHRvbl9uZXc9Ci0KLU9TX19ndGtfdG9nZ2xlX2J1dHRvbl9zZXRfYWN0aXZlPQotT1NfX2d0a190b2dnbGVfYnV0dG9uX3NldF9hY3RpdmVfMD1jYXN0PShHdGtUb2dnbGVCdXR0b24gKikKLU9TX19ndGtfdG9nZ2xlX2J1dHRvbl9zZXRfYWN0aXZlXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfdG9nZ2xlX2J1dHRvbl9zZXRfbW9kZT0KLU9TX19ndGtfdG9nZ2xlX2J1dHRvbl9zZXRfbW9kZV8wPWNhc3Q9KEd0a1RvZ2dsZUJ1dHRvbiAqKQotT1NfX2d0a190b2dnbGVfYnV0dG9uX3NldF9tb2RlXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfdG9vbGJhcl9pbnNlcnRfd2lkZ2V0PQotT1NfX2d0a190b29sYmFyX2luc2VydF93aWRnZXRfMD1jYXN0PShHdGtUb29sYmFyICopCi1PU19fZ3RrX3Rvb2xiYXJfaW5zZXJ0X3dpZGdldF8xPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a190b29sYmFyX2luc2VydF93aWRnZXRfMj1jYXN0PShjb25zdCBjaGFyICopCi1PU19fZ3RrX3Rvb2xiYXJfaW5zZXJ0X3dpZGdldF8zPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX19ndGtfdG9vbGJhcl9pbnNlcnRfd2lkZ2V0XzQ9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a190b29sYmFyX25ldz0KLQotT1NfX2d0a190b29sYmFyX3NldF9vcmllbnRhdGlvbj0KLU9TX19ndGtfdG9vbGJhcl9zZXRfb3JpZW50YXRpb25fMD1jYXN0PShHdGtUb29sYmFyICopCi1PU19fZ3RrX3Rvb2xiYXJfc2V0X29yaWVudGF0aW9uXzE9Y2FzdD0oR3RrT3JpZW50YXRpb24pCi0KLU9TX19ndGtfdG9vbHRpcHNfZGlzYWJsZT0KLU9TX19ndGtfdG9vbHRpcHNfZGlzYWJsZV8wPWNhc3Q9KEd0a1Rvb2x0aXBzICopCi0KLU9TX19ndGtfdG9vbHRpcHNfZW5hYmxlPQotT1NfX2d0a190b29sdGlwc19lbmFibGVfMD1jYXN0PShHdGtUb29sdGlwcyAqKQotCi1PU19fZ3RrX3Rvb2x0aXBzX25ldz0KLQotT1NfX2d0a190b29sdGlwc19zZXRfdGlwPQotT1NfX2d0a190b29sdGlwc19zZXRfdGlwXzA9Y2FzdD0oR3RrVG9vbHRpcHMgKikKLU9TX19ndGtfdG9vbHRpcHNfc2V0X3RpcF8xPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a190b29sdGlwc19zZXRfdGlwXzI9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX19ndGtfdG9vbHRpcHNfc2V0X3RpcF8zPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX18xZ3RrXzF0cmVlXzFtb2RlbF8xZ2V0X19JSUlfM0lJPQotT1NfXzFndGtfMXRyZWVfMW1vZGVsXzFnZXRfX0lJSV8zSUlfMD1jYXN0PShHdGtUcmVlTW9kZWwgKikKLU9TX18xZ3RrXzF0cmVlXzFtb2RlbF8xZ2V0X19JSUlfM0lJXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX18xZ3RrXzF0cmVlXzFtb2RlbF8xZ2V0X19JSUlfM0lJXzI9Ci1PU19fMWd0a18xdHJlZV8xbW9kZWxfMWdldF9fSUlJXzNJSV8zPQotT1NfXzFndGtfMXRyZWVfMW1vZGVsXzFnZXRfX0lJSV8zSUlfND0KLQotT1NfXzFndGtfMXRyZWVfMW1vZGVsXzFnZXRfX0lJSV8zSkk9Ci1PU19fMWd0a18xdHJlZV8xbW9kZWxfMWdldF9fSUlJXzNKSV8wPWNhc3Q9KEd0a1RyZWVNb2RlbCAqKQotT1NfXzFndGtfMXRyZWVfMW1vZGVsXzFnZXRfX0lJSV8zSklfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfXzFndGtfMXRyZWVfMW1vZGVsXzFnZXRfX0lJSV8zSklfMj0KLU9TX18xZ3RrXzF0cmVlXzFtb2RlbF8xZ2V0X19JSUlfM0pJXzM9Ci1PU19fMWd0a18xdHJlZV8xbW9kZWxfMWdldF9fSUlJXzNKSV80PQotCi1PU19fZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXI9Ci1PU19fZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXJfMD1jYXN0PShHdGtUcmVlTW9kZWwgKikKLU9TX19ndGtfdHJlZV9tb2RlbF9nZXRfaXRlcl8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXJfMj1jYXN0PShHdGtUcmVlUGF0aCAqKQotCi1PU19fZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXJfZmlyc3Q9Ci1PU19fZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXJfZmlyc3RfMD1jYXN0PShHdGtUcmVlTW9kZWwgKikKLU9TX19ndGtfdHJlZV9tb2RlbF9nZXRfaXRlcl9maXJzdF8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi0KLU9TX19ndGtfdHJlZV9tb2RlbF9nZXRfbl9jb2x1bW5zPQotT1NfX2d0a190cmVlX21vZGVsX2dldF9uX2NvbHVtbnNfMD1jYXN0PShHdGtUcmVlTW9kZWwgKikKLQotT1NfX2d0a190cmVlX21vZGVsX2dldF9wYXRoPQotT1NfX2d0a190cmVlX21vZGVsX2dldF9wYXRoXzA9Y2FzdD0oR3RrVHJlZU1vZGVsICopCi1PU19fZ3RrX3RyZWVfbW9kZWxfZ2V0X3BhdGhfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotCi1PU19fZ3RrX3RyZWVfbW9kZWxfZ2V0X3R5cGU9Ci0KLU9TX19ndGtfdHJlZV9tb2RlbF9pdGVyX2NoaWxkcmVuPQotT1NfX2d0a190cmVlX21vZGVsX2l0ZXJfY2hpbGRyZW5fMD1jYXN0PShHdGtUcmVlTW9kZWwgKikKLU9TX19ndGtfdHJlZV9tb2RlbF9pdGVyX2NoaWxkcmVuXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX19ndGtfdHJlZV9tb2RlbF9pdGVyX2NoaWxkcmVuXzI9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLQotT1NfX2d0a190cmVlX21vZGVsX2l0ZXJfbl9jaGlsZHJlbj0KLU9TX19ndGtfdHJlZV9tb2RlbF9pdGVyX25fY2hpbGRyZW5fMD1jYXN0PShHdGtUcmVlTW9kZWwgKikKLU9TX19ndGtfdHJlZV9tb2RlbF9pdGVyX25fY2hpbGRyZW5fMT1jYXN0PShHdGtUcmVlSXRlciAqKQotCi1PU19fZ3RrX3RyZWVfbW9kZWxfaXRlcl9uZXh0PQotT1NfX2d0a190cmVlX21vZGVsX2l0ZXJfbmV4dF8wPWNhc3Q9KEd0a1RyZWVNb2RlbCAqKQotT1NfX2d0a190cmVlX21vZGVsX2l0ZXJfbmV4dF8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi0KLU9TX19ndGtfdHJlZV9tb2RlbF9pdGVyX250aF9jaGlsZD0KLU9TX19ndGtfdHJlZV9tb2RlbF9pdGVyX250aF9jaGlsZF8wPWNhc3Q9KEd0a1RyZWVNb2RlbCAqKQotT1NfX2d0a190cmVlX21vZGVsX2l0ZXJfbnRoX2NoaWxkXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX19ndGtfdHJlZV9tb2RlbF9pdGVyX250aF9jaGlsZF8yPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fZ3RrX3RyZWVfbW9kZWxfaXRlcl9udGhfY2hpbGRfMz0KLQotT1NfX2d0a190cmVlX3BhdGhfYXBwZW5kX2luZGV4PQotT1NfX2d0a190cmVlX3BhdGhfYXBwZW5kX2luZGV4XzA9Y2FzdD0oR3RrVHJlZVBhdGggKikKLU9TX19ndGtfdHJlZV9wYXRoX2FwcGVuZF9pbmRleF8xPQotCi1PU19fZ3RrX3RyZWVfcGF0aF9jb21wYXJlPQotT1NfX2d0a190cmVlX3BhdGhfY29tcGFyZV8wPWNhc3Q9KGNvbnN0IEd0a1RyZWVQYXRoICopCi1PU19fZ3RrX3RyZWVfcGF0aF9jb21wYXJlXzE9Y2FzdD0oY29uc3QgR3RrVHJlZVBhdGggKikKLQotT1NfX2d0a190cmVlX3BhdGhfZG93bj0KLU9TX19ndGtfdHJlZV9wYXRoX2Rvd25fMD1jYXN0PShHdGtUcmVlUGF0aCAqKQotCi1PU19fZ3RrX3RyZWVfcGF0aF9mcmVlPQotT1NfX2d0a190cmVlX3BhdGhfZnJlZV8wPWNhc3Q9KEd0a1RyZWVQYXRoICopCi0KLU9TX19ndGtfdHJlZV9wYXRoX2dldF9kZXB0aD0KLU9TX19ndGtfdHJlZV9wYXRoX2dldF9kZXB0aF8wPWNhc3Q9KEd0a1RyZWVQYXRoICopCi0KLU9TX19ndGtfdHJlZV9wYXRoX2dldF9pbmRpY2VzPQotT1NfX2d0a190cmVlX3BhdGhfZ2V0X2luZGljZXNfMD1jYXN0PShHdGtUcmVlUGF0aCAqKQotCi1PU19fZ3RrX3RyZWVfcGF0aF9uZXc9Ci0KLU9TX19ndGtfdHJlZV9wYXRoX25ld19maXJzdD0KLQotT1NfXzFndGtfMXRyZWVfMXBhdGhfMW5ld18xZnJvbV8xc3RyaW5nX19JPQotT1NfXzFndGtfMXRyZWVfMXBhdGhfMW5ld18xZnJvbV8xc3RyaW5nX19JXzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfXzFndGtfMXRyZWVfMXBhdGhfMW5ld18xZnJvbV8xc3RyaW5nX19fM0I9Ci1PU19fMWd0a18xdHJlZV8xcGF0aF8xbmV3XzFmcm9tXzFzdHJpbmdfX18zQl8wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfdHJlZV9wYXRoX25leHQ9Ci1PU19fZ3RrX3RyZWVfcGF0aF9uZXh0XzA9Y2FzdD0oR3RrVHJlZVBhdGggKikKLQotT1NfX2d0a190cmVlX3BhdGhfcHJldj0KLU9TX19ndGtfdHJlZV9wYXRoX3ByZXZfMD1jYXN0PShHdGtUcmVlUGF0aCAqKQotCi1PU19fZ3RrX3RyZWVfcGF0aF91cD0KLU9TX19ndGtfdHJlZV9wYXRoX3VwXzA9Y2FzdD0oR3RrVHJlZVBhdGggKikKLQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9jb3VudF9zZWxlY3RlZF9yb3dzPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fY291bnRfc2VsZWN0ZWRfcm93c18wPWNhc3Q9KEd0a1RyZWVTZWxlY3Rpb24gKikKLQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9nZXRfc2VsZWN0ZWQ9Ci1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX2dldF9zZWxlY3RlZF8wPWNhc3Q9KEd0a1RyZWVTZWxlY3Rpb24gKikKLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fZ2V0X3NlbGVjdGVkXzE9Y2FzdD0oR3RrVHJlZU1vZGVsICoqKQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9nZXRfc2VsZWN0ZWRfMj1jYXN0PShHdGtUcmVlSXRlciAqKQotCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX2dldF9zZWxlY3RlZF9yb3dzPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fZ2V0X3NlbGVjdGVkX3Jvd3NfMD1jYXN0PShHdGtUcmVlU2VsZWN0aW9uICopCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX2dldF9zZWxlY3RlZF9yb3dzXzE9Y2FzdD0oR3RrVHJlZU1vZGVsICoqKQotCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3BhdGhfaXNfc2VsZWN0ZWQ9Ci1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3BhdGhfaXNfc2VsZWN0ZWRfMD1jYXN0PShHdGtUcmVlU2VsZWN0aW9uICopCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3BhdGhfaXNfc2VsZWN0ZWRfMT1jYXN0PShHdGtUcmVlUGF0aCAqKQotCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3NlbGVjdF9hbGw9Ci1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3NlbGVjdF9hbGxfMD1jYXN0PShHdGtUcmVlU2VsZWN0aW9uICopCi0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fc2VsZWN0X2l0ZXI9Ci1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3NlbGVjdF9pdGVyXzA9Y2FzdD0oR3RrVHJlZVNlbGVjdGlvbiAqKQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9zZWxlY3RfaXRlcl8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fc2VsZWN0ZWRfZm9yZWFjaD0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fc2VsZWN0ZWRfZm9yZWFjaF8wPWNhc3Q9KEd0a1RyZWVTZWxlY3Rpb24gKikKLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fc2VsZWN0ZWRfZm9yZWFjaF8xPWNhc3Q9KEd0a1RyZWVTZWxlY3Rpb25Gb3JlYWNoRnVuYykKLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fc2VsZWN0ZWRfZm9yZWFjaF8yPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3NldF9tb2RlPQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9zZXRfbW9kZV8wPWNhc3Q9KEd0a1RyZWVTZWxlY3Rpb24gKikKLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fc2V0X21vZGVfMT1jYXN0PShHdGtTZWxlY3Rpb25Nb2RlKQotCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3Vuc2VsZWN0X2FsbD0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fdW5zZWxlY3RfYWxsXzA9Y2FzdD0oR3RrVHJlZVNlbGVjdGlvbiAqKQotCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3Vuc2VsZWN0X2l0ZXI9Ci1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3Vuc2VsZWN0X2l0ZXJfMD1jYXN0PShHdGtUcmVlU2VsZWN0aW9uICopCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3Vuc2VsZWN0X2l0ZXJfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotCi1PU19fZ3RrX3RyZWVfc3RvcmVfYXBwZW5kPQotT1NfX2d0a190cmVlX3N0b3JlX2FwcGVuZF8wPWNhc3Q9KEd0a1RyZWVTdG9yZSAqKQotT1NfX2d0a190cmVlX3N0b3JlX2FwcGVuZF8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fZ3RrX3RyZWVfc3RvcmVfYXBwZW5kXzI9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLQotT1NfX2d0a190cmVlX3N0b3JlX2NsZWFyPQotT1NfX2d0a190cmVlX3N0b3JlX2NsZWFyXzA9Y2FzdD0oR3RrVHJlZVN0b3JlICopCi0KLU9TX19ndGtfdHJlZV9zdG9yZV9pbnNlcnQ9Ci1PU19fZ3RrX3RyZWVfc3RvcmVfaW5zZXJ0XzA9Y2FzdD0oR3RrVHJlZVN0b3JlICopCi1PU19fZ3RrX3RyZWVfc3RvcmVfaW5zZXJ0XzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX19ndGtfdHJlZV9zdG9yZV9pbnNlcnRfMj1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfX2d0a190cmVlX3N0b3JlX2luc2VydF8zPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfdHJlZV9zdG9yZV9uZXd2PQotT1NfX2d0a190cmVlX3N0b3JlX25ld3ZfMD0KLU9TX19ndGtfdHJlZV9zdG9yZV9uZXd2XzE9Y2FzdD0oR1R5cGUgKikKLQotT1NfX2d0a190cmVlX3N0b3JlX3JlbW92ZT0KLU9TX19ndGtfdHJlZV9zdG9yZV9yZW1vdmVfMD1jYXN0PShHdGtUcmVlU3RvcmUgKikKLU9TX19ndGtfdHJlZV9zdG9yZV9yZW1vdmVfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotCi1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJSUk9Ci1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJSUlfMD1jYXN0PShHdGtUcmVlU3RvcmUgKikKLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlJSV8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJSUlfMj0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlJSV8zPQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUlJXzQ9Ci0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlKST0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlKSV8wPWNhc3Q9KEd0a1RyZWVTdG9yZSAqKQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUpJXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlKSV8yPQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUpJXzM9Ci1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJSklfND0KLQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJPQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJXzA9Y2FzdD0oR3RrVHJlZVN0b3JlICopCi1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMklfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJXzI9Ci1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMklfMz1mbGFncz1ub19vdXQKLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtDb2xvcl8ySV80PQotCi1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJWkk9Ci1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJWklfMD1jYXN0PShHdGtUcmVlU3RvcmUgKikKLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlaSV8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJWklfMj0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlaSV8zPQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSVpJXzQ9Ci0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlfM0JJPQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSV8zQklfMD1jYXN0PShHdGtUcmVlU3RvcmUgKikKLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlfM0JJXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlfM0JJXzI9Ci1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJXzNCSV8zPQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSV8zQklfND0KLQotT1NfX2d0a190cmVlX3ZpZXdfY29sbGFwc2Vfcm93PQotT1NfX2d0a190cmVlX3ZpZXdfY29sbGFwc2Vfcm93XzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbGxhcHNlX3Jvd18xPWNhc3Q9KEd0a1RyZWVQYXRoICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9hZGRfYXR0cmlidXRlPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2FkZF9hdHRyaWJ1dGVfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2FkZF9hdHRyaWJ1dGVfMT1jYXN0PShHdGtDZWxsUmVuZGVyZXIgKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9hZGRfYXR0cmlidXRlXzI9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9hZGRfYXR0cmlidXRlXzM9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfZ2V0X3Bvc2l0aW9uPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX2dldF9wb3NpdGlvbl8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9nZXRfcG9zaXRpb25fMT1jYXN0PShHdGtDZWxsUmVuZGVyZXIgKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX2dldF9wb3NpdGlvbl8yPWNhc3Q9KGdpbnQgKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX2dldF9wb3NpdGlvbl8zPWNhc3Q9KGdpbnQgKikKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfZ2V0X3NpemU9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9nZXRfc2l6ZV8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9nZXRfc2l6ZV8xPWNhc3Q9KEdka1JlY3RhbmdsZSAqKSxmbGFncz1ub19pbgotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfZ2V0X3NpemVfMj1jYXN0PShnaW50ICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9nZXRfc2l6ZV8zPWNhc3Q9KGdpbnQgKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX2dldF9zaXplXzQ9Y2FzdD0oZ2ludCAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfZ2V0X3NpemVfNT1jYXN0PShnaW50ICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX3NldF9jZWxsX2RhdGE9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9zZXRfY2VsbF9kYXRhXzA9Y2FzdD1HdGtUcmVlVmlld0NvbHVtbiAqCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9zZXRfY2VsbF9kYXRhXzE9Y2FzdD1HdGtUcmVlTW9kZWwgKgotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfc2V0X2NlbGxfZGF0YV8yPWNhc3Q9R3RrVHJlZUl0ZXIgKgotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfc2V0X2NlbGxfZGF0YV8zPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfc2V0X2NlbGxfZGF0YV80PQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2xlYXI9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2xlYXJfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fZ2V0X2NlbGxfcmVuZGVyZXJzPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2dldF9jZWxsX3JlbmRlcmVyc18wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfZml4ZWRfd2lkdGg9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fZ2V0X2ZpeGVkX3dpZHRoXzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2dldF9yZW9yZGVyYWJsZT0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfcmVvcmRlcmFibGVfMD1jYXN0PUd0a1RyZWVWaWV3Q29sdW1uICoKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2dldF9yZXNpemFibGU9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fZ2V0X3Jlc2l6YWJsZV8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfc29ydF9pbmRpY2F0b3I9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fZ2V0X3NvcnRfaW5kaWNhdG9yXzA9Y2FzdD1HdGtUcmVlVmlld0NvbHVtbiAqCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfc29ydF9vcmRlcj0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfc29ydF9vcmRlcl8wPWNhc3Q9R3RrVHJlZVZpZXdDb2x1bW4gKgotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fZ2V0X3NwYWNpbmc9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fZ2V0X3NwYWNpbmdfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fZ2V0X3Zpc2libGU9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fZ2V0X3Zpc2libGVfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fZ2V0X3dpZHRoPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2dldF93aWR0aF8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9uZXc9Ci0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX2VuZD0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX2VuZF8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fcGFja19lbmRfMT1jYXN0PShHdGtDZWxsUmVuZGVyZXIgKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX2VuZF8yPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fcGFja19zdGFydD0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX3N0YXJ0XzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX3N0YXJ0XzE9Y2FzdD0oR3RrQ2VsbFJlbmRlcmVyICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fcGFja19zdGFydF8yPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2FsaWdubWVudD0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfYWxpZ25tZW50XzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfYWxpZ25tZW50XzE9Ci0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfY2VsbF9kYXRhX2Z1bmM9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2NlbGxfZGF0YV9mdW5jXzA9Y2FzdD1HdGtUcmVlVmlld0NvbHVtbiAqCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2NlbGxfZGF0YV9mdW5jXzE9Y2FzdD1HdGtDZWxsUmVuZGVyZXIgKgotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9jZWxsX2RhdGFfZnVuY18yPWNhc3Q9KEd0a1RyZWVDZWxsRGF0YUZ1bmMpCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2NlbGxfZGF0YV9mdW5jXzM9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2NlbGxfZGF0YV9mdW5jXzQ9Y2FzdD1HdGtEZXN0cm95Tm90aWZ5Ci0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfY2xpY2thYmxlPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9jbGlja2FibGVfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9jbGlja2FibGVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9maXhlZF93aWR0aD0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfZml4ZWRfd2lkdGhfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9maXhlZF93aWR0aF8xPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfcmVvcmRlcmFibGU9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Jlb3JkZXJhYmxlXzA9Y2FzdD1HdGtUcmVlVmlld0NvbHVtbiAqCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Jlb3JkZXJhYmxlXzE9Y2FzdD1nYm9vbGVhbgotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Jlc2l6YWJsZT0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfcmVzaXphYmxlXzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfcmVzaXphYmxlXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfc2l6aW5nPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9zaXppbmdfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9zaXppbmdfMT1jYXN0PShHdGtUcmVlVmlld0NvbHVtblNpemluZykKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9zb3J0X2luZGljYXRvcj0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfc29ydF9pbmRpY2F0b3JfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9zb3J0X2luZGljYXRvcl8xPWNhc3Q9Z2Jvb2xlYW4KLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9zb3J0X29yZGVyPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9zb3J0X29yZGVyXzA9Y2FzdD1HdGtUcmVlVmlld0NvbHVtbiAqCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3NvcnRfb3JkZXJfMT1jYXN0PUd0a1NvcnRUeXBlCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdGl0bGU9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3RpdGxlXzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdGl0bGVfMT1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGU9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGVfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF92aXNpYmxlXzE9Ci0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfd2lkZ2V0PQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF93aWRnZXRfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF93aWRnZXRfMT1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a190cmVlX3ZpZXdfZXhwYW5kX3Jvdz0KLU9TX19ndGtfdHJlZV92aWV3X2V4cGFuZF9yb3dfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotT1NfX2d0a190cmVlX3ZpZXdfZXhwYW5kX3Jvd18xPWNhc3Q9KEd0a1RyZWVQYXRoICopCi1PU19fZ3RrX3RyZWVfdmlld19leHBhbmRfcm93XzI9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9iaW5fd2luZG93PQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X2Jpbl93aW5kb3dfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfY2VsbF9hcmVhPQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X2NlbGxfYXJlYV8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfY2VsbF9hcmVhXzE9Y2FzdD0oR3RrVHJlZVBhdGggKikKLU9TX19ndGtfdHJlZV92aWV3X2dldF9jZWxsX2FyZWFfMj1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X2NlbGxfYXJlYV8zPWNhc3Q9KEdka1JlY3RhbmdsZSAqKSxmbGFncz1ub19pbgotCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uPQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbl8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uXzE9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbnM9Ci1PU19fZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uc18wPWNhc3Q9R3RrVHJlZVZpZXcgKgotCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfY3Vyc29yPQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X2N1cnNvcl8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfY3Vyc29yXzE9Y2FzdD0oR3RrVHJlZVBhdGggKiopCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfY3Vyc29yXzI9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKiopCi0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9leHBhbmRlcl9jb2x1bW49Ci1PU19fZ3RrX3RyZWVfdmlld19nZXRfZXhwYW5kZXJfY29sdW1uXzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X2hlYWRlcnNfdmlzaWJsZT0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9oZWFkZXJzX3Zpc2libGVfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfcGF0aF9hdF9wb3M9Ci1PU19fZ3RrX3RyZWVfdmlld19nZXRfcGF0aF9hdF9wb3NfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X3BhdGhfYXRfcG9zXzE9Y2FzdD0oZ2ludCkKLU9TX19ndGtfdHJlZV92aWV3X2dldF9wYXRoX2F0X3Bvc18yPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfcGF0aF9hdF9wb3NfMz1jYXN0PShHdGtUcmVlUGF0aCAqKikKLU9TX19ndGtfdHJlZV92aWV3X2dldF9wYXRoX2F0X3Bvc180PWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICoqKQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X3BhdGhfYXRfcG9zXzU9Y2FzdD0oZ2ludCAqKQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X3BhdGhfYXRfcG9zXzY9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfcnVsZXNfaGludD0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9ydWxlc19oaW50XzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X3NlbGVjdGlvbj0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9zZWxlY3Rpb25fMD1jYXN0PShHdGtUcmVlVmlldyAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfdmlzaWJsZV9yZWN0PQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X3Zpc2libGVfcmVjdF8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfdmlzaWJsZV9yZWN0XzE9ZmxhZ3M9bm9faW4KLQotT1NfX2d0a190cmVlX3ZpZXdfaW5zZXJ0X2NvbHVtbj0KLU9TX19ndGtfdHJlZV92aWV3X2luc2VydF9jb2x1bW5fMD1jYXN0PShHdGtUcmVlVmlldyAqKQotT1NfX2d0a190cmVlX3ZpZXdfaW5zZXJ0X2NvbHVtbl8xPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19pbnNlcnRfY29sdW1uXzI9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a190cmVlX3ZpZXdfbW92ZV9jb2x1bW5fYWZ0ZXI9Ci1PU19fZ3RrX3RyZWVfdmlld19tb3ZlX2NvbHVtbl9hZnRlcl8wPWNhc3Q9R3RrVHJlZVZpZXcgKgotT1NfX2d0a190cmVlX3ZpZXdfbW92ZV9jb2x1bW5fYWZ0ZXJfMT1jYXN0PUd0a1RyZWVWaWV3Q29sdW1uICoKLU9TX19ndGtfdHJlZV92aWV3X21vdmVfY29sdW1uX2FmdGVyXzI9Y2FzdD1HdGtUcmVlVmlld0NvbHVtbiAqCi0KLU9TX19ndGtfdHJlZV92aWV3X25ld193aXRoX21vZGVsPQotT1NfX2d0a190cmVlX3ZpZXdfbmV3X3dpdGhfbW9kZWxfMD1jYXN0PShHdGtUcmVlTW9kZWwgKikKLQotT1NfX2d0a190cmVlX3ZpZXdfcmVtb3ZlX2NvbHVtbj0KLU9TX19ndGtfdHJlZV92aWV3X3JlbW92ZV9jb2x1bW5fMD1jYXN0PShHdGtUcmVlVmlldyAqKQotT1NfX2d0a190cmVlX3ZpZXdfcmVtb3ZlX2NvbHVtbl8xPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi0KLU9TX19ndGtfdHJlZV92aWV3X3Jvd19leHBhbmRlZD0KLU9TX19ndGtfdHJlZV92aWV3X3Jvd19leHBhbmRlZF8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19yb3dfZXhwYW5kZWRfMT1jYXN0PShHdGtUcmVlUGF0aCAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19zY3JvbGxfdG9fY2VsbD0KLU9TX19ndGtfdHJlZV92aWV3X3Njcm9sbF90b19jZWxsXzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X3Njcm9sbF90b19jZWxsXzE9Y2FzdD0oR3RrVHJlZVBhdGggKikKLU9TX19ndGtfdHJlZV92aWV3X3Njcm9sbF90b19jZWxsXzI9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLU9TX19ndGtfdHJlZV92aWV3X3Njcm9sbF90b19jZWxsXzM9Y2FzdD0oZ2Jvb2xlYW4pCi1PU19fZ3RrX3RyZWVfdmlld19zY3JvbGxfdG9fY2VsbF80PWNhc3Q9KGdmbG9hdCkKLU9TX19ndGtfdHJlZV92aWV3X3Njcm9sbF90b19jZWxsXzU9Y2FzdD0oZ2Zsb2F0KQotCi1PU19fZ3RrX3RyZWVfdmlld19zY3JvbGxfdG9fcG9pbnQ9Ci1PU19fZ3RrX3RyZWVfdmlld19zY3JvbGxfdG9fcG9pbnRfMD1jYXN0PUd0a1RyZWVWaWV3ICoKLU9TX19ndGtfdHJlZV92aWV3X3Njcm9sbF90b19wb2ludF8xPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX3RyZWVfdmlld19zY3JvbGxfdG9fcG9pbnRfMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX3RyZWVfdmlld19zZXRfY3Vyc29yPQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X2N1cnNvcl8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19zZXRfY3Vyc29yXzE9Y2FzdD0oR3RrVHJlZVBhdGggKikKLU9TX19ndGtfdHJlZV92aWV3X3NldF9jdXJzb3JfMj1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X2N1cnNvcl8zPQotCi1PU19fZ3RrX3RyZWVfdmlld19zZXRfZHJhZ19kZXN0X3Jvdz0KLU9TX19ndGtfdHJlZV92aWV3X3NldF9kcmFnX2Rlc3Rfcm93XzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X3NldF9kcmFnX2Rlc3Rfcm93XzE9Y2FzdD0oR3RrVHJlZVBhdGggKikKLU9TX19ndGtfdHJlZV92aWV3X3NldF9kcmFnX2Rlc3Rfcm93XzI9Ci0KLU9TX19ndGtfdHJlZV92aWV3X3NldF9oZWFkZXJzX3Zpc2libGU9Ci1PU19fZ3RrX3RyZWVfdmlld19zZXRfaGVhZGVyc192aXNpYmxlXzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X3NldF9oZWFkZXJzX3Zpc2libGVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X21vZGVsPQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X21vZGVsXzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X3NldF9tb2RlbF8xPWNhc3Q9KEd0a1RyZWVNb2RlbCAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19zZXRfcnVsZXNfaGludD0KLU9TX19ndGtfdHJlZV92aWV3X3NldF9ydWxlc19oaW50XzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X3NldF9ydWxlc19oaW50XzE9Ci0KLU9TX19ndGtfdHJlZV92aWV3X3NldF9zZWFyY2hfY29sdW1uPQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X3NlYXJjaF9jb2x1bW5fMD1jYXN0PShHdGtUcmVlVmlldyAqKQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X3NlYXJjaF9jb2x1bW5fMT1jYXN0PShnaW50KQotCi1PU19fZ3RrX3RyZWVfdmlld190cmVlX3RvX3dpZGdldF9jb29yZHM9Ci1PU19fZ3RrX3RyZWVfdmlld190cmVlX3RvX3dpZGdldF9jb29yZHNfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotT1NfX2d0a190cmVlX3ZpZXdfdHJlZV90b193aWRnZXRfY29vcmRzXzE9Y2FzdD0oZ2ludCkKLU9TX19ndGtfdHJlZV92aWV3X3RyZWVfdG9fd2lkZ2V0X2Nvb3Jkc18yPWNhc3Q9Z2ludAotT1NfX2d0a190cmVlX3ZpZXdfdHJlZV90b193aWRnZXRfY29vcmRzXzM9Y2FzdD1naW50ICoKLU9TX19ndGtfdHJlZV92aWV3X3RyZWVfdG9fd2lkZ2V0X2Nvb3Jkc180PWNhc3Q9Z2ludCAqCi0KLU9TX19ndGtfdHJlZV92aWV3X3Vuc2V0X3Jvd3NfZHJhZ19kZXN0PQotT1NfX2d0a190cmVlX3ZpZXdfdW5zZXRfcm93c19kcmFnX2Rlc3RfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotCi1PU19fZ3RrX3RyZWVfdmlld193aWRnZXRfdG9fdHJlZV9jb29yZHM9Ci1PU19fZ3RrX3RyZWVfdmlld193aWRnZXRfdG9fdHJlZV9jb29yZHNfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotT1NfX2d0a190cmVlX3ZpZXdfd2lkZ2V0X3RvX3RyZWVfY29vcmRzXzE9Ci1PU19fZ3RrX3RyZWVfdmlld193aWRnZXRfdG9fdHJlZV9jb29yZHNfMj0KLU9TX19ndGtfdHJlZV92aWV3X3dpZGdldF90b190cmVlX2Nvb3Jkc18zPQotT1NfX2d0a190cmVlX3ZpZXdfd2lkZ2V0X3RvX3RyZWVfY29vcmRzXzQ9Ci0KLU9TX19ndGtfdmJveF9uZXc9Ci1PU19fZ3RrX3Zib3hfbmV3XzA9Y2FzdD0oZ2Jvb2xlYW4pCi1PU19fZ3RrX3Zib3hfbmV3XzE9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a192c2NhbGVfbmV3PQotT1NfX2d0a192c2NhbGVfbmV3XzA9Y2FzdD0oR3RrQWRqdXN0bWVudCAqKQotCi1PU19fZ3RrX3ZzY3JvbGxiYXJfbmV3PQotT1NfX2d0a192c2Nyb2xsYmFyX25ld18wPWNhc3Q9KEd0a0FkanVzdG1lbnQgKikKLQotT1NfX2d0a192c2VwYXJhdG9yX25ldz0KLQotT1NfX2d0a193aWRnZXRfYWRkX2FjY2VsZXJhdG9yPQotT1NfX2d0a193aWRnZXRfYWRkX2FjY2VsZXJhdG9yXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9hZGRfYWNjZWxlcmF0b3JfMT1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2d0a193aWRnZXRfYWRkX2FjY2VsZXJhdG9yXzI9Y2FzdD0oR3RrQWNjZWxHcm91cCAqKQotT1NfX2d0a193aWRnZXRfYWRkX2FjY2VsZXJhdG9yXzM9Y2FzdD0oZ3VpbnQpCi1PU19fZ3RrX3dpZGdldF9hZGRfYWNjZWxlcmF0b3JfND1jYXN0PShHZGtNb2RpZmllclR5cGUpCi1PU19fZ3RrX3dpZGdldF9hZGRfYWNjZWxlcmF0b3JfNT0KLQotT1NfX2d0a193aWRnZXRfYWRkX2V2ZW50cz0KLU9TX19ndGtfd2lkZ2V0X2FkZF9ldmVudHNfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X2FkZF9ldmVudHNfMT1jYXN0PShnaW50KQotCi1PU19fZ3RrX3dpZGdldF9jaGlsZF9mb2N1cz0KLU9TX19ndGtfd2lkZ2V0X2NoaWxkX2ZvY3VzXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9jaGlsZF9mb2N1c18xPQotCi1PU19fMWd0a18xd2lkZ2V0XzFjcmVhdGVfMXBhbmdvXzFsYXlvdXRfX0lJPQotT1NfXzFndGtfMXdpZGdldF8xY3JlYXRlXzFwYW5nb18xbGF5b3V0X19JSV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfXzFndGtfMXdpZGdldF8xY3JlYXRlXzFwYW5nb18xbGF5b3V0X19JSV8xPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX18xZ3RrXzF3aWRnZXRfMWNyZWF0ZV8xcGFuZ29fMWxheW91dF9fSV8zQj0KLU9TX18xZ3RrXzF3aWRnZXRfMWNyZWF0ZV8xcGFuZ29fMWxheW91dF9fSV8zQl8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfXzFndGtfMXdpZGdldF8xY3JlYXRlXzFwYW5nb18xbGF5b3V0X19JXzNCXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a193aWRnZXRfZGVzdHJveT0KLU9TX19ndGtfd2lkZ2V0X2Rlc3Ryb3lfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfZXZlbnQ9Ci1PU19fZ3RrX3dpZGdldF9ldmVudF8wPWNhc3Q9R3RrV2lkZ2V0ICoKLU9TX19ndGtfd2lkZ2V0X2V2ZW50XzE9Y2FzdD1HZGtFdmVudCAqCi0KLU9TX19ndGtfd2lkZ2V0X2dldF9hY2Nlc3NpYmxlPQotT1NfX2d0a193aWRnZXRfZ2V0X2FjY2Vzc2libGVfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfZ2V0X2NoaWxkX3Zpc2libGU9Ci1PU19fZ3RrX3dpZGdldF9nZXRfY2hpbGRfdmlzaWJsZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9nZXRfZGVmYXVsdF9kaXJlY3Rpb249Ci0KLU9TX19ndGtfd2lkZ2V0X2dldF9kZWZhdWx0X3N0eWxlPQotCi1PU19fZ3RrX3dpZGdldF9nZXRfZGlyZWN0aW9uPQotT1NfX2d0a193aWRnZXRfZ2V0X2RpcmVjdGlvbl8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9nZXRfZXZlbnRzPQotT1NfX2d0a193aWRnZXRfZ2V0X2V2ZW50c18wPWNhc3Q9R3RrV2lkZ2V0ICoKLQotT1NfX2d0a193aWRnZXRfZ2V0X21vZGlmaWVyX3N0eWxlPQotT1NfX2d0a193aWRnZXRfZ2V0X21vZGlmaWVyX3N0eWxlXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfd2lkZ2V0X2dldF9wYW5nb19jb250ZXh0PQotT1NfX2d0a193aWRnZXRfZ2V0X3BhbmdvX2NvbnRleHRfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfZ2V0X3BhcmVudD0KLU9TX19ndGtfd2lkZ2V0X2dldF9wYXJlbnRfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfZ2V0X3NpemVfcmVxdWVzdD0KLU9TX19ndGtfd2lkZ2V0X2dldF9zaXplX3JlcXVlc3RfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X2dldF9zaXplX3JlcXVlc3RfMT1jYXN0PShnaW50ICopCi1PU19fZ3RrX3dpZGdldF9nZXRfc2l6ZV9yZXF1ZXN0XzI9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX3dpZGdldF9nZXRfc3R5bGU9Ci1PU19fZ3RrX3dpZGdldF9nZXRfc3R5bGVfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfZ2V0X3RvcGxldmVsPQotT1NfX2d0a193aWRnZXRfZ2V0X3RvcGxldmVsXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfd2lkZ2V0X2dyYWJfZm9jdXM9Ci1PU19fZ3RrX3dpZGdldF9ncmFiX2ZvY3VzXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfd2lkZ2V0X2hpZGU9Ci1PU19fZ3RrX3dpZGdldF9oaWRlXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfd2lkZ2V0X2lzX2ZvY3VzPQotT1NfX2d0a193aWRnZXRfaXNfZm9jdXNfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfbWFwPQotT1NfX2d0a193aWRnZXRfbWFwXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfd2lkZ2V0X21uZW1vbmljX2FjdGl2YXRlPQotT1NfX2d0a193aWRnZXRfbW5lbW9uaWNfYWN0aXZhdGVfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X21uZW1vbmljX2FjdGl2YXRlXzE9Y2FzdD1nYm9vbGVhbgotCi1PU19fZ3RrX3dpZGdldF9tb2RpZnlfYmFzZT0KLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9iYXNlXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9tb2RpZnlfYmFzZV8xPWNhc3Q9KEd0a1N0YXRlVHlwZSkKLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9iYXNlXzI9Y2FzdD0oR2RrQ29sb3IgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9iZz0KLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9iZ18wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X2JnXzE9Y2FzdD0oR3RrU3RhdGVUeXBlKQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X2JnXzI9Y2FzdD0oR2RrQ29sb3IgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9mZz0KLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9mZ18wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X2ZnXzE9Y2FzdD0oR3RrU3RhdGVUeXBlKQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X2ZnXzI9Y2FzdD0oR2RrQ29sb3IgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9mb250PQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X2ZvbnRfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9mb250XzE9Y2FzdD0oUGFuZ29Gb250RGVzY3JpcHRpb24gKikKLQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X3N0eWxlPQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X3N0eWxlXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9tb2RpZnlfc3R5bGVfMT1jYXN0PShHdGtSY1N0eWxlICopCi0KLU9TX19ndGtfd2lkZ2V0X21vZGlmeV90ZXh0PQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X3RleHRfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X21vZGlmeV90ZXh0XzE9Y2FzdD0oR3RrU3RhdGVUeXBlKQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X3RleHRfMj1jYXN0PShHZGtDb2xvciAqKSxmbGFncz1ub19vdXQKLQotT1NfX2d0a193aWRnZXRfcmVhbGl6ZT0KLU9TX19ndGtfd2lkZ2V0X3JlYWxpemVfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfcmVtb3ZlX2FjY2VsZXJhdG9yPQotT1NfX2d0a193aWRnZXRfcmVtb3ZlX2FjY2VsZXJhdG9yXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9yZW1vdmVfYWNjZWxlcmF0b3JfMT1jYXN0PShHdGtBY2NlbEdyb3VwICopCi1PU19fZ3RrX3dpZGdldF9yZW1vdmVfYWNjZWxlcmF0b3JfMj1jYXN0PShndWludCkKLU9TX19ndGtfd2lkZ2V0X3JlbW92ZV9hY2NlbGVyYXRvcl8zPWNhc3Q9KEdka01vZGlmaWVyVHlwZSkKLQotT1NfX2d0a193aWRnZXRfcmVwYXJlbnQ9Ci1PU19fZ3RrX3dpZGdldF9yZXBhcmVudF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfcmVwYXJlbnRfMT1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfc2V0X2RlZmF1bHRfZGlyZWN0aW9uPQotT1NfX2d0a193aWRnZXRfc2V0X2RlZmF1bHRfZGlyZWN0aW9uXzA9Y2FzdD0oR3RrVGV4dERpcmVjdGlvbikKLQotT1NfX2d0a193aWRnZXRfc2V0X2RpcmVjdGlvbj0KLU9TX19ndGtfd2lkZ2V0X3NldF9kaXJlY3Rpb25fMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X3NldF9kaXJlY3Rpb25fMT1jYXN0PShHdGtUZXh0RGlyZWN0aW9uKQotCi1PU19fZ3RrX3dpZGdldF9zZXRfZG91YmxlX2J1ZmZlcmVkPQotT1NfX2d0a193aWRnZXRfc2V0X2RvdWJsZV9idWZmZXJlZF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfc2V0X2RvdWJsZV9idWZmZXJlZF8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX3dpZGdldF9zZXRfbmFtZT0KLU9TX19ndGtfd2lkZ2V0X3NldF9uYW1lXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9zZXRfbmFtZV8xPWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotT1NfX2d0a193aWRnZXRfc2V0X3BhcmVudF93aW5kb3c9Ci1PU19fZ3RrX3dpZGdldF9zZXRfcGFyZW50X3dpbmRvd18wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfc2V0X3BhcmVudF93aW5kb3dfMT1jYXN0PShHZGtXaW5kb3cgKikKLQotT1NfX2d0a193aWRnZXRfc2V0X3JlZHJhd19vbl9hbGxvY2F0ZT0KLU9TX19ndGtfd2lkZ2V0X3NldF9yZWRyYXdfb25fYWxsb2NhdGVfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X3NldF9yZWRyYXdfb25fYWxsb2NhdGVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a193aWRnZXRfc2V0X3NlbnNpdGl2ZT0KLU9TX19ndGtfd2lkZ2V0X3NldF9zZW5zaXRpdmVfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X3NldF9zZW5zaXRpdmVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a193aWRnZXRfc2V0X3NpemVfcmVxdWVzdD0KLU9TX19ndGtfd2lkZ2V0X3NldF9zaXplX3JlcXVlc3RfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X3NldF9zaXplX3JlcXVlc3RfMT1jYXN0PShnaW50KQotT1NfX2d0a193aWRnZXRfc2V0X3NpemVfcmVxdWVzdF8yPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfd2lkZ2V0X3NldF9zdGF0ZT0KLU9TX19ndGtfd2lkZ2V0X3NldF9zdGF0ZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfc2V0X3N0YXRlXzE9Y2FzdD0oR3RrU3RhdGVUeXBlKQotCi1PU19fZ3RrX3dpZGdldF9zaGFwZV9jb21iaW5lX21hc2s9Ci1PU19fZ3RrX3dpZGdldF9zaGFwZV9jb21iaW5lX21hc2tfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X3NoYXBlX2NvbWJpbmVfbWFza18xPWNhc3Q9KEdka0JpdG1hcCAqKQotT1NfX2d0a193aWRnZXRfc2hhcGVfY29tYmluZV9tYXNrXzI9Y2FzdD1naW50Ci1PU19fZ3RrX3dpZGdldF9zaGFwZV9jb21iaW5lX21hc2tfMz1jYXN0PWdpbnQKLQotT1NfX2d0a193aWRnZXRfc2hvdz0KLU9TX19ndGtfd2lkZ2V0X3Nob3dfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfc2hvd19ub3c9Ci1PU19fZ3RrX3dpZGdldF9zaG93X25vd18wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9zaXplX2FsbG9jYXRlPQotT1NfX2d0a193aWRnZXRfc2l6ZV9hbGxvY2F0ZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfc2l6ZV9hbGxvY2F0ZV8xPWNhc3Q9KEd0a0FsbG9jYXRpb24gKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX19ndGtfd2lkZ2V0X3NpemVfcmVxdWVzdD0KLU9TX19ndGtfd2lkZ2V0X3NpemVfcmVxdWVzdF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfc2l6ZV9yZXF1ZXN0XzE9Y2FzdD0oR3RrUmVxdWlzaXRpb24gKiksZmxhZ3M9bm9faW4KLQotT1NfXzFndGtfMXdpZGdldF8xc3R5bGVfMWdldF9fSV8zQl8zSUk9Ci1PU19fMWd0a18xd2lkZ2V0XzFzdHlsZV8xZ2V0X19JXzNCXzNJSV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfXzFndGtfMXdpZGdldF8xc3R5bGVfMWdldF9fSV8zQl8zSUlfMT1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfXzFndGtfMXdpZGdldF8xc3R5bGVfMWdldF9fSV8zQl8zSUlfMj0KLU9TX18xZ3RrXzF3aWRnZXRfMXN0eWxlXzFnZXRfX0lfM0JfM0lJXzM9Ci0KLU9TX18xZ3RrXzF3aWRnZXRfMXN0eWxlXzFnZXRfX0lfM0JfM0pJPQotT1NfXzFndGtfMXdpZGdldF8xc3R5bGVfMWdldF9fSV8zQl8zSklfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX18xZ3RrXzF3aWRnZXRfMXN0eWxlXzFnZXRfX0lfM0JfM0pJXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX18xZ3RrXzF3aWRnZXRfMXN0eWxlXzFnZXRfX0lfM0JfM0pJXzI9Ci1PU19fMWd0a18xd2lkZ2V0XzFzdHlsZV8xZ2V0X19JXzNCXzNKSV8zPQotCi1PU19fZ3RrX3dpZGdldF91bnJlYWxpemU9Ci1PU19fZ3RrX3dpZGdldF91bnJlYWxpemVfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aW5kb3dfYWN0aXZhdGVfZGVmYXVsdD0KLU9TX19ndGtfd2luZG93X2FjdGl2YXRlX2RlZmF1bHRfMD1jYXN0PShHdGtXaW5kb3cgKikKLQotT1NfX2d0a193aW5kb3dfYWRkX2FjY2VsX2dyb3VwPQotT1NfX2d0a193aW5kb3dfYWRkX2FjY2VsX2dyb3VwXzA9Y2FzdD0oR3RrV2luZG93ICopCi1PU19fZ3RrX3dpbmRvd19hZGRfYWNjZWxfZ3JvdXBfMT1jYXN0PShHdGtBY2NlbEdyb3VwICopCi0KLU9TX19ndGtfd2luZG93X2RlaWNvbmlmeT0KLU9TX19ndGtfd2luZG93X2RlaWNvbmlmeV8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotCi1PU19fZ3RrX3dpbmRvd19nZXRfZm9jdXM9Ci1PU19fZ3RrX3dpbmRvd19nZXRfZm9jdXNfMD1jYXN0PShHdGtXaW5kb3cgKikKLQotT1NfX2d0a193aW5kb3dfZ2V0X2ljb25fbGlzdD0KLU9TX19ndGtfd2luZG93X2dldF9pY29uX2xpc3RfMD1jYXN0PShHdGtXaW5kb3cgKikKLQotT1NfX2d0a193aW5kb3dfZ2V0X21uZW1vbmljX21vZGlmaWVyPQotT1NfX2d0a193aW5kb3dfZ2V0X21uZW1vbmljX21vZGlmaWVyXzA9Y2FzdD0oR3RrV2luZG93ICopCi0KLU9TX19ndGtfd2luZG93X2dldF9wb3NpdGlvbj0KLU9TX19ndGtfd2luZG93X2dldF9wb3NpdGlvbl8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotT1NfX2d0a193aW5kb3dfZ2V0X3Bvc2l0aW9uXzE9Y2FzdD0oZ2ludCAqKQotT1NfX2d0a193aW5kb3dfZ2V0X3Bvc2l0aW9uXzI9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX3dpbmRvd19nZXRfc2l6ZT0KLU9TX19ndGtfd2luZG93X2dldF9zaXplXzA9Y2FzdD0oR3RrV2luZG93ICopCi1PU19fZ3RrX3dpbmRvd19nZXRfc2l6ZV8xPWNhc3Q9KGdpbnQgKikKLU9TX19ndGtfd2luZG93X2dldF9zaXplXzI9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX3dpbmRvd19pY29uaWZ5PQotT1NfX2d0a193aW5kb3dfaWNvbmlmeV8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotCi1PU19fZ3RrX3dpbmRvd19tYXhpbWl6ZT0KLU9TX19ndGtfd2luZG93X21heGltaXplXzA9Y2FzdD0oR3RrV2luZG93ICopCi0KLU9TX19ndGtfd2luZG93X21vdmU9Ci1PU19fZ3RrX3dpbmRvd19tb3ZlXzA9Y2FzdD0oR3RrV2luZG93ICopCi1PU19fZ3RrX3dpbmRvd19tb3ZlXzE9Y2FzdD0oZ2ludCkKLU9TX19ndGtfd2luZG93X21vdmVfMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX3dpbmRvd19uZXc9Ci1PU19fZ3RrX3dpbmRvd19uZXdfMD1jYXN0PShHdGtXaW5kb3dUeXBlKQotCi1PU19fZ3RrX3dpbmRvd19wcmVzZW50PQotT1NfX2d0a193aW5kb3dfcHJlc2VudF8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotCi1PU19fZ3RrX3dpbmRvd19yZW1vdmVfYWNjZWxfZ3JvdXA9Ci1PU19fZ3RrX3dpbmRvd19yZW1vdmVfYWNjZWxfZ3JvdXBfMD1jYXN0PShHdGtXaW5kb3cgKikKLU9TX19ndGtfd2luZG93X3JlbW92ZV9hY2NlbF9ncm91cF8xPWNhc3Q9KEd0a0FjY2VsR3JvdXAgKikKLQotT1NfX2d0a193aW5kb3dfcmVzaXplPQotT1NfX2d0a193aW5kb3dfcmVzaXplXzA9Y2FzdD0oR3RrV2luZG93ICopCi1PU19fZ3RrX3dpbmRvd19yZXNpemVfMT1jYXN0PShnaW50KQotT1NfX2d0a193aW5kb3dfcmVzaXplXzI9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a193aW5kb3dfc2V0X2RlZmF1bHQ9Ci1PU19fZ3RrX3dpbmRvd19zZXRfZGVmYXVsdF8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotT1NfX2d0a193aW5kb3dfc2V0X2RlZmF1bHRfMT1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aW5kb3dfc2V0X2Rlc3Ryb3lfd2l0aF9wYXJlbnQ9Ci1PU19fZ3RrX3dpbmRvd19zZXRfZGVzdHJveV93aXRoX3BhcmVudF8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotT1NfX2d0a193aW5kb3dfc2V0X2Rlc3Ryb3lfd2l0aF9wYXJlbnRfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a193aW5kb3dfc2V0X2dlb21ldHJ5X2hpbnRzPQotT1NfX2d0a193aW5kb3dfc2V0X2dlb21ldHJ5X2hpbnRzXzA9Y2FzdD1HdGtXaW5kb3cgKgotT1NfX2d0a193aW5kb3dfc2V0X2dlb21ldHJ5X2hpbnRzXzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpbmRvd19zZXRfZ2VvbWV0cnlfaGludHNfMj1mbGFncz1ub19vdXQKLU9TX19ndGtfd2luZG93X3NldF9nZW9tZXRyeV9oaW50c18zPQotCi1PU19fZ3RrX3dpbmRvd19zZXRfaWNvbl9saXN0PQotT1NfX2d0a193aW5kb3dfc2V0X2ljb25fbGlzdF8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotT1NfX2d0a193aW5kb3dfc2V0X2ljb25fbGlzdF8xPWNhc3Q9KEdMaXN0ICopCi0KLU9TX19ndGtfd2luZG93X3NldF9tb2RhbD0KLU9TX19ndGtfd2luZG93X3NldF9tb2RhbF8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotT1NfX2d0a193aW5kb3dfc2V0X21vZGFsXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfd2luZG93X3NldF9yZXNpemFibGU9Ci1PU19fZ3RrX3dpbmRvd19zZXRfcmVzaXphYmxlXzA9Y2FzdD0oR3RrV2luZG93ICopCi1PU19fZ3RrX3dpbmRvd19zZXRfcmVzaXphYmxlXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfd2luZG93X3NldF90aXRsZT0KLU9TX19ndGtfd2luZG93X3NldF90aXRsZV8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotT1NfX2d0a193aW5kb3dfc2V0X3RpdGxlXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a193aW5kb3dfc2V0X3RyYW5zaWVudF9mb3I9Ci1PU19fZ3RrX3dpbmRvd19zZXRfdHJhbnNpZW50X2Zvcl8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotT1NfX2d0a193aW5kb3dfc2V0X3RyYW5zaWVudF9mb3JfMT1jYXN0PShHdGtXaW5kb3cgKikKLQotT1NfX2d0a193aW5kb3dfc2V0X3R5cGVfaGludD0KLU9TX19ndGtfd2luZG93X3NldF90eXBlX2hpbnRfMD1jYXN0PShHdGtXaW5kb3cgKikKLU9TX19ndGtfd2luZG93X3NldF90eXBlX2hpbnRfMT0KLQotT1NfX2d0a193aW5kb3dfdW5tYXhpbWl6ZT0KLU9TX19ndGtfd2luZG93X3VubWF4aW1pemVfMD1jYXN0PShHdGtXaW5kb3cgKikKLQotT1NfX3BhbmdvX2F0dHJfYmFja2dyb3VuZF9uZXc9Ci1PU19fcGFuZ29fYXR0cl9iYWNrZ3JvdW5kX25ld18wPQotT1NfX3BhbmdvX2F0dHJfYmFja2dyb3VuZF9uZXdfMT0KLU9TX19wYW5nb19hdHRyX2JhY2tncm91bmRfbmV3XzI9Ci0KLU9TX19wYW5nb19hdHRyX2ZvbnRfZGVzY19uZXc9Ci1PU19fcGFuZ29fYXR0cl9mb250X2Rlc2NfbmV3XzA9Y2FzdD1jb25zdCBQYW5nb0ZvbnREZXNjcmlwdGlvbiAqCi0KLU9TX19wYW5nb19hdHRyX2ZvcmVncm91bmRfbmV3PQotT1NfX3BhbmdvX2F0dHJfZm9yZWdyb3VuZF9uZXdfMD0KLU9TX19wYW5nb19hdHRyX2ZvcmVncm91bmRfbmV3XzE9Ci1PU19fcGFuZ29fYXR0cl9mb3JlZ3JvdW5kX25ld18yPQotCi1PU19fcGFuZ29fYXR0cl9saXN0X2NoYW5nZT0KLU9TX19wYW5nb19hdHRyX2xpc3RfY2hhbmdlXzA9Y2FzdD1QYW5nb0F0dHJMaXN0ICoKLU9TX19wYW5nb19hdHRyX2xpc3RfY2hhbmdlXzE9Y2FzdD1QYW5nb0F0dHJpYnV0ZSAqCi0KLU9TX19wYW5nb19hdHRyX2xpc3RfaW5zZXJ0PQotT1NfX3BhbmdvX2F0dHJfbGlzdF9pbnNlcnRfMD1jYXN0PVBhbmdvQXR0ckxpc3QgKgotT1NfX3BhbmdvX2F0dHJfbGlzdF9pbnNlcnRfMT1jYXN0PVBhbmdvQXR0cmlidXRlICoKLQotT1NfX3BhbmdvX2F0dHJfbGlzdF9uZXc9Ci0KLU9TX19wYW5nb19hdHRyX2xpc3RfdW5yZWY9Ci1PU19fcGFuZ29fYXR0cl9saXN0X3VucmVmXzA9Y2FzdD0oUGFuZ29BdHRyTGlzdCAqKQotCi1PU19fcGFuZ29fYXR0cl9yaXNlX25ldz0KLU9TX19wYW5nb19hdHRyX3Jpc2VfbmV3XzA9Ci0KLU9TX19wYW5nb19hdHRyX3NoYXBlX25ldz0KLU9TX19wYW5nb19hdHRyX3NoYXBlX25ld18wPWZsYWdzPW5vX291dAotT1NfX3BhbmdvX2F0dHJfc2hhcGVfbmV3XzE9ZmxhZ3M9bm9fb3V0Ci0KLU9TX19wYW5nb19hdHRyX3N0cmlrZXRocm91Z2hfbmV3PQotT1NfX3BhbmdvX2F0dHJfc3RyaWtldGhyb3VnaF9uZXdfMD0KLQotT1NfX3BhbmdvX2F0dHJfdW5kZXJsaW5lX25ldz0KLU9TX19wYW5nb19hdHRyX3VuZGVybGluZV9uZXdfMD0KLQotT1NfX3BhbmdvX2F0dHJfd2VpZ2h0X25ldz0KLU9TX19wYW5nb19hdHRyX3dlaWdodF9uZXdfMD0KLQotT1NfX3BhbmdvX2NvbnRleHRfZ2V0X2Jhc2VfZGlyPQotT1NfX3BhbmdvX2NvbnRleHRfZ2V0X2Jhc2VfZGlyXzA9Y2FzdD0oUGFuZ29Db250ZXh0ICopCi0KLU9TX19wYW5nb19jb250ZXh0X2dldF9sYW5ndWFnZT0KLU9TX19wYW5nb19jb250ZXh0X2dldF9sYW5ndWFnZV8wPWNhc3Q9KFBhbmdvQ29udGV4dCAqKQotCi1PU19fcGFuZ29fY29udGV4dF9nZXRfbWV0cmljcz0KLU9TX19wYW5nb19jb250ZXh0X2dldF9tZXRyaWNzXzA9Y2FzdD0oUGFuZ29Db250ZXh0ICopCi1PU19fcGFuZ29fY29udGV4dF9nZXRfbWV0cmljc18xPWNhc3Q9KGNvbnN0IFBhbmdvRm9udERlc2NyaXB0aW9uICopCi1PU19fcGFuZ29fY29udGV4dF9nZXRfbWV0cmljc18yPWNhc3Q9KFBhbmdvTGFuZ3VhZ2UgKikKLQotT1NfX3BhbmdvX2NvbnRleHRfbGlzdF9mYW1pbGllcz0KLU9TX19wYW5nb19jb250ZXh0X2xpc3RfZmFtaWxpZXNfMD1jYXN0PShQYW5nb0NvbnRleHQgKikKLU9TX19wYW5nb19jb250ZXh0X2xpc3RfZmFtaWxpZXNfMT1jYXN0PShQYW5nb0ZvbnRGYW1pbHkgKioqKQotT1NfX3BhbmdvX2NvbnRleHRfbGlzdF9mYW1pbGllc18yPWNhc3Q9KGludCAqKQotCi1PU19fcGFuZ29fY29udGV4dF9zZXRfYmFzZV9kaXI9Ci1PU19fcGFuZ29fY29udGV4dF9zZXRfYmFzZV9kaXJfMD1jYXN0PShQYW5nb0NvbnRleHQgKikKLU9TX19wYW5nb19jb250ZXh0X3NldF9iYXNlX2Rpcl8xPQotCi1PU19fcGFuZ29fY29udGV4dF9zZXRfbGFuZ3VhZ2U9Ci1PU19fcGFuZ29fY29udGV4dF9zZXRfbGFuZ3VhZ2VfMD1jYXN0PShQYW5nb0NvbnRleHQgKikKLU9TX19wYW5nb19jb250ZXh0X3NldF9sYW5ndWFnZV8xPWNhc3Q9KFBhbmdvTGFuZ3VhZ2UgKikKLQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fY29weT0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX2NvcHlfMD1jYXN0PShQYW5nb0ZvbnREZXNjcmlwdGlvbiAqKQotCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9mcmVlPQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZnJlZV8wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX2Zyb21fc3RyaW5nPQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZnJvbV9zdHJpbmdfMD1jYXN0PShjb25zdCBjaGFyICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9nZXRfZmFtaWx5PQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZ2V0X2ZhbWlseV8wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX2dldF9zaXplPQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZ2V0X3NpemVfMD1jYXN0PShQYW5nb0ZvbnREZXNjcmlwdGlvbiAqKQotCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9nZXRfc3R5bGU9Ci1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9nZXRfc3R5bGVfMD1jYXN0PShQYW5nb0ZvbnREZXNjcmlwdGlvbiAqKQotCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9nZXRfd2VpZ2h0PQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZ2V0X3dlaWdodF8wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX25ldz0KLQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X2ZhbWlseT0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX3NldF9mYW1pbHlfMD1jYXN0PShQYW5nb0ZvbnREZXNjcmlwdGlvbiAqKQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X2ZhbWlseV8xPWNhc3Q9KGNvbnN0IGNoYXIgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX3NldF9zaXplPQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X3NpemVfMD1jYXN0PShQYW5nb0ZvbnREZXNjcmlwdGlvbiAqKQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X3NpemVfMT1jYXN0PShnaW50KQotCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfc3RyZXRjaD0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX3NldF9zdHJldGNoXzA9Y2FzdD0oUGFuZ29Gb250RGVzY3JpcHRpb24gKikKLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX3NldF9zdHJldGNoXzE9Y2FzdD0oUGFuZ29TdHJldGNoKQotCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfc3R5bGU9Ci1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfc3R5bGVfMD1jYXN0PShQYW5nb0ZvbnREZXNjcmlwdGlvbiAqKQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X3N0eWxlXzE9Y2FzdD0oUGFuZ29TdHlsZSkKLQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X3dlaWdodD0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX3NldF93ZWlnaHRfMD1jYXN0PShQYW5nb0ZvbnREZXNjcmlwdGlvbiAqKQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X3dlaWdodF8xPWNhc3Q9KFBhbmdvV2VpZ2h0KQotCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl90b19zdHJpbmc9Ci1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl90b19zdHJpbmdfMD1jYXN0PShQYW5nb0ZvbnREZXNjcmlwdGlvbiAqKQotCi1PU19fcGFuZ29fZm9udF9mYWNlX2Rlc2NyaWJlPQotT1NfX3BhbmdvX2ZvbnRfZmFjZV9kZXNjcmliZV8wPWNhc3Q9KFBhbmdvRm9udEZhY2UgKikKLQotT1NfX3BhbmdvX2ZvbnRfZmFtaWx5X2dldF9uYW1lPQotT1NfX3BhbmdvX2ZvbnRfZmFtaWx5X2dldF9uYW1lXzA9Y2FzdD0oUGFuZ29Gb250RmFtaWx5ICopCi0KLU9TX19wYW5nb19mb250X2ZhbWlseV9saXN0X2ZhY2VzPQotT1NfX3BhbmdvX2ZvbnRfZmFtaWx5X2xpc3RfZmFjZXNfMD1jYXN0PShQYW5nb0ZvbnRGYW1pbHkgKikKLU9TX19wYW5nb19mb250X2ZhbWlseV9saXN0X2ZhY2VzXzE9Y2FzdD0oUGFuZ29Gb250RmFjZSAqKiopCi1PU19fcGFuZ29fZm9udF9mYW1pbHlfbGlzdF9mYWNlc18yPWNhc3Q9KGludCAqKQotCi1PU19fcGFuZ29fZm9udF9nZXRfbWV0cmljcz0KLU9TX19wYW5nb19mb250X2dldF9tZXRyaWNzXzA9Y2FzdD1QYW5nb0ZvbnQgKgotT1NfX3BhbmdvX2ZvbnRfZ2V0X21ldHJpY3NfMT1jYXN0PVBhbmdvTGFuZ3VhZ2UgKgotCi1PU19fcGFuZ29fZm9udF9tZXRyaWNzX2dldF9hcHByb3hpbWF0ZV9jaGFyX3dpZHRoPQotT1NfX3BhbmdvX2ZvbnRfbWV0cmljc19nZXRfYXBwcm94aW1hdGVfY2hhcl93aWR0aF8wPWNhc3Q9KFBhbmdvRm9udE1ldHJpY3MgKikKLQotT1NfX3BhbmdvX2ZvbnRfbWV0cmljc19nZXRfYXNjZW50PQotT1NfX3BhbmdvX2ZvbnRfbWV0cmljc19nZXRfYXNjZW50XzA9Y2FzdD0oUGFuZ29Gb250TWV0cmljcyAqKQotCi1PU19fcGFuZ29fZm9udF9tZXRyaWNzX2dldF9kZXNjZW50PQotT1NfX3BhbmdvX2ZvbnRfbWV0cmljc19nZXRfZGVzY2VudF8wPWNhc3Q9KFBhbmdvRm9udE1ldHJpY3MgKikKLQotT1NfX3BhbmdvX2ZvbnRfbWV0cmljc191bnJlZj0KLU9TX19wYW5nb19mb250X21ldHJpY3NfdW5yZWZfMD1jYXN0PShQYW5nb0ZvbnRNZXRyaWNzICopCi0KLU9TX19wYW5nb19sYW5ndWFnZV9mcm9tX3N0cmluZz0KLU9TX19wYW5nb19sYW5ndWFnZV9mcm9tX3N0cmluZ18wPWNhc3Q9KGNvbnN0IGNoYXIgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX19wYW5nb19sYXlvdXRfY29udGV4dF9jaGFuZ2VkPQotT1NfX3BhbmdvX2xheW91dF9jb250ZXh0X2NoYW5nZWRfMD1jYXN0PVBhbmdvTGF5b3V0ICoKLQotT1NfX3BhbmdvX2xheW91dF9nZXRfYWxpZ25tZW50PQotT1NfX3BhbmdvX2xheW91dF9nZXRfYWxpZ25tZW50XzA9Y2FzdD1QYW5nb0xheW91dCoKLQotT1NfX3BhbmdvX2xheW91dF9nZXRfYXR0cmlidXRlcz0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X2F0dHJpYnV0ZXNfMD1jYXN0PVBhbmdvTGF5b3V0ICoKLQotT1NfX3BhbmdvX2xheW91dF9nZXRfaW5kZW50PQotT1NfX3BhbmdvX2xheW91dF9nZXRfaW5kZW50XzA9Y2FzdD0oUGFuZ29MYXlvdXQqKQotCi1PU19fcGFuZ29fbGF5b3V0X2dldF9pdGVyPQotT1NfX3BhbmdvX2xheW91dF9nZXRfaXRlcl8wPWNhc3Q9KFBhbmdvTGF5b3V0KikKLQotT1NfX3BhbmdvX2xheW91dF9nZXRfanVzdGlmeT0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X2p1c3RpZnlfMD1jYXN0PShQYW5nb0xheW91dCopCi0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X2xpbmU9Ci1PU19fcGFuZ29fbGF5b3V0X2dldF9saW5lXzA9Y2FzdD1QYW5nb0xheW91dCAqCi1PU19fcGFuZ29fbGF5b3V0X2dldF9saW5lXzE9Ci0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X2xpbmVfY291bnQ9Ci1PU19fcGFuZ29fbGF5b3V0X2dldF9saW5lX2NvdW50XzA9Y2FzdD1QYW5nb0xheW91dCoKLQotT1NfX3BhbmdvX2xheW91dF9nZXRfbG9nX2F0dHJzPQotT1NfX3BhbmdvX2xheW91dF9nZXRfbG9nX2F0dHJzXzA9Y2FzdD1QYW5nb0xheW91dCoKLU9TX19wYW5nb19sYXlvdXRfZ2V0X2xvZ19hdHRyc18xPWNhc3Q9UGFuZ29Mb2dBdHRyICoqCi1PU19fcGFuZ29fbGF5b3V0X2dldF9sb2dfYXR0cnNfMj1jYXN0PShpbnQgKikKLQotT1NfX3BhbmdvX2xheW91dF9nZXRfc2l6ZT0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X3NpemVfMD1jYXN0PShQYW5nb0xheW91dCAqKQotT1NfX3BhbmdvX2xheW91dF9nZXRfc2l6ZV8xPWNhc3Q9KGludCAqKQotT1NfX3BhbmdvX2xheW91dF9nZXRfc2l6ZV8yPWNhc3Q9KGludCAqKQotCi1PU19fcGFuZ29fbGF5b3V0X2dldF9zcGFjaW5nPQotT1NfX3BhbmdvX2xheW91dF9nZXRfc3BhY2luZ18wPWNhc3Q9UGFuZ29MYXlvdXQqCi0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X3RhYnM9Ci1PU19fcGFuZ29fbGF5b3V0X2dldF90YWJzXzA9Y2FzdD1QYW5nb0xheW91dCoKLQotT1NfX3BhbmdvX2xheW91dF9nZXRfdGV4dD0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X3RleHRfMD1jYXN0PVBhbmdvTGF5b3V0ICoKLQotT1NfX3BhbmdvX2xheW91dF9nZXRfd2lkdGg9Ci1PU19fcGFuZ29fbGF5b3V0X2dldF93aWR0aF8wPWNhc3Q9UGFuZ29MYXlvdXQgKgotCi1PU19fcGFuZ29fbGF5b3V0X2luZGV4X3RvX3Bvcz0KLU9TX19wYW5nb19sYXlvdXRfaW5kZXhfdG9fcG9zXzA9Y2FzdD0oUGFuZ29MYXlvdXQqKQotT1NfX3BhbmdvX2xheW91dF9pbmRleF90b19wb3NfMT0KLU9TX19wYW5nb19sYXlvdXRfaW5kZXhfdG9fcG9zXzI9ZmxhZ3M9bm9faW4KLQotT1NfX3BhbmdvX2xheW91dF9pdGVyX2ZyZWU9Ci1PU19fcGFuZ29fbGF5b3V0X2l0ZXJfZnJlZV8wPWNhc3Q9UGFuZ29MYXlvdXRJdGVyKgotCi1PU19fcGFuZ29fbGF5b3V0X2l0ZXJfZ2V0X2luZGV4PQotT1NfX3BhbmdvX2xheW91dF9pdGVyX2dldF9pbmRleF8wPWNhc3Q9KFBhbmdvTGF5b3V0SXRlciopCi0KLU9TX19wYW5nb19sYXlvdXRfaXRlcl9nZXRfbGluZV9leHRlbnRzPQotT1NfX3BhbmdvX2xheW91dF9pdGVyX2dldF9saW5lX2V4dGVudHNfMD1jYXN0PShQYW5nb0xheW91dEl0ZXIqKQotT1NfX3BhbmdvX2xheW91dF9pdGVyX2dldF9saW5lX2V4dGVudHNfMT1mbGFncz1ub19pbgotT1NfX3BhbmdvX2xheW91dF9pdGVyX2dldF9saW5lX2V4dGVudHNfMj1mbGFncz1ub19pbgotCi1PU19fcGFuZ29fbGF5b3V0X2l0ZXJfZ2V0X3J1bj0KLU9TX19wYW5nb19sYXlvdXRfaXRlcl9nZXRfcnVuXzA9Y2FzdD1QYW5nb0xheW91dEl0ZXIqCi0KLU9TX19wYW5nb19sYXlvdXRfaXRlcl9uZXh0X2xpbmU9Ci1PU19fcGFuZ29fbGF5b3V0X2l0ZXJfbmV4dF9saW5lXzA9Y2FzdD1QYW5nb0xheW91dEl0ZXIqCi0KLU9TX19wYW5nb19sYXlvdXRfaXRlcl9uZXh0X3J1bj0KLU9TX19wYW5nb19sYXlvdXRfaXRlcl9uZXh0X3J1bl8wPWNhc3Q9UGFuZ29MYXlvdXRJdGVyKgotCi1PU19fcGFuZ29fbGF5b3V0X2xpbmVfZ2V0X2V4dGVudHM9Ci1PU19fcGFuZ29fbGF5b3V0X2xpbmVfZ2V0X2V4dGVudHNfMD1jYXN0PVBhbmdvTGF5b3V0TGluZSoKLU9TX19wYW5nb19sYXlvdXRfbGluZV9nZXRfZXh0ZW50c18xPWNhc3Q9UGFuZ29SZWN0YW5nbGUgKixmbGFncz1ub19pbgotT1NfX3BhbmdvX2xheW91dF9saW5lX2dldF9leHRlbnRzXzI9Y2FzdD1QYW5nb1JlY3RhbmdsZSAqLGZsYWdzPW5vX2luCi0KLU9TX19wYW5nb19sYXlvdXRfbGluZV94X3RvX2luZGV4PQotT1NfX3BhbmdvX2xheW91dF9saW5lX3hfdG9faW5kZXhfMD1jYXN0PVBhbmdvTGF5b3V0TGluZSoKLU9TX19wYW5nb19sYXlvdXRfbGluZV94X3RvX2luZGV4XzE9Ci1PU19fcGFuZ29fbGF5b3V0X2xpbmVfeF90b19pbmRleF8yPWNhc3Q9aW50ICoKLU9TX19wYW5nb19sYXlvdXRfbGluZV94X3RvX2luZGV4XzM9Y2FzdD1pbnQgKgotCi1PU19fcGFuZ29fbGF5b3V0X25ldz0KLU9TX19wYW5nb19sYXlvdXRfbmV3XzA9Y2FzdD0oUGFuZ29Db250ZXh0ICopCi0KLU9TX19wYW5nb19sYXlvdXRfc2V0X2FsaWdubWVudD0KLU9TX19wYW5nb19sYXlvdXRfc2V0X2FsaWdubWVudF8wPWNhc3Q9KFBhbmdvTGF5b3V0ICopCi1PU19fcGFuZ29fbGF5b3V0X3NldF9hbGlnbm1lbnRfMT0KLQotT1NfX3BhbmdvX2xheW91dF9zZXRfYXR0cmlidXRlcz0KLU9TX19wYW5nb19sYXlvdXRfc2V0X2F0dHJpYnV0ZXNfMD1jYXN0PShQYW5nb0xheW91dCAqKQotT1NfX3BhbmdvX2xheW91dF9zZXRfYXR0cmlidXRlc18xPWNhc3Q9UGFuZ29BdHRyTGlzdCAqCi0KLU9TX19wYW5nb19sYXlvdXRfc2V0X2ZvbnRfZGVzY3JpcHRpb249Ci1PU19fcGFuZ29fbGF5b3V0X3NldF9mb250X2Rlc2NyaXB0aW9uXzA9Y2FzdD0oUGFuZ29MYXlvdXQgKikKLU9TX19wYW5nb19sYXlvdXRfc2V0X2ZvbnRfZGVzY3JpcHRpb25fMT1jYXN0PShQYW5nb0ZvbnREZXNjcmlwdGlvbiAqKQotCi1PU19fcGFuZ29fbGF5b3V0X3NldF9pbmRlbnQ9Ci1PU19fcGFuZ29fbGF5b3V0X3NldF9pbmRlbnRfMD1jYXN0PShQYW5nb0xheW91dCopCi1PU19fcGFuZ29fbGF5b3V0X3NldF9pbmRlbnRfMT0KLQotT1NfX3BhbmdvX2xheW91dF9zZXRfanVzdGlmeT0KLU9TX19wYW5nb19sYXlvdXRfc2V0X2p1c3RpZnlfMD1jYXN0PShQYW5nb0xheW91dCopCi1PU19fcGFuZ29fbGF5b3V0X3NldF9qdXN0aWZ5XzE9Ci0KLU9TX19wYW5nb19sYXlvdXRfc2V0X3NpbmdsZV9wYXJhZ3JhcGhfbW9kZT0KLU9TX19wYW5nb19sYXlvdXRfc2V0X3NpbmdsZV9wYXJhZ3JhcGhfbW9kZV8wPWNhc3Q9UGFuZ29MYXlvdXQgKgotT1NfX3BhbmdvX2xheW91dF9zZXRfc2luZ2xlX3BhcmFncmFwaF9tb2RlXzE9Y2FzdD1nYm9vbGVhbgotCi1PU19fcGFuZ29fbGF5b3V0X3NldF9zcGFjaW5nPQotT1NfX3BhbmdvX2xheW91dF9zZXRfc3BhY2luZ18wPWNhc3Q9KFBhbmdvTGF5b3V0ICopCi1PU19fcGFuZ29fbGF5b3V0X3NldF9zcGFjaW5nXzE9Ci0KLU9TX19wYW5nb19sYXlvdXRfc2V0X3RhYnM9Ci1PU19fcGFuZ29fbGF5b3V0X3NldF90YWJzXzA9Y2FzdD1QYW5nb0xheW91dCAqCi1PU19fcGFuZ29fbGF5b3V0X3NldF90YWJzXzE9Y2FzdD0oUGFuZ29UYWJBcnJheSAqKQotCi1PU19fcGFuZ29fbGF5b3V0X3NldF90ZXh0PQotT1NfX3BhbmdvX2xheW91dF9zZXRfdGV4dF8wPWNhc3Q9KFBhbmdvTGF5b3V0ICopCi1PU19fcGFuZ29fbGF5b3V0X3NldF90ZXh0XzE9Y2FzdD0oY29uc3QgY2hhciAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX19wYW5nb19sYXlvdXRfc2V0X3RleHRfMj1jYXN0PShpbnQpCi0KLU9TX19wYW5nb19sYXlvdXRfc2V0X3dpZHRoPQotT1NfX3BhbmdvX2xheW91dF9zZXRfd2lkdGhfMD1jYXN0PShQYW5nb0xheW91dCAqKQotT1NfX3BhbmdvX2xheW91dF9zZXRfd2lkdGhfMT0KLQotT1NfX3BhbmdvX2xheW91dF9zZXRfd3JhcD0KLU9TX19wYW5nb19sYXlvdXRfc2V0X3dyYXBfMD1jYXN0PVBhbmdvTGF5b3V0ICoKLU9TX19wYW5nb19sYXlvdXRfc2V0X3dyYXBfMT0KLQotT1NfX3BhbmdvX2xheW91dF94eV90b19pbmRleD0KLU9TX19wYW5nb19sYXlvdXRfeHlfdG9faW5kZXhfMD1jYXN0PVBhbmdvTGF5b3V0ICoKLU9TX19wYW5nb19sYXlvdXRfeHlfdG9faW5kZXhfMT0KLU9TX19wYW5nb19sYXlvdXRfeHlfdG9faW5kZXhfMj0KLU9TX19wYW5nb19sYXlvdXRfeHlfdG9faW5kZXhfMz1jYXN0PWludCAqCi1PU19fcGFuZ29fbGF5b3V0X3h5X3RvX2luZGV4XzQ9Y2FzdD1pbnQgKgotCi1PU19fcGFuZ29fdGFiX2FycmF5X2ZyZWU9Ci1PU19fcGFuZ29fdGFiX2FycmF5X2ZyZWVfMD1jYXN0PShQYW5nb1RhYkFycmF5ICopCi0KLU9TX19wYW5nb190YWJfYXJyYXlfZ2V0X3NpemU9Ci1PU19fcGFuZ29fdGFiX2FycmF5X2dldF9zaXplXzA9Y2FzdD0oUGFuZ29UYWJBcnJheSAqKQotCi1PU19fcGFuZ29fdGFiX2FycmF5X2dldF90YWJzPQotT1NfX3BhbmdvX3RhYl9hcnJheV9nZXRfdGFic18wPWNhc3Q9KFBhbmdvVGFiQXJyYXkgKikKLU9TX19wYW5nb190YWJfYXJyYXlfZ2V0X3RhYnNfMT1jYXN0PShQYW5nb1RhYkFsaWduICoqKQotT1NfX3BhbmdvX3RhYl9hcnJheV9nZXRfdGFic18yPWNhc3Q9KGludCAqKikKLQotT1NfX3BhbmdvX3RhYl9hcnJheV9uZXc9Ci1PU19fcGFuZ29fdGFiX2FycmF5X25ld18wPWNhc3Q9KGdpbnQpCi1PU19fcGFuZ29fdGFiX2FycmF5X25ld18xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fcGFuZ29fdGFiX2FycmF5X3NldF90YWI9Ci1PU19fcGFuZ29fdGFiX2FycmF5X3NldF90YWJfMD1jYXN0PShQYW5nb1RhYkFycmF5ICopCi1PU19fcGFuZ29fdGFiX2FycmF5X3NldF90YWJfMT1jYXN0PShnaW50KQotT1NfX3BhbmdvX3RhYl9hcnJheV9zZXRfdGFiXzI9Y2FzdD0oUGFuZ29UYWJBbGlnbikKLU9TX19wYW5nb190YWJfYXJyYXlfc2V0X3RhYl8zPWNhc3Q9KGdpbnQpCi0KLU9TX2dfbWFpbl9jb250ZXh0X3dha2V1cD0KLU9TX2dfbWFpbl9jb250ZXh0X3dha2V1cF8wPWNhc3Q9R01haW5Db250ZXh0ICoKLQotT1NfZ2V0ZW52PQotT1NfZ2V0ZW52XzA9Y2FzdD1jb25zdCBjaGFyICoKLQotT1NfbG9jYWxlY29udl9kZWNpbWFsX3BvaW50PQotCi1PU19tZW1tb3ZlX19JSUk9Ci1PU19tZW1tb3ZlX19JSUlfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JSUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19JSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HSW50ZXJmYWNlSW5mb18yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HSW50ZXJmYWNlSW5mb18ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HSW50ZXJmYWNlSW5mb18ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR0ludGVyZmFjZUluZm9fMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HT2JqZWN0Q2xhc3NfMj0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HT2JqZWN0Q2xhc3NfMl8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HT2JqZWN0Q2xhc3NfMl8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HVHlwZUluZm9fMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR1R5cGVJbmZvXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dUeXBlSW5mb18ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR1R5cGVJbmZvXzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRCdXR0b25fMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRCdXR0b25fMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRCdXR0b25fMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50QnV0dG9uXzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQWRqdXN0bWVudF8yPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0FkanVzdG1lbnRfMl8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtBZGp1c3RtZW50XzJfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrRml4ZWRfMj0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtGaXhlZF8yXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0ZpeGVkXzJfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrVGFyZ2V0RW50cnlfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrVGFyZ2V0RW50cnlfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrVGFyZ2V0RW50cnlfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1RhcmdldEVudHJ5XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrV2lkZ2V0Q2xhc3NfMj0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtXaWRnZXRDbGFzc18yXzA9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrV2lkZ2V0Q2xhc3NfMl8xPWZsYWdzPW5vX291dAotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29BdHRyaWJ1dGVfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29BdHRyaWJ1dGVfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29BdHRyaWJ1dGVfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvQXR0cmlidXRlXzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEJ1dHRvbkV2ZW50XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hCdXR0b25FdmVudF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQnV0dG9uRXZlbnRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hCdXR0b25FdmVudF8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hDbGllbnRNZXNzYWdlRXZlbnRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWENsaWVudE1lc3NhZ2VFdmVudF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQ2xpZW50TWVzc2FnZUV2ZW50XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQ2xpZW50TWVzc2FnZUV2ZW50XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWENyb3NzaW5nRXZlbnRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWENyb3NzaW5nRXZlbnRfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWENyb3NzaW5nRXZlbnRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hDcm9zc2luZ0V2ZW50XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEV4cG9zZUV2ZW50XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hFeHBvc2VFdmVudF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YRXhwb3NlRXZlbnRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hFeHBvc2VFdmVudF8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hGb2N1c0NoYW5nZUV2ZW50XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hGb2N1c0NoYW5nZUV2ZW50XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hGb2N1c0NoYW5nZUV2ZW50XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YRm9jdXNDaGFuZ2VFdmVudF8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSV8zQkk9Ci1PU19tZW1tb3ZlX19JXzNCSV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lfM0JJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX21lbW1vdmVfX0lfM0JJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JXzNDST0KLU9TX21lbW1vdmVfX0lfM0NJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSV8zQ0lfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfbWVtbW92ZV9fSV8zQ0lfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lfM0RJPQotT1NfbWVtbW92ZV9fSV8zRElfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JXzNESV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19tZW1tb3ZlX19JXzNESV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSV8zSUk9Ci1PU19tZW1tb3ZlX19JXzNJSV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lfM0lJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX21lbW1vdmVfX0lfM0lJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JXzNKST0KLU9TX21lbW1vdmVfX0lfM0pJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSV8zSklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfbWVtbW92ZV9fSV8zSklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dPYmplY3RDbGFzc18yST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dPYmplY3RDbGFzc18ySV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dPYmplY3RDbGFzc18ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR1R5cGVRdWVyeV8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HVHlwZVF1ZXJ5XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dUeXBlUXVlcnlfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR1R5cGVRdWVyeV8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRHJhZ0NvbnRleHRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRHJhZ0NvbnRleHRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRHJhZ0NvbnRleHRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRHJhZ0NvbnRleHRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEFueV8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEFueV8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEFueV8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEFueV8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50QnV0dG9uXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50QnV0dG9uXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50QnV0dG9uXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50QnV0dG9uXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRDcm9zc2luZ18ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudENyb3NzaW5nXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50Q3Jvc3NpbmdfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRDcm9zc2luZ18ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50RXhwb3NlXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50RXhwb3NlXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50RXhwb3NlXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50RXhwb3NlXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRGb2N1c18ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEZvY3VzXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50Rm9jdXNfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRGb2N1c18ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50S2V5XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50S2V5XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50S2V5XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50S2V5XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRNb3Rpb25fMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRNb3Rpb25fMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRNb3Rpb25fMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRNb3Rpb25fMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudFNjcm9sbF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudFNjcm9sbF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudFNjcm9sbF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudFNjcm9sbF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50VmlzaWJpbGl0eV8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudFZpc2liaWxpdHlfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRWaXNpYmlsaXR5XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50VmlzaWJpbGl0eV8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50V2luZG93U3RhdGVfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRXaW5kb3dTdGF0ZV8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudFdpbmRvd1N0YXRlXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50V2luZG93U3RhdGVfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0ltYWdlXzJJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrSW1hZ2VfMklfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtJbWFnZV8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrUmVjdGFuZ2xlXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka1JlY3RhbmdsZV8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtSZWN0YW5nbGVfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrUmVjdGFuZ2xlXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrVmlzdWFsXzJJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrVmlzdWFsXzJJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrVmlzdWFsXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtBZGp1c3RtZW50XzJJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQWRqdXN0bWVudF8ySV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0FkanVzdG1lbnRfMklfMT1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0JvcmRlcl8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtCb3JkZXJfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQm9yZGVyXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0JvcmRlcl8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0NvbG9yU2VsZWN0aW9uRGlhbG9nXzJJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQ29sb3JTZWxlY3Rpb25EaWFsb2dfMklfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtDb2xvclNlbGVjdGlvbkRpYWxvZ18ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQ29tYm9fMkk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtDb21ib18ySV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0NvbWJvXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtGaWxlU2VsZWN0aW9uXzJJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrRmlsZVNlbGVjdGlvbl8ySV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0ZpbGVTZWxlY3Rpb25fMklfMT1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0ZpeGVkXzJJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrRml4ZWRfMklfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtGaXhlZF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrU2VsZWN0aW9uRGF0YV8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtTZWxlY3Rpb25EYXRhXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1NlbGVjdGlvbkRhdGFfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrU2VsZWN0aW9uRGF0YV8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1RhcmdldFBhaXJfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrVGFyZ2V0UGFpcl8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtUYXJnZXRQYWlyXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1RhcmdldFBhaXJfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtXaWRnZXRDbGFzc18yST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1dpZGdldENsYXNzXzJJXzA9ZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1dpZGdldENsYXNzXzJJXzE9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvQXR0cmlidXRlXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvQXR0cmlidXRlXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvQXR0cmlidXRlXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvQXR0cmlidXRlXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29JdGVtXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvSXRlbV8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0l0ZW1fMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29JdGVtXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29MYXlvdXRMaW5lXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvTGF5b3V0TGluZV8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0xheW91dExpbmVfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29MYXlvdXRMaW5lXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29MYXlvdXRSdW5fMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29MYXlvdXRSdW5fMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29MYXlvdXRSdW5fMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29MYXlvdXRSdW5fMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0xvZ0F0dHJfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29Mb2dBdHRyXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvTG9nQXR0cl8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0xvZ0F0dHJfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQnV0dG9uRXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEJ1dHRvbkV2ZW50XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hCdXR0b25FdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQnV0dG9uRXZlbnRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQ3Jvc3NpbmdFdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQ3Jvc3NpbmdFdmVudF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQ3Jvc3NpbmdFdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQ3Jvc3NpbmdFdmVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hFeHBvc2VFdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YRXhwb3NlRXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEV4cG9zZUV2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hFeHBvc2VFdmVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hGb2N1c0NoYW5nZUV2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hGb2N1c0NoYW5nZUV2ZW50XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hGb2N1c0NoYW5nZUV2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hGb2N1c0NoYW5nZUV2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWFZpc2liaWxpdHlFdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YVmlzaWJpbGl0eUV2ZW50XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hWaXNpYmlsaXR5RXZlbnRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWFZpc2liaWxpdHlFdmVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX18zQklJPQotT1NfbWVtbW92ZV9fXzNCSUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1PU19tZW1tb3ZlX19fM0JJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX18zQklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19fM0NJST0KLU9TX21lbW1vdmVfX18zQ0lJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfbWVtbW92ZV9fXzNDSUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19fM0NJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fXzNJSUk9Ci1PU19tZW1tb3ZlX19fM0lJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4gY3JpdGljYWwKLU9TX21lbW1vdmVfX18zSUlJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fXzNJSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX18zSV8zQkk9Ci1PU19tZW1tb3ZlX19fM0lfM0JJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfbWVtbW92ZV9fXzNJXzNCSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX18zSV8zQklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX18zSklJPQotT1NfbWVtbW92ZV9fXzNKSUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1PU19tZW1tb3ZlX19fM0pJSV8xPWNhc3Q9Y29uc3Qgdm9pZCAqLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfbWVtbW92ZV9fXzNKSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbXNldD0KLU9TX21lbXNldF8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbXNldF8xPWNhc3Q9KGNoYXIpCi1PU19tZW1zZXRfMj1jYXN0PShzaXplX3QpCi0KLU9TX3N0cmxlbj0KLU9TX3N0cmxlbl8wPWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvQXR0cmlidXRlPQotUGFuZ29BdHRyaWJ1dGVfa2xhc3M9Y2FzdD1jb25zdCBQYW5nb0F0dHJDbGFzcyAqCi1QYW5nb0F0dHJpYnV0ZV9zdGFydF9pbmRleD0KLVBhbmdvQXR0cmlidXRlX2VuZF9pbmRleD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0l0ZW09Ci1QYW5nb0l0ZW1fb2Zmc2V0PQotUGFuZ29JdGVtX2xlbmd0aD0KLVBhbmdvSXRlbV9udW1fY2hhcnM9Ci1QYW5nb0l0ZW1fYW5hbHlzaXNfc2hhcGVfZW5naW5lPWFjY2Vzc29yPWFuYWx5c2lzLnNoYXBlX2VuZ2luZSxjYXN0PShQYW5nb0VuZ2luZVNoYXBlICopCi1QYW5nb0l0ZW1fYW5hbHlzaXNfbGFuZ19lbmdpbmU9YWNjZXNzb3I9YW5hbHlzaXMubGFuZ19lbmdpbmUsY2FzdD1QYW5nb0VuZ2luZUxhbmcgKgotUGFuZ29JdGVtX2FuYWx5c2lzX2ZvbnQ9YWNjZXNzb3I9YW5hbHlzaXMuZm9udCxjYXN0PVBhbmdvRm9udCAqCi1QYW5nb0l0ZW1fYW5hbHlzaXNfbGV2ZWw9YWNjZXNzb3I9YW5hbHlzaXMubGV2ZWwKLVBhbmdvSXRlbV9hbmFseXNpc19sYW5ndWFnZT1hY2Nlc3Nvcj1hbmFseXNpcy5sYW5ndWFnZSxjYXN0PShQYW5nb0xhbmd1YWdlICopCi1QYW5nb0l0ZW1fYW5hbHlzaXNfZXh0cmFfYXR0cnM9YWNjZXNzb3I9YW5hbHlzaXMuZXh0cmFfYXR0cnMsY2FzdD1HU0xpc3QgKgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvTGF5b3V0TGluZT0KLVBhbmdvTGF5b3V0TGluZV9sYXlvdXQ9Y2FzdD1QYW5nb0xheW91dCAqCi1QYW5nb0xheW91dExpbmVfc3RhcnRfaW5kZXg9Ci1QYW5nb0xheW91dExpbmVfbGVuZ3RoPQotUGFuZ29MYXlvdXRMaW5lX3J1bnM9Y2FzdD1HU0xpc3QgKgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvTGF5b3V0UnVuPQotUGFuZ29MYXlvdXRSdW5faXRlbT1jYXN0PVBhbmdvSXRlbSAqCi1QYW5nb0xheW91dFJ1bl9nbHlwaHM9Y2FzdD1QYW5nb0dseXBoU3RyaW5nICoKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0xvZ0F0dHI9Ci1QYW5nb0xvZ0F0dHJfaXNfbGluZV9icmVhaz0KLVBhbmdvTG9nQXR0cl9pc19tYW5kYXRvcnlfYnJlYWs9Ci1QYW5nb0xvZ0F0dHJfaXNfY2hhcl9icmVhaz0KLVBhbmdvTG9nQXR0cl9pc193aGl0ZT0KLVBhbmdvTG9nQXR0cl9pc19jdXJzb3JfcG9zaXRpb249Ci1QYW5nb0xvZ0F0dHJfaXNfd29yZF9zdGFydD0KLVBhbmdvTG9nQXR0cl9pc193b3JkX2VuZD0KLVBhbmdvTG9nQXR0cl9pc19zZW50ZW5jZV9ib3VuZGFyeT0KLVBhbmdvTG9nQXR0cl9pc19zZW50ZW5jZV9zdGFydD0KLVBhbmdvTG9nQXR0cl9pc19zZW50ZW5jZV9lbmQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29SZWN0YW5nbGU9Ci1QYW5nb1JlY3RhbmdsZV94PQotUGFuZ29SZWN0YW5nbGVfeT0KLVBhbmdvUmVjdGFuZ2xlX3dpZHRoPQotUGFuZ29SZWN0YW5nbGVfaGVpZ2h0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hBbnlFdmVudD0KLVhBbnlFdmVudF9zZXJpYWw9Ci1YQW55RXZlbnRfc2VuZF9ldmVudD0KLVhBbnlFdmVudF9kaXNwbGF5PWNhc3Q9RGlzcGxheSAqCi1YQW55RXZlbnRfd2luZG93PWNhc3Q9V2luZG93Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEJ1dHRvbkV2ZW50PQotWEJ1dHRvbkV2ZW50X3Jvb3Q9Ci1YQnV0dG9uRXZlbnRfc3Vid2luZG93PQotWEJ1dHRvbkV2ZW50X3RpbWU9Ci1YQnV0dG9uRXZlbnRfeD0KLVhCdXR0b25FdmVudF95PQotWEJ1dHRvbkV2ZW50X3hfcm9vdD0KLVhCdXR0b25FdmVudF95X3Jvb3Q9Ci1YQnV0dG9uRXZlbnRfc3RhdGU9Ci1YQnV0dG9uRXZlbnRfYnV0dG9uPQotWEJ1dHRvbkV2ZW50X3NhbWVfc2NyZWVuPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hDbGllbnRNZXNzYWdlRXZlbnQ9Ci1YQ2xpZW50TWVzc2FnZUV2ZW50X3R5cGU9Ci1YQ2xpZW50TWVzc2FnZUV2ZW50X3NlcmlhbD0KLVhDbGllbnRNZXNzYWdlRXZlbnRfc2VuZF9ldmVudD0KLVhDbGllbnRNZXNzYWdlRXZlbnRfZGlzcGxheT1jYXN0PShEaXNwbGF5ICopCi1YQ2xpZW50TWVzc2FnZUV2ZW50X3dpbmRvdz1jYXN0PShXaW5kb3cpCi1YQ2xpZW50TWVzc2FnZUV2ZW50X21lc3NhZ2VfdHlwZT1jYXN0PShBdG9tKQotWENsaWVudE1lc3NhZ2VFdmVudF9mb3JtYXQ9Ci1YQ2xpZW50TWVzc2FnZUV2ZW50X2RhdGE9YWNjZXNzb3I9ZGF0YS5sLGNhc3Q9KGxvbmcgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQ3Jvc3NpbmdFdmVudD0KLVhDcm9zc2luZ0V2ZW50X3Jvb3Q9Y2FzdD0oV2luZG93KQotWENyb3NzaW5nRXZlbnRfc3Vid2luZG93PWNhc3Q9KFdpbmRvdykKLVhDcm9zc2luZ0V2ZW50X3RpbWU9Y2FzdD1UaW1lCi1YQ3Jvc3NpbmdFdmVudF94PQotWENyb3NzaW5nRXZlbnRfeT0KLVhDcm9zc2luZ0V2ZW50X3hfcm9vdD0KLVhDcm9zc2luZ0V2ZW50X3lfcm9vdD0KLVhDcm9zc2luZ0V2ZW50X21vZGU9Ci1YQ3Jvc3NpbmdFdmVudF9kZXRhaWw9Ci1YQ3Jvc3NpbmdFdmVudF9zYW1lX3NjcmVlbj1jYXN0PUJvb2wKLVhDcm9zc2luZ0V2ZW50X2ZvY3VzPWNhc3Q9Qm9vbAotWENyb3NzaW5nRXZlbnRfc3RhdGU9Y2FzdD11bnNpZ25lZCBpbnQKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YRXZlbnQ9Ci1YRXZlbnRfdHlwZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YRXhwb3NlRXZlbnQ9Ci1YRXhwb3NlRXZlbnRfeD0KLVhFeHBvc2VFdmVudF95PQotWEV4cG9zZUV2ZW50X3dpZHRoPQotWEV4cG9zZUV2ZW50X2hlaWdodD0KLVhFeHBvc2VFdmVudF9jb3VudD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YRm9jdXNDaGFuZ2VFdmVudD0KLVhGb2N1c0NoYW5nZUV2ZW50X21vZGU9Ci1YRm9jdXNDaGFuZ2VFdmVudF9kZXRhaWw9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX3JlcGVhdD0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19hbHBoYV9tYXA9Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfYWxwaGFfeF9vcmlnaW49Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfYWxwaGFfeV9vcmlnaW49Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfY2xpcF94X29yaWdpbj0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19jbGlwX3lfb3JpZ2luPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2NsaXBfbWFzaz0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19ncmFwaGljc19leHBvc3VyZXM9Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfc3Vid2luZG93X21vZGU9Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfcG9seV9lZGdlPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX3BvbHlfbW9kZT0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19kaXRoZXI9Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfY29tcG9uZW50X2FscGhhPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hWaXNpYmlsaXR5RXZlbnQ9Ci1YVmlzaWJpbGl0eUV2ZW50X3N0YXRlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hXaW5kb3dDaGFuZ2VzPQotWFdpbmRvd0NoYW5nZXNfeD0KLVhXaW5kb3dDaGFuZ2VzX3k9Ci1YV2luZG93Q2hhbmdlc193aWR0aD0KLVhXaW5kb3dDaGFuZ2VzX2hlaWdodD0KLVhXaW5kb3dDaGFuZ2VzX2JvcmRlcl93aWR0aD0KLVhXaW5kb3dDaGFuZ2VzX3NpYmxpbmc9Ci1YV2luZG93Q2hhbmdlc19zdGFja19tb2RlPQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmd0ay5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjYzVlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmd0ay5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc3d0X2NvcHlyaWdodD0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXAotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zXG5cCi0gKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKSBWZXJzaW9uIDIuMSB0aGF0XG5cCi0gKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiAobGdwbC12MjEudHh0KS4gIFRoZSBMR1BMIGlzIGFsc29cblwKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGdwbC5odG1sLiAgSWYgdGhlIHZlcnNpb25cblwKLSAqIG9mIHRoZSBMR1BMIGF0IGh0dHA6Ly93d3cuZ251Lm9yZyBpcyBkaWZmZXJlbnQgdG8gdGhlIHZlcnNpb24gb2ZcblwKLSAqIHRoZSBMR1BMIGFjY29tcGFueWluZyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgdGhlcmUgaXMgYW55IGNvbmZsaWN0XG5cCi0gKiBiZXR3ZWVuIHRoZSB0d28gbGljZW5zZSB2ZXJzaW9ucywgdGhlIHRlcm1zIG9mIHRoZSBMR1BMIGFjY29tcGFueWluZ1xuXAotICogdGhpcyBkaXN0cmlidXRpb24gc2hhbGwgZ292ZXJuLlxuXAotICogXG5cCi0gKiBDb250cmlidXRvcnM6XG5cCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG5cCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbgotIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW90aWYuT1MucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW90aWYuT1MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUxM2I0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm1vdGlmLk9TLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9PUz0KLU9TX0NPREVTRVQ9ZmxhZ3M9Y29uc3QKLQotT1NfRkRfSVNTRVQ9Ci1PU19GRF9JU1NFVF8wPQotT1NfRkRfSVNTRVRfMT1jYXN0PShmZF9zZXQgKikKLQotT1NfRkRfU0VUPQotT1NfRkRfU0VUXzA9Ci1PU19GRF9TRVRfMT1jYXN0PShmZF9zZXQgKikKLQotT1NfRkRfWkVSTz0KLU9TX0ZEX1pFUk9fMD1jYXN0PShmZF9zZXQgKikKLQotT1NfTENfQ1RZUEU9ZmxhZ3M9Y29uc3QKLQotT1NfTUJfQ1VSX01BWD1mbGFncz1jb25zdAotCi1PU19Nb25pdG9yRW50ZXI9ZmxhZ3M9bm9fZ2VuCi1PU19Nb25pdG9yRW50ZXJfMD0KLQotT1NfTW9uaXRvckV4aXQ9ZmxhZ3M9bm9fZ2VuCi1PU19Nb25pdG9yRXhpdF8wPQotCi1PU19YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfc2l6ZW9mPQotCi1PU19fQ2FsbD0KLU9TX19DYWxsXzA9Ci1PU19fQ2FsbF8xPQotT1NfX0NhbGxfMj0KLQotT1NfX0Nvbm5lY3Rpb25OdW1iZXI9Ci1PU19fQ29ubmVjdGlvbk51bWJlcl8wPQotCi1PU19fWEFsbG9jQ29sb3I9Ci1PU19fWEFsbG9jQ29sb3JfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEFsbG9jQ29sb3JfMT0KLU9TX19YQWxsb2NDb2xvcl8yPQotCi1PU19fWEJlbGw9Ci1PU19fWEJlbGxfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEJlbGxfMT0KLQotT1NfX1hCbGFja1BpeGVsPQotT1NfX1hCbGFja1BpeGVsXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hCbGFja1BpeGVsXzE9Ci0KLU9TX19YQ2hhbmdlQWN0aXZlUG9pbnRlckdyYWI9Ci1PU19fWENoYW5nZUFjdGl2ZVBvaW50ZXJHcmFiXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDaGFuZ2VBY3RpdmVQb2ludGVyR3JhYl8xPQotT1NfX1hDaGFuZ2VBY3RpdmVQb2ludGVyR3JhYl8yPWNhc3Q9KEN1cnNvcikKLU9TX19YQ2hhbmdlQWN0aXZlUG9pbnRlckdyYWJfMz1jYXN0PShUaW1lKQotCi1PU19fWENoYW5nZVByb3BlcnR5PQotT1NfX1hDaGFuZ2VQcm9wZXJ0eV8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWENoYW5nZVByb3BlcnR5XzE9Y2FzdD1XaW5kb3cKLU9TX19YQ2hhbmdlUHJvcGVydHlfMj1jYXN0PUF0b20KLU9TX19YQ2hhbmdlUHJvcGVydHlfMz1jYXN0PUF0b20KLU9TX19YQ2hhbmdlUHJvcGVydHlfND0KLU9TX19YQ2hhbmdlUHJvcGVydHlfNT0KLU9TX19YQ2hhbmdlUHJvcGVydHlfNj1jYXN0PXVuc2lnbmVkIGNoYXIgKgotT1NfX1hDaGFuZ2VQcm9wZXJ0eV83PQotCi1PU19fWENoYW5nZVdpbmRvd0F0dHJpYnV0ZXM9Ci1PU19fWENoYW5nZVdpbmRvd0F0dHJpYnV0ZXNfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENoYW5nZVdpbmRvd0F0dHJpYnV0ZXNfMT0KLU9TX19YQ2hhbmdlV2luZG93QXR0cmlidXRlc18yPQotT1NfX1hDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzXzM9Ci0KLU9TX19YQ2hlY2tJZkV2ZW50PQotT1NfX1hDaGVja0lmRXZlbnRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENoZWNrSWZFdmVudF8xPWNhc3Q9KFhFdmVudCAqKQotT1NfX1hDaGVja0lmRXZlbnRfMj1jYXN0PShCb29sICgqKSgpKQotT1NfX1hDaGVja0lmRXZlbnRfMz1jYXN0PShYUG9pbnRlcikKLQotT1NfX1hDaGVja01hc2tFdmVudD0KLU9TX19YQ2hlY2tNYXNrRXZlbnRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENoZWNrTWFza0V2ZW50XzE9Ci1PU19fWENoZWNrTWFza0V2ZW50XzI9Y2FzdD0oWEV2ZW50ICopCi0KLU9TX19YQ2hlY2tXaW5kb3dFdmVudD0KLU9TX19YQ2hlY2tXaW5kb3dFdmVudF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ2hlY2tXaW5kb3dFdmVudF8xPWNhc3Q9KFdpbmRvdykKLU9TX19YQ2hlY2tXaW5kb3dFdmVudF8yPQotT1NfX1hDaGVja1dpbmRvd0V2ZW50XzM9Y2FzdD0oWEV2ZW50ICopCi0KLU9TX19YQ2xlYXJBcmVhPQotT1NfX1hDbGVhckFyZWFfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENsZWFyQXJlYV8xPQotT1NfX1hDbGVhckFyZWFfMj0KLU9TX19YQ2xlYXJBcmVhXzM9Ci1PU19fWENsZWFyQXJlYV80PQotT1NfX1hDbGVhckFyZWFfNT0KLU9TX19YQ2xlYXJBcmVhXzY9Ci0KLU9TX19YQ2xpcEJveD0KLU9TX19YQ2xpcEJveF8wPWNhc3Q9KFJlZ2lvbikKLU9TX19YQ2xpcEJveF8xPWNhc3Q9KFhSZWN0YW5nbGUgKikKLQotT1NfX1hDbG9zZURpc3BsYXk9Ci1PU19fWENsb3NlRGlzcGxheV8wPWNhc3Q9KERpc3BsYXkgKikKLQotT1NfX1hDb3B5QXJlYT0KLU9TX19YQ29weUFyZWFfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENvcHlBcmVhXzE9Ci1PU19fWENvcHlBcmVhXzI9Ci1PU19fWENvcHlBcmVhXzM9Y2FzdD0oR0MpCi1PU19fWENvcHlBcmVhXzQ9Ci1PU19fWENvcHlBcmVhXzU9Ci1PU19fWENvcHlBcmVhXzY9Ci1PU19fWENvcHlBcmVhXzc9Ci1PU19fWENvcHlBcmVhXzg9Ci1PU19fWENvcHlBcmVhXzk9Ci0KLU9TX19YQ29weVBsYW5lPQotT1NfX1hDb3B5UGxhbmVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENvcHlQbGFuZV8xPQotT1NfX1hDb3B5UGxhbmVfMj0KLU9TX19YQ29weVBsYW5lXzM9Y2FzdD0oR0MpCi1PU19fWENvcHlQbGFuZV80PQotT1NfX1hDb3B5UGxhbmVfNT0KLU9TX19YQ29weVBsYW5lXzY9Ci1PU19fWENvcHlQbGFuZV83PQotT1NfX1hDb3B5UGxhbmVfOD0KLU9TX19YQ29weVBsYW5lXzk9Ci1PU19fWENvcHlQbGFuZV8xMD0KLQotT1NfX1hDcmVhdGVCaXRtYXBGcm9tRGF0YT0KLU9TX19YQ3JlYXRlQml0bWFwRnJvbURhdGFfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENyZWF0ZUJpdG1hcEZyb21EYXRhXzE9Ci1PU19fWENyZWF0ZUJpdG1hcEZyb21EYXRhXzI9Y2FzdD0oY2hhciAqKQotT1NfX1hDcmVhdGVCaXRtYXBGcm9tRGF0YV8zPQotT1NfX1hDcmVhdGVCaXRtYXBGcm9tRGF0YV80PQotCi1PU19fWENyZWF0ZUNvbG9ybWFwPQotT1NfX1hDcmVhdGVDb2xvcm1hcF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ3JlYXRlQ29sb3JtYXBfMT1jYXN0PShXaW5kb3cpCi1PU19fWENyZWF0ZUNvbG9ybWFwXzI9Y2FzdD0oVmlzdWFsICopCi1PU19fWENyZWF0ZUNvbG9ybWFwXzM9Ci0KLU9TX19YQ3JlYXRlRm9udEN1cnNvcj0KLU9TX19YQ3JlYXRlRm9udEN1cnNvcl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ3JlYXRlRm9udEN1cnNvcl8xPQotCi1PU19fWENyZWF0ZUdDPQotT1NfX1hDcmVhdGVHQ18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ3JlYXRlR0NfMT0KLU9TX19YQ3JlYXRlR0NfMj0KLU9TX19YQ3JlYXRlR0NfMz0KLQotT1NfX1hDcmVhdGVJbWFnZT0KLU9TX19YQ3JlYXRlSW1hZ2VfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENyZWF0ZUltYWdlXzE9Y2FzdD0oVmlzdWFsICopCi1PU19fWENyZWF0ZUltYWdlXzI9Ci1PU19fWENyZWF0ZUltYWdlXzM9Ci1PU19fWENyZWF0ZUltYWdlXzQ9Ci1PU19fWENyZWF0ZUltYWdlXzU9Y2FzdD0oY2hhciAqKQotT1NfX1hDcmVhdGVJbWFnZV82PQotT1NfX1hDcmVhdGVJbWFnZV83PQotT1NfX1hDcmVhdGVJbWFnZV84PQotT1NfX1hDcmVhdGVJbWFnZV85PQotCi1PU19fWENyZWF0ZVBpeG1hcD0KLU9TX19YQ3JlYXRlUGl4bWFwXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDcmVhdGVQaXhtYXBfMT0KLU9TX19YQ3JlYXRlUGl4bWFwXzI9Ci1PU19fWENyZWF0ZVBpeG1hcF8zPQotT1NfX1hDcmVhdGVQaXhtYXBfND0KLQotT1NfX1hDcmVhdGVQaXhtYXBDdXJzb3I9Ci1PU19fWENyZWF0ZVBpeG1hcEN1cnNvcl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ3JlYXRlUGl4bWFwQ3Vyc29yXzE9Y2FzdD0oUGl4bWFwKQotT1NfX1hDcmVhdGVQaXhtYXBDdXJzb3JfMj1jYXN0PShQaXhtYXApCi1PU19fWENyZWF0ZVBpeG1hcEN1cnNvcl8zPQotT1NfX1hDcmVhdGVQaXhtYXBDdXJzb3JfND0KLU9TX19YQ3JlYXRlUGl4bWFwQ3Vyc29yXzU9Ci1PU19fWENyZWF0ZVBpeG1hcEN1cnNvcl82PQotCi1PU19fWENyZWF0ZVJlZ2lvbj0KLQotT1NfX1hDcmVhdGVXaW5kb3c9Ci1PU19fWENyZWF0ZVdpbmRvd18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ3JlYXRlV2luZG93XzE9Y2FzdD0oV2luZG93KQotT1NfX1hDcmVhdGVXaW5kb3dfMj0KLU9TX19YQ3JlYXRlV2luZG93XzM9Ci1PU19fWENyZWF0ZVdpbmRvd180PQotT1NfX1hDcmVhdGVXaW5kb3dfNT0KLU9TX19YQ3JlYXRlV2luZG93XzY9Ci1PU19fWENyZWF0ZVdpbmRvd183PQotT1NfX1hDcmVhdGVXaW5kb3dfOD0KLU9TX19YQ3JlYXRlV2luZG93Xzk9Y2FzdD0oVmlzdWFsICopCi1PU19fWENyZWF0ZVdpbmRvd18xMD0KLU9TX19YQ3JlYXRlV2luZG93XzExPWNhc3Q9KFhTZXRXaW5kb3dBdHRyaWJ1dGVzICopCi0KLU9TX19YRGVmYXVsdENvbG9ybWFwPQotT1NfX1hEZWZhdWx0Q29sb3JtYXBfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWERlZmF1bHRDb2xvcm1hcF8xPQotCi1PU19fWERlZmF1bHRDb2xvcm1hcE9mU2NyZWVuPQotT1NfX1hEZWZhdWx0Q29sb3JtYXBPZlNjcmVlbl8wPWNhc3Q9KFNjcmVlbiAqKQotCi1PU19fWERlZmF1bHREZXB0aE9mU2NyZWVuPQotT1NfX1hEZWZhdWx0RGVwdGhPZlNjcmVlbl8wPWNhc3Q9KFNjcmVlbiAqKQotCi1PU19fWERlZmF1bHRHQ09mU2NyZWVuPQotT1NfX1hEZWZhdWx0R0NPZlNjcmVlbl8wPWNhc3Q9KFNjcmVlbiAqKQotCi1PU19fWERlZmF1bHRSb290V2luZG93PQotT1NfX1hEZWZhdWx0Um9vdFdpbmRvd18wPWNhc3Q9KERpc3BsYXkgKikKLQotT1NfX1hEZWZhdWx0U2NyZWVuPQotT1NfX1hEZWZhdWx0U2NyZWVuXzA9Y2FzdD0oRGlzcGxheSAqKQotCi1PU19fWERlZmF1bHRTY3JlZW5PZkRpc3BsYXk9Ci1PU19fWERlZmF1bHRTY3JlZW5PZkRpc3BsYXlfMD1jYXN0PShEaXNwbGF5ICopCi0KLU9TX19YRGVmYXVsdFZpc3VhbD0KLU9TX19YRGVmYXVsdFZpc3VhbF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRGVmYXVsdFZpc3VhbF8xPQotCi1PU19fWERlZmluZUN1cnNvcj0KLU9TX19YRGVmaW5lQ3Vyc29yXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hEZWZpbmVDdXJzb3JfMT0KLU9TX19YRGVmaW5lQ3Vyc29yXzI9Ci0KLU9TX19YRGVzdHJveUltYWdlPQotT1NfX1hEZXN0cm95SW1hZ2VfMD1jYXN0PShYSW1hZ2UgKikKLQotT1NfX1hEZXN0cm95UmVnaW9uPQotT1NfX1hEZXN0cm95UmVnaW9uXzA9Y2FzdD0oUmVnaW9uKQotCi1PU19fWERlc3Ryb3lXaW5kb3c9Ci1PU19fWERlc3Ryb3lXaW5kb3dfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWERlc3Ryb3lXaW5kb3dfMT1jYXN0PShXaW5kb3cpCi0KLU9TX19YRGlzcGxheUhlaWdodD0KLU9TX19YRGlzcGxheUhlaWdodF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRGlzcGxheUhlaWdodF8xPQotCi1PU19fWERpc3BsYXlIZWlnaHRNTT0KLU9TX19YRGlzcGxheUhlaWdodE1NXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hEaXNwbGF5SGVpZ2h0TU1fMT0KLQotT1NfX1hEaXNwbGF5V2lkdGg9Ci1PU19fWERpc3BsYXlXaWR0aF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRGlzcGxheVdpZHRoXzE9Ci0KLU9TX19YRGlzcGxheVdpZHRoTU09Ci1PU19fWERpc3BsYXlXaWR0aE1NXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hEaXNwbGF5V2lkdGhNTV8xPQotCi1PU19fWERyYXdBcmM9Ci1PU19fWERyYXdBcmNfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWERyYXdBcmNfMT1jYXN0PShEcmF3YWJsZSkKLU9TX19YRHJhd0FyY18yPWNhc3Q9KEdDKQotT1NfX1hEcmF3QXJjXzM9Ci1PU19fWERyYXdBcmNfND0KLU9TX19YRHJhd0FyY181PQotT1NfX1hEcmF3QXJjXzY9Ci1PU19fWERyYXdBcmNfNz0KLU9TX19YRHJhd0FyY184PQotCi1PU19fWERyYXdMaW5lPQotT1NfX1hEcmF3TGluZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRHJhd0xpbmVfMT1jYXN0PShEcmF3YWJsZSkKLU9TX19YRHJhd0xpbmVfMj1jYXN0PShHQykKLU9TX19YRHJhd0xpbmVfMz0KLU9TX19YRHJhd0xpbmVfND0KLU9TX19YRHJhd0xpbmVfNT0KLU9TX19YRHJhd0xpbmVfNj0KLQotT1NfX1hEcmF3TGluZXM9Ci1PU19fWERyYXdMaW5lc18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRHJhd0xpbmVzXzE9Y2FzdD0oRHJhd2FibGUpCi1PU19fWERyYXdMaW5lc18yPWNhc3Q9KEdDKQotT1NfX1hEcmF3TGluZXNfMz1jYXN0PShYUG9pbnQgKikKLU9TX19YRHJhd0xpbmVzXzQ9Ci1PU19fWERyYXdMaW5lc181PQotCi1PU19fWERyYXdQb2ludD0KLU9TX19YRHJhd1BvaW50XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hEcmF3UG9pbnRfMT1jYXN0PURyYXdhYmxlCi1PU19fWERyYXdQb2ludF8yPWNhc3Q9R0MKLU9TX19YRHJhd1BvaW50XzM9Ci1PU19fWERyYXdQb2ludF80PQotCi1PU19fWERyYXdSZWN0YW5nbGU9Ci1PU19fWERyYXdSZWN0YW5nbGVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWERyYXdSZWN0YW5nbGVfMT1jYXN0PShEcmF3YWJsZSkKLU9TX19YRHJhd1JlY3RhbmdsZV8yPWNhc3Q9KEdDKQotT1NfX1hEcmF3UmVjdGFuZ2xlXzM9Ci1PU19fWERyYXdSZWN0YW5nbGVfND0KLU9TX19YRHJhd1JlY3RhbmdsZV81PQotT1NfX1hEcmF3UmVjdGFuZ2xlXzY9Ci0KLU9TX19YRW1wdHlSZWdpb249Ci1PU19fWEVtcHR5UmVnaW9uXzA9Y2FzdD0oUmVnaW9uKQotCi1PU19fWEV2ZW50c1F1ZXVlZD0KLU9TX19YRXZlbnRzUXVldWVkXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hFdmVudHNRdWV1ZWRfMT0KLQotT1NfX1hGaWxsQXJjPQotT1NfX1hGaWxsQXJjXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hGaWxsQXJjXzE9Y2FzdD0oRHJhd2FibGUpCi1PU19fWEZpbGxBcmNfMj1jYXN0PShHQykKLU9TX19YRmlsbEFyY18zPQotT1NfX1hGaWxsQXJjXzQ9Ci1PU19fWEZpbGxBcmNfNT0KLU9TX19YRmlsbEFyY182PQotT1NfX1hGaWxsQXJjXzc9Ci1PU19fWEZpbGxBcmNfOD0KLQotT1NfX1hGaWxsUG9seWdvbj0KLU9TX19YRmlsbFBvbHlnb25fMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEZpbGxQb2x5Z29uXzE9Y2FzdD0oRHJhd2FibGUpCi1PU19fWEZpbGxQb2x5Z29uXzI9Y2FzdD0oR0MpCi1PU19fWEZpbGxQb2x5Z29uXzM9Y2FzdD0oWFBvaW50ICopCi1PU19fWEZpbGxQb2x5Z29uXzQ9Ci1PU19fWEZpbGxQb2x5Z29uXzU9Ci1PU19fWEZpbGxQb2x5Z29uXzY9Ci0KLU9TX19YRmlsbFJlY3RhbmdsZT0KLU9TX19YRmlsbFJlY3RhbmdsZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRmlsbFJlY3RhbmdsZV8xPWNhc3Q9KERyYXdhYmxlKQotT1NfX1hGaWxsUmVjdGFuZ2xlXzI9Y2FzdD0oR0MpCi1PU19fWEZpbGxSZWN0YW5nbGVfMz0KLU9TX19YRmlsbFJlY3RhbmdsZV80PQotT1NfX1hGaWxsUmVjdGFuZ2xlXzU9Ci1PU19fWEZpbGxSZWN0YW5nbGVfNj0KLQotT1NfX1hGaWx0ZXJFdmVudD0KLU9TX19YRmlsdGVyRXZlbnRfMD1jYXN0PShYRXZlbnQgKikKLU9TX19YRmlsdGVyRXZlbnRfMT1jYXN0PShXaW5kb3cpCi0KLU9TX19YRmx1c2g9Ci1PU19fWEZsdXNoXzA9Y2FzdD0oRGlzcGxheSAqKQotCi1PU19fWEZvbnRzT2ZGb250U2V0PQotT1NfX1hGb250c09mRm9udFNldF8wPWNhc3Q9KFhGb250U2V0KQotT1NfX1hGb250c09mRm9udFNldF8xPWNhc3Q9KFhGb250U3RydWN0ICoqKikKLU9TX19YRm9udHNPZkZvbnRTZXRfMj1jYXN0PShjaGFyICoqKikKLQotT1NfX1hGcmVlPQotT1NfX1hGcmVlXzA9Y2FzdD0oY2hhciAqKQotCi1PU19fWEZyZWVDb2xvcm1hcD0KLU9TX19YRnJlZUNvbG9ybWFwXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hGcmVlQ29sb3JtYXBfMT1jYXN0PShDb2xvcm1hcCkKLQotT1NfX1hGcmVlQ29sb3JzPQotT1NfX1hGcmVlQ29sb3JzXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hGcmVlQ29sb3JzXzE9Ci1PU19fWEZyZWVDb2xvcnNfMj1jYXN0PSh1bnNpZ25lZCBsb25nICopCi1PU19fWEZyZWVDb2xvcnNfMz0KLU9TX19YRnJlZUNvbG9yc180PQotCi1PU19fWEZyZWVDdXJzb3I9Ci1PU19fWEZyZWVDdXJzb3JfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEZyZWVDdXJzb3JfMT1jYXN0PShDdXJzb3IpCi0KLU9TX19YRnJlZUZvbnQ9Ci1PU19fWEZyZWVGb250XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hGcmVlRm9udF8xPWNhc3Q9KFhGb250U3RydWN0ICopCi0KLU9TX19YRnJlZUZvbnROYW1lcz0KLU9TX19YRnJlZUZvbnROYW1lc18wPWNhc3Q9KGNoYXIgKiopCi0KLU9TX19YRnJlZUdDPQotT1NfX1hGcmVlR0NfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEZyZWVHQ18xPWNhc3Q9KEdDKQotCi1PU19fWEZyZWVNb2RpZmllcm1hcD0KLU9TX19YRnJlZU1vZGlmaWVybWFwXzA9Y2FzdD0oWE1vZGlmaWVyS2V5bWFwICopCi0KLU9TX19YRnJlZVBpeG1hcD0KLU9TX19YRnJlZVBpeG1hcF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRnJlZVBpeG1hcF8xPWNhc3Q9KFBpeG1hcCkKLQotT1NfX1hGcmVlU3RyaW5nTGlzdD0KLU9TX19YRnJlZVN0cmluZ0xpc3RfMD1jYXN0PShjaGFyICoqKQotCi1PU19fWEdldEdDVmFsdWVzPQotT1NfX1hHZXRHQ1ZhbHVlc18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YR2V0R0NWYWx1ZXNfMT1jYXN0PShHQykKLU9TX19YR2V0R0NWYWx1ZXNfMj0KLU9TX19YR2V0R0NWYWx1ZXNfMz0KLQotT1NfX1hHZXRHZW9tZXRyeT0KLU9TX19YR2V0R2VvbWV0cnlfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEdldEdlb21ldHJ5XzE9Y2FzdD0oRHJhd2FibGUpCi1PU19fWEdldEdlb21ldHJ5XzI9Y2FzdD0oV2luZG93ICopCi1PU19fWEdldEdlb21ldHJ5XzM9Y2FzdD0oaW50ICopCi1PU19fWEdldEdlb21ldHJ5XzQ9Y2FzdD0oaW50ICopCi1PU19fWEdldEdlb21ldHJ5XzU9Y2FzdD0odW5zaWduZWQgaW50ICopCi1PU19fWEdldEdlb21ldHJ5XzY9Y2FzdD0odW5zaWduZWQgaW50ICopCi1PU19fWEdldEdlb21ldHJ5Xzc9Y2FzdD0odW5zaWduZWQgaW50ICopCi1PU19fWEdldEdlb21ldHJ5Xzg9Y2FzdD0odW5zaWduZWQgaW50ICopCi0KLU9TX19YR2V0SWNvblNpemVzPQotT1NfX1hHZXRJY29uU2l6ZXNfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hHZXRJY29uU2l6ZXNfMT1jYXN0PVdpbmRvdwotT1NfX1hHZXRJY29uU2l6ZXNfMj1jYXN0PVhJY29uU2l6ZSAqKgotT1NfX1hHZXRJY29uU2l6ZXNfMz1jYXN0PWludCAqCi0KLU9TX19YR2V0SW1hZ2U9Ci1PU19fWEdldEltYWdlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hHZXRJbWFnZV8xPWNhc3Q9KERyYXdhYmxlKQotT1NfX1hHZXRJbWFnZV8yPQotT1NfX1hHZXRJbWFnZV8zPQotT1NfX1hHZXRJbWFnZV80PQotT1NfX1hHZXRJbWFnZV81PQotT1NfX1hHZXRJbWFnZV82PQotT1NfX1hHZXRJbWFnZV83PQotCi1PU19fWEdldElucHV0Rm9jdXM9Ci1PU19fWEdldElucHV0Rm9jdXNfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEdldElucHV0Rm9jdXNfMT1jYXN0PShXaW5kb3cgKikKLU9TX19YR2V0SW5wdXRGb2N1c18yPWNhc3Q9KGludCAqKQotCi1PU19fWEdldE1vZGlmaWVyTWFwcGluZz0KLU9TX19YR2V0TW9kaWZpZXJNYXBwaW5nXzA9Y2FzdD0oRGlzcGxheSAqKQotCi1PU19fWEdldFdpbmRvd0F0dHJpYnV0ZXM9Ci1PU19fWEdldFdpbmRvd0F0dHJpYnV0ZXNfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEdldFdpbmRvd0F0dHJpYnV0ZXNfMT0KLU9TX19YR2V0V2luZG93QXR0cmlidXRlc18yPQotCi1PU19fWEdldFdpbmRvd1Byb3BlcnR5PQotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWEdldFdpbmRvd1Byb3BlcnR5XzE9Y2FzdD1XaW5kb3cKLU9TX19YR2V0V2luZG93UHJvcGVydHlfMj1jYXN0PUF0b20KLU9TX19YR2V0V2luZG93UHJvcGVydHlfMz0KLU9TX19YR2V0V2luZG93UHJvcGVydHlfND0KLU9TX19YR2V0V2luZG93UHJvcGVydHlfNT1jYXN0PUJvb2wKLU9TX19YR2V0V2luZG93UHJvcGVydHlfNj1jYXN0PUF0b20KLU9TX19YR2V0V2luZG93UHJvcGVydHlfNz1jYXN0PUF0b20gKgotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV84PWNhc3Q9aW50ICoKLU9TX19YR2V0V2luZG93UHJvcGVydHlfOT1jYXN0PXVuc2lnbmVkIGxvbmcgKgotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV8xMD1jYXN0PXVuc2lnbmVkIGxvbmcgKgotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV8xMT1jYXN0PXVuc2lnbmVkIGNoYXIgKioKLQotT1NfX1hHcmFiS2V5Ym9hcmQ9Ci1PU19fWEdyYWJLZXlib2FyZF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YR3JhYktleWJvYXJkXzE9Ci1PU19fWEdyYWJLZXlib2FyZF8yPQotT1NfX1hHcmFiS2V5Ym9hcmRfMz0KLU9TX19YR3JhYktleWJvYXJkXzQ9Ci1PU19fWEdyYWJLZXlib2FyZF81PQotCi1PU19fWEdyYWJQb2ludGVyPQotT1NfX1hHcmFiUG9pbnRlcl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YR3JhYlBvaW50ZXJfMT0KLU9TX19YR3JhYlBvaW50ZXJfMj0KLU9TX19YR3JhYlBvaW50ZXJfMz0KLU9TX19YR3JhYlBvaW50ZXJfND0KLU9TX19YR3JhYlBvaW50ZXJfNT0KLU9TX19YR3JhYlBvaW50ZXJfNj0KLU9TX19YR3JhYlBvaW50ZXJfNz0KLU9TX19YR3JhYlBvaW50ZXJfOD0KLQotT1NfX1hJbml0VGhyZWFkcz0KLQotT1NfX1hJbnRlcm5BdG9tPQotT1NfX1hJbnRlcm5BdG9tXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hJbnRlcm5BdG9tXzE9Y2FzdD0oY2hhciAqKQotT1NfX1hJbnRlcm5BdG9tXzI9Ci0KLU9TX19YSW50ZXJzZWN0UmVnaW9uPQotT1NfX1hJbnRlcnNlY3RSZWdpb25fMD1jYXN0PShSZWdpb24pCi1PU19fWEludGVyc2VjdFJlZ2lvbl8xPWNhc3Q9KFJlZ2lvbikKLU9TX19YSW50ZXJzZWN0UmVnaW9uXzI9Y2FzdD0oUmVnaW9uKQotCi1PU19fWEtleXN5bVRvS2V5Y29kZT0KLU9TX19YS2V5c3ltVG9LZXljb2RlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hLZXlzeW1Ub0tleWNvZGVfMT1jYXN0PShLZXlTeW0pCi0KLU9TX19YS2V5c3ltVG9TdHJpbmc9Ci1PU19fWEtleXN5bVRvU3RyaW5nXzA9Ci0KLU9TX19YTGlzdEZvbnRzPQotT1NfX1hMaXN0Rm9udHNfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWExpc3RGb250c18xPWNhc3Q9KGNoYXIgKikKLU9TX19YTGlzdEZvbnRzXzI9Ci1PU19fWExpc3RGb250c18zPWNhc3Q9KGludCAqKQotCi1PU19fWExpc3RQcm9wZXJ0aWVzPQotT1NfX1hMaXN0UHJvcGVydGllc18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YTGlzdFByb3BlcnRpZXNfMT1jYXN0PShXaW5kb3cpCi1PU19fWExpc3RQcm9wZXJ0aWVzXzI9Y2FzdD0oaW50ICopCi0KLU9TX19YTG9jYWxlT2ZGb250U2V0PQotT1NfX1hMb2NhbGVPZkZvbnRTZXRfMD1jYXN0PShYRm9udFNldCkKLQotT1NfX1hMb29rdXBTdHJpbmc9Ci1PU19fWExvb2t1cFN0cmluZ18wPWNhc3Q9KFhLZXlFdmVudCAqKQotT1NfX1hMb29rdXBTdHJpbmdfMT1jYXN0PShjaGFyICopCi1PU19fWExvb2t1cFN0cmluZ18yPQotT1NfX1hMb29rdXBTdHJpbmdfMz1jYXN0PShLZXlTeW0gKikKLU9TX19YTG9va3VwU3RyaW5nXzQ9Y2FzdD0oWENvbXBvc2VTdGF0dXMgKikKLQotT1NfX1hMb3dlcldpbmRvdz0KLU9TX19YTG93ZXJXaW5kb3dfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWExvd2VyV2luZG93XzE9Y2FzdD0oV2luZG93KQotCi1PU19fWE1hcFdpbmRvdz0KLU9TX19YTWFwV2luZG93XzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YTWFwV2luZG93XzE9Y2FzdD1XaW5kb3cKLQotT1NfX1hNb3ZlUmVzaXplV2luZG93PQotT1NfX1hNb3ZlUmVzaXplV2luZG93XzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YTW92ZVJlc2l6ZVdpbmRvd18xPWNhc3Q9V2luZG93Ci1PU19fWE1vdmVSZXNpemVXaW5kb3dfMj0KLU9TX19YTW92ZVJlc2l6ZVdpbmRvd18zPQotT1NfX1hNb3ZlUmVzaXplV2luZG93XzQ9Ci1PU19fWE1vdmVSZXNpemVXaW5kb3dfNT0KLQotT1NfX1hPZmZzZXRSZWdpb249Ci1PU19fWE9mZnNldFJlZ2lvbl8wPWNhc3Q9KFJlZ2lvbikKLU9TX19YT2Zmc2V0UmVnaW9uXzE9Ci1PU19fWE9mZnNldFJlZ2lvbl8yPQotCi1PU19fWE9wZW5EaXNwbGF5PQotT1NfX1hPcGVuRGlzcGxheV8wPWNhc3Q9KGNoYXIgKikKLQotT1NfX1hQb2ludEluUmVnaW9uPQotT1NfX1hQb2ludEluUmVnaW9uXzA9Y2FzdD0oUmVnaW9uKQotT1NfX1hQb2ludEluUmVnaW9uXzE9Ci1PU19fWFBvaW50SW5SZWdpb25fMj0KLQotT1NfX1hQb2x5Z29uUmVnaW9uPQotT1NfX1hQb2x5Z29uUmVnaW9uXzA9Y2FzdD0oWFBvaW50ICopCi1PU19fWFBvbHlnb25SZWdpb25fMT0KLU9TX19YUG9seWdvblJlZ2lvbl8yPQotCi1PU19fWFB1dEltYWdlPQotT1NfX1hQdXRJbWFnZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YUHV0SW1hZ2VfMT1jYXN0PShEcmF3YWJsZSkKLU9TX19YUHV0SW1hZ2VfMj1jYXN0PShHQykKLU9TX19YUHV0SW1hZ2VfMz1jYXN0PShYSW1hZ2UgKikKLU9TX19YUHV0SW1hZ2VfND0KLU9TX19YUHV0SW1hZ2VfNT0KLU9TX19YUHV0SW1hZ2VfNj0KLU9TX19YUHV0SW1hZ2VfNz0KLU9TX19YUHV0SW1hZ2VfOD0KLU9TX19YUHV0SW1hZ2VfOT0KLQotT1NfX1hRdWVyeUJlc3RDdXJzb3I9Ci1PU19fWFF1ZXJ5QmVzdEN1cnNvcl8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFF1ZXJ5QmVzdEN1cnNvcl8xPQotT1NfX1hRdWVyeUJlc3RDdXJzb3JfMj0KLU9TX19YUXVlcnlCZXN0Q3Vyc29yXzM9Ci1PU19fWFF1ZXJ5QmVzdEN1cnNvcl80PWNhc3Q9KHVuc2lnbmVkIGludCAqKQotT1NfX1hRdWVyeUJlc3RDdXJzb3JfNT1jYXN0PSh1bnNpZ25lZCBpbnQgKikKLQotT1NfX1hRdWVyeUNvbG9yPQotT1NfX1hRdWVyeUNvbG9yXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hRdWVyeUNvbG9yXzE9Ci1PU19fWFF1ZXJ5Q29sb3JfMj0KLQotT1NfX1hRdWVyeVBvaW50ZXI9Ci1PU19fWFF1ZXJ5UG9pbnRlcl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YUXVlcnlQb2ludGVyXzE9Y2FzdD0oV2luZG93KQotT1NfX1hRdWVyeVBvaW50ZXJfMj1jYXN0PShXaW5kb3cgKikKLU9TX19YUXVlcnlQb2ludGVyXzM9Y2FzdD0oV2luZG93ICopCi1PU19fWFF1ZXJ5UG9pbnRlcl80PWNhc3Q9KGludCAqKQotT1NfX1hRdWVyeVBvaW50ZXJfNT1jYXN0PShpbnQgKikKLU9TX19YUXVlcnlQb2ludGVyXzY9Y2FzdD0oaW50ICopCi1PU19fWFF1ZXJ5UG9pbnRlcl83PWNhc3Q9KGludCAqKQotT1NfX1hRdWVyeVBvaW50ZXJfOD1jYXN0PSh1bnNpZ25lZCBpbnQgKikKLQotT1NfX1hRdWVyeVRyZWU9Ci1PU19fWFF1ZXJ5VHJlZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YUXVlcnlUcmVlXzE9Y2FzdD0oV2luZG93KQotT1NfX1hRdWVyeVRyZWVfMj1jYXN0PShXaW5kb3cgKikKLU9TX19YUXVlcnlUcmVlXzM9Y2FzdD0oV2luZG93ICopCi1PU19fWFF1ZXJ5VHJlZV80PWNhc3Q9KFdpbmRvdyAqKikKLU9TX19YUXVlcnlUcmVlXzU9Y2FzdD0odW5zaWduZWQgaW50ICopCi0KLU9TX19YUmFpc2VXaW5kb3c9Ci1PU19fWFJhaXNlV2luZG93XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hSYWlzZVdpbmRvd18xPWNhc3Q9KFdpbmRvdykKLQotT1NfX1hSZWNvbmZpZ3VyZVdNV2luZG93PQotT1NfX1hSZWNvbmZpZ3VyZVdNV2luZG93XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hSZWNvbmZpZ3VyZVdNV2luZG93XzE9Y2FzdD0oV2luZG93KQotT1NfX1hSZWNvbmZpZ3VyZVdNV2luZG93XzI9Ci1PU19fWFJlY29uZmlndXJlV01XaW5kb3dfMz0KLU9TX19YUmVjb25maWd1cmVXTVdpbmRvd180PQotCi1PU19fWFJlY3RJblJlZ2lvbj0KLU9TX19YUmVjdEluUmVnaW9uXzA9Y2FzdD0oUmVnaW9uKQotT1NfX1hSZWN0SW5SZWdpb25fMT0KLU9TX19YUmVjdEluUmVnaW9uXzI9Ci1PU19fWFJlY3RJblJlZ2lvbl8zPQotT1NfX1hSZWN0SW5SZWdpb25fND0KLQotT1NfX1hSZW5kZXJDb21wb3NpdGU9ZmxhZ3M9ZHluYW1pYwotT1NfX1hSZW5kZXJDb21wb3NpdGVfMD0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzE9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV8yPQotT1NfX1hSZW5kZXJDb21wb3NpdGVfMz0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzQ9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV81PQotT1NfX1hSZW5kZXJDb21wb3NpdGVfNj0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzc9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV84PQotT1NfX1hSZW5kZXJDb21wb3NpdGVfOT0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzEwPQotT1NfX1hSZW5kZXJDb21wb3NpdGVfMTE9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV8xMj0KLQotT1NfX1hSZW5kZXJDcmVhdGVQaWN0dXJlPWZsYWdzPWR5bmFtaWMKLU9TX19YUmVuZGVyQ3JlYXRlUGljdHVyZV8wPQotT1NfX1hSZW5kZXJDcmVhdGVQaWN0dXJlXzE9Ci1PU19fWFJlbmRlckNyZWF0ZVBpY3R1cmVfMj0KLU9TX19YUmVuZGVyQ3JlYXRlUGljdHVyZV8zPQotT1NfX1hSZW5kZXJDcmVhdGVQaWN0dXJlXzQ9Ci0KLU9TX19YUmVuZGVyRmluZFN0YW5kYXJkRm9ybWF0PWZsYWdzPWR5bmFtaWMKLU9TX19YUmVuZGVyRmluZFN0YW5kYXJkRm9ybWF0XzA9Ci1PU19fWFJlbmRlckZpbmRTdGFuZGFyZEZvcm1hdF8xPQotCi1PU19fWFJlbmRlckZpbmRWaXN1YWxGb3JtYXQ9ZmxhZ3M9ZHluYW1pYwotT1NfX1hSZW5kZXJGaW5kVmlzdWFsRm9ybWF0XzA9Ci1PU19fWFJlbmRlckZpbmRWaXN1YWxGb3JtYXRfMT0KLQotT1NfX1hSZW5kZXJGcmVlUGljdHVyZT1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlckZyZWVQaWN0dXJlXzA9Ci1PU19fWFJlbmRlckZyZWVQaWN0dXJlXzE9Ci0KLU9TX19YUmVuZGVyUXVlcnlFeHRlbnNpb249ZmxhZ3M9ZHluYW1pYwotT1NfX1hSZW5kZXJRdWVyeUV4dGVuc2lvbl8wPQotT1NfX1hSZW5kZXJRdWVyeUV4dGVuc2lvbl8xPQotT1NfX1hSZW5kZXJRdWVyeUV4dGVuc2lvbl8yPQotCi1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVjdGFuZ2xlcz1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVjdGFuZ2xlc18wPQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlQ2xpcFJlY3RhbmdsZXNfMT0KLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWN0YW5nbGVzXzI9Ci1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVjdGFuZ2xlc18zPQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlQ2xpcFJlY3RhbmdsZXNfND0KLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWN0YW5nbGVzXzU9Ci0KLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWdpb249ZmxhZ3M9ZHluYW1pYwotT1NfX1hSZW5kZXJTZXRQaWN0dXJlQ2xpcFJlZ2lvbl8wPQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlQ2xpcFJlZ2lvbl8xPQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlQ2xpcFJlZ2lvbl8yPQotCi1PU19fWFJlbmRlclNldFBpY3R1cmVUcmFuc2Zvcm09ZmxhZ3M9ZHluYW1pYwotT1NfX1hSZW5kZXJTZXRQaWN0dXJlVHJhbnNmb3JtXzA9Ci1PU19fWFJlbmRlclNldFBpY3R1cmVUcmFuc2Zvcm1fMT0KLU9TX19YUmVuZGVyU2V0UGljdHVyZVRyYW5zZm9ybV8yPQotCi1PU19fWFJlcGFyZW50V2luZG93PQotT1NfX1hSZXBhcmVudFdpbmRvd18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YUmVwYXJlbnRXaW5kb3dfMT1jYXN0PShXaW5kb3cpCi1PU19fWFJlcGFyZW50V2luZG93XzI9Y2FzdD0oV2luZG93KQotT1NfX1hSZXBhcmVudFdpbmRvd18zPQotT1NfX1hSZXBhcmVudFdpbmRvd180PQotCi1PU19fWFJlc2l6ZVdpbmRvdz0KLU9TX19YUmVzaXplV2luZG93XzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YUmVzaXplV2luZG93XzE9Y2FzdD1XaW5kb3cKLU9TX19YUmVzaXplV2luZG93XzI9Ci1PU19fWFJlc2l6ZVdpbmRvd18zPQotCi1PU19fWFJvb3RXaW5kb3dPZlNjcmVlbj0KLU9TX19YUm9vdFdpbmRvd09mU2NyZWVuXzA9Y2FzdD0oU2NyZWVuICopCi0KLU9TX19YU2VsZWN0SW5wdXQ9Ci1PU19fWFNlbGVjdElucHV0XzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YU2VsZWN0SW5wdXRfMT1jYXN0PVdpbmRvdwotT1NfX1hTZWxlY3RJbnB1dF8yPQotCi1PU19fWFNlbmRFdmVudD0KLU9TX19YU2VuZEV2ZW50XzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YU2VuZEV2ZW50XzE9Y2FzdD1XaW5kb3cKLU9TX19YU2VuZEV2ZW50XzI9Y2FzdD1Cb29sCi1PU19fWFNlbmRFdmVudF8zPWNhc3Q9bG9uZwotT1NfX1hTZW5kRXZlbnRfND1jYXN0PVhFdmVudCAqCi0KLU9TX19YU2V0QmFja2dyb3VuZD0KLU9TX19YU2V0QmFja2dyb3VuZF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU2V0QmFja2dyb3VuZF8xPWNhc3Q9KEdDKQotT1NfX1hTZXRCYWNrZ3JvdW5kXzI9Ci0KLU9TX19YU2V0Q2xpcE1hc2s9Ci1PU19fWFNldENsaXBNYXNrXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTZXRDbGlwTWFza18xPWNhc3Q9KEdDKQotT1NfX1hTZXRDbGlwTWFza18yPWNhc3Q9KFBpeG1hcCkKLQotT1NfX1hTZXRDbGlwUmVjdGFuZ2xlcz0KLU9TX19YU2V0Q2xpcFJlY3RhbmdsZXNfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFNldENsaXBSZWN0YW5nbGVzXzE9Y2FzdD0oR0MpCi1PU19fWFNldENsaXBSZWN0YW5nbGVzXzI9Ci1PU19fWFNldENsaXBSZWN0YW5nbGVzXzM9Ci1PU19fWFNldENsaXBSZWN0YW5nbGVzXzQ9Y2FzdD0oWFJlY3RhbmdsZSAqKQotT1NfX1hTZXRDbGlwUmVjdGFuZ2xlc181PQotT1NfX1hTZXRDbGlwUmVjdGFuZ2xlc182PQotCi1PU19fWFNldERhc2hlcz0KLU9TX19YU2V0RGFzaGVzXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTZXREYXNoZXNfMT1jYXN0PShHQykKLU9TX19YU2V0RGFzaGVzXzI9Ci1PU19fWFNldERhc2hlc18zPWNhc3Q9KGNoYXIgKikKLU9TX19YU2V0RGFzaGVzXzQ9Ci0KLU9TX19YU2V0RXJyb3JIYW5kbGVyPQotT1NfX1hTZXRFcnJvckhhbmRsZXJfMD1jYXN0PShYRXJyb3JIYW5kbGVyKQotCi1PU19fWFNldEZpbGxSdWxlPQotT1NfX1hTZXRGaWxsUnVsZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU2V0RmlsbFJ1bGVfMT1jYXN0PShHQykKLU9TX19YU2V0RmlsbFJ1bGVfMj0KLQotT1NfX1hTZXRGaWxsU3R5bGU9Ci1PU19fWFNldEZpbGxTdHlsZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU2V0RmlsbFN0eWxlXzE9Y2FzdD0oR0MpCi1PU19fWFNldEZpbGxTdHlsZV8yPQotCi1PU19fWFNldEZvcmVncm91bmQ9Ci1PU19fWFNldEZvcmVncm91bmRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFNldEZvcmVncm91bmRfMT1jYXN0PShHQykKLU9TX19YU2V0Rm9yZWdyb3VuZF8yPQotCi1PU19fWFNldEZ1bmN0aW9uPQotT1NfX1hTZXRGdW5jdGlvbl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU2V0RnVuY3Rpb25fMT1jYXN0PShHQykKLU9TX19YU2V0RnVuY3Rpb25fMj0KLQotT1NfX1hTZXRHcmFwaGljc0V4cG9zdXJlcz0KLU9TX19YU2V0R3JhcGhpY3NFeHBvc3VyZXNfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFNldEdyYXBoaWNzRXhwb3N1cmVzXzE9Y2FzdD0oR0MpCi1PU19fWFNldEdyYXBoaWNzRXhwb3N1cmVzXzI9Y2FzdD0oQm9vbCkKLQotT1NfX1hTZXRJT0Vycm9ySGFuZGxlcj0KLU9TX19YU2V0SU9FcnJvckhhbmRsZXJfMD1jYXN0PShYSU9FcnJvckhhbmRsZXIpCi0KLU9TX19YU2V0SW5wdXRGb2N1cz0KLU9TX19YU2V0SW5wdXRGb2N1c18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU2V0SW5wdXRGb2N1c18xPWNhc3Q9KFdpbmRvdykKLU9TX19YU2V0SW5wdXRGb2N1c18yPQotT1NfX1hTZXRJbnB1dEZvY3VzXzM9Ci0KLU9TX19YU2V0TGluZUF0dHJpYnV0ZXM9Ci1PU19fWFNldExpbmVBdHRyaWJ1dGVzXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTZXRMaW5lQXR0cmlidXRlc18xPWNhc3Q9KEdDKQotT1NfX1hTZXRMaW5lQXR0cmlidXRlc18yPQotT1NfX1hTZXRMaW5lQXR0cmlidXRlc18zPQotT1NfX1hTZXRMaW5lQXR0cmlidXRlc180PQotT1NfX1hTZXRMaW5lQXR0cmlidXRlc181PQotCi1PU19fWFNldFJlZ2lvbj0KLU9TX19YU2V0UmVnaW9uXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTZXRSZWdpb25fMT1jYXN0PShHQykKLU9TX19YU2V0UmVnaW9uXzI9Y2FzdD0oUmVnaW9uKQotCi1PU19fWFNldFN0aXBwbGU9Ci1PU19fWFNldFN0aXBwbGVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFNldFN0aXBwbGVfMT1jYXN0PShHQykKLU9TX19YU2V0U3RpcHBsZV8yPWNhc3Q9KFBpeG1hcCkKLQotT1NfX1hTZXRTdWJ3aW5kb3dNb2RlPQotT1NfX1hTZXRTdWJ3aW5kb3dNb2RlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTZXRTdWJ3aW5kb3dNb2RlXzE9Y2FzdD0oR0MpCi1PU19fWFNldFN1YndpbmRvd01vZGVfMj0KLQotT1NfX1hTZXRXTU5vcm1hbEhpbnRzPQotT1NfX1hTZXRXTU5vcm1hbEhpbnRzXzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YU2V0V01Ob3JtYWxIaW50c18xPWNhc3Q9V2luZG93Ci1PU19fWFNldFdNTm9ybWFsSGludHNfMj0KLQotT1NfX1hTaGFwZUNvbWJpbmVNYXNrPQotT1NfX1hTaGFwZUNvbWJpbmVNYXNrXzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YU2hhcGVDb21iaW5lTWFza18xPWNhc3Q9KFdpbmRvdykKLU9TX19YU2hhcGVDb21iaW5lTWFza18yPQotT1NfX1hTaGFwZUNvbWJpbmVNYXNrXzM9Ci1PU19fWFNoYXBlQ29tYmluZU1hc2tfND0KLU9TX19YU2hhcGVDb21iaW5lTWFza181PWNhc3Q9UGl4bWFwCi1PU19fWFNoYXBlQ29tYmluZU1hc2tfNj0KLQotT1NfX1hTaGFwZUNvbWJpbmVSZWdpb249Ci1PU19fWFNoYXBlQ29tYmluZVJlZ2lvbl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU2hhcGVDb21iaW5lUmVnaW9uXzE9Y2FzdD0oV2luZG93KQotT1NfX1hTaGFwZUNvbWJpbmVSZWdpb25fMj0KLU9TX19YU2hhcGVDb21iaW5lUmVnaW9uXzM9Ci1PU19fWFNoYXBlQ29tYmluZVJlZ2lvbl80PQotT1NfX1hTaGFwZUNvbWJpbmVSZWdpb25fNT1jYXN0PShSZWdpb24pCi1PU19fWFNoYXBlQ29tYmluZVJlZ2lvbl82PQotCi1PU19fWFN1YnRyYWN0UmVnaW9uPQotT1NfX1hTdWJ0cmFjdFJlZ2lvbl8wPWNhc3Q9KFJlZ2lvbikKLU9TX19YU3VidHJhY3RSZWdpb25fMT1jYXN0PShSZWdpb24pCi1PU19fWFN1YnRyYWN0UmVnaW9uXzI9Y2FzdD0oUmVnaW9uKQotCi1PU19fWFN5bmM9Ci1PU19fWFN5bmNfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFN5bmNfMT1jYXN0PShCb29sKQotCi1PU19fWFN5bmNocm9uaXplPQotT1NfX1hTeW5jaHJvbml6ZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU3luY2hyb25pemVfMT1jYXN0PShCb29sKQotCi1PU19fWFRlc3RGYWtlQnV0dG9uRXZlbnQ9Ci1PU19fWFRlc3RGYWtlQnV0dG9uRXZlbnRfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hUZXN0RmFrZUJ1dHRvbkV2ZW50XzE9Ci1PU19fWFRlc3RGYWtlQnV0dG9uRXZlbnRfMj1jYXN0PUJvb2wKLU9TX19YVGVzdEZha2VCdXR0b25FdmVudF8zPWNhc3Q9dW5zaWduZWQgbG9uZwotCi1PU19fWFRlc3RGYWtlS2V5RXZlbnQ9Ci1PU19fWFRlc3RGYWtlS2V5RXZlbnRfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hUZXN0RmFrZUtleUV2ZW50XzE9Ci1PU19fWFRlc3RGYWtlS2V5RXZlbnRfMj1jYXN0PUJvb2wKLU9TX19YVGVzdEZha2VLZXlFdmVudF8zPWNhc3Q9dW5zaWduZWQgbG9uZwotCi1PU19fWFRlc3RGYWtlTW90aW9uRXZlbnQ9Ci1PU19fWFRlc3RGYWtlTW90aW9uRXZlbnRfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hUZXN0RmFrZU1vdGlvbkV2ZW50XzE9Ci1PU19fWFRlc3RGYWtlTW90aW9uRXZlbnRfMj0KLU9TX19YVGVzdEZha2VNb3Rpb25FdmVudF8zPQotT1NfX1hUZXN0RmFrZU1vdGlvbkV2ZW50XzQ9Y2FzdD11bnNpZ25lZCBsb25nCi0KLU9TX19YVHJhbnNsYXRlQ29vcmRpbmF0ZXM9Ci1PU19fWFRyYW5zbGF0ZUNvb3JkaW5hdGVzXzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YVHJhbnNsYXRlQ29vcmRpbmF0ZXNfMT1jYXN0PVdpbmRvdwotT1NfX1hUcmFuc2xhdGVDb29yZGluYXRlc18yPWNhc3Q9V2luZG93Ci1PU19fWFRyYW5zbGF0ZUNvb3JkaW5hdGVzXzM9Ci1PU19fWFRyYW5zbGF0ZUNvb3JkaW5hdGVzXzQ9Ci1PU19fWFRyYW5zbGF0ZUNvb3JkaW5hdGVzXzU9Ci1PU19fWFRyYW5zbGF0ZUNvb3JkaW5hdGVzXzY9Ci1PU19fWFRyYW5zbGF0ZUNvb3JkaW5hdGVzXzc9Y2FzdD1XaW5kb3cgKgotCi1PU19fWFVuZGVmaW5lQ3Vyc29yPQotT1NfX1hVbmRlZmluZUN1cnNvcl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YVW5kZWZpbmVDdXJzb3JfMT1jYXN0PShXaW5kb3cpCi0KLU9TX19YVW5ncmFiS2V5Ym9hcmQ9Ci1PU19fWFVuZ3JhYktleWJvYXJkXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hVbmdyYWJLZXlib2FyZF8xPQotCi1PU19fWFVuZ3JhYlBvaW50ZXI9Ci1PU19fWFVuZ3JhYlBvaW50ZXJfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFVuZ3JhYlBvaW50ZXJfMT0KLQotT1NfX1hVbmlvblJlY3RXaXRoUmVnaW9uPQotT1NfX1hVbmlvblJlY3RXaXRoUmVnaW9uXzA9Y2FzdD0oWFJlY3RhbmdsZSAqKQotT1NfX1hVbmlvblJlY3RXaXRoUmVnaW9uXzE9Y2FzdD0oUmVnaW9uKQotT1NfX1hVbmlvblJlY3RXaXRoUmVnaW9uXzI9Y2FzdD0oUmVnaW9uKQotCi1PU19fWFVuaW9uUmVnaW9uPQotT1NfX1hVbmlvblJlZ2lvbl8wPWNhc3Q9KFJlZ2lvbikKLU9TX19YVW5pb25SZWdpb25fMT1jYXN0PShSZWdpb24pCi1PU19fWFVuaW9uUmVnaW9uXzI9Y2FzdD0oUmVnaW9uKQotCi1PU19fWFVubWFwV2luZG93PQotT1NfX1hVbm1hcFdpbmRvd18wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFVubWFwV2luZG93XzE9Y2FzdD1XaW5kb3cKLQotT1NfX1hXYXJwUG9pbnRlcj0KLU9TX19YV2FycFBvaW50ZXJfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFdhcnBQb2ludGVyXzE9Ci1PU19fWFdhcnBQb2ludGVyXzI9Ci1PU19fWFdhcnBQb2ludGVyXzM9Ci1PU19fWFdhcnBQb2ludGVyXzQ9Ci1PU19fWFdhcnBQb2ludGVyXzU9Ci1PU19fWFdhcnBQb2ludGVyXzY9Ci1PU19fWFdhcnBQb2ludGVyXzc9Ci1PU19fWFdhcnBQb2ludGVyXzg9Ci0KLU9TX19YV2hpdGVQaXhlbD0KLU9TX19YV2hpdGVQaXhlbF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YV2hpdGVQaXhlbF8xPQotCi1PU19fWFdpdGhkcmF3V2luZG93PQotT1NfX1hXaXRoZHJhd1dpbmRvd18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YV2l0aGRyYXdXaW5kb3dfMT1jYXN0PShXaW5kb3cpCi1PU19fWFdpdGhkcmF3V2luZG93XzI9Ci0KLU9TX19YaW5lcmFtYUlzQWN0aXZlPQotT1NfX1hpbmVyYW1hSXNBY3RpdmVfMD1jYXN0PShEaXNwbGF5ICopCi0KLU9TX19YaW5lcmFtYVF1ZXJ5U2NyZWVucz0KLU9TX19YaW5lcmFtYVF1ZXJ5U2NyZWVuc18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YaW5lcmFtYVF1ZXJ5U2NyZWVuc18xPQotCi1PU19fWG1BZGRXTVByb3RvY29sQ2FsbGJhY2s9Ci1PU19fWG1BZGRXTVByb3RvY29sQ2FsbGJhY2tfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1BZGRXTVByb3RvY29sQ2FsbGJhY2tfMT1jYXN0PShBdG9tKQotT1NfX1htQWRkV01Qcm90b2NvbENhbGxiYWNrXzI9Y2FzdD0oWHRDYWxsYmFja1Byb2MpCi1PU19fWG1BZGRXTVByb3RvY29sQ2FsbGJhY2tfMz1jYXN0PShYdFBvaW50ZXIpCi0KLU9TX19YbUNoYW5nZUNvbG9yPQotT1NfX1htQ2hhbmdlQ29sb3JfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DaGFuZ2VDb2xvcl8xPQotCi1PU19fWG1DbGlwYm9hcmRDb3B5PQotT1NfX1htQ2xpcGJvYXJkQ29weV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbUNsaXBib2FyZENvcHlfMT1jYXN0PShXaW5kb3cpCi1PU19fWG1DbGlwYm9hcmRDb3B5XzI9Ci1PU19fWG1DbGlwYm9hcmRDb3B5XzM9Y2FzdD0oY2hhciAqKQotT1NfX1htQ2xpcGJvYXJkQ29weV80PWNhc3Q9KGNoYXIgKikKLU9TX19YbUNsaXBib2FyZENvcHlfNT0KLU9TX19YbUNsaXBib2FyZENvcHlfNj0KLU9TX19YbUNsaXBib2FyZENvcHlfNz1jYXN0PSh2b2lkICopCi0KLU9TX19YbUNsaXBib2FyZEVuZENvcHk9Ci1PU19fWG1DbGlwYm9hcmRFbmRDb3B5XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1htQ2xpcGJvYXJkRW5kQ29weV8xPWNhc3Q9KFdpbmRvdykKLU9TX19YbUNsaXBib2FyZEVuZENvcHlfMj0KLQotT1NfX1htQ2xpcGJvYXJkRW5kUmV0cmlldmU9Ci1PU19fWG1DbGlwYm9hcmRFbmRSZXRyaWV2ZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbUNsaXBib2FyZEVuZFJldHJpZXZlXzE9Y2FzdD0oV2luZG93KQotCi1PU19fWG1DbGlwYm9hcmRJbnF1aXJlQ291bnQ9Ci1PU19fWG1DbGlwYm9hcmRJbnF1aXJlQ291bnRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWG1DbGlwYm9hcmRJbnF1aXJlQ291bnRfMT1jYXN0PShXaW5kb3cpCi1PU19fWG1DbGlwYm9hcmRJbnF1aXJlQ291bnRfMj1jYXN0PShpbnQgKikKLU9TX19YbUNsaXBib2FyZElucXVpcmVDb3VudF8zPWNhc3Q9KHVuc2lnbmVkIGxvbmcgKikKLQotT1NfX1htQ2xpcGJvYXJkSW5xdWlyZUZvcm1hdD0KLU9TX19YbUNsaXBib2FyZElucXVpcmVGb3JtYXRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWG1DbGlwYm9hcmRJbnF1aXJlRm9ybWF0XzE9Y2FzdD0oV2luZG93KQotT1NfX1htQ2xpcGJvYXJkSW5xdWlyZUZvcm1hdF8yPQotT1NfX1htQ2xpcGJvYXJkSW5xdWlyZUZvcm1hdF8zPWNhc3Q9KGNoYXIgKikKLU9TX19YbUNsaXBib2FyZElucXVpcmVGb3JtYXRfND0KLU9TX19YbUNsaXBib2FyZElucXVpcmVGb3JtYXRfNT1jYXN0PSh1bnNpZ25lZCBsb25nICopCi0KLU9TX19YbUNsaXBib2FyZElucXVpcmVMZW5ndGg9Ci1PU19fWG1DbGlwYm9hcmRJbnF1aXJlTGVuZ3RoXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1htQ2xpcGJvYXJkSW5xdWlyZUxlbmd0aF8xPWNhc3Q9KFdpbmRvdykKLU9TX19YbUNsaXBib2FyZElucXVpcmVMZW5ndGhfMj1jYXN0PShjaGFyICopCi1PU19fWG1DbGlwYm9hcmRJbnF1aXJlTGVuZ3RoXzM9Y2FzdD0odW5zaWduZWQgbG9uZyAqKQotCi1PU19fWG1DbGlwYm9hcmRSZXRyaWV2ZT0KLU9TX19YbUNsaXBib2FyZFJldHJpZXZlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1htQ2xpcGJvYXJkUmV0cmlldmVfMT1jYXN0PShXaW5kb3cpCi1PU19fWG1DbGlwYm9hcmRSZXRyaWV2ZV8yPWNhc3Q9KGNoYXIgKikKLU9TX19YbUNsaXBib2FyZFJldHJpZXZlXzM9Y2FzdD0oY2hhciAqKQotT1NfX1htQ2xpcGJvYXJkUmV0cmlldmVfND0KLU9TX19YbUNsaXBib2FyZFJldHJpZXZlXzU9Y2FzdD0odW5zaWduZWQgbG9uZyAqKQotT1NfX1htQ2xpcGJvYXJkUmV0cmlldmVfNj1jYXN0PShsb25nICopCi0KLU9TX19YbUNsaXBib2FyZFN0YXJ0Q29weT0KLU9TX19YbUNsaXBib2FyZFN0YXJ0Q29weV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbUNsaXBib2FyZFN0YXJ0Q29weV8xPWNhc3Q9KFdpbmRvdykKLU9TX19YbUNsaXBib2FyZFN0YXJ0Q29weV8yPWNhc3Q9KFhtU3RyaW5nKQotT1NfX1htQ2xpcGJvYXJkU3RhcnRDb3B5XzM9Ci1PU19fWG1DbGlwYm9hcmRTdGFydENvcHlfND1jYXN0PShXaWRnZXQpCi1PU19fWG1DbGlwYm9hcmRTdGFydENvcHlfNT1jYXN0PShYbUN1dFBhc3RlUHJvYykKLU9TX19YbUNsaXBib2FyZFN0YXJ0Q29weV82PWNhc3Q9KGxvbmcgKikKLQotT1NfX1htQ2xpcGJvYXJkU3RhcnRSZXRyaWV2ZT0KLU9TX19YbUNsaXBib2FyZFN0YXJ0UmV0cmlldmVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWG1DbGlwYm9hcmRTdGFydFJldHJpZXZlXzE9Y2FzdD0oV2luZG93KQotT1NfX1htQ2xpcGJvYXJkU3RhcnRSZXRyaWV2ZV8yPQotCi1PU19fWG1Db21ib0JveEFkZEl0ZW09Ci1PU19fWG1Db21ib0JveEFkZEl0ZW1fMD1jYXN0PShXaWRnZXQpCi1PU19fWG1Db21ib0JveEFkZEl0ZW1fMT1jYXN0PShYbVN0cmluZykKLU9TX19YbUNvbWJvQm94QWRkSXRlbV8yPQotT1NfX1htQ29tYm9Cb3hBZGRJdGVtXzM9Ci0KLU9TX19YbUNvbWJvQm94RGVsZXRlUG9zPQotT1NfX1htQ29tYm9Cb3hEZWxldGVQb3NfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1Db21ib0JveERlbGV0ZVBvc18xPQotCi1PU19fWG1Db21ib0JveFNlbGVjdEl0ZW09Ci1PU19fWG1Db21ib0JveFNlbGVjdEl0ZW1fMD1jYXN0PShXaWRnZXQpCi1PU19fWG1Db21ib0JveFNlbGVjdEl0ZW1fMT1jYXN0PShYbVN0cmluZykKLQotT1NfX1htQ3JlYXRlQXJyb3dCdXR0b249Ci1PU19fWG1DcmVhdGVBcnJvd0J1dHRvbl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZUFycm93QnV0dG9uXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlQXJyb3dCdXR0b25fMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlQXJyb3dCdXR0b25fMz0KLQotT1NfX1htQ3JlYXRlQ2FzY2FkZUJ1dHRvbkdhZGdldD0KLU9TX19YbUNyZWF0ZUNhc2NhZGVCdXR0b25HYWRnZXRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVDYXNjYWRlQnV0dG9uR2FkZ2V0XzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlQ2FzY2FkZUJ1dHRvbkdhZGdldF8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVDYXNjYWRlQnV0dG9uR2FkZ2V0XzM9Ci0KLU9TX19YbUNyZWF0ZUNvbWJvQm94PQotT1NfX1htQ3JlYXRlQ29tYm9Cb3hfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVDb21ib0JveF8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZUNvbWJvQm94XzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZUNvbWJvQm94XzM9Ci0KLU9TX19YbUNyZWF0ZURpYWxvZ1NoZWxsPQotT1NfX1htQ3JlYXRlRGlhbG9nU2hlbGxfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVEaWFsb2dTaGVsbF8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZURpYWxvZ1NoZWxsXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZURpYWxvZ1NoZWxsXzM9Ci0KLU9TX19YbUNyZWF0ZURyYXdpbmdBcmVhPQotT1NfX1htQ3JlYXRlRHJhd2luZ0FyZWFfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVEcmF3aW5nQXJlYV8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZURyYXdpbmdBcmVhXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZURyYXdpbmdBcmVhXzM9Ci0KLU9TX19YbUNyZWF0ZURyYXduQnV0dG9uPQotT1NfX1htQ3JlYXRlRHJhd25CdXR0b25fMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVEcmF3bkJ1dHRvbl8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZURyYXduQnV0dG9uXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZURyYXduQnV0dG9uXzM9Ci0KLU9TX19YbUNyZWF0ZUVycm9yRGlhbG9nPQotT1NfX1htQ3JlYXRlRXJyb3JEaWFsb2dfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVFcnJvckRpYWxvZ18xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZUVycm9yRGlhbG9nXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZUVycm9yRGlhbG9nXzM9Ci0KLU9TX19YbUNyZWF0ZUZpbGVTZWxlY3Rpb25EaWFsb2c9Ci1PU19fWG1DcmVhdGVGaWxlU2VsZWN0aW9uRGlhbG9nXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlRmlsZVNlbGVjdGlvbkRpYWxvZ18xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZUZpbGVTZWxlY3Rpb25EaWFsb2dfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlRmlsZVNlbGVjdGlvbkRpYWxvZ18zPQotCi1PU19fWG1DcmVhdGVGb3JtPQotT1NfX1htQ3JlYXRlRm9ybV8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZUZvcm1fMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVGb3JtXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZUZvcm1fMz0KLQotT1NfX1htQ3JlYXRlRnJhbWU9Ci1PU19fWG1DcmVhdGVGcmFtZV8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZUZyYW1lXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlRnJhbWVfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlRnJhbWVfMz0KLQotT1NfX1htQ3JlYXRlSW5mb3JtYXRpb25EaWFsb2c9Ci1PU19fWG1DcmVhdGVJbmZvcm1hdGlvbkRpYWxvZ18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZUluZm9ybWF0aW9uRGlhbG9nXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlSW5mb3JtYXRpb25EaWFsb2dfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlSW5mb3JtYXRpb25EaWFsb2dfMz0KLQotT1NfX1htQ3JlYXRlTGFiZWw9Ci1PU19fWG1DcmVhdGVMYWJlbF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZUxhYmVsXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlTGFiZWxfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlTGFiZWxfMz0KLQotT1NfX1htQ3JlYXRlTGlzdD0KLU9TX19YbUNyZWF0ZUxpc3RfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVMaXN0XzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlTGlzdF8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVMaXN0XzM9Ci0KLU9TX19YbUNyZWF0ZU1haW5XaW5kb3c9Ci1PU19fWG1DcmVhdGVNYWluV2luZG93XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlTWFpbldpbmRvd18xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZU1haW5XaW5kb3dfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlTWFpbldpbmRvd18zPQotCi1PU19fWG1DcmVhdGVNZW51QmFyPQotT1NfX1htQ3JlYXRlTWVudUJhcl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZU1lbnVCYXJfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVNZW51QmFyXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZU1lbnVCYXJfMz0KLQotT1NfX1htQ3JlYXRlTWVzc2FnZURpYWxvZz0KLU9TX19YbUNyZWF0ZU1lc3NhZ2VEaWFsb2dfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVNZXNzYWdlRGlhbG9nXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlTWVzc2FnZURpYWxvZ18yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVNZXNzYWdlRGlhbG9nXzM9Ci0KLU9TX19YbUNyZWF0ZVBvcHVwTWVudT0KLU9TX19YbUNyZWF0ZVBvcHVwTWVudV8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZVBvcHVwTWVudV8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZVBvcHVwTWVudV8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVQb3B1cE1lbnVfMz0KLQotT1NfX1htQ3JlYXRlUHVsbGRvd25NZW51PQotT1NfX1htQ3JlYXRlUHVsbGRvd25NZW51XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlUHVsbGRvd25NZW51XzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlUHVsbGRvd25NZW51XzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVB1bGxkb3duTWVudV8zPQotCi1PU19fWG1DcmVhdGVQdXNoQnV0dG9uPQotT1NfX1htQ3JlYXRlUHVzaEJ1dHRvbl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZVB1c2hCdXR0b25fMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVQdXNoQnV0dG9uXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVB1c2hCdXR0b25fMz0KLQotT1NfX1htQ3JlYXRlUHVzaEJ1dHRvbkdhZGdldD0KLU9TX19YbUNyZWF0ZVB1c2hCdXR0b25HYWRnZXRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVQdXNoQnV0dG9uR2FkZ2V0XzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlUHVzaEJ1dHRvbkdhZGdldF8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVQdXNoQnV0dG9uR2FkZ2V0XzM9Ci0KLU9TX19YbUNyZWF0ZVF1ZXN0aW9uRGlhbG9nPQotT1NfX1htQ3JlYXRlUXVlc3Rpb25EaWFsb2dfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVRdWVzdGlvbkRpYWxvZ18xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZVF1ZXN0aW9uRGlhbG9nXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVF1ZXN0aW9uRGlhbG9nXzM9Ci0KLU9TX19YbUNyZWF0ZVNjYWxlPQotT1NfX1htQ3JlYXRlU2NhbGVfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVTY2FsZV8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZVNjYWxlXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVNjYWxlXzM9Ci0KLU9TX19YbUNyZWF0ZVNjcm9sbEJhcj0KLU9TX19YbUNyZWF0ZVNjcm9sbEJhcl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZVNjcm9sbEJhcl8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZVNjcm9sbEJhcl8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVTY3JvbGxCYXJfMz0KLQotT1NfX1htQ3JlYXRlU2Nyb2xsZWRMaXN0PQotT1NfX1htQ3JlYXRlU2Nyb2xsZWRMaXN0XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlU2Nyb2xsZWRMaXN0XzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlU2Nyb2xsZWRMaXN0XzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVNjcm9sbGVkTGlzdF8zPQotCi1PU19fWG1DcmVhdGVTY3JvbGxlZFRleHQ9Ci1PU19fWG1DcmVhdGVTY3JvbGxlZFRleHRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVTY3JvbGxlZFRleHRfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVTY3JvbGxlZFRleHRfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlU2Nyb2xsZWRUZXh0XzM9Ci0KLU9TX19YbUNyZWF0ZVNlcGFyYXRvcj0KLU9TX19YbUNyZWF0ZVNlcGFyYXRvcl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZVNlcGFyYXRvcl8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZVNlcGFyYXRvcl8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVTZXBhcmF0b3JfMz0KLQotT1NfX1htQ3JlYXRlU2VwYXJhdG9yR2FkZ2V0PQotT1NfX1htQ3JlYXRlU2VwYXJhdG9yR2FkZ2V0XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlU2VwYXJhdG9yR2FkZ2V0XzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlU2VwYXJhdG9yR2FkZ2V0XzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVNlcGFyYXRvckdhZGdldF8zPQotCi1PU19fWG1DcmVhdGVTaW1wbGVTcGluQm94PQotT1NfX1htQ3JlYXRlU2ltcGxlU3BpbkJveF8wPWNhc3Q9V2lkZ2V0Ci1PU19fWG1DcmVhdGVTaW1wbGVTcGluQm94XzE9Y2FzdD1TdHJpbmcKLU9TX19YbUNyZWF0ZVNpbXBsZVNwaW5Cb3hfMj1jYXN0PUFyZ0xpc3QKLU9TX19YbUNyZWF0ZVNpbXBsZVNwaW5Cb3hfMz0KLQotT1NfX1htQ3JlYXRlVGV4dEZpZWxkPQotT1NfX1htQ3JlYXRlVGV4dEZpZWxkXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlVGV4dEZpZWxkXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlVGV4dEZpZWxkXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVRleHRGaWVsZF8zPQotCi1PU19fWG1DcmVhdGVUb2dnbGVCdXR0b249Ci1PU19fWG1DcmVhdGVUb2dnbGVCdXR0b25fMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVUb2dnbGVCdXR0b25fMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVUb2dnbGVCdXR0b25fMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlVG9nZ2xlQnV0dG9uXzM9Ci0KLU9TX19YbUNyZWF0ZVRvZ2dsZUJ1dHRvbkdhZGdldD0KLU9TX19YbUNyZWF0ZVRvZ2dsZUJ1dHRvbkdhZGdldF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZVRvZ2dsZUJ1dHRvbkdhZGdldF8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZVRvZ2dsZUJ1dHRvbkdhZGdldF8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVUb2dnbGVCdXR0b25HYWRnZXRfMz0KLQotT1NfX1htQ3JlYXRlV2FybmluZ0RpYWxvZz0KLU9TX19YbUNyZWF0ZVdhcm5pbmdEaWFsb2dfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVXYXJuaW5nRGlhbG9nXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlV2FybmluZ0RpYWxvZ18yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVXYXJuaW5nRGlhbG9nXzM9Ci0KLU9TX19YbUNyZWF0ZVdvcmtpbmdEaWFsb2c9Ci1PU19fWG1DcmVhdGVXb3JraW5nRGlhbG9nXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlV29ya2luZ0RpYWxvZ18xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZVdvcmtpbmdEaWFsb2dfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlV29ya2luZ0RpYWxvZ18zPQotCi1PU19fWG1EZXN0cm95UGl4bWFwPQotT1NfX1htRGVzdHJveVBpeG1hcF8wPWNhc3Q9KFNjcmVlbiAqKQotT1NfX1htRGVzdHJveVBpeG1hcF8xPWNhc3Q9KFBpeG1hcCkKLQotT1NfX1htRHJhZ0NhbmNlbD0KLU9TX19YbURyYWdDYW5jZWxfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbURyYWdTdGFydD0KLU9TX19YbURyYWdTdGFydF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbURyYWdTdGFydF8xPWNhc3Q9KFhFdmVudCAqKQotT1NfX1htRHJhZ1N0YXJ0XzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbURyYWdTdGFydF8zPWNhc3Q9KENhcmRpbmFsKQotCi1PU19fWG1Ecm9wU2l0ZVJlZ2lzdGVyPQotT1NfX1htRHJvcFNpdGVSZWdpc3Rlcl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbURyb3BTaXRlUmVnaXN0ZXJfMT1jYXN0PShBcmdMaXN0KQotT1NfX1htRHJvcFNpdGVSZWdpc3Rlcl8yPWNhc3Q9KENhcmRpbmFsKQotCi1PU19fWG1Ecm9wU2l0ZVVucmVnaXN0ZXI9Ci1PU19fWG1Ecm9wU2l0ZVVucmVnaXN0ZXJfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbURyb3BTaXRlVXBkYXRlPQotT1NfX1htRHJvcFNpdGVVcGRhdGVfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1Ecm9wU2l0ZVVwZGF0ZV8xPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1Ecm9wU2l0ZVVwZGF0ZV8yPWNhc3Q9KENhcmRpbmFsKQotCi1PU19fWG1Ecm9wVHJhbnNmZXJBZGQ9Ci1PU19fWG1Ecm9wVHJhbnNmZXJBZGRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1Ecm9wVHJhbnNmZXJBZGRfMT1jYXN0PShYbURyb3BUcmFuc2ZlckVudHJ5UmVjICopCi1PU19fWG1Ecm9wVHJhbnNmZXJBZGRfMj1jYXN0PShDYXJkaW5hbCkKLQotT1NfX1htRHJvcFRyYW5zZmVyU3RhcnQ9Ci1PU19fWG1Ecm9wVHJhbnNmZXJTdGFydF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbURyb3BUcmFuc2ZlclN0YXJ0XzE9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbURyb3BUcmFuc2ZlclN0YXJ0XzI9Y2FzdD0oQ2FyZGluYWwpCi0KLU9TX19YbUZpbGVTZWxlY3Rpb25Cb3hHZXRDaGlsZD0KLU9TX19YbUZpbGVTZWxlY3Rpb25Cb3hHZXRDaGlsZF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUZpbGVTZWxlY3Rpb25Cb3hHZXRDaGlsZF8xPQotCi1PU19fWG1Gb250TGlzdEFwcGVuZEVudHJ5PQotT1NfX1htRm9udExpc3RBcHBlbmRFbnRyeV8wPWNhc3Q9KFhtRm9udExpc3QpCi1PU19fWG1Gb250TGlzdEFwcGVuZEVudHJ5XzE9Y2FzdD0oWG1Gb250TGlzdEVudHJ5KQotCi1PU19fWG1Gb250TGlzdENvcHk9Ci1PU19fWG1Gb250TGlzdENvcHlfMD1jYXN0PShYbUZvbnRMaXN0KQotCi1PU19fWG1Gb250TGlzdEVudHJ5RnJlZT0KLU9TX19YbUZvbnRMaXN0RW50cnlGcmVlXzA9Y2FzdD0oWG1Gb250TGlzdEVudHJ5ICopCi0KLU9TX19YbUZvbnRMaXN0RW50cnlHZXRGb250PQotT1NfX1htRm9udExpc3RFbnRyeUdldEZvbnRfMD1jYXN0PShYbUZvbnRMaXN0RW50cnkpCi1PU19fWG1Gb250TGlzdEVudHJ5R2V0Rm9udF8xPWNhc3Q9KFhtRm9udFR5cGUgKikKLQotT1NfX1htRm9udExpc3RFbnRyeUxvYWQ9Ci1PU19fWG1Gb250TGlzdEVudHJ5TG9hZF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbUZvbnRMaXN0RW50cnlMb2FkXzE9Y2FzdD0oY2hhciAqKQotT1NfX1htRm9udExpc3RFbnRyeUxvYWRfMj0KLU9TX19YbUZvbnRMaXN0RW50cnlMb2FkXzM9Y2FzdD0oY2hhciAqKQotCi1PU19fWG1Gb250TGlzdEZyZWU9Ci1PU19fWG1Gb250TGlzdEZyZWVfMD1jYXN0PShYbUZvbnRMaXN0KQotCi1PU19fWG1Gb250TGlzdEZyZWVGb250Q29udGV4dD0KLU9TX19YbUZvbnRMaXN0RnJlZUZvbnRDb250ZXh0XzA9Y2FzdD0oWG1Gb250Q29udGV4dCkKLQotT1NfX1htRm9udExpc3RJbml0Rm9udENvbnRleHQ9Ci1PU19fWG1Gb250TGlzdEluaXRGb250Q29udGV4dF8wPWNhc3Q9KFhtRm9udENvbnRleHQgKikKLU9TX19YbUZvbnRMaXN0SW5pdEZvbnRDb250ZXh0XzE9Y2FzdD0oWG1Gb250TGlzdCkKLQotT1NfX1htRm9udExpc3ROZXh0RW50cnk9Ci1PU19fWG1Gb250TGlzdE5leHRFbnRyeV8wPWNhc3Q9KFhtRm9udENvbnRleHQpCi0KLU9TX19YbUdldEF0b21OYW1lPQotT1NfX1htR2V0QXRvbU5hbWVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWG1HZXRBdG9tTmFtZV8xPWNhc3Q9KEF0b20pCi0KLU9TX19YbUdldERyYWdDb250ZXh0PQotT1NfX1htR2V0RHJhZ0NvbnRleHRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1HZXREcmFnQ29udGV4dF8xPWNhc3Q9KFRpbWUpCi0KLU9TX19YbUdldEZvY3VzV2lkZ2V0PQotT1NfX1htR2V0Rm9jdXNXaWRnZXRfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbUdldFBpeG1hcD0KLU9TX19YbUdldFBpeG1hcF8wPWNhc3Q9KFNjcmVlbiAqKQotT1NfX1htR2V0UGl4bWFwXzE9Y2FzdD0oY2hhciAqKQotT1NfX1htR2V0UGl4bWFwXzI9Y2FzdD0oUGl4ZWwpCi1PU19fWG1HZXRQaXhtYXBfMz1jYXN0PShQaXhlbCkKLQotT1NfX1htR2V0UGl4bWFwQnlEZXB0aD0KLU9TX19YbUdldFBpeG1hcEJ5RGVwdGhfMD1jYXN0PShTY3JlZW4gKikKLU9TX19YbUdldFBpeG1hcEJ5RGVwdGhfMT1jYXN0PShjaGFyICopCi1PU19fWG1HZXRQaXhtYXBCeURlcHRoXzI9Ci1PU19fWG1HZXRQaXhtYXBCeURlcHRoXzM9Ci1PU19fWG1HZXRQaXhtYXBCeURlcHRoXzQ9Ci0KLU9TX19YbUdldFhtRGlzcGxheT0KLU9TX19YbUdldFhtRGlzcGxheV8wPWNhc3Q9KERpc3BsYXkgKikKLQotT1NfX1htSW1NYkxvb2t1cFN0cmluZz0KLU9TX19YbUltTWJMb29rdXBTdHJpbmdfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1JbU1iTG9va3VwU3RyaW5nXzE9Y2FzdD0oWEtleVByZXNzZWRFdmVudCAqKQotT1NfX1htSW1NYkxvb2t1cFN0cmluZ18yPWNhc3Q9KGNoYXIgKikKLU9TX19YbUltTWJMb29rdXBTdHJpbmdfMz0KLU9TX19YbUltTWJMb29rdXBTdHJpbmdfND1jYXN0PShLZXlTeW0gKikKLU9TX19YbUltTWJMb29rdXBTdHJpbmdfNT1jYXN0PShpbnQgKikKLQotT1NfX1htSW1SZWdpc3Rlcj0KLU9TX19YbUltUmVnaXN0ZXJfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1JbVJlZ2lzdGVyXzE9Ci0KLU9TX19YbUltU2V0Rm9jdXNWYWx1ZXM9Ci1PU19fWG1JbVNldEZvY3VzVmFsdWVzXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htSW1TZXRGb2N1c1ZhbHVlc18xPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1JbVNldEZvY3VzVmFsdWVzXzI9Ci0KLU9TX19YbUltU2V0VmFsdWVzPQotT1NfX1htSW1TZXRWYWx1ZXNfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1JbVNldFZhbHVlc18xPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1JbVNldFZhbHVlc18yPQotCi1PU19fWG1JbVVucmVnaXN0ZXI9Ci1PU19fWG1JbVVucmVnaXN0ZXJfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbUltVW5zZXRGb2N1cz0KLU9TX19YbUltVW5zZXRGb2N1c18wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htSW50ZXJuQXRvbT0KLU9TX19YbUludGVybkF0b21fMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWG1JbnRlcm5BdG9tXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htSW50ZXJuQXRvbV8yPQotCi1PU19fWG1MaXN0QWRkSXRlbVVuc2VsZWN0ZWQ9Ci1PU19fWG1MaXN0QWRkSXRlbVVuc2VsZWN0ZWRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1MaXN0QWRkSXRlbVVuc2VsZWN0ZWRfMT1jYXN0PShYbVN0cmluZykKLU9TX19YbUxpc3RBZGRJdGVtVW5zZWxlY3RlZF8yPQotCi1PU19fWG1MaXN0RGVsZXRlQWxsSXRlbXM9Ci1PU19fWG1MaXN0RGVsZXRlQWxsSXRlbXNfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbUxpc3REZWxldGVJdGVtc1Bvcz0KLU9TX19YbUxpc3REZWxldGVJdGVtc1Bvc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUxpc3REZWxldGVJdGVtc1Bvc18xPQotT1NfX1htTGlzdERlbGV0ZUl0ZW1zUG9zXzI9Ci0KLU9TX19YbUxpc3REZWxldGVQb3M9Ci1PU19fWG1MaXN0RGVsZXRlUG9zXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTGlzdERlbGV0ZVBvc18xPQotCi1PU19fWG1MaXN0RGVsZXRlUG9zaXRpb25zPQotT1NfX1htTGlzdERlbGV0ZVBvc2l0aW9uc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUxpc3REZWxldGVQb3NpdGlvbnNfMT1jYXN0PShpbnQgKikKLU9TX19YbUxpc3REZWxldGVQb3NpdGlvbnNfMj0KLQotT1NfX1htTGlzdERlc2VsZWN0QWxsSXRlbXM9Ci1PU19fWG1MaXN0RGVzZWxlY3RBbGxJdGVtc18wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htTGlzdERlc2VsZWN0UG9zPQotT1NfX1htTGlzdERlc2VsZWN0UG9zXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTGlzdERlc2VsZWN0UG9zXzE9Ci0KLU9TX19YbUxpc3RHZXRLYmRJdGVtUG9zPQotT1NfX1htTGlzdEdldEtiZEl0ZW1Qb3NfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbUxpc3RHZXRTZWxlY3RlZFBvcz0KLU9TX19YbUxpc3RHZXRTZWxlY3RlZFBvc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUxpc3RHZXRTZWxlY3RlZFBvc18xPWNhc3Q9KGludCAqKikKLU9TX19YbUxpc3RHZXRTZWxlY3RlZFBvc18yPWNhc3Q9KGludCAqKQotCi1PU19fWG1MaXN0SXRlbVBvcz0KLU9TX19YbUxpc3RJdGVtUG9zXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTGlzdEl0ZW1Qb3NfMT1jYXN0PShYbVN0cmluZykKLQotT1NfX1htTGlzdFBvc1NlbGVjdGVkPQotT1NfX1htTGlzdFBvc1NlbGVjdGVkXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTGlzdFBvc1NlbGVjdGVkXzE9Ci0KLU9TX19YbUxpc3RSZXBsYWNlSXRlbXNQb3NVbnNlbGVjdGVkPQotT1NfX1htTGlzdFJlcGxhY2VJdGVtc1Bvc1Vuc2VsZWN0ZWRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1MaXN0UmVwbGFjZUl0ZW1zUG9zVW5zZWxlY3RlZF8xPWNhc3Q9KFhtU3RyaW5nICopCi1PU19fWG1MaXN0UmVwbGFjZUl0ZW1zUG9zVW5zZWxlY3RlZF8yPQotT1NfX1htTGlzdFJlcGxhY2VJdGVtc1Bvc1Vuc2VsZWN0ZWRfMz0KLQotT1NfX1htTGlzdFNlbGVjdFBvcz0KLU9TX19YbUxpc3RTZWxlY3RQb3NfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1MaXN0U2VsZWN0UG9zXzE9Ci1PU19fWG1MaXN0U2VsZWN0UG9zXzI9Ci0KLU9TX19YbUxpc3RTZXRLYmRJdGVtUG9zPQotT1NfX1htTGlzdFNldEtiZEl0ZW1Qb3NfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1MaXN0U2V0S2JkSXRlbVBvc18xPQotCi1PU19fWG1MaXN0U2V0UG9zPQotT1NfX1htTGlzdFNldFBvc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUxpc3RTZXRQb3NfMT0KLQotT1NfX1htTGlzdFVwZGF0ZVNlbGVjdGVkTGlzdD0KLU9TX19YbUxpc3RVcGRhdGVTZWxlY3RlZExpc3RfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbU1haW5XaW5kb3dTZXRBcmVhcz0KLU9TX19YbU1haW5XaW5kb3dTZXRBcmVhc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbU1haW5XaW5kb3dTZXRBcmVhc18xPWNhc3Q9KFdpZGdldCkKLU9TX19YbU1haW5XaW5kb3dTZXRBcmVhc18yPWNhc3Q9KFdpZGdldCkKLU9TX19YbU1haW5XaW5kb3dTZXRBcmVhc18zPWNhc3Q9KFdpZGdldCkKLU9TX19YbU1haW5XaW5kb3dTZXRBcmVhc180PWNhc3Q9KFdpZGdldCkKLU9TX19YbU1haW5XaW5kb3dTZXRBcmVhc181PWNhc3Q9KFdpZGdldCkKLQotT1NfX1htTWVzc2FnZUJveEdldENoaWxkPQotT1NfX1htTWVzc2FnZUJveEdldENoaWxkXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTWVzc2FnZUJveEdldENoaWxkXzE9Ci0KLU9TX19YbVBhcnNlTWFwcGluZ0NyZWF0ZT0KLU9TX19YbVBhcnNlTWFwcGluZ0NyZWF0ZV8wPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1QYXJzZU1hcHBpbmdDcmVhdGVfMT0KLQotT1NfX1htUGFyc2VNYXBwaW5nRnJlZT0KLU9TX19YbVBhcnNlTWFwcGluZ0ZyZWVfMD1jYXN0PShYbVBhcnNlTWFwcGluZykKLQotT1NfX1htUHJvY2Vzc1RyYXZlcnNhbD0KLU9TX19YbVByb2Nlc3NUcmF2ZXJzYWxfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1Qcm9jZXNzVHJhdmVyc2FsXzE9Ci0KLU9TX19YbVJlbmRlclRhYmxlQWRkUmVuZGl0aW9ucz0KLU9TX19YbVJlbmRlclRhYmxlQWRkUmVuZGl0aW9uc18wPWNhc3Q9KFhtUmVuZGVyVGFibGUpCi1PU19fWG1SZW5kZXJUYWJsZUFkZFJlbmRpdGlvbnNfMT1jYXN0PShYbVJlbmRpdGlvbiAqKQotT1NfX1htUmVuZGVyVGFibGVBZGRSZW5kaXRpb25zXzI9Ci1PU19fWG1SZW5kZXJUYWJsZUFkZFJlbmRpdGlvbnNfMz0KLQotT1NfX1htUmVuZGVyVGFibGVGcmVlPQotT1NfX1htUmVuZGVyVGFibGVGcmVlXzA9Y2FzdD0oWG1SZW5kZXJUYWJsZSkKLQotT1NfX1htUmVuZGl0aW9uQ3JlYXRlPQotT1NfX1htUmVuZGl0aW9uQ3JlYXRlXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htUmVuZGl0aW9uQ3JlYXRlXzE9Y2FzdD0oWG1TdHJpbmdUYWcpCi1PU19fWG1SZW5kaXRpb25DcmVhdGVfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htUmVuZGl0aW9uQ3JlYXRlXzM9Ci0KLU9TX19YbVJlbmRpdGlvbkZyZWU9Ci1PU19fWG1SZW5kaXRpb25GcmVlXzA9Y2FzdD0oWG1SZW5kaXRpb24pCi0KLU9TX19YbVN0cmluZ0Jhc2VsaW5lPQotT1NfX1htU3RyaW5nQmFzZWxpbmVfMD1jYXN0PVhtUmVuZGVyVGFibGUKLU9TX19YbVN0cmluZ0Jhc2VsaW5lXzE9Y2FzdD1YbVN0cmluZwotCi1PU19fWG1TdHJpbmdDb21wYXJlPQotT1NfX1htU3RyaW5nQ29tcGFyZV8wPWNhc3Q9KFhtU3RyaW5nKQotT1NfX1htU3RyaW5nQ29tcGFyZV8xPWNhc3Q9KFhtU3RyaW5nKQotCi1PU19fWG1TdHJpbmdDb21wb25lbnRDcmVhdGU9Ci1PU19fWG1TdHJpbmdDb21wb25lbnRDcmVhdGVfMD0KLU9TX19YbVN0cmluZ0NvbXBvbmVudENyZWF0ZV8xPQotT1NfX1htU3RyaW5nQ29tcG9uZW50Q3JlYXRlXzI9Y2FzdD0oWHRQb2ludGVyKQotCi1PU19fWG1TdHJpbmdDb25jYXQ9Ci1PU19fWG1TdHJpbmdDb25jYXRfMD1jYXN0PShYbVN0cmluZykKLU9TX19YbVN0cmluZ0NvbmNhdF8xPWNhc3Q9KFhtU3RyaW5nKQotCi1PU19fWG1TdHJpbmdDcmVhdGU9Ci1PU19fWG1TdHJpbmdDcmVhdGVfMD1jYXN0PShjaGFyICopCi1PU19fWG1TdHJpbmdDcmVhdGVfMT1jYXN0PShjaGFyICopCi0KLU9TX19YbVN0cmluZ0NyZWF0ZUxvY2FsaXplZD0KLU9TX19YbVN0cmluZ0NyZWF0ZUxvY2FsaXplZF8wPWNhc3Q9KGNoYXIgKikKLQotT1NfX1htU3RyaW5nRHJhdz0KLU9TX19YbVN0cmluZ0RyYXdfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWG1TdHJpbmdEcmF3XzE9Y2FzdD0oV2luZG93KQotT1NfX1htU3RyaW5nRHJhd18yPWNhc3Q9KFhtRm9udExpc3QpCi1PU19fWG1TdHJpbmdEcmF3XzM9Y2FzdD0oWG1TdHJpbmcpCi1PU19fWG1TdHJpbmdEcmF3XzQ9Y2FzdD0oR0MpCi1PU19fWG1TdHJpbmdEcmF3XzU9Ci1PU19fWG1TdHJpbmdEcmF3XzY9Ci1PU19fWG1TdHJpbmdEcmF3Xzc9Ci1PU19fWG1TdHJpbmdEcmF3Xzg9Ci1PU19fWG1TdHJpbmdEcmF3Xzk9Ci1PU19fWG1TdHJpbmdEcmF3XzEwPQotCi1PU19fWG1TdHJpbmdEcmF3SW1hZ2U9Ci1PU19fWG1TdHJpbmdEcmF3SW1hZ2VfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWG1TdHJpbmdEcmF3SW1hZ2VfMT1jYXN0PShXaW5kb3cpCi1PU19fWG1TdHJpbmdEcmF3SW1hZ2VfMj1jYXN0PShYbUZvbnRMaXN0KQotT1NfX1htU3RyaW5nRHJhd0ltYWdlXzM9Y2FzdD0oWG1TdHJpbmcpCi1PU19fWG1TdHJpbmdEcmF3SW1hZ2VfND1jYXN0PShHQykKLU9TX19YbVN0cmluZ0RyYXdJbWFnZV81PQotT1NfX1htU3RyaW5nRHJhd0ltYWdlXzY9Ci1PU19fWG1TdHJpbmdEcmF3SW1hZ2VfNz0KLU9TX19YbVN0cmluZ0RyYXdJbWFnZV84PQotT1NfX1htU3RyaW5nRHJhd0ltYWdlXzk9Ci1PU19fWG1TdHJpbmdEcmF3SW1hZ2VfMTA9Ci0KLU9TX19YbVN0cmluZ0RyYXdVbmRlcmxpbmU9Ci1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1htU3RyaW5nRHJhd1VuZGVybGluZV8xPWNhc3Q9KFdpbmRvdykKLU9TX19YbVN0cmluZ0RyYXdVbmRlcmxpbmVfMj1jYXN0PShYbUZvbnRMaXN0KQotT1NfX1htU3RyaW5nRHJhd1VuZGVybGluZV8zPWNhc3Q9KFhtU3RyaW5nKQotT1NfX1htU3RyaW5nRHJhd1VuZGVybGluZV80PWNhc3Q9KEdDKQotT1NfX1htU3RyaW5nRHJhd1VuZGVybGluZV81PQotT1NfX1htU3RyaW5nRHJhd1VuZGVybGluZV82PQotT1NfX1htU3RyaW5nRHJhd1VuZGVybGluZV83PQotT1NfX1htU3RyaW5nRHJhd1VuZGVybGluZV84PQotT1NfX1htU3RyaW5nRHJhd1VuZGVybGluZV85PQotT1NfX1htU3RyaW5nRHJhd1VuZGVybGluZV8xMD0KLU9TX19YbVN0cmluZ0RyYXdVbmRlcmxpbmVfMTE9Y2FzdD0oWG1TdHJpbmcpCi0KLU9TX19YbVN0cmluZ0VtcHR5PQotT1NfX1htU3RyaW5nRW1wdHlfMD1jYXN0PShYbVN0cmluZykKLQotT1NfX1htU3RyaW5nRXh0ZW50PQotT1NfX1htU3RyaW5nRXh0ZW50XzA9Y2FzdD1YbVJlbmRlclRhYmxlCi1PU19fWG1TdHJpbmdFeHRlbnRfMT1jYXN0PVhtU3RyaW5nCi1PU19fWG1TdHJpbmdFeHRlbnRfMj1jYXN0PURpbWVuc2lvbiAqCi1PU19fWG1TdHJpbmdFeHRlbnRfMz1jYXN0PURpbWVuc2lvbiAqCi0KLU9TX19YbVN0cmluZ0ZyZWU9Ci1PU19fWG1TdHJpbmdGcmVlXzA9Y2FzdD0oWG1TdHJpbmcpCi0KLU9TX19YbVN0cmluZ0dlbmVyYXRlPQotT1NfX1htU3RyaW5nR2VuZXJhdGVfMD1jYXN0PShYdFBvaW50ZXIpCi1PU19fWG1TdHJpbmdHZW5lcmF0ZV8xPWNhc3Q9KFhtU3RyaW5nVGFnKQotT1NfX1htU3RyaW5nR2VuZXJhdGVfMj0KLU9TX19YbVN0cmluZ0dlbmVyYXRlXzM9Y2FzdD0oWG1TdHJpbmdUYWcpCi0KLU9TX19YbVN0cmluZ0hlaWdodD0KLU9TX19YbVN0cmluZ0hlaWdodF8wPWNhc3Q9KFhtRm9udExpc3QpCi1PU19fWG1TdHJpbmdIZWlnaHRfMT1jYXN0PShYbVN0cmluZykKLQotT1NfX1htU3RyaW5nUGFyc2VUZXh0PQotT1NfX1htU3RyaW5nUGFyc2VUZXh0XzA9Y2FzdD0oWHRQb2ludGVyKQotT1NfX1htU3RyaW5nUGFyc2VUZXh0XzE9Y2FzdD0oWHRQb2ludGVyICopCi1PU19fWG1TdHJpbmdQYXJzZVRleHRfMj1jYXN0PShYbVN0cmluZ1RhZykKLU9TX19YbVN0cmluZ1BhcnNlVGV4dF8zPQotT1NfX1htU3RyaW5nUGFyc2VUZXh0XzQ9Y2FzdD0oWG1QYXJzZVRhYmxlKQotT1NfX1htU3RyaW5nUGFyc2VUZXh0XzU9Ci1PU19fWG1TdHJpbmdQYXJzZVRleHRfNj1jYXN0PShYdFBvaW50ZXIpCi0KLU9TX19YbVN0cmluZ1VucGFyc2U9Ci1PU19fWG1TdHJpbmdVbnBhcnNlXzA9Y2FzdD0oWG1TdHJpbmcpCi1PU19fWG1TdHJpbmdVbnBhcnNlXzE9Y2FzdD0oWG1TdHJpbmdUYWcpCi1PU19fWG1TdHJpbmdVbnBhcnNlXzI9Ci1PU19fWG1TdHJpbmdVbnBhcnNlXzM9Ci1PU19fWG1TdHJpbmdVbnBhcnNlXzQ9Y2FzdD0oWG1QYXJzZVRhYmxlKQotT1NfX1htU3RyaW5nVW5wYXJzZV81PQotT1NfX1htU3RyaW5nVW5wYXJzZV82PQotCi1PU19fWG1TdHJpbmdXaWR0aD0KLU9TX19YbVN0cmluZ1dpZHRoXzA9Y2FzdD0oWG1Gb250TGlzdCkKLU9TX19YbVN0cmluZ1dpZHRoXzE9Y2FzdD0oWG1TdHJpbmcpCi0KLU9TX19YbVRhYkNyZWF0ZT0KLU9TX19YbVRhYkNyZWF0ZV8wPQotT1NfX1htVGFiQ3JlYXRlXzE9Ci1PU19fWG1UYWJDcmVhdGVfMj0KLU9TX19YbVRhYkNyZWF0ZV8zPQotT1NfX1htVGFiQ3JlYXRlXzQ9Y2FzdD0oY2hhciAqKQotCi1PU19fWG1UYWJGcmVlPQotT1NfX1htVGFiRnJlZV8wPWNhc3Q9KFhtVGFiKQotCi1PU19fWG1UYWJMaXN0RnJlZT0KLU9TX19YbVRhYkxpc3RGcmVlXzA9Y2FzdD0oWG1UYWJMaXN0KQotCi1PU19fWG1UYWJMaXN0SW5zZXJ0VGFicz0KLU9TX19YbVRhYkxpc3RJbnNlcnRUYWJzXzA9Y2FzdD0oWG1UYWJMaXN0KQotT1NfX1htVGFiTGlzdEluc2VydFRhYnNfMT1jYXN0PShYbVRhYiAqKQotT1NfX1htVGFiTGlzdEluc2VydFRhYnNfMj0KLU9TX19YbVRhYkxpc3RJbnNlcnRUYWJzXzM9Ci0KLU9TX19YbVRleHRDbGVhclNlbGVjdGlvbj0KLU9TX19YbVRleHRDbGVhclNlbGVjdGlvbl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRDbGVhclNlbGVjdGlvbl8xPQotCi1PU19fWG1UZXh0Q29weT0KLU9TX19YbVRleHRDb3B5XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htVGV4dENvcHlfMT0KLQotT1NfX1htVGV4dEN1dD0KLU9TX19YbVRleHRDdXRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1UZXh0Q3V0XzE9Ci0KLU9TX19YbVRleHREaXNhYmxlUmVkaXNwbGF5PQotT1NfX1htVGV4dERpc2FibGVSZWRpc3BsYXlfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbVRleHRFbmFibGVSZWRpc3BsYXk9Ci1PU19fWG1UZXh0RW5hYmxlUmVkaXNwbGF5XzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWG1UZXh0RmllbGRQYXN0ZT0KLU9TX19YbVRleHRGaWVsZFBhc3RlXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWG1UZXh0R2V0SW5zZXJ0aW9uUG9zaXRpb249Ci1PU19fWG1UZXh0R2V0SW5zZXJ0aW9uUG9zaXRpb25fMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbVRleHRHZXRMYXN0UG9zaXRpb249Ci1PU19fWG1UZXh0R2V0TGFzdFBvc2l0aW9uXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWG1UZXh0R2V0TWF4TGVuZ3RoPQotT1NfX1htVGV4dEdldE1heExlbmd0aF8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htVGV4dEdldFNlbGVjdGlvbj0KLU9TX19YbVRleHRHZXRTZWxlY3Rpb25fMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbVRleHRHZXRTZWxlY3Rpb25Qb3NpdGlvbj0KLU9TX19YbVRleHRHZXRTZWxlY3Rpb25Qb3NpdGlvbl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRHZXRTZWxlY3Rpb25Qb3NpdGlvbl8xPWNhc3Q9KFhtVGV4dFBvc2l0aW9uICopCi1PU19fWG1UZXh0R2V0U2VsZWN0aW9uUG9zaXRpb25fMj1jYXN0PShYbVRleHRQb3NpdGlvbiAqKQotCi1PU19fWG1UZXh0R2V0U3RyaW5nPQotT1NfX1htVGV4dEdldFN0cmluZ18wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htVGV4dEdldFN1YnN0cmluZz0KLU9TX19YbVRleHRHZXRTdWJzdHJpbmdfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1UZXh0R2V0U3Vic3RyaW5nXzE9Ci1PU19fWG1UZXh0R2V0U3Vic3RyaW5nXzI9Ci1PU19fWG1UZXh0R2V0U3Vic3RyaW5nXzM9Ci1PU19fWG1UZXh0R2V0U3Vic3RyaW5nXzQ9Y2FzdD0oY2hhciAqKQotCi1PU19fWG1UZXh0R2V0U3Vic3RyaW5nV2NzPQotT1NfX1htVGV4dEdldFN1YnN0cmluZ1djc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRHZXRTdWJzdHJpbmdXY3NfMT1jYXN0PShYbVRleHRQb3NpdGlvbikKLU9TX19YbVRleHRHZXRTdWJzdHJpbmdXY3NfMj0KLU9TX19YbVRleHRHZXRTdWJzdHJpbmdXY3NfMz0KLU9TX19YbVRleHRHZXRTdWJzdHJpbmdXY3NfND1jYXN0PSh3Y2hhcl90ICopCi0KLU9TX19YbVRleHRJbnNlcnQ9Ci1PU19fWG1UZXh0SW5zZXJ0XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htVGV4dEluc2VydF8xPQotT1NfX1htVGV4dEluc2VydF8yPWNhc3Q9KGNoYXIgKikKLQotT1NfX1htVGV4dFBhc3RlPQotT1NfX1htVGV4dFBhc3RlXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWG1UZXh0UG9zVG9YWT0KLU9TX19YbVRleHRQb3NUb1hZXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htVGV4dFBvc1RvWFlfMT1jYXN0PShYbVRleHRQb3NpdGlvbikKLU9TX19YbVRleHRQb3NUb1hZXzI9Y2FzdD0oUG9zaXRpb24gKikKLU9TX19YbVRleHRQb3NUb1hZXzM9Y2FzdD0oUG9zaXRpb24gKikKLQotT1NfX1htVGV4dFJlcGxhY2U9Ci1PU19fWG1UZXh0UmVwbGFjZV8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRSZXBsYWNlXzE9Ci1PU19fWG1UZXh0UmVwbGFjZV8yPQotT1NfX1htVGV4dFJlcGxhY2VfMz1jYXN0PShjaGFyICopCi0KLU9TX19YbVRleHRTY3JvbGw9Ci1PU19fWG1UZXh0U2Nyb2xsXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htVGV4dFNjcm9sbF8xPQotCi1PU19fWG1UZXh0U2V0RWRpdGFibGU9Ci1PU19fWG1UZXh0U2V0RWRpdGFibGVfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1UZXh0U2V0RWRpdGFibGVfMT0KLQotT1NfX1htVGV4dFNldEhpZ2hsaWdodD0KLU9TX19YbVRleHRTZXRIaWdobGlnaHRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1UZXh0U2V0SGlnaGxpZ2h0XzE9Ci1PU19fWG1UZXh0U2V0SGlnaGxpZ2h0XzI9Ci1PU19fWG1UZXh0U2V0SGlnaGxpZ2h0XzM9Ci0KLU9TX19YbVRleHRTZXRJbnNlcnRpb25Qb3NpdGlvbj0KLU9TX19YbVRleHRTZXRJbnNlcnRpb25Qb3NpdGlvbl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRTZXRJbnNlcnRpb25Qb3NpdGlvbl8xPQotCi1PU19fWG1UZXh0U2V0TWF4TGVuZ3RoPQotT1NfX1htVGV4dFNldE1heExlbmd0aF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRTZXRNYXhMZW5ndGhfMT0KLQotT1NfX1htVGV4dFNldFNlbGVjdGlvbj0KLU9TX19YbVRleHRTZXRTZWxlY3Rpb25fMD1jYXN0PShXaWRnZXQpCi1PU19fWG1UZXh0U2V0U2VsZWN0aW9uXzE9Ci1PU19fWG1UZXh0U2V0U2VsZWN0aW9uXzI9Ci1PU19fWG1UZXh0U2V0U2VsZWN0aW9uXzM9Ci0KLU9TX19YbVRleHRTZXRTdHJpbmc9Ci1PU19fWG1UZXh0U2V0U3RyaW5nXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htVGV4dFNldFN0cmluZ18xPWNhc3Q9KGNoYXIgKikKLQotT1NfX1htVGV4dFNob3dQb3NpdGlvbj0KLU9TX19YbVRleHRTaG93UG9zaXRpb25fMD1jYXN0PShXaWRnZXQpCi1PU19fWG1UZXh0U2hvd1Bvc2l0aW9uXzE9Ci0KLU9TX19YbVVwZGF0ZURpc3BsYXk9Ci1PU19fWG1VcGRhdGVEaXNwbGF5XzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWG1XaWRnZXRHZXREaXNwbGF5UmVjdD0KLU9TX19YbVdpZGdldEdldERpc3BsYXlSZWN0XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htV2lkZ2V0R2V0RGlzcGxheVJlY3RfMT1jYXN0PShYUmVjdGFuZ2xlICopCi0KLU9TX19YbWJUZXh0TGlzdFRvVGV4dFByb3BlcnR5PQotT1NfX1htYlRleHRMaXN0VG9UZXh0UHJvcGVydHlfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWG1iVGV4dExpc3RUb1RleHRQcm9wZXJ0eV8xPWNhc3Q9KGNoYXIgKiopCi1PU19fWG1iVGV4dExpc3RUb1RleHRQcm9wZXJ0eV8yPQotT1NfX1htYlRleHRMaXN0VG9UZXh0UHJvcGVydHlfMz1jYXN0PShYSUNDRW5jb2RpbmdTdHlsZSkKLU9TX19YbWJUZXh0TGlzdFRvVGV4dFByb3BlcnR5XzQ9Ci0KLU9TX19YbWJUZXh0UHJvcGVydHlUb1RleHRMaXN0PQotT1NfX1htYlRleHRQcm9wZXJ0eVRvVGV4dExpc3RfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWG1iVGV4dFByb3BlcnR5VG9UZXh0TGlzdF8xPQotT1NfX1htYlRleHRQcm9wZXJ0eVRvVGV4dExpc3RfMj1jYXN0PShjaGFyICoqKikKLU9TX19YbWJUZXh0UHJvcGVydHlUb1RleHRMaXN0XzM9Y2FzdD0oaW50ICopCi0KLU9TX19YcENhbmNlbEpvYj0KLU9TX19YcENhbmNlbEpvYl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YcENhbmNlbEpvYl8xPQotCi1PU19fWHBDcmVhdGVDb250ZXh0PQotT1NfX1hwQ3JlYXRlQ29udGV4dF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YcENyZWF0ZUNvbnRleHRfMT1jYXN0PShjaGFyICopCi0KLU9TX19YcERlc3Ryb3lDb250ZXh0PQotT1NfX1hwRGVzdHJveUNvbnRleHRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWHBEZXN0cm95Q29udGV4dF8xPWNhc3Q9KFhQQ29udGV4dCkKLQotT1NfX1hwRW5kSm9iPQotT1NfX1hwRW5kSm9iXzA9Y2FzdD0oRGlzcGxheSAqKQotCi1PU19fWHBFbmRQYWdlPQotT1NfX1hwRW5kUGFnZV8wPWNhc3Q9KERpc3BsYXkgKikKLQotT1NfX1hwRnJlZVByaW50ZXJMaXN0PQotT1NfX1hwRnJlZVByaW50ZXJMaXN0XzA9Y2FzdD0oWFBQcmludGVyTGlzdCkKLQotT1NfX1hwR2V0T25lQXR0cmlidXRlPQotT1NfX1hwR2V0T25lQXR0cmlidXRlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hwR2V0T25lQXR0cmlidXRlXzE9Y2FzdD0oWFBDb250ZXh0KQotT1NfX1hwR2V0T25lQXR0cmlidXRlXzI9Y2FzdD0oWFBBdHRyaWJ1dGVzKQotT1NfX1hwR2V0T25lQXR0cmlidXRlXzM9Y2FzdD0oY2hhciAqKQotCi1PU19fWHBHZXRQYWdlRGltZW5zaW9ucz0KLU9TX19YcEdldFBhZ2VEaW1lbnNpb25zXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hwR2V0UGFnZURpbWVuc2lvbnNfMT1jYXN0PShYUENvbnRleHQpCi1PU19fWHBHZXRQYWdlRGltZW5zaW9uc18yPWNhc3Q9KHVuc2lnbmVkIHNob3J0ICopCi1PU19fWHBHZXRQYWdlRGltZW5zaW9uc18zPWNhc3Q9KHVuc2lnbmVkIHNob3J0ICopCi1PU19fWHBHZXRQYWdlRGltZW5zaW9uc180PWNhc3Q9KFhSZWN0YW5nbGUgKikKLQotT1NfX1hwR2V0UHJpbnRlckxpc3Q9Ci1PU19fWHBHZXRQcmludGVyTGlzdF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YcEdldFByaW50ZXJMaXN0XzE9Y2FzdD0oY2hhciAqKQotT1NfX1hwR2V0UHJpbnRlckxpc3RfMj1jYXN0PShpbnQgKikKLQotT1NfX1hwR2V0U2NyZWVuT2ZDb250ZXh0PQotT1NfX1hwR2V0U2NyZWVuT2ZDb250ZXh0XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hwR2V0U2NyZWVuT2ZDb250ZXh0XzE9Y2FzdD0oWFBDb250ZXh0KQotCi1PU19fWHBTZXRBdHRyaWJ1dGVzPQotT1NfX1hwU2V0QXR0cmlidXRlc18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YcFNldEF0dHJpYnV0ZXNfMT1jYXN0PShYUENvbnRleHQpCi1PU19fWHBTZXRBdHRyaWJ1dGVzXzI9Y2FzdD0oWFBBdHRyaWJ1dGVzKQotT1NfX1hwU2V0QXR0cmlidXRlc18zPWNhc3Q9KGNoYXIgKikKLU9TX19YcFNldEF0dHJpYnV0ZXNfND1jYXN0PShYUEF0dHJSZXBsYWNlbWVudCkKLQotT1NfX1hwU2V0Q29udGV4dD0KLU9TX19YcFNldENvbnRleHRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWHBTZXRDb250ZXh0XzE9Y2FzdD0oWFBDb250ZXh0KQotCi1PU19fWHBTdGFydEpvYj0KLU9TX19YcFN0YXJ0Sm9iXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hwU3RhcnRKb2JfMT1jYXN0PShYUFNhdmVEYXRhKQotCi1PU19fWHBTdGFydFBhZ2U9Ci1PU19fWHBTdGFydFBhZ2VfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWHBTdGFydFBhZ2VfMT1jYXN0PShXaW5kb3cpCi0KLU9TX19YdEFkZENhbGxiYWNrPQotT1NfX1h0QWRkQ2FsbGJhY2tfMD1jYXN0PShXaWRnZXQpCi1PU19fWHRBZGRDYWxsYmFja18xPWNhc3Q9KFN0cmluZykKLU9TX19YdEFkZENhbGxiYWNrXzI9Y2FzdD0oWHRDYWxsYmFja1Byb2MpCi1PU19fWHRBZGRDYWxsYmFja18zPWNhc3Q9KFh0UG9pbnRlcikKLQotT1NfX1h0QWRkRXZlbnRIYW5kbGVyPQotT1NfX1h0QWRkRXZlbnRIYW5kbGVyXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0QWRkRXZlbnRIYW5kbGVyXzE9Ci1PU19fWHRBZGRFdmVudEhhbmRsZXJfMj0KLU9TX19YdEFkZEV2ZW50SGFuZGxlcl8zPWNhc3Q9KFh0RXZlbnRIYW5kbGVyKQotT1NfX1h0QWRkRXZlbnRIYW5kbGVyXzQ9Y2FzdD0oWHRQb2ludGVyKQotCi1PU19fWHRBZGRFeHBvc3VyZVRvUmVnaW9uPQotT1NfX1h0QWRkRXhwb3N1cmVUb1JlZ2lvbl8wPWNhc3Q9KFhFdmVudCAqKQotT1NfX1h0QWRkRXhwb3N1cmVUb1JlZ2lvbl8xPWNhc3Q9KFJlZ2lvbikKLQotT1NfX1h0QXBwQWRkSW5wdXQ9Ci1PU19fWHRBcHBBZGRJbnB1dF8wPWNhc3Q9KFh0QXBwQ29udGV4dCkKLU9TX19YdEFwcEFkZElucHV0XzE9Ci1PU19fWHRBcHBBZGRJbnB1dF8yPWNhc3Q9KFh0UG9pbnRlcikKLU9TX19YdEFwcEFkZElucHV0XzM9Y2FzdD0oWHRJbnB1dENhbGxiYWNrUHJvYykKLU9TX19YdEFwcEFkZElucHV0XzQ9Y2FzdD0oWHRQb2ludGVyKQotCi1PU19fWHRBcHBBZGRUaW1lT3V0PQotT1NfX1h0QXBwQWRkVGltZU91dF8wPWNhc3Q9KFh0QXBwQ29udGV4dCkKLU9TX19YdEFwcEFkZFRpbWVPdXRfMT0KLU9TX19YdEFwcEFkZFRpbWVPdXRfMj1jYXN0PShYdFRpbWVyQ2FsbGJhY2tQcm9jKQotT1NfX1h0QXBwQWRkVGltZU91dF8zPWNhc3Q9KFh0UG9pbnRlcikKLQotT1NfX1h0QXBwQ3JlYXRlU2hlbGw9Ci1PU19fWHRBcHBDcmVhdGVTaGVsbF8wPWNhc3Q9KFN0cmluZykKLU9TX19YdEFwcENyZWF0ZVNoZWxsXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1h0QXBwQ3JlYXRlU2hlbGxfMj1jYXN0PShXaWRnZXRDbGFzcykKLU9TX19YdEFwcENyZWF0ZVNoZWxsXzM9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1h0QXBwQ3JlYXRlU2hlbGxfND1jYXN0PShBcmdMaXN0KQotT1NfX1h0QXBwQ3JlYXRlU2hlbGxfNT0KLQotT1NfX1h0QXBwR2V0U2VsZWN0aW9uVGltZW91dD0KLU9TX19YdEFwcEdldFNlbGVjdGlvblRpbWVvdXRfMD1jYXN0PShYdEFwcENvbnRleHQpCi0KLU9TX19YdEFwcE5leHRFdmVudD0KLU9TX19YdEFwcE5leHRFdmVudF8wPWNhc3Q9KFh0QXBwQ29udGV4dCkKLU9TX19YdEFwcE5leHRFdmVudF8xPWNhc3Q9KFhFdmVudCAqKQotCi1PU19fWHRBcHBQZWVrRXZlbnQ9Ci1PU19fWHRBcHBQZWVrRXZlbnRfMD1jYXN0PShYdEFwcENvbnRleHQpCi1PU19fWHRBcHBQZWVrRXZlbnRfMT1jYXN0PShYRXZlbnQgKikKLQotT1NfX1h0QXBwUGVuZGluZz0KLU9TX19YdEFwcFBlbmRpbmdfMD1jYXN0PShYdEFwcENvbnRleHQpCi0KLU9TX19YdEFwcFByb2Nlc3NFdmVudD0KLU9TX19YdEFwcFByb2Nlc3NFdmVudF8wPWNhc3Q9KFh0QXBwQ29udGV4dCkKLU9TX19YdEFwcFByb2Nlc3NFdmVudF8xPQotCi1PU19fWHRBcHBTZXRFcnJvckhhbmRsZXI9Ci1PU19fWHRBcHBTZXRFcnJvckhhbmRsZXJfMD1jYXN0PShYdEFwcENvbnRleHQpCi1PU19fWHRBcHBTZXRFcnJvckhhbmRsZXJfMT1jYXN0PShYdEVycm9ySGFuZGxlcikKLQotT1NfX1h0QXBwU2V0RmFsbGJhY2tSZXNvdXJjZXM9Ci1PU19fWHRBcHBTZXRGYWxsYmFja1Jlc291cmNlc18wPWNhc3Q9KFh0QXBwQ29udGV4dCkKLU9TX19YdEFwcFNldEZhbGxiYWNrUmVzb3VyY2VzXzE9Y2FzdD0oU3RyaW5nICopCi0KLU9TX19YdEFwcFNldFNlbGVjdGlvblRpbWVvdXQ9Ci1PU19fWHRBcHBTZXRTZWxlY3Rpb25UaW1lb3V0XzA9Y2FzdD0oWHRBcHBDb250ZXh0KQotT1NfX1h0QXBwU2V0U2VsZWN0aW9uVGltZW91dF8xPQotCi1PU19fWHRBcHBTZXRXYXJuaW5nSGFuZGxlcj0KLU9TX19YdEFwcFNldFdhcm5pbmdIYW5kbGVyXzA9Y2FzdD0oWHRBcHBDb250ZXh0KQotT1NfX1h0QXBwU2V0V2FybmluZ0hhbmRsZXJfMT1jYXN0PShYdEVycm9ySGFuZGxlcikKLQotT1NfX1h0QnVpbGRFdmVudE1hc2s9Ci1PU19fWHRCdWlsZEV2ZW50TWFza18wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1h0Q2FsbEFjdGlvblByb2M9Ci1PU19fWHRDYWxsQWN0aW9uUHJvY18wPWNhc3Q9KFdpZGdldCkKLU9TX19YdENhbGxBY3Rpb25Qcm9jXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1h0Q2FsbEFjdGlvblByb2NfMj1jYXN0PShYRXZlbnQgKikKLU9TX19YdENhbGxBY3Rpb25Qcm9jXzM9Y2FzdD0oU3RyaW5nICopCi1PU19fWHRDYWxsQWN0aW9uUHJvY180PQotCi1PU19fWHRDbGFzcz0KLU9TX19YdENsYXNzXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWHRDb25maWd1cmVXaWRnZXQ9Ci1PU19fWHRDb25maWd1cmVXaWRnZXRfMD1jYXN0PShXaWRnZXQpCi1PU19fWHRDb25maWd1cmVXaWRnZXRfMT0KLU9TX19YdENvbmZpZ3VyZVdpZGdldF8yPQotT1NfX1h0Q29uZmlndXJlV2lkZ2V0XzM9Ci1PU19fWHRDb25maWd1cmVXaWRnZXRfND0KLU9TX19YdENvbmZpZ3VyZVdpZGdldF81PQotCi1PU19fWHRDcmVhdGVBcHBsaWNhdGlvbkNvbnRleHQ9Ci0KLU9TX19YdENyZWF0ZVBvcHVwU2hlbGw9Ci1PU19fWHRDcmVhdGVQb3B1cFNoZWxsXzA9Y2FzdD0oU3RyaW5nKQotT1NfX1h0Q3JlYXRlUG9wdXBTaGVsbF8xPWNhc3Q9KFdpZGdldENsYXNzKQotT1NfX1h0Q3JlYXRlUG9wdXBTaGVsbF8yPWNhc3Q9KFdpZGdldCkKLU9TX19YdENyZWF0ZVBvcHVwU2hlbGxfMz1jYXN0PShBcmdMaXN0KQotT1NfX1h0Q3JlYXRlUG9wdXBTaGVsbF80PQotCi1PU19fWHREZXN0cm95QXBwbGljYXRpb25Db250ZXh0PQotT1NfX1h0RGVzdHJveUFwcGxpY2F0aW9uQ29udGV4dF8wPWNhc3Q9KFh0QXBwQ29udGV4dCkKLQotT1NfX1h0RGVzdHJveVdpZGdldD0KLU9TX19YdERlc3Ryb3lXaWRnZXRfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YdERpc293blNlbGVjdGlvbj0KLU9TX19YdERpc293blNlbGVjdGlvbl8wPWNhc3Q9V2lkZ2V0Ci1PU19fWHREaXNvd25TZWxlY3Rpb25fMT1jYXN0PUF0b20KLU9TX19YdERpc293blNlbGVjdGlvbl8yPWNhc3Q9VGltZQotCi1PU19fWHREaXNwYXRjaEV2ZW50PQotT1NfX1h0RGlzcGF0Y2hFdmVudF8wPWNhc3Q9KFhFdmVudCAqKQotCi1PU19fWHREaXNwbGF5PQotT1NfX1h0RGlzcGxheV8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1h0RGlzcGxheVRvQXBwbGljYXRpb25Db250ZXh0PQotT1NfX1h0RGlzcGxheVRvQXBwbGljYXRpb25Db250ZXh0XzA9Y2FzdD0oRGlzcGxheSAqKQotCi1PU19fWHRGcmVlPQotT1NfX1h0RnJlZV8wPWNhc3Q9KGNoYXIgKikKLQotT1NfX1h0R2V0TXVsdGlDbGlja1RpbWU9Ci1PU19fWHRHZXRNdWx0aUNsaWNrVGltZV8wPWNhc3Q9KERpc3BsYXkgKikKLQotT1NfX1h0R2V0U2VsZWN0aW9uVmFsdWU9Ci1PU19fWHRHZXRTZWxlY3Rpb25WYWx1ZV8wPWNhc3Q9V2lkZ2V0Ci1PU19fWHRHZXRTZWxlY3Rpb25WYWx1ZV8xPWNhc3Q9QXRvbQotT1NfX1h0R2V0U2VsZWN0aW9uVmFsdWVfMj1jYXN0PUF0b20KLU9TX19YdEdldFNlbGVjdGlvblZhbHVlXzM9Y2FzdD1YdFNlbGVjdGlvbkNhbGxiYWNrUHJvYwotT1NfX1h0R2V0U2VsZWN0aW9uVmFsdWVfND1jYXN0PVh0UG9pbnRlcgotT1NfX1h0R2V0U2VsZWN0aW9uVmFsdWVfNT1jYXN0PVRpbWUKLQotT1NfX1h0R2V0VmFsdWVzPWZsYWdzPW5vX2dlbgotT1NfX1h0R2V0VmFsdWVzXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0R2V0VmFsdWVzXzE9Y2FzdD0oQXJnTGlzdCkKLU9TX19YdEdldFZhbHVlc18yPQotCi1PU19fWHRJbnNlcnRFdmVudEhhbmRsZXI9Ci1PU19fWHRJbnNlcnRFdmVudEhhbmRsZXJfMD1jYXN0PShXaWRnZXQpCi1PU19fWHRJbnNlcnRFdmVudEhhbmRsZXJfMT1jYXN0PShFdmVudE1hc2spCi1PU19fWHRJbnNlcnRFdmVudEhhbmRsZXJfMj1jYXN0PShCb29sZWFuKQotT1NfX1h0SW5zZXJ0RXZlbnRIYW5kbGVyXzM9Y2FzdD0oWHRFdmVudEhhbmRsZXIpCi1PU19fWHRJbnNlcnRFdmVudEhhbmRsZXJfND1jYXN0PShYdFBvaW50ZXIpCi1PU19fWHRJbnNlcnRFdmVudEhhbmRsZXJfNT1jYXN0PShYdExpc3RQb3NpdGlvbikKLQotT1NfX1h0SXNNYW5hZ2VkPQotT1NfX1h0SXNNYW5hZ2VkXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWHRJc1JlYWxpemVkPQotT1NfX1h0SXNSZWFsaXplZF8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1h0SXNTdWJjbGFzcz0KLU9TX19YdElzU3ViY2xhc3NfMD1jYXN0PShXaWRnZXQpCi1PU19fWHRJc1N1YmNsYXNzXzE9Y2FzdD0oV2lkZ2V0Q2xhc3MpCi0KLU9TX19YdElzVG9wTGV2ZWxTaGVsbD0KLU9TX19YdElzVG9wTGV2ZWxTaGVsbF8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1h0TGFzdFRpbWVzdGFtcFByb2Nlc3NlZD0KLU9TX19YdExhc3RUaW1lc3RhbXBQcm9jZXNzZWRfMD1jYXN0PShEaXNwbGF5ICopCi0KLU9TX19YdE1hbGxvYz0KLU9TX19YdE1hbGxvY18wPQotCi1PU19fWHRNYW5hZ2VDaGlsZD0KLU9TX19YdE1hbmFnZUNoaWxkXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWHRNYXBXaWRnZXQ9Ci1PU19fWHRNYXBXaWRnZXRfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YdE1vdmVXaWRnZXQ9Ci1PU19fWHRNb3ZlV2lkZ2V0XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0TW92ZVdpZGdldF8xPQotT1NfX1h0TW92ZVdpZGdldF8yPQotCi1PU19fWHROYW1lVG9XaWRnZXQ9Ci1PU19fWHROYW1lVG9XaWRnZXRfMD1jYXN0PShXaWRnZXQpCi1PU19fWHROYW1lVG9XaWRnZXRfMT1jYXN0PShTdHJpbmcpCi0KLU9TX19YdE9wZW5EaXNwbGF5PQotT1NfX1h0T3BlbkRpc3BsYXlfMD1jYXN0PShYdEFwcENvbnRleHQpCi1PU19fWHRPcGVuRGlzcGxheV8xPWNhc3Q9KFN0cmluZykKLU9TX19YdE9wZW5EaXNwbGF5XzI9Y2FzdD0oU3RyaW5nKQotT1NfX1h0T3BlbkRpc3BsYXlfMz1jYXN0PShTdHJpbmcpCi1PU19fWHRPcGVuRGlzcGxheV80PWNhc3Q9KFhybU9wdGlvbkRlc2NSZWMgKikKLU9TX19YdE9wZW5EaXNwbGF5XzU9Ci1PU19fWHRPcGVuRGlzcGxheV82PWNhc3Q9KGludCAqKQotT1NfX1h0T3BlbkRpc3BsYXlfNz1jYXN0PShjaGFyICoqKQotCi1PU19fWHRPdmVycmlkZVRyYW5zbGF0aW9ucz0KLU9TX19YdE92ZXJyaWRlVHJhbnNsYXRpb25zXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0T3ZlcnJpZGVUcmFuc2xhdGlvbnNfMT1jYXN0PShYdFRyYW5zbGF0aW9ucykKLQotT1NfX1h0T3duU2VsZWN0aW9uPQotT1NfX1h0T3duU2VsZWN0aW9uXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0T3duU2VsZWN0aW9uXzE9Y2FzdD0oQXRvbSkKLU9TX19YdE93blNlbGVjdGlvbl8yPWNhc3Q9VGltZQotT1NfX1h0T3duU2VsZWN0aW9uXzM9Y2FzdD1YdENvbnZlcnRTZWxlY3Rpb25Qcm9jCi1PU19fWHRPd25TZWxlY3Rpb25fND1jYXN0PShYdExvc2VTZWxlY3Rpb25Qcm9jKQotT1NfX1h0T3duU2VsZWN0aW9uXzU9Y2FzdD0oWHRTZWxlY3Rpb25Eb25lUHJvYykKLQotT1NfX1h0UGFyZW50PQotT1NfX1h0UGFyZW50XzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWHRQYXJzZVRyYW5zbGF0aW9uVGFibGU9Ci1PU19fWHRQYXJzZVRyYW5zbGF0aW9uVGFibGVfMD1jYXN0PShTdHJpbmcpCi0KLU9TX19YdFBvcGRvd249Ci1PU19fWHRQb3Bkb3duXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWHRQb3B1cD0KLU9TX19YdFBvcHVwXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0UG9wdXBfMT0KLQotT1NfX1h0UXVlcnlHZW9tZXRyeT0KLU9TX19YdFF1ZXJ5R2VvbWV0cnlfMD1jYXN0PShXaWRnZXQpCi1PU19fWHRRdWVyeUdlb21ldHJ5XzE9Y2FzdD0oWHRXaWRnZXRHZW9tZXRyeSAqKQotT1NfX1h0UXVlcnlHZW9tZXRyeV8yPWNhc3Q9KFh0V2lkZ2V0R2VvbWV0cnkgKikKLQotT1NfX1h0UmVhbGl6ZVdpZGdldD0KLU9TX19YdFJlYWxpemVXaWRnZXRfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YdFJlZ2lzdGVyRHJhd2FibGU9Ci1PU19fWHRSZWdpc3RlckRyYXdhYmxlXzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YdFJlZ2lzdGVyRHJhd2FibGVfMT1jYXN0PURyYXdhYmxlCi1PU19fWHRSZWdpc3RlckRyYXdhYmxlXzI9Y2FzdD1XaWRnZXQKLQotT1NfX1h0UmVtb3ZlRXZlbnRIYW5kbGVyPQotT1NfX1h0UmVtb3ZlRXZlbnRIYW5kbGVyXzA9Y2FzdD1XaWRnZXQKLU9TX19YdFJlbW92ZUV2ZW50SGFuZGxlcl8xPQotT1NfX1h0UmVtb3ZlRXZlbnRIYW5kbGVyXzI9Ci1PU19fWHRSZW1vdmVFdmVudEhhbmRsZXJfMz1jYXN0PVh0RXZlbnRIYW5kbGVyCi1PU19fWHRSZW1vdmVFdmVudEhhbmRsZXJfND1jYXN0PVh0UG9pbnRlcgotCi1PU19fWHRSZW1vdmVJbnB1dD0KLU9TX19YdFJlbW92ZUlucHV0XzA9Y2FzdD0oWHRJbnB1dElkKQotCi1PU19fWHRSZW1vdmVUaW1lT3V0PQotT1NfX1h0UmVtb3ZlVGltZU91dF8wPQotCi1PU19fWHRSZXNpemVXaWRnZXQ9Ci1PU19fWHRSZXNpemVXaWRnZXRfMD1jYXN0PShXaWRnZXQpCi1PU19fWHRSZXNpemVXaWRnZXRfMT0KLU9TX19YdFJlc2l6ZVdpZGdldF8yPQotT1NfX1h0UmVzaXplV2lkZ2V0XzM9Ci0KLU9TX19YdFJlc2l6ZVdpbmRvdz0KLU9TX19YdFJlc2l6ZVdpbmRvd18wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1h0U2V0TGFuZ3VhZ2VQcm9jPQotT1NfX1h0U2V0TGFuZ3VhZ2VQcm9jXzA9Y2FzdD0oWHRBcHBDb250ZXh0KQotT1NfX1h0U2V0TGFuZ3VhZ2VQcm9jXzE9Y2FzdD0oWHRMYW5ndWFnZVByb2MpCi1PU19fWHRTZXRMYW5ndWFnZVByb2NfMj1jYXN0PShYdFBvaW50ZXIpCi0KLU9TX19YdFNldE1hcHBlZFdoZW5NYW5hZ2VkPQotT1NfX1h0U2V0TWFwcGVkV2hlbk1hbmFnZWRfMD1jYXN0PShXaWRnZXQpCi1PU19fWHRTZXRNYXBwZWRXaGVuTWFuYWdlZF8xPQotCi1PU19fWHRTZXRWYWx1ZXM9Ci1PU19fWHRTZXRWYWx1ZXNfMD1jYXN0PShXaWRnZXQpCi1PU19fWHRTZXRWYWx1ZXNfMT1jYXN0PShBcmdMaXN0KQotT1NfX1h0U2V0VmFsdWVzXzI9Ci0KLU9TX19YdFRvb2xraXRJbml0aWFsaXplPQotCi1PU19fWHRUb29sa2l0VGhyZWFkSW5pdGlhbGl6ZT0KLQotT1NfX1h0VHJhbnNsYXRlQ29vcmRzPQotT1NfX1h0VHJhbnNsYXRlQ29vcmRzXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0VHJhbnNsYXRlQ29vcmRzXzE9Ci1PU19fWHRUcmFuc2xhdGVDb29yZHNfMj0KLU9TX19YdFRyYW5zbGF0ZUNvb3Jkc18zPQotT1NfX1h0VHJhbnNsYXRlQ29vcmRzXzQ9Ci0KLU9TX19YdFVubWFuYWdlQ2hpbGQ9Ci1PU19fWHRVbm1hbmFnZUNoaWxkXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWHRVbm1hcFdpZGdldD0KLU9TX19YdFVubWFwV2lkZ2V0XzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWHRVbnJlZ2lzdGVyRHJhd2FibGU9Ci1PU19fWHRVbnJlZ2lzdGVyRHJhd2FibGVfMD1jYXN0PURpc3BsYXkgKgotT1NfX1h0VW5yZWdpc3RlckRyYXdhYmxlXzE9Y2FzdD1EcmF3YWJsZQotCi1PU19fWHRXaW5kb3c9Ci1PU19fWHRXaW5kb3dfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YdFdpbmRvd1RvV2lkZ2V0PQotT1NfX1h0V2luZG93VG9XaWRnZXRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWHRXaW5kb3dUb1dpZGdldF8xPWNhc3Q9KFdpbmRvdykKLQotT1NfX19YbVNldE1lbnVUcmF2ZXJzYWw9Ci1PU19fX1htU2V0TWVudVRyYXZlcnNhbF8wPWNhc3Q9KFdpZGdldCkKLU9TX19fWG1TZXRNZW51VHJhdmVyc2FsXzE9Ci0KLU9TX19hcHBsaWNhdGlvblNoZWxsV2lkZ2V0Q2xhc3M9ZmxhZ3M9Y29uc3QKLQotT1NfX2RsY2xvc2U9Ci1PU19fZGxjbG9zZV8wPWNhc3Q9KHZvaWQgKikKLQotT1NfX2Rsb3Blbj0KLU9TX19kbG9wZW5fMD1jYXN0PShjb25zdCBjaGFyICopCi1PU19fZGxvcGVuXzE9Ci0KLU9TX19kbHN5bT0KLU9TX19kbHN5bV8wPWNhc3Q9KHZvaWQgKikKLU9TX19kbHN5bV8xPWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotT1NfX292ZXJyaWRlU2hlbGxXaWRnZXRDbGFzcz1mbGFncz1jb25zdAotCi1PU19fc2hlbGxXaWRnZXRDbGFzcz1mbGFncz1jb25zdAotCi1PU19fdG9wTGV2ZWxTaGVsbFdpZGdldENsYXNzPWZsYWdzPWNvbnN0Ci0KLU9TX190cmFuc2llbnRTaGVsbFdpZGdldENsYXNzPWZsYWdzPWNvbnN0Ci0KLU9TX194bU1lbnVTaGVsbFdpZGdldENsYXNzPWZsYWdzPWNvbnN0Ci0KLU9TX2Nsb3NlPQotT1NfY2xvc2VfMD0KLQotT1NfZmRfc2V0X3NpemVvZj0KLQotT1NfZ2V0ZW52PQotT1NfZ2V0ZW52XzA9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1PU19pY29udj0KLU9TX2ljb252XzA9Y2FzdD0oaWNvbnZfdCkKLU9TX2ljb252XzE9Y2FzdD0odm9pZCAqKQotT1NfaWNvbnZfMj1jYXN0PShzaXplX3QgKikKLU9TX2ljb252XzM9Y2FzdD0oY2hhciAqKikKLU9TX2ljb252XzQ9Y2FzdD0oc2l6ZV90ICopCi0KLU9TX2ljb252X2Nsb3NlPQotT1NfaWNvbnZfY2xvc2VfMD1jYXN0PShpY29udl90KQotCi1PU19pY29udl9vcGVuPQotT1NfaWNvbnZfb3Blbl8wPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX2ljb252X29wZW5fMT1jYXN0PShjb25zdCBjaGFyICopCi0KLU9TX2xvY2FsZWNvbnZfZGVjaW1hbF9wb2ludD0KLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEJ1dHRvbkV2ZW50XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEJ1dHRvbkV2ZW50XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEJ1dHRvbkV2ZW50XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hCdXR0b25FdmVudF8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENsaWVudE1lc3NhZ2VFdmVudF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDbGllbnRNZXNzYWdlRXZlbnRfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ2xpZW50TWVzc2FnZUV2ZW50XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDbGllbnRNZXNzYWdlRXZlbnRfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDb25maWd1cmVFdmVudF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDb25maWd1cmVFdmVudF8ySV8wPWNhc3Q9dm9pZCAqCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ29uZmlndXJlRXZlbnRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENvbmZpZ3VyZUV2ZW50XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRXhwb3NlRXZlbnRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRXhwb3NlRXZlbnRfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRXhwb3NlRXZlbnRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEV4cG9zZUV2ZW50XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YSW1hZ2VfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YSW1hZ2VfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YSW1hZ2VfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEltYWdlXzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YS2V5RXZlbnRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YS2V5RXZlbnRfMklfMD1jYXN0PXZvaWQgKgotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEtleUV2ZW50XzJJXzE9Y2FzdD1jb25zdCB2b2lkICosZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YS2V5RXZlbnRfMklfMj1jYXN0PXNpemVfdAotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbURyYWdQcm9jQ2FsbGJhY2tTdHJ1Y3RfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbURyYWdQcm9jQ2FsbGJhY2tTdHJ1Y3RfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbURyYWdQcm9jQ2FsbGJhY2tTdHJ1Y3RfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVNwaW5Cb3hDYWxsYmFja1N0cnVjdF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htU3BpbkJveENhbGxiYWNrU3RydWN0XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1TcGluQm94Q2FsbGJhY2tTdHJ1Y3RfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1TcGluQm94Q2FsbGJhY2tTdHJ1Y3RfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dEJsb2NrUmVjXzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0QmxvY2tSZWNfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVRleHRCbG9ja1JlY18ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVRleHRCbG9ja1JlY18ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0VmVyaWZ5Q2FsbGJhY2tTdHJ1Y3RfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVRleHRWZXJpZnlDYWxsYmFja1N0cnVjdF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JXzNCST0KLU9TX21lbW1vdmVfX0lfM0JJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSV8zQklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSV8zQklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lfM0NJPQotT1NfbWVtbW92ZV9fSV8zQ0lfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JXzNDSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JXzNDSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSV8zSUk9Ci1PU19tZW1tb3ZlX19JXzNJSV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lfM0lJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lfM0lJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JXzNTST0KLU9TX21lbW1vdmVfX0lfM1NJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSV8zU0lfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSV8zU0lfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfVmlzdWFsXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfVmlzdWFsXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfVmlzdWFsXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfVmlzdWFsXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQW55RXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQW55RXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQW55RXZlbnRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQW55RXZlbnRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hCdXR0b25FdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hCdXR0b25FdmVudF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hCdXR0b25FdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hCdXR0b25FdmVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENoYXJTdHJ1Y3RfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ2hhclN0cnVjdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDaGFyU3RydWN0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENoYXJTdHJ1Y3RfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDbGllbnRNZXNzYWdlRXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ2xpZW50TWVzc2FnZUV2ZW50XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENsaWVudE1lc3NhZ2VFdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDbGllbnRNZXNzYWdlRXZlbnRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDb25maWd1cmVFdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDb25maWd1cmVFdmVudF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDb25maWd1cmVFdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDb25maWd1cmVFdmVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENyZWF0ZVdpbmRvd0V2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENyZWF0ZVdpbmRvd0V2ZW50XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENyZWF0ZVdpbmRvd0V2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENyZWF0ZVdpbmRvd0V2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ3Jvc3NpbmdFdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDcm9zc2luZ0V2ZW50XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENyb3NzaW5nRXZlbnRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ3Jvc3NpbmdFdmVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWERlc3Ryb3lXaW5kb3dFdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hEZXN0cm95V2luZG93RXZlbnRfMklJXzA9Y2FzdD12b2lkICosZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWERlc3Ryb3lXaW5kb3dFdmVudF8ySUlfMT1jYXN0PWNvbnN0IHZvaWQgKgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRGVzdHJveVdpbmRvd0V2ZW50XzJJSV8yPWNhc3Q9c2l6ZV90Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEV2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEV2ZW50XzJJSV8wPWNhc3Q9dm9pZCAqCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFdmVudF8ySUlfMT1jYXN0PWNvbnN0IHZvaWQgKgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRXZlbnRfMklJXzI9Y2FzdD1zaXplX3QKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRXhwb3NlRXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRXhwb3NlRXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRXhwb3NlRXZlbnRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRXhwb3NlRXZlbnRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hGb2N1c0NoYW5nZUV2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEZvY3VzQ2hhbmdlRXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRm9jdXNDaGFuZ2VFdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hGb2N1c0NoYW5nZUV2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRm9udFN0cnVjdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hGb250U3RydWN0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEZvbnRTdHJ1Y3RfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRm9udFN0cnVjdF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEljb25TaXplXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEljb25TaXplXzJJSV8wPWNhc3Q9dm9pZCAqLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hJY29uU2l6ZV8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hJY29uU2l6ZV8ySUlfMj1jYXN0PXNpemVfdAotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hJbWFnZV8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hJbWFnZV8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hJbWFnZV8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hJbWFnZV8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEtleUV2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEtleUV2ZW50XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEtleUV2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEtleUV2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YTW9kaWZpZXJLZXltYXBfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YTW9kaWZpZXJLZXltYXBfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YTW9kaWZpZXJLZXltYXBfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YTW9kaWZpZXJLZXltYXBfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hNb3Rpb25FdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hNb3Rpb25FdmVudF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hNb3Rpb25FdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hNb3Rpb25FdmVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWFByb3BlcnR5RXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YUHJvcGVydHlFdmVudF8ySUlfMD1jYXN0PXZvaWQgKixmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YUHJvcGVydHlFdmVudF8ySUlfMT1jYXN0PWNvbnN0IHZvaWQgKgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YUHJvcGVydHlFdmVudF8ySUlfMj1jYXN0PXNpemVfdAotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hSZXBhcmVudEV2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWFJlcGFyZW50RXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YUmVwYXJlbnRFdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hSZXBhcmVudEV2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YaW5lcmFtYVNjcmVlbkluZm9fMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YaW5lcmFtYVNjcmVlbkluZm9fMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YaW5lcmFtYVNjcmVlbkluZm9fMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YaW5lcmFtYVNjcmVlbkluZm9fMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htQW55Q2FsbGJhY2tTdHJ1Y3RfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbUFueUNhbGxiYWNrU3RydWN0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1BbnlDYWxsYmFja1N0cnVjdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htQW55Q2FsbGJhY2tTdHJ1Y3RfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJhZ1Byb2NDYWxsYmFja1N0cnVjdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJhZ1Byb2NDYWxsYmFja1N0cnVjdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJhZ1Byb2NDYWxsYmFja1N0cnVjdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJhZ1Byb2NDYWxsYmFja1N0cnVjdF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1Ecm9wRmluaXNoQ2FsbGJhY2tTdHJ1Y3RfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbURyb3BGaW5pc2hDYWxsYmFja1N0cnVjdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJvcEZpbmlzaENhbGxiYWNrU3RydWN0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1Ecm9wRmluaXNoQ2FsbGJhY2tTdHJ1Y3RfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJvcFByb2NDYWxsYmFja1N0cnVjdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJvcFByb2NDYWxsYmFja1N0cnVjdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJvcFByb2NDYWxsYmFja1N0cnVjdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJvcFByb2NDYWxsYmFja1N0cnVjdF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1TcGluQm94Q2FsbGJhY2tTdHJ1Y3RfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVNwaW5Cb3hDYWxsYmFja1N0cnVjdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htU3BpbkJveENhbGxiYWNrU3RydWN0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1TcGluQm94Q2FsbGJhY2tTdHJ1Y3RfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dEJsb2NrUmVjXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0QmxvY2tSZWNfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVRleHRCbG9ja1JlY18ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dEJsb2NrUmVjXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVRleHRWZXJpZnlDYWxsYmFja1N0cnVjdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0VmVyaWZ5Q2FsbGJhY2tTdHJ1Y3RfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVRleHRWZXJpZnlDYWxsYmFja1N0cnVjdF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX18zQklJPQotT1NfbWVtbW92ZV9fXzNCSUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19fM0JJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX18zQklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19fM0NJST0KLU9TX21lbW1vdmVfX18zQ0lJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fXzNDSUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19fM0NJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fXzNJSUk9Ci1PU19tZW1tb3ZlX19fM0lJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX18zSUlJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fXzNJSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX25sX2xhbmdpbmZvPQotT1NfbmxfbGFuZ2luZm9fMD0KLQotT1NfcGlwZT0KLU9TX3BpcGVfMD1jYXN0PShpbnQgKikKLQotT1NfcmVhZD0KLU9TX3JlYWRfMD0KLU9TX3JlYWRfMT1jYXN0PShjaGFyICopCi1PU19yZWFkXzI9Ci0KLU9TX3NlbGVjdD0KLU9TX3NlbGVjdF8wPQotT1Nfc2VsZWN0XzE9Y2FzdD0oZmRfc2V0ICopCi1PU19zZWxlY3RfMj1jYXN0PShmZF9zZXQgKikKLU9TX3NlbGVjdF8zPWNhc3Q9KGZkX3NldCAqKQotT1Nfc2VsZWN0XzQ9Y2FzdD0oc3RydWN0IHRpbWV2YWwgKikKLQotT1Nfc2V0UmVzb3VyY2VNZW09ZmxhZ3M9bm9fZ2VuCi1PU19zZXRSZXNvdXJjZU1lbV8wPQotT1Nfc2V0UmVzb3VyY2VNZW1fMT0KLQotT1Nfc2V0bG9jYWxlPQotT1Nfc2V0bG9jYWxlXzA9Ci1PU19zZXRsb2NhbGVfMT1jYXN0PShjaGFyICopCi0KLU9TX3N0cmxlbj0KLU9TX3N0cmxlbl8wPWNhc3Q9KGNoYXIgKikKLQotT1Nfd3JpdGU9Ci1PU193cml0ZV8wPQotT1Nfd3JpdGVfMT1jYXN0PShjaGFyICopCi1PU193cml0ZV8yPQotCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9WaXN1YWw9Ci1WaXN1YWxfZXh0X2RhdGE9Y2FzdD0oWEV4dERhdGEgKikKLVZpc3VhbF92aXN1YWxpZD0KLVZpc3VhbF9jX2NsYXNzPWFjY2Vzc29yPWNsYXNzCi1WaXN1YWxfcmVkX21hc2s9Ci1WaXN1YWxfZ3JlZW5fbWFzaz0KLVZpc3VhbF9ibHVlX21hc2s9Ci1WaXN1YWxfYml0c19wZXJfcmdiPQotVmlzdWFsX21hcF9lbnRyaWVzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEFueUV2ZW50PQotWEFueUV2ZW50X3NlcmlhbD0KLVhBbnlFdmVudF9zZW5kX2V2ZW50PQotWEFueUV2ZW50X2Rpc3BsYXk9Y2FzdD0oRGlzcGxheSAqKQotWEFueUV2ZW50X3dpbmRvdz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hCdXR0b25FdmVudD0KLVhCdXR0b25FdmVudF9yb290PQotWEJ1dHRvbkV2ZW50X3N1YndpbmRvdz0KLVhCdXR0b25FdmVudF90aW1lPQotWEJ1dHRvbkV2ZW50X3g9Ci1YQnV0dG9uRXZlbnRfeT0KLVhCdXR0b25FdmVudF94X3Jvb3Q9Ci1YQnV0dG9uRXZlbnRfeV9yb290PQotWEJ1dHRvbkV2ZW50X3N0YXRlPQotWEJ1dHRvbkV2ZW50X2J1dHRvbj0KLVhCdXR0b25FdmVudF9zYW1lX3NjcmVlbj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDaGFyU3RydWN0PQotWENoYXJTdHJ1Y3RfbGJlYXJpbmc9Ci1YQ2hhclN0cnVjdF9yYmVhcmluZz0KLVhDaGFyU3RydWN0X3dpZHRoPQotWENoYXJTdHJ1Y3RfYXNjZW50PQotWENoYXJTdHJ1Y3RfZGVzY2VudD0KLVhDaGFyU3RydWN0X2F0dHJpYnV0ZXM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ2xpZW50TWVzc2FnZUV2ZW50PQotWENsaWVudE1lc3NhZ2VFdmVudF9tZXNzYWdlX3R5cGU9Y2FzdD1BdG9tCi1YQ2xpZW50TWVzc2FnZUV2ZW50X2Zvcm1hdD0KLVhDbGllbnRNZXNzYWdlRXZlbnRfZGF0YT1hY2Nlc3Nvcj1kYXRhLmwsY2FzdD1sb25nICoKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDb2xvcj0KLVhDb2xvcl9waXhlbD0KLVhDb2xvcl9yZWQ9Ci1YQ29sb3JfZ3JlZW49Ci1YQ29sb3JfYmx1ZT0KLVhDb2xvcl9mbGFncz0KLVhDb2xvcl9wYWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ29uZmlndXJlRXZlbnQ9Ci1YQ29uZmlndXJlRXZlbnRfc2VyaWFsPQotWENvbmZpZ3VyZUV2ZW50X3NlbmRfZXZlbnQ9Ci1YQ29uZmlndXJlRXZlbnRfZGlzcGxheT1jYXN0PURpc3BsYXkgKgotWENvbmZpZ3VyZUV2ZW50X2V2ZW50PWNhc3Q9V2luZG93Ci1YQ29uZmlndXJlRXZlbnRfd2luZG93PWNhc3Q9V2luZG93Ci1YQ29uZmlndXJlRXZlbnRfeD0KLVhDb25maWd1cmVFdmVudF95PQotWENvbmZpZ3VyZUV2ZW50X3dpZHRoPQotWENvbmZpZ3VyZUV2ZW50X2hlaWdodD0KLVhDb25maWd1cmVFdmVudF9ib3JkZXJfd2lkdGg9Ci1YQ29uZmlndXJlRXZlbnRfYWJvdmU9Y2FzdD1XaW5kb3cKLVhDb25maWd1cmVFdmVudF9vdmVycmlkZV9yZWRpcmVjdD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDcmVhdGVXaW5kb3dFdmVudD0KLVhDcmVhdGVXaW5kb3dFdmVudF9zZXJpYWw9Ci1YQ3JlYXRlV2luZG93RXZlbnRfc2VuZF9ldmVudD0KLVhDcmVhdGVXaW5kb3dFdmVudF9kaXNwbGF5PWNhc3Q9KERpc3BsYXkgKikKLVhDcmVhdGVXaW5kb3dFdmVudF9wYXJlbnQ9Y2FzdD1XaW5kb3cKLVhDcmVhdGVXaW5kb3dFdmVudF93aW5kb3c9Y2FzdD1XaW5kb3cKLVhDcmVhdGVXaW5kb3dFdmVudF94PQotWENyZWF0ZVdpbmRvd0V2ZW50X3k9Ci1YQ3JlYXRlV2luZG93RXZlbnRfd2lkdGg9Ci1YQ3JlYXRlV2luZG93RXZlbnRfaGVpZ2h0PQotWENyZWF0ZVdpbmRvd0V2ZW50X2JvcmRlcl93aWR0aD0KLVhDcmVhdGVXaW5kb3dFdmVudF9vdmVycmlkZV9yZWRpcmVjdD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDcm9zc2luZ0V2ZW50PQotWENyb3NzaW5nRXZlbnRfcm9vdD0KLVhDcm9zc2luZ0V2ZW50X3N1YndpbmRvdz0KLVhDcm9zc2luZ0V2ZW50X3RpbWU9Ci1YQ3Jvc3NpbmdFdmVudF94PQotWENyb3NzaW5nRXZlbnRfeT0KLVhDcm9zc2luZ0V2ZW50X3hfcm9vdD0KLVhDcm9zc2luZ0V2ZW50X3lfcm9vdD0KLVhDcm9zc2luZ0V2ZW50X21vZGU9Ci1YQ3Jvc3NpbmdFdmVudF9kZXRhaWw9Ci1YQ3Jvc3NpbmdFdmVudF9zYW1lX3NjcmVlbj0KLVhDcm9zc2luZ0V2ZW50X2ZvY3VzPQotWENyb3NzaW5nRXZlbnRfc3RhdGU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRGVzdHJveVdpbmRvd0V2ZW50PQotWERlc3Ryb3lXaW5kb3dFdmVudF9zZXJpYWw9Ci1YRGVzdHJveVdpbmRvd0V2ZW50X3NlbmRfZXZlbnQ9Ci1YRGVzdHJveVdpbmRvd0V2ZW50X2Rpc3BsYXk9Y2FzdD1EaXNwbGF5ICoKLVhEZXN0cm95V2luZG93RXZlbnRfZXZlbnQ9Y2FzdD1XaW5kb3cKLVhEZXN0cm95V2luZG93RXZlbnRfd2luZG93PWNhc3Q9V2luZG93Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRXZlbnQ9Ci1YRXZlbnRfdHlwZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFeHBvc2VFdmVudD0KLVhFeHBvc2VFdmVudF94PQotWEV4cG9zZUV2ZW50X3k9Ci1YRXhwb3NlRXZlbnRfd2lkdGg9Ci1YRXhwb3NlRXZlbnRfaGVpZ2h0PQotWEV4cG9zZUV2ZW50X2NvdW50PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEZvY3VzQ2hhbmdlRXZlbnQ9Ci1YRm9jdXNDaGFuZ2VFdmVudF9tb2RlPQotWEZvY3VzQ2hhbmdlRXZlbnRfZGV0YWlsPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEZvbnRTdHJ1Y3Q9Ci1YRm9udFN0cnVjdF9leHRfZGF0YT1jYXN0PShYRXh0RGF0YSAqKQotWEZvbnRTdHJ1Y3RfZmlkPQotWEZvbnRTdHJ1Y3RfZGlyZWN0aW9uPQotWEZvbnRTdHJ1Y3RfbWluX2NoYXJfb3JfYnl0ZTI9Ci1YRm9udFN0cnVjdF9tYXhfY2hhcl9vcl9ieXRlMj0KLVhGb250U3RydWN0X21pbl9ieXRlMT0KLVhGb250U3RydWN0X21heF9ieXRlMT0KLVhGb250U3RydWN0X2FsbF9jaGFyc19leGlzdD0KLVhGb250U3RydWN0X2RlZmF1bHRfY2hhcj0KLVhGb250U3RydWN0X25fcHJvcGVydGllcz0KLVhGb250U3RydWN0X3Byb3BlcnRpZXM9Y2FzdD0oWEZvbnRQcm9wICopCi1YRm9udFN0cnVjdF9taW5fYm91bmRzX2xiZWFyaW5nPWFjY2Vzc29yPW1pbl9ib3VuZHMubGJlYXJpbmcKLVhGb250U3RydWN0X21pbl9ib3VuZHNfcmJlYXJpbmc9YWNjZXNzb3I9bWluX2JvdW5kcy5yYmVhcmluZwotWEZvbnRTdHJ1Y3RfbWluX2JvdW5kc193aWR0aD1hY2Nlc3Nvcj1taW5fYm91bmRzLndpZHRoCi1YRm9udFN0cnVjdF9taW5fYm91bmRzX2FzY2VudD1hY2Nlc3Nvcj1taW5fYm91bmRzLmFzY2VudAotWEZvbnRTdHJ1Y3RfbWluX2JvdW5kc19kZXNjZW50PWFjY2Vzc29yPW1pbl9ib3VuZHMuZGVzY2VudAotWEZvbnRTdHJ1Y3RfbWluX2JvdW5kc19hdHRyaWJ1dGVzPWFjY2Vzc29yPW1pbl9ib3VuZHMuYXR0cmlidXRlcwotWEZvbnRTdHJ1Y3RfbWF4X2JvdW5kc19sYmVhcmluZz1hY2Nlc3Nvcj1tYXhfYm91bmRzLmxiZWFyaW5nCi1YRm9udFN0cnVjdF9tYXhfYm91bmRzX3JiZWFyaW5nPWFjY2Vzc29yPW1heF9ib3VuZHMucmJlYXJpbmcKLVhGb250U3RydWN0X21heF9ib3VuZHNfd2lkdGg9YWNjZXNzb3I9bWF4X2JvdW5kcy53aWR0aAotWEZvbnRTdHJ1Y3RfbWF4X2JvdW5kc19hc2NlbnQ9YWNjZXNzb3I9bWF4X2JvdW5kcy5hc2NlbnQKLVhGb250U3RydWN0X21heF9ib3VuZHNfZGVzY2VudD1hY2Nlc3Nvcj1tYXhfYm91bmRzLmRlc2NlbnQKLVhGb250U3RydWN0X21heF9ib3VuZHNfYXR0cmlidXRlcz1hY2Nlc3Nvcj1tYXhfYm91bmRzLmF0dHJpYnV0ZXMKLVhGb250U3RydWN0X3Blcl9jaGFyPWNhc3Q9KFhDaGFyU3RydWN0ICopCi1YRm9udFN0cnVjdF9hc2NlbnQ9Ci1YRm9udFN0cnVjdF9kZXNjZW50PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEdDVmFsdWVzPQotWEdDVmFsdWVzX2Z1bmN0aW9uPQotWEdDVmFsdWVzX3BsYW5lX21hc2s9Ci1YR0NWYWx1ZXNfZm9yZWdyb3VuZD0KLVhHQ1ZhbHVlc19iYWNrZ3JvdW5kPQotWEdDVmFsdWVzX2xpbmVfd2lkdGg9Ci1YR0NWYWx1ZXNfbGluZV9zdHlsZT0KLVhHQ1ZhbHVlc19jYXBfc3R5bGU9Ci1YR0NWYWx1ZXNfam9pbl9zdHlsZT0KLVhHQ1ZhbHVlc19maWxsX3N0eWxlPQotWEdDVmFsdWVzX2ZpbGxfcnVsZT0KLVhHQ1ZhbHVlc19hcmNfbW9kZT0KLVhHQ1ZhbHVlc190aWxlPQotWEdDVmFsdWVzX3N0aXBwbGU9Ci1YR0NWYWx1ZXNfdHNfeF9vcmlnaW49Ci1YR0NWYWx1ZXNfdHNfeV9vcmlnaW49Ci1YR0NWYWx1ZXNfZm9udD0KLVhHQ1ZhbHVlc19zdWJ3aW5kb3dfbW9kZT0KLVhHQ1ZhbHVlc19ncmFwaGljc19leHBvc3VyZXM9Ci1YR0NWYWx1ZXNfY2xpcF94X29yaWdpbj0KLVhHQ1ZhbHVlc19jbGlwX3lfb3JpZ2luPQotWEdDVmFsdWVzX2NsaXBfbWFzaz0KLVhHQ1ZhbHVlc19kYXNoX29mZnNldD0KLVhHQ1ZhbHVlc19kYXNoZXM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YSWNvblNpemU9Ci1YSWNvblNpemVfbWluX3dpZHRoPQotWEljb25TaXplX21pbl9oZWlnaHQ9Ci1YSWNvblNpemVfbWF4X3dpZHRoPQotWEljb25TaXplX21heF9oZWlnaHQ9Ci1YSWNvblNpemVfd2lkdGhfaW5jPQotWEljb25TaXplX2hlaWdodF9pbmM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YSW1hZ2U9Ci1YSW1hZ2Vfd2lkdGg9Ci1YSW1hZ2VfaGVpZ2h0PQotWEltYWdlX3hvZmZzZXQ9Ci1YSW1hZ2VfZm9ybWF0PQotWEltYWdlX2RhdGE9Y2FzdD0oY2hhciAqKQotWEltYWdlX2J5dGVfb3JkZXI9Ci1YSW1hZ2VfYml0bWFwX3VuaXQ9Ci1YSW1hZ2VfYml0bWFwX2JpdF9vcmRlcj0KLVhJbWFnZV9iaXRtYXBfcGFkPQotWEltYWdlX2RlcHRoPQotWEltYWdlX2J5dGVzX3Blcl9saW5lPQotWEltYWdlX2JpdHNfcGVyX3BpeGVsPQotWEltYWdlX3JlZF9tYXNrPQotWEltYWdlX2dyZWVuX21hc2s9Ci1YSW1hZ2VfYmx1ZV9tYXNrPQotWEltYWdlX29iZGF0YT1jYXN0PShYUG9pbnRlcikKLVhJbWFnZV9jcmVhdGVfaW1hZ2U9YWNjZXNzb3I9Zi5jcmVhdGVfaW1hZ2UsY2FzdD0oWEltYWdlICooKikoKSkKLVhJbWFnZV9kZXN0cm95X2ltYWdlPWFjY2Vzc29yPWYuZGVzdHJveV9pbWFnZSxjYXN0PShpbnQoKikoKSkKLVhJbWFnZV9nZXRfcGl4ZWw9YWNjZXNzb3I9Zi5nZXRfcGl4ZWwsY2FzdD0odW5zaWduZWQgbG9uZygqKSgpKQotWEltYWdlX3B1dF9waXhlbD1hY2Nlc3Nvcj1mLnB1dF9waXhlbCxjYXN0PShpbnQoKikoKSkKLVhJbWFnZV9zdWJfaW1hZ2U9YWNjZXNzb3I9Zi5zdWJfaW1hZ2UsY2FzdD0oWEltYWdlICooKikoKSkKLVhJbWFnZV9hZGRfcGl4ZWw9YWNjZXNzb3I9Zi5hZGRfcGl4ZWwsY2FzdD0oaW50KCopKCkpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YS2V5RXZlbnQ9Ci1YS2V5RXZlbnRfcm9vdD0KLVhLZXlFdmVudF9zdWJ3aW5kb3c9Ci1YS2V5RXZlbnRfdGltZT0KLVhLZXlFdmVudF94PQotWEtleUV2ZW50X3k9Ci1YS2V5RXZlbnRfeF9yb290PQotWEtleUV2ZW50X3lfcm9vdD0KLVhLZXlFdmVudF9zdGF0ZT0KLVhLZXlFdmVudF9rZXljb2RlPQotWEtleUV2ZW50X3NhbWVfc2NyZWVuPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWE1vZGlmaWVyS2V5bWFwPQotWE1vZGlmaWVyS2V5bWFwX21heF9rZXlwZXJtb2Q9Ci1YTW9kaWZpZXJLZXltYXBfbW9kaWZpZXJtYXA9Y2FzdD0oS2V5Q29kZSAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWE1vdGlvbkV2ZW50PQotWE1vdGlvbkV2ZW50X3Jvb3Q9Ci1YTW90aW9uRXZlbnRfc3Vid2luZG93PQotWE1vdGlvbkV2ZW50X3RpbWU9Ci1YTW90aW9uRXZlbnRfeD0KLVhNb3Rpb25FdmVudF95PQotWE1vdGlvbkV2ZW50X3hfcm9vdD0KLVhNb3Rpb25FdmVudF95X3Jvb3Q9Ci1YTW90aW9uRXZlbnRfc3RhdGU9Ci1YTW90aW9uRXZlbnRfaXNfaGludD0KLVhNb3Rpb25FdmVudF9zYW1lX3NjcmVlbj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hQcm9wZXJ0eUV2ZW50PQotWFByb3BlcnR5RXZlbnRfYXRvbT0KLVhQcm9wZXJ0eUV2ZW50X3RpbWU9Ci1YUHJvcGVydHlFdmVudF9zdGF0ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hSZWN0YW5nbGU9Ci1YUmVjdGFuZ2xlX3g9Ci1YUmVjdGFuZ2xlX3k9Ci1YUmVjdGFuZ2xlX3dpZHRoPQotWFJlY3RhbmdsZV9oZWlnaHQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXM9Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfcmVwZWF0PQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2FscGhhX21hcD0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19hbHBoYV94X29yaWdpbj0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19hbHBoYV95X29yaWdpbj0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19jbGlwX3hfb3JpZ2luPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2NsaXBfeV9vcmlnaW49Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfY2xpcF9tYXNrPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2dyYXBoaWNzX2V4cG9zdXJlcz0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19zdWJ3aW5kb3dfbW9kZT0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19wb2x5X2VkZ2U9Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfcG9seV9tb2RlPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2RpdGhlcj0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19jb21wb25lbnRfYWxwaGE9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YUmVwYXJlbnRFdmVudD0KLVhSZXBhcmVudEV2ZW50X3NlcmlhbD0KLVhSZXBhcmVudEV2ZW50X3NlbmRfZXZlbnQ9Ci1YUmVwYXJlbnRFdmVudF9kaXNwbGF5PWNhc3Q9RGlzcGxheSAqCi1YUmVwYXJlbnRFdmVudF9ldmVudD1jYXN0PVdpbmRvdwotWFJlcGFyZW50RXZlbnRfd2luZG93PWNhc3Q9V2luZG93Ci1YUmVwYXJlbnRFdmVudF9wYXJlbnQ9Y2FzdD1XaW5kb3cKLVhSZXBhcmVudEV2ZW50X3g9Ci1YUmVwYXJlbnRFdmVudF95PQotWFJlcGFyZW50RXZlbnRfb3ZlcnJpZGVfcmVkaXJlY3Q9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YU2V0V2luZG93QXR0cmlidXRlcz0KLVhTZXRXaW5kb3dBdHRyaWJ1dGVzX2JhY2tncm91bmRfcGl4bWFwPQotWFNldFdpbmRvd0F0dHJpYnV0ZXNfYmFja2dyb3VuZF9waXhlbD0KLVhTZXRXaW5kb3dBdHRyaWJ1dGVzX2JvcmRlcl9waXhtYXA9Ci1YU2V0V2luZG93QXR0cmlidXRlc19ib3JkZXJfcGl4ZWw9Ci1YU2V0V2luZG93QXR0cmlidXRlc19iaXRfZ3Jhdml0eT0KLVhTZXRXaW5kb3dBdHRyaWJ1dGVzX3dpbl9ncmF2aXR5PQotWFNldFdpbmRvd0F0dHJpYnV0ZXNfYmFja2luZ19zdG9yZT0KLVhTZXRXaW5kb3dBdHRyaWJ1dGVzX2JhY2tpbmdfcGxhbmVzPQotWFNldFdpbmRvd0F0dHJpYnV0ZXNfYmFja2luZ19waXhlbD0KLVhTZXRXaW5kb3dBdHRyaWJ1dGVzX3NhdmVfdW5kZXI9Ci1YU2V0V2luZG93QXR0cmlidXRlc19ldmVudF9tYXNrPQotWFNldFdpbmRvd0F0dHJpYnV0ZXNfZG9fbm90X3Byb3BhZ2F0ZV9tYXNrPQotWFNldFdpbmRvd0F0dHJpYnV0ZXNfb3ZlcnJpZGVfcmVkaXJlY3Q9Ci1YU2V0V2luZG93QXR0cmlidXRlc19jb2xvcm1hcD0KLVhTZXRXaW5kb3dBdHRyaWJ1dGVzX2N1cnNvcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hTaXplSGludHM9Ci1YU2l6ZUhpbnRzX2ZsYWdzPQotWFNpemVIaW50c194PQotWFNpemVIaW50c195PQotWFNpemVIaW50c193aWR0aD0KLVhTaXplSGludHNfaGVpZ2h0PQotWFNpemVIaW50c19taW5fd2lkdGg9Ci1YU2l6ZUhpbnRzX21pbl9oZWlnaHQ9Ci1YU2l6ZUhpbnRzX21heF93aWR0aD0KLVhTaXplSGludHNfbWF4X2hlaWdodD0KLVhTaXplSGludHNfd2lkdGhfaW5jPQotWFNpemVIaW50c19oZWlnaHRfaW5jPQotWFNpemVIaW50c19hc3BlY3RfeD1hY2Nlc3Nvcj1taW5fYXNwZWN0LngKLVhTaXplSGludHNfYXNwZWN0X3k9YWNjZXNzb3I9bWluX2FzcGVjdC55Ci1YU2l6ZUhpbnRzX2Jhc2Vfd2lkdGg9Ci1YU2l6ZUhpbnRzX2Jhc2VfaGVpZ2h0PQotWFNpemVIaW50c193aW5fZ3Jhdml0eT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hUZXh0UHJvcGVydHk9Ci1YVGV4dFByb3BlcnR5X3ZhbHVlPWNhc3Q9KHVuc2lnbmVkIGNoYXIgKikKLVhUZXh0UHJvcGVydHlfZW5jb2Rpbmc9Ci1YVGV4dFByb3BlcnR5X2Zvcm1hdD0KLVhUZXh0UHJvcGVydHlfbml0ZW1zPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWFdpbmRvd0F0dHJpYnV0ZXM9Ci1YV2luZG93QXR0cmlidXRlc194PQotWFdpbmRvd0F0dHJpYnV0ZXNfeT0KLVhXaW5kb3dBdHRyaWJ1dGVzX3dpZHRoPQotWFdpbmRvd0F0dHJpYnV0ZXNfaGVpZ2h0PQotWFdpbmRvd0F0dHJpYnV0ZXNfYm9yZGVyX3dpZHRoPQotWFdpbmRvd0F0dHJpYnV0ZXNfZGVwdGg9Ci1YV2luZG93QXR0cmlidXRlc192aXN1YWw9Y2FzdD0oVmlzdWFsICopCi1YV2luZG93QXR0cmlidXRlc19yb290PQotWFdpbmRvd0F0dHJpYnV0ZXNfY19jbGFzcz1hY2Nlc3Nvcj1jbGFzcwotWFdpbmRvd0F0dHJpYnV0ZXNfYml0X2dyYXZpdHk9Ci1YV2luZG93QXR0cmlidXRlc193aW5fZ3Jhdml0eT0KLVhXaW5kb3dBdHRyaWJ1dGVzX2JhY2tpbmdfc3RvcmU9Ci1YV2luZG93QXR0cmlidXRlc19iYWNraW5nX3BsYW5lcz0KLVhXaW5kb3dBdHRyaWJ1dGVzX2JhY2tpbmdfcGl4ZWw9Ci1YV2luZG93QXR0cmlidXRlc19zYXZlX3VuZGVyPQotWFdpbmRvd0F0dHJpYnV0ZXNfY29sb3JtYXA9Ci1YV2luZG93QXR0cmlidXRlc19tYXBfaW5zdGFsbGVkPQotWFdpbmRvd0F0dHJpYnV0ZXNfbWFwX3N0YXRlPQotWFdpbmRvd0F0dHJpYnV0ZXNfYWxsX2V2ZW50X21hc2tzPQotWFdpbmRvd0F0dHJpYnV0ZXNfeW91cl9ldmVudF9tYXNrPQotWFdpbmRvd0F0dHJpYnV0ZXNfZG9fbm90X3Byb3BhZ2F0ZV9tYXNrPQotWFdpbmRvd0F0dHJpYnV0ZXNfb3ZlcnJpZGVfcmVkaXJlY3Q9Ci1YV2luZG93QXR0cmlidXRlc19zY3JlZW49Y2FzdD0oU2NyZWVuICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YV2luZG93Q2hhbmdlcz0KLVhXaW5kb3dDaGFuZ2VzX3g9Ci1YV2luZG93Q2hhbmdlc195PQotWFdpbmRvd0NoYW5nZXNfd2lkdGg9Ci1YV2luZG93Q2hhbmdlc19oZWlnaHQ9Ci1YV2luZG93Q2hhbmdlc19ib3JkZXJfd2lkdGg9Ci1YV2luZG93Q2hhbmdlc19zaWJsaW5nPQotWFdpbmRvd0NoYW5nZXNfc3RhY2tfbW9kZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hpbmVyYW1hU2NyZWVuSW5mbz0KLVhpbmVyYW1hU2NyZWVuSW5mb19zY3JlZW5fbnVtYmVyPQotWGluZXJhbWFTY3JlZW5JbmZvX3hfb3JnPQotWGluZXJhbWFTY3JlZW5JbmZvX3lfb3JnPQotWGluZXJhbWFTY3JlZW5JbmZvX3dpZHRoPQotWGluZXJhbWFTY3JlZW5JbmZvX2hlaWdodD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htQW55Q2FsbGJhY2tTdHJ1Y3Q9Ci1YbUFueUNhbGxiYWNrU3RydWN0X3JlYXNvbj0KLVhtQW55Q2FsbGJhY2tTdHJ1Y3RfZXZlbnQ9Y2FzdD0oWEV2ZW50ICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbURyYWdQcm9jQ2FsbGJhY2tTdHJ1Y3Q9Ci1YbURyYWdQcm9jQ2FsbGJhY2tTdHJ1Y3RfdGltZVN0YW1wPQotWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0X2RyYWdDb250ZXh0PWNhc3Q9KFdpZGdldCkKLVhtRHJhZ1Byb2NDYWxsYmFja1N0cnVjdF94PQotWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0X3k9Ci1YbURyYWdQcm9jQ2FsbGJhY2tTdHJ1Y3RfZHJvcFNpdGVTdGF0dXM9Ci1YbURyYWdQcm9jQ2FsbGJhY2tTdHJ1Y3Rfb3BlcmF0aW9uPQotWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0X29wZXJhdGlvbnM9Ci1YbURyYWdQcm9jQ2FsbGJhY2tTdHJ1Y3RfYW5pbWF0ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJvcEZpbmlzaENhbGxiYWNrU3RydWN0PQotWG1Ecm9wRmluaXNoQ2FsbGJhY2tTdHJ1Y3RfdGltZVN0YW1wPQotWG1Ecm9wRmluaXNoQ2FsbGJhY2tTdHJ1Y3Rfb3BlcmF0aW9uPQotWG1Ecm9wRmluaXNoQ2FsbGJhY2tTdHJ1Y3Rfb3BlcmF0aW9ucz0KLVhtRHJvcEZpbmlzaENhbGxiYWNrU3RydWN0X2Ryb3BTaXRlU3RhdHVzPQotWG1Ecm9wRmluaXNoQ2FsbGJhY2tTdHJ1Y3RfZHJvcEFjdGlvbj0KLVhtRHJvcEZpbmlzaENhbGxiYWNrU3RydWN0X2NvbXBsZXRpb25TdGF0dXM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbURyb3BQcm9jQ2FsbGJhY2tTdHJ1Y3Q9Ci1YbURyb3BQcm9jQ2FsbGJhY2tTdHJ1Y3RfdGltZVN0YW1wPQotWG1Ecm9wUHJvY0NhbGxiYWNrU3RydWN0X2RyYWdDb250ZXh0PWNhc3Q9KFdpZGdldCkKLVhtRHJvcFByb2NDYWxsYmFja1N0cnVjdF94PQotWG1Ecm9wUHJvY0NhbGxiYWNrU3RydWN0X3k9Ci1YbURyb3BQcm9jQ2FsbGJhY2tTdHJ1Y3RfZHJvcFNpdGVTdGF0dXM9Ci1YbURyb3BQcm9jQ2FsbGJhY2tTdHJ1Y3Rfb3BlcmF0aW9uPQotWG1Ecm9wUHJvY0NhbGxiYWNrU3RydWN0X29wZXJhdGlvbnM9Ci1YbURyb3BQcm9jQ2FsbGJhY2tTdHJ1Y3RfZHJvcEFjdGlvbj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htU3BpbkJveENhbGxiYWNrU3RydWN0PQotWG1TcGluQm94Q2FsbGJhY2tTdHJ1Y3Rfd2lkZ2V0PWNhc3Q9V2lkZ2V0Ci1YbVNwaW5Cb3hDYWxsYmFja1N0cnVjdF9kb2l0PWNhc3Q9Qm9vbGVhbgotWG1TcGluQm94Q2FsbGJhY2tTdHJ1Y3RfcG9zaXRpb249Ci1YbVNwaW5Cb3hDYWxsYmFja1N0cnVjdF92YWx1ZT1jYXN0PVhtU3RyaW5nCi1YbVNwaW5Cb3hDYWxsYmFja1N0cnVjdF9jcm9zc2VkX2JvdW5kYXJ5PWNhc3Q9Qm9vbGVhbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0QmxvY2tSZWM9Ci1YbVRleHRCbG9ja1JlY19wdHI9Y2FzdD0oY2hhciAqKQotWG1UZXh0QmxvY2tSZWNfbGVuZ3RoPQotWG1UZXh0QmxvY2tSZWNfZm9ybWF0PWNhc3Q9KFhtVGV4dEZvcm1hdCkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0PQotWG1UZXh0VmVyaWZ5Q2FsbGJhY2tTdHJ1Y3RfZG9pdD0KLVhtVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0X2N1cnJJbnNlcnQ9Ci1YbVRleHRWZXJpZnlDYWxsYmFja1N0cnVjdF9uZXdJbnNlcnQ9Ci1YbVRleHRWZXJpZnlDYWxsYmFja1N0cnVjdF9zdGFydFBvcz0KLVhtVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0X2VuZFBvcz0KLVhtVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0X3RleHQ9Y2FzdD0oWG1UZXh0QmxvY2spCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YdFdpZGdldEdlb21ldHJ5PQotWHRXaWRnZXRHZW9tZXRyeV9yZXF1ZXN0X21vZGU9Ci1YdFdpZGdldEdlb21ldHJ5X3g9Ci1YdFdpZGdldEdlb21ldHJ5X3k9Ci1YdFdpZGdldEdlb21ldHJ5X3dpZHRoPQotWHRXaWRnZXRHZW9tZXRyeV9oZWlnaHQ9Ci1YdFdpZGdldEdlb21ldHJ5X2JvcmRlcl93aWR0aD0KLVh0V2lkZ2V0R2VvbWV0cnlfc2libGluZz1jYXN0PShXaWRnZXQpCi1YdFdpZGdldEdlb21ldHJ5X3N0YWNrX21vZGU9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW96aWxsYS5YUENPTS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5tb3ppbGxhLlhQQ09NLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MDUyODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5tb3ppbGxhLlhQQ09NLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5MzcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfWFBDT009ZmxhZ3M9Y3BwCi1YUENPTV9DYWxsPQotWFBDT01fQ2FsbF8wPWNhc3Q9KG5zV3JpdGVTZWdtZW50RnVuKQotWFBDT01fQ2FsbF8xPWNhc3Q9KG5zSUlucHV0U3RyZWFtICopCi1YUENPTV9DYWxsXzI9Y2FzdD0odm9pZCAqKQotWFBDT01fQ2FsbF8zPWNhc3Q9KGNvbnN0IGNoYXIgKikKLVhQQ09NX0NhbGxfND0KLVhQQ09NX0NhbGxfNT0KLVhQQ09NX0NhbGxfNj1jYXN0PShQUlVpbnQzMiAqKQotCi1YUENPTV9OU19HZXRDb21wb25lbnRNYW5hZ2VyPQotWFBDT01fTlNfR2V0Q29tcG9uZW50TWFuYWdlcl8wPWNhc3Q9KG5zSUNvbXBvbmVudE1hbmFnZXIqKikKLQotWFBDT01fTlNfR2V0U2VydmljZU1hbmFnZXI9Ci1YUENPTV9OU19HZXRTZXJ2aWNlTWFuYWdlcl8wPWNhc3Q9KG5zSVNlcnZpY2VNYW5hZ2VyKiopCi0KLVhQQ09NX05TX0luaXRFbWJlZGRpbmc9Ci1YUENPTV9OU19Jbml0RW1iZWRkaW5nXzA9Y2FzdD0obnNJTG9jYWxGaWxlICopCi1YUENPTV9OU19Jbml0RW1iZWRkaW5nXzE9Y2FzdD0obnNJRGlyZWN0b3J5U2VydmljZVByb3ZpZGVyICopCi0KLVhQQ09NX05TX05ld0xvY2FsRmlsZT0KLVhQQ09NX05TX05ld0xvY2FsRmlsZV8wPWNhc3Q9KG5zQVN0cmluZyAqKSxmbGFncz1zdHJ1Y3QKLVhQQ09NX05TX05ld0xvY2FsRmlsZV8xPQotWFBDT01fTlNfTmV3TG9jYWxGaWxlXzI9Y2FzdD0obnNJTG9jYWxGaWxlKiopCi0KLVhQQ09NX05TX1Rlcm1FbWJlZGRpbmc9Ci0KLVhQQ09NX1BSX0ZyZWU9Ci1YUENPTV9QUl9GcmVlXzA9Y2FzdD0odm9pZCAqKQotCi1YUENPTV9QUl9NYWxsb2M9Ci1YUENPTV9QUl9NYWxsb2NfMD0KLQotWFBDT01fVnRibENhbGxfX0lJPQotWFBDT01fVnRibENhbGxfX0lJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfMT0KLQotWFBDT01fVnRibENhbGxfX0lJRj0KLVhQQ09NX1Z0YmxDYWxsX19JSUZfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUZfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUZfMj0KLQotWFBDT01fVnRibENhbGxfX0lJST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfMj0KLQotWFBDT01fVnRibENhbGxfX0lJSUlJPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8yPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfND0KLQotWFBDT01fVnRibENhbGxfX0lJSUlJST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlfNT0KLQotWFBDT01fVnRibENhbGxfX0lJSUlJSUk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSV8wPQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSV8zPQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSV82PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSUk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV8xPQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV80PQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlJXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfNj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV83PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJWl8xPQotWFBDT01fVnRibENhbGxfX0lJSUlJSVpfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJWl80PQotWFBDT01fVnRibENhbGxfX0lJSUlJSVpfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlaXzY9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVo9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV82PQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJXzc9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfOD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV85PQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJXzEwPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJXzExPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJXzEyPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJXzEzPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0M9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0NfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zQ18xPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNDXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0NfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zQ180PQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNDXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0lfNT0KLQotWFBDT01fVnRibENhbGxfX0lJSUlKWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSlpfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSlpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSlpfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSlpfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSlpfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSlpfNT0KLQotWFBDT01fVnRibENhbGxfX0lJSUlaPQotWFBDT01fVnRibENhbGxfX0lJSUlaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSVpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJWl8yPQotWFBDT01fVnRibENhbGxfX0lJSUlaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSVpfND0KLQotWFBDT01fVnRibENhbGxfX0lJSUlfM0M9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQ18wPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQ18zPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NfND0KLQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NJSkk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQ0lKSV8wPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NJSklfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDSUpJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQ0lKSV8zPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NJSklfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDSUpJXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQ0lKSV82PQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NJSklfNz0KLQotWFBDT01fVnRibENhbGxfX0lJSUlfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0lfND0KLQotWFBDT01fVnRibENhbGxfX0lJSUlfM0o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zSl8wPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNKXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zSl8zPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0pfND0KLQotWFBDT01fVnRibENhbGxfX0lJSUpKPQotWFBDT01fVnRibENhbGxfX0lJSUpKXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSkpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlKSl8yPQotWFBDT01fVnRibENhbGxfX0lJSUpKXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSkpfND0KLQotWFBDT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8wPQotWFBDT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWl8xPQotWFBDT01fVnRibENhbGxfX0lJSVpfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWl8wPQotWFBDT01fVnRibENhbGxfX0lJSVpaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWl8zPQotWFBDT01fVnRibENhbGxfX0lJSVpaXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSV8yPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSV81PQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlfNj0KLQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV8yPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV81PQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfNz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV84PQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfMTA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfMTE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfMTI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfMTM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfMTQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfMTU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfMTY9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaXzNaPQotWFBDT01fVnRibENhbGxfX0lJSVpfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWl8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJSVpfM1pfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaXzNaXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JJXzNJPQotWFBDT01fVnRibENhbGxfX0lJSV8zQklfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JJXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCSV8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJSV8zQklfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JJXzNJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCSV8zSV81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNCXzNCSV8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0JfM0JJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNCXzNCSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zQl8zQklfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0JfM0JJXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNCXzNCSV8zSV80PQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zQl8zQklfM0lfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0JfM0JJXzNJXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNCXzNCSV8zSV83PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNaPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zWl8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zWl80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18xPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18yPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDSV8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18xPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18yPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ180PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNDXzNDXzNDXzNDXzNaXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNDXzNDXzNDXzNDXzNaXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zSV80PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0lfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNDXzNDXzNDXzNDXzNaXzNJXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zSV83PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0lfOD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNDXzNDXzNDXzNDXzNaXzNJXzk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zSV8xMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNDXzNDXzNDXzNDXzNaXzNJXzExPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zSV8zSV8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNJXzNJXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zSV8zSV8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0lfM0lfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNJXzNJXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zSV8zSV8zWl80PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0lfM0lfM1pfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNJXzNJXzNaXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zSV8zSV8zWl83PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0lfM0lfM1pfOD0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zQ18zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1pfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1pfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1pfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1pfNj0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zQ18zWl8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1pfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1pfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1pfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1pfM1pfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1pfM1pfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1pfM1pfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1pfM1pfNj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1pfM1pfNz0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfNT0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zQ18zWl8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0NfM1pfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0NfM1pfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0NfM1pfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0NfM1pfM1pfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0NfM1pfM1pfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0NfM1pfM1pfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0NfM1pfM1pfNj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0NfM1pfM1pfNz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0NfM1pfM1pfOD0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zSV8zQ18zWl8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0lfM0NfM1pfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0lfM0NfM1pfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0lfM0NfM1pfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0lfM0NfM1pfM1pfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0lfM0NfM1pfM1pfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0lfM0NfM1pfM1pfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0lfM0NfM1pfM1pfNj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0lfM0NfM1pfM1pfNz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0lfM0NfM1pfM1pfOD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0lfM0NfM1pfM1pfOT0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM1pfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM1pfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM1pfNT0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0lfMz0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zSV8zSV8zSV8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0lfM0lfM0lfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0lfM0lfM0lfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0lfM0lfM0lfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0lfM0lfM0lfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0lfM0lfM0lfM0lfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0lfM0lfM0lfM0lfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0lfM0lfM0lfM0lfNj0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM1pfMz0KLQotWFBDT01fVnRibENhbGxfX0lJSj0KLVhQQ09NX1Z0YmxDYWxsX19JSUpfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUpfMj0KLQotWFBDT01fVnRibENhbGxfX0lJSkk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSV8wPQotWFBDT01fVnRibENhbGxfX0lJSklfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUpJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSV8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlKSj0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSl8xPQotWFBDT01fVnRibENhbGxfX0lJSkpfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKST0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSV8wPQotWFBDT01fVnRibENhbGxfX0lJSkpJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSklfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSV8zPQotWFBDT01fVnRibENhbGxfX0lJSkpJXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSkpKPQotWFBDT01fVnRibENhbGxfX0lJSkpKSkpfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSkpKXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSkpKSl8yPQotWFBDT01fVnRibENhbGxfX0lJSkpKSkpfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSkpKXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSkpKSl81PQotWFBDT01fVnRibENhbGxfX0lJSkpKSkpfNj0KLQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMkk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySV8wPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySV8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV80PQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV8yPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV8zQl8zQj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzNCXzNCXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV8zQl8zQl8xPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfM0JfM0JfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzNCXzNCXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV8zQl8zQl80PQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfM0JfM0JfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzNCXzNCXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV8zQl8zQl83PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlaPQotWFBDT01fVnRibENhbGxfX0lJWl8wPQotWFBDT01fVnRibENhbGxfX0lJWl8xPQotWFBDT01fVnRibENhbGxfX0lJWl8yPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlaST0KLVhQQ09NX1Z0YmxDYWxsX19JSVpJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlaSV8xPQotWFBDT01fVnRibENhbGxfX0lJWklfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSVpJXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSVpfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlaXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlaXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlaXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlaXzNaXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfMj0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCST0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklfMz0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJXzNCSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfND0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJXzNJXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQko9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JKXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JKXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JKXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JKXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpJXzNJXzNaPQotWFBDT01fVnRibENhbGxfX0lJXzNCWklfM0lfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpJXzNJXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaSV8zSV8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCWklfM0lfM1pfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpJXzNJXzNaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaSV8zSV8zWl81PQotWFBDT01fVnRibENhbGxfX0lJXzNCWklfM0lfM1pfNj0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCWl8zSV8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpfM0lfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpfM0lfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpfM0lfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpfM0lfM1pfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpfM0lfM1pfND0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpfM0lfM1pfNT0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCWj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQlpfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQlpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQlpfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQlpfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQlpfND0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzNCWlpfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0JaWl8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzNCWlpfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zQlpaXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0JaWl8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzNCWlpfM0lfND0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zQlpaXzNJXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0JaWl8zSV82PQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzNCWlpfM0lfNz0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzNJPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0lfND0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSV8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSV8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSV8zWl8zPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzNaXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNKXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM1pfMz0KLQotWFBDT01fVnRibENhbGxfX0lJXzNDPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18yPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJPQotWFBDT01fVnRibENhbGxfX0lJXzNDSUlJSV8wPQotWFBDT01fVnRibENhbGxfX0lJXzNDSUlJSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNDSUlJSV8yPQotWFBDT01fVnRibENhbGxfX0lJXzNDSUlJSV8zPQotWFBDT01fVnRibENhbGxfX0lJXzNDSUlJSV80PQotWFBDT01fVnRibENhbGxfX0lJXzNDSUlJSV81PQotWFBDT01fVnRibENhbGxfX0lJXzNDSUlJSV82PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJXzNJPQotWFBDT01fVnRibENhbGxfX0lJXzNDSV8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJXzNDSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNDSV8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJXzNDSV8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJXzNDSV8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0NaPQotWFBDT01fVnRibENhbGxfX0lJXzNDWl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNDWl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNDWl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNDWl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM0M9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM0NfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zQ18xPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM0NfMz0KLQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zQ18zQ1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zQ18zQ1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zQ18zQ1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zQ18zQ1pfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zQ18zQ1pfND0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zQ18zQ1pfNT0KLQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNaPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zWl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNaXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zRj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zRl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNGXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0ZfMj0KLQotWFBDT01fVnRibENhbGxfX0lJXzNJPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8yPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfMz0KLQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzNJPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfND0KLQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzNJXzNJPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzNJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zSV8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzNJXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfM0lfND0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zSV8zSV81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNKXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0pfMz0KLQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNKXzNJPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNKXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0pfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSl8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNKXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0pfM0lfND0KLQotWFBDT01fVnRibENhbGxfX0lJXzNKPQotWFBDT01fVnRibENhbGxfX0lJXzNKXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSl8yPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM1M9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM1NfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zU18xPQotWFBDT01fVnRibENhbGxfX0lJXzNTXzI9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM1pfMj0KLQotWFBDT01fbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJPQotWFBDT01fbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJXzA9Y2FzdD0odm9pZCAqKQotWFBDT01fbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotWFBDT01fbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1YUENPTV9tZW1tb3ZlX19JXzNCST0KLVhQQ09NX21lbW1vdmVfX0lfM0JJXzA9Y2FzdD0odm9pZCAqKQotWFBDT01fbWVtbW92ZV9fSV8zQklfMT1jYXN0PShjb25zdCB2b2lkICopCi1YUENPTV9tZW1tb3ZlX19JXzNCSV8yPWNhc3Q9KHNpemVfdCkKLQotWFBDT01fbWVtbW92ZV9fSV8zQ0k9Ci1YUENPTV9tZW1tb3ZlX19JXzNDSV8wPWNhc3Q9KHZvaWQgKikKLVhQQ09NX21lbW1vdmVfX0lfM0NJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotWFBDT01fbWVtbW92ZV9fSV8zQ0lfMj1jYXN0PShzaXplX3QpCi0KLVhQQ09NX21lbW1vdmVfX0lfM0lJPQotWFBDT01fbWVtbW92ZV9fSV8zSUlfMD1jYXN0PSh2b2lkICopCi1YUENPTV9tZW1tb3ZlX19JXzNJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLVhQQ09NX21lbW1vdmVfX0lfM0lJXzI9Y2FzdD0oc2l6ZV90KQotCi1YUENPTV9tZW1tb3ZlX19JXzNKST0KLVhQQ09NX21lbW1vdmVfX0lfM0pJXzA9Y2FzdD0odm9pZCAqKQotWFBDT01fbWVtbW92ZV9fSV8zSklfMT1jYXN0PShjb25zdCB2b2lkICopCi1YUENPTV9tZW1tb3ZlX19JXzNKSV8yPWNhc3Q9KHNpemVfdCkKLQotWFBDT01fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklJPQotWFBDT01fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklJXzA9Y2FzdD0odm9pZCAqKQotWFBDT01fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotWFBDT01fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1YUENPTV9tZW1tb3ZlX19fM0JJST0KLVhQQ09NX21lbW1vdmVfX18zQklJXzA9Y2FzdD0odm9pZCAqKQotWFBDT01fbWVtbW92ZV9fXzNCSUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1YUENPTV9tZW1tb3ZlX19fM0JJSV8yPWNhc3Q9KHNpemVfdCkKLQotWFBDT01fbWVtbW92ZV9fXzNCXzNDST0KLVhQQ09NX21lbW1vdmVfX18zQl8zQ0lfMD1jYXN0PSh2b2lkICopCi1YUENPTV9tZW1tb3ZlX19fM0JfM0NJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotWFBDT01fbWVtbW92ZV9fXzNCXzNDSV8yPWNhc3Q9KHNpemVfdCkKLQotWFBDT01fbWVtbW92ZV9fXzNDSUk9Ci1YUENPTV9tZW1tb3ZlX19fM0NJSV8wPWNhc3Q9KHZvaWQgKikKLVhQQ09NX21lbW1vdmVfX18zQ0lJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotWFBDT01fbWVtbW92ZV9fXzNDSUlfMj1jYXN0PShzaXplX3QpCi0KLVhQQ09NX21lbW1vdmVfX18zSUlJPQotWFBDT01fbWVtbW92ZV9fXzNJSUlfMD1jYXN0PSh2b2lkICopCi1YUENPTV9tZW1tb3ZlX19fM0lJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLVhQQ09NX21lbW1vdmVfX18zSUlJXzI9Y2FzdD0oc2l6ZV90KQotCi1YUENPTV9tZW1tb3ZlX19fM0pJST0KLVhQQ09NX21lbW1vdmVfX18zSklJXzA9Y2FzdD0odm9pZCAqKQotWFBDT01fbWVtbW92ZV9fXzNKSUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1YUENPTV9tZW1tb3ZlX19fM0pJSV8yPWNhc3Q9KHNpemVfdCkKLQotWFBDT01fbnNFbWJlZENTdHJpbmdfTGVuZ3RoPWZsYWdzPWNwcAotWFBDT01fbnNFbWJlZENTdHJpbmdfTGVuZ3RoXzA9Y2FzdD0obnNFbWJlZENTdHJpbmcgKikKLQotWFBDT01fbnNFbWJlZENTdHJpbmdfZGVsZXRlPWZsYWdzPWRlbGV0ZQotWFBDT01fbnNFbWJlZENTdHJpbmdfZGVsZXRlXzA9Y2FzdD0obnNFbWJlZENTdHJpbmcgKikKLQotWFBDT01fbnNFbWJlZENTdHJpbmdfZ2V0PWZsYWdzPWNwcAotWFBDT01fbnNFbWJlZENTdHJpbmdfZ2V0XzA9Y2FzdD0obnNFbWJlZENTdHJpbmcgKikKLQotWFBDT01fbnNFbWJlZENTdHJpbmdfMW5ld19fPWZsYWdzPW5ldwotCi1YUENPTV9uc0VtYmVkQ1N0cmluZ18xbmV3X19fM0JJPWZsYWdzPW5ldwotWFBDT01fbnNFbWJlZENTdHJpbmdfMW5ld19fXzNCSV8wPWNhc3Q9KGNvbnN0IGNoYXIgKikKLVhQQ09NX25zRW1iZWRDU3RyaW5nXzFuZXdfX18zQklfMT0KLQotWFBDT01fbnNFbWJlZFN0cmluZ19MZW5ndGg9ZmxhZ3M9Y3BwCi1YUENPTV9uc0VtYmVkU3RyaW5nX0xlbmd0aF8wPWNhc3Q9KG5zRW1iZWRTdHJpbmcgKikKLQotWFBDT01fbnNFbWJlZFN0cmluZ19kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1YUENPTV9uc0VtYmVkU3RyaW5nX2RlbGV0ZV8wPWNhc3Q9KG5zRW1iZWRTdHJpbmcgKikKLQotWFBDT01fbnNFbWJlZFN0cmluZ19nZXQ9ZmxhZ3M9Y3BwCi1YUENPTV9uc0VtYmVkU3RyaW5nX2dldF8wPWNhc3Q9KG5zRW1iZWRTdHJpbmcgKikKLQotWFBDT01fbnNFbWJlZFN0cmluZ18xbmV3X189ZmxhZ3M9bmV3Ci0KLVhQQ09NX25zRW1iZWRTdHJpbmdfMW5ld19fXzNDPWZsYWdzPW5ldwotWFBDT01fbnNFbWJlZFN0cmluZ18xbmV3X19fM0NfMD0KLQotWFBDT01fbnNJRF9FcXVhbHM9ZmxhZ3M9Y3BwCi1YUENPTV9uc0lEX0VxdWFsc18wPWNhc3Q9KG5zSUQgKikKLVhQQ09NX25zSURfRXF1YWxzXzE9Y2FzdD0obnNJRCAqKSxmbGFncz1zdHJ1Y3QKLQotWFBDT01fbnNJRF9QYXJzZT1mbGFncz1jcHAKLVhQQ09NX25zSURfUGFyc2VfMD1jYXN0PShuc0lEICopCi1YUENPTV9uc0lEX1BhcnNlXzE9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1YUENPTV9uc0lEX2RlbGV0ZT1mbGFncz1kZWxldGUKLVhQQ09NX25zSURfZGVsZXRlXzA9Y2FzdD0obnNJRCAqKQotCi1YUENPTV9uc0lEX25ldz1mbGFncz1uZXcKLQotWFBDT01fc3RybGVuPQotWFBDT01fc3RybGVuXzA9Y2FzdD0oY2hhciAqKQotCi1YUENPTV9zdHJsZW5fUFJVbmljaGFyPWZsYWdzPW5vX2dlbgotWFBDT01fc3RybGVuX1BSVW5pY2hhcl8wPQotCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX1hQQ09NT2JqZWN0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0VtYmVkU3RyaW5nPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lBcHBTaGVsbD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJQmFzZVdpbmRvdz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJQ2F0ZWdvcnlNYW5hZ2VyPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lDb21wb25lbnRNYW5hZ2VyPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lDb21wb25lbnRSZWdpc3RyYXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUNvbnRleHRNZW51TGlzdGVuZXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUNvb2tpZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJQ29va2llTWFuYWdlcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRD1mbGFncz1jcHAKLW5zSURfbTA9Ci1uc0lEX20xPQotbnNJRF9tMj0KLW5zSURfbTM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURPTUV2ZW50PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lET01Nb3VzZUV2ZW50PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lET01VSUV2ZW50PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lET01XaW5kb3c9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURvY1NoZWxsPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEb3dubG9hZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRW1iZWRkaW5nU2l0ZVdpbmRvdz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRmFjdG9yeT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRmlsZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRmlsZVBpY2tlcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJSGVscGVyQXBwTGF1bmNoZXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUhlbHBlckFwcExhdW5jaGVyRGlhbG9nPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lJT1NlcnZpY2U9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUlucHV0U3RyZWFtPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lJbnRlcmZhY2VSZXF1ZXN0b3I9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUxvY2FsRmlsZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJTWVtb3J5PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lQcm9maWxlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lQcm9ncmVzc0RpYWxvZz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJUHJvbXB0U2VydmljZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJUmVxdWVzdD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJU2VydmljZU1hbmFnZXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVNpbXBsZUVudW1lcmF0b3I9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVN1cHBvcnRzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lTdXBwb3J0c1dlYWtSZWZlcmVuY2U9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVRvb2x0aXBMaXN0ZW5lcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJVVJJPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lVUklDb250ZW50TGlzdGVuZXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVdlYWtSZWZlcmVuY2U9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVdlYkJyb3dzZXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVdlYkJyb3dzZXJDaHJvbWU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVdlYkJyb3dzZXJDaHJvbWVGb2N1cz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2ViQnJvd3NlckZvY3VzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lXZWJCcm93c2VyU3RyZWFtPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lXZWJOYXZpZ2F0aW9uPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lXZWJQcm9ncmVzcz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2ViUHJvZ3Jlc3NMaXN0ZW5lcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2luZG93Q3JlYXRvcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2luZG93V2F0Y2hlcj0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5tb3ppbGxhLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm1vemlsbGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQyZjIyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm1vemlsbGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXN3dF9jb3B5cmlnaHQ9LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKlxuXAotICogVmVyc2lvbjogTVBMIDEuMVxuXAotICpcblwKLSAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvblxuXAotICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG5cCi0gKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cCi0gKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9cblwKLSAqXG5cCi0gKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLFxuXAotICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlXG5cCi0gKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZVxuXAotICogTGljZW5zZS5cblwKLSAqXG5cCi0gKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZSwgcmVsZWFzZWQgTWFyY2ggMzEsIDE5OTguXG5cCi0gKlxuXAotICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzXG5cCi0gKiBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi5cblwKLSAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgTmV0c2NhcGUgYXJlIENvcHlyaWdodCAoQykgMTk5OC0xOTk5XG5cCi0gKiBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi0gKlxuXAotICogQ29udHJpYnV0b3Iocyk6XG5cCi0gKlxuXAotICogSUJNXG5cCi0gKiAtICBCaW5kaW5nIHRvIHBlcm1pdCBpbnRlcmZhY2luZyBiZXR3ZWVuIE1vemlsbGEgYW5kIFNXVFxuXAotICogLSAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0IElCTSBDb3JwLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLSAqXG5cCi0gKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqL1xuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5DT00ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLkNPTS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjBhODZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLkNPTS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODAyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfQ0FVVUlEPQotQ0FVVUlEX2NFbGVtcz0KLUNBVVVJRF9wRWxlbXM9Y2FzdD0oR1VJRCBGQVIgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9DT009Ci1DT01fQ0xTSURGcm9tUHJvZ0lEPQotQ09NX0NMU0lERnJvbVByb2dJRF8wPWNhc3Q9TFBDT0xFU1RSCi1DT01fQ0xTSURGcm9tUHJvZ0lEXzE9Ci0KLUNPTV9DTFNJREZyb21TdHJpbmc9Ci1DT01fQ0xTSURGcm9tU3RyaW5nXzA9Y2FzdD1MUE9MRVNUUgotQ09NX0NMU0lERnJvbVN0cmluZ18xPQotCi1DT01fQ29DcmVhdGVJbnN0YW5jZT0KLUNPTV9Db0NyZWF0ZUluc3RhbmNlXzA9Ci1DT01fQ29DcmVhdGVJbnN0YW5jZV8xPWNhc3Q9TFBVTktOT1dOCi1DT01fQ29DcmVhdGVJbnN0YW5jZV8yPQotQ09NX0NvQ3JlYXRlSW5zdGFuY2VfMz0KLUNPTV9Db0NyZWF0ZUluc3RhbmNlXzQ9Y2FzdD1MUFZPSUQgKgotCi1DT01fQ29GcmVlVW51c2VkTGlicmFyaWVzPQotCi1DT01fQ29HZXRDbGFzc09iamVjdD0KLUNPTV9Db0dldENsYXNzT2JqZWN0XzA9Ci1DT01fQ29HZXRDbGFzc09iamVjdF8xPQotQ09NX0NvR2V0Q2xhc3NPYmplY3RfMj1jYXN0PShDT1NFUlZFUklORk8gKgotQ09NX0NvR2V0Q2xhc3NPYmplY3RfMz0KLUNPTV9Db0dldENsYXNzT2JqZWN0XzQ9Y2FzdD1MUFZPSUQgKgotCi1DT01fQ29Mb2NrT2JqZWN0RXh0ZXJuYWw9Ci1DT01fQ29Mb2NrT2JqZWN0RXh0ZXJuYWxfMD1jYXN0PShJVW5rbm93biAqKQotQ09NX0NvTG9ja09iamVjdEV4dGVybmFsXzE9Y2FzdD0oQk9PTCkKLUNPTV9Db0xvY2tPYmplY3RFeHRlcm5hbF8yPWNhc3Q9KEJPT0wpCi0KLUNPTV9Db1Rhc2tNZW1BbGxvYz0KLUNPTV9Db1Rhc2tNZW1BbGxvY18wPWNhc3Q9KFVMT05HKQotCi1DT01fQ29UYXNrTWVtRnJlZT0KLUNPTV9Db1Rhc2tNZW1GcmVlXzA9Y2FzdD0oTFBWT0lEKQotCi1DT01fQ3JlYXRlU3RkQWNjZXNzaWJsZU9iamVjdD1mbGFncz1keW5hbWljCi1DT01fQ3JlYXRlU3RkQWNjZXNzaWJsZU9iamVjdF8wPWNhc3Q9KEhXTkQpCi1DT01fQ3JlYXRlU3RkQWNjZXNzaWJsZU9iamVjdF8xPQotQ09NX0NyZWF0ZVN0ZEFjY2Vzc2libGVPYmplY3RfMj0KLUNPTV9DcmVhdGVTdGRBY2Nlc3NpYmxlT2JqZWN0XzM9Y2FzdD0oTFBWT0lEICopCi0KLUNPTV9Eb0RyYWdEcm9wPQotQ09NX0RvRHJhZ0Ryb3BfMD1jYXN0PShJRGF0YU9iamVjdCAqKQotQ09NX0RvRHJhZ0Ryb3BfMT1jYXN0PUlEcm9wU291cmNlICoKLUNPTV9Eb0RyYWdEcm9wXzI9Ci1DT01fRG9EcmFnRHJvcF8zPQotCi1DT01fR2V0Q2xhc3NGaWxlPQotQ09NX0dldENsYXNzRmlsZV8wPWNhc3Q9TFBDV1NUUgotQ09NX0dldENsYXNzRmlsZV8xPQotCi1DT01fSUlERnJvbVN0cmluZz0KLUNPTV9JSURGcm9tU3RyaW5nXzA9Y2FzdD1MUE9MRVNUUgotQ09NX0lJREZyb21TdHJpbmdfMT0KLQotQ09NX0lzRXF1YWxHVUlEPQotQ09NX0lzRXF1YWxHVUlEXzA9Ci1DT01fSXNFcXVhbEdVSURfMT0KLQotQ09NX0xyZXN1bHRGcm9tT2JqZWN0PWZsYWdzPWR5bmFtaWMKLUNPTV9McmVzdWx0RnJvbU9iamVjdF8wPQotQ09NX0xyZXN1bHRGcm9tT2JqZWN0XzE9Ci1DT01fTHJlc3VsdEZyb21PYmplY3RfMj1jYXN0PShMUFVOS05PV04pCi0KLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJJPQotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMklfMD1jYXN0PShQVk9JRCkKLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yST0KLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySV8wPWNhc3Q9KFBWT0lEKQotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySV8yPQotCi1DT01fTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUlOUExBQ0VGUkFNRUlORk9fMkk9Ci1DT01fTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUlOUExBQ0VGUkFNRUlORk9fMklfMD1jYXN0PShQVk9JRCkKLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFSU5QTEFDRUZSQU1FSU5GT18ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1DT01fTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUlOUExBQ0VGUkFNRUlORk9fMklfMj0KLQotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEFUU1RHXzJJPQotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEFUU1RHXzJJXzA9Y2FzdD0oUFZPSUQpCi1DT01fTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEdfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEFUU1RHXzJJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzJJPQotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMklfMD1jYXN0PShQVk9JRCkKLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzJJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9ESVNQUEFSQU1TXzJJST0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9ESVNQUEFSQU1TXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RJU1BQQVJBTVNfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RJU1BQQVJBTVNfMklJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMklJPQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18ySUlfMj0KLQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZVTkNERVNDXzJJST0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GVU5DREVTQ18ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GVU5DREVTQ18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRlVOQ0RFU0NfMklJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJST0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEFUU1RHXzJJST0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEFUU1RHXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEdfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEdfMklJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMklJPQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUR01FRElVTV8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUR01FRElVTV8ySUlfMj0KLQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1RZUEVBVFRSXzJJST0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9UWVBFQVRUUl8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9UWVBFQVRUUl8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfVFlQRUFUVFJfMklJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9WQVJERVNDXzJJST0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9WQVJERVNDXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1ZBUkRFU0NfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1ZBUkRFU0NfMklJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklJPQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySUlfMj0KLQotQ09NX09sZUNyZWF0ZT0KLUNPTV9PbGVDcmVhdGVfMD0KLUNPTV9PbGVDcmVhdGVfMT0KLUNPTV9PbGVDcmVhdGVfMj0KLUNPTV9PbGVDcmVhdGVfMz0KLUNPTV9PbGVDcmVhdGVfND1jYXN0PUlPbGVDbGllbnRTaXRlICoKLUNPTV9PbGVDcmVhdGVfNT1jYXN0PUlTdG9yYWdlICoKLUNPTV9PbGVDcmVhdGVfNj1jYXN0PXZvaWQgKioKLQotQ09NX09sZUNyZWF0ZUZyb21GaWxlPQotQ09NX09sZUNyZWF0ZUZyb21GaWxlXzA9Ci1DT01fT2xlQ3JlYXRlRnJvbUZpbGVfMT1jYXN0PUxQQ09MRVNUUgotQ09NX09sZUNyZWF0ZUZyb21GaWxlXzI9Ci1DT01fT2xlQ3JlYXRlRnJvbUZpbGVfMz0KLUNPTV9PbGVDcmVhdGVGcm9tRmlsZV80PQotQ09NX09sZUNyZWF0ZUZyb21GaWxlXzU9Y2FzdD0oTFBPTEVDTElFTlRTSVRFKQotQ09NX09sZUNyZWF0ZUZyb21GaWxlXzY9Y2FzdD0oTFBTVE9SQUdFKQotQ09NX09sZUNyZWF0ZUZyb21GaWxlXzc9Y2FzdD1MUFZPSUQgKgotCi1DT01fT2xlQ3JlYXRlUHJvcGVydHlGcmFtZT0KLUNPTV9PbGVDcmVhdGVQcm9wZXJ0eUZyYW1lXzA9Y2FzdD0oSFdORCkKLUNPTV9PbGVDcmVhdGVQcm9wZXJ0eUZyYW1lXzE9Ci1DT01fT2xlQ3JlYXRlUHJvcGVydHlGcmFtZV8yPQotQ09NX09sZUNyZWF0ZVByb3BlcnR5RnJhbWVfMz1jYXN0PUxQQ09MRVNUUgotQ09NX09sZUNyZWF0ZVByb3BlcnR5RnJhbWVfND0KLUNPTV9PbGVDcmVhdGVQcm9wZXJ0eUZyYW1lXzU9Y2FzdD0oTFBVTktOT1dOIEZBUiopCi1DT01fT2xlQ3JlYXRlUHJvcGVydHlGcmFtZV82PQotQ09NX09sZUNyZWF0ZVByb3BlcnR5RnJhbWVfNz1jYXN0PShMUENMU0lEKQotQ09NX09sZUNyZWF0ZVByb3BlcnR5RnJhbWVfOD1jYXN0PShMQ0lEKQotQ09NX09sZUNyZWF0ZVByb3BlcnR5RnJhbWVfOT0KLUNPTV9PbGVDcmVhdGVQcm9wZXJ0eUZyYW1lXzEwPWNhc3Q9KExQVk9JRCkKLQotQ09NX09sZURyYXc9Ci1DT01fT2xlRHJhd18wPWNhc3Q9KExQVU5LTk9XTikKLUNPTV9PbGVEcmF3XzE9Y2FzdD0oRFdPUkQpCi1DT01fT2xlRHJhd18yPWNhc3Q9KEhEQykKLUNPTV9PbGVEcmF3XzM9Y2FzdD0oTFBSRUNUKQotCi1DT01fT2xlRmx1c2hDbGlwYm9hcmQ9Ci0KLUNPTV9PbGVHZXRDbGlwYm9hcmQ9Ci1DT01fT2xlR2V0Q2xpcGJvYXJkXzA9Y2FzdD0oSURhdGFPYmplY3QgKiopCi0KLUNPTV9PbGVJc0N1cnJlbnRDbGlwYm9hcmQ9Ci1DT01fT2xlSXNDdXJyZW50Q2xpcGJvYXJkXzA9Y2FzdD0oSURhdGFPYmplY3QgKikKLQotQ09NX09sZUlzUnVubmluZz0KLUNPTV9PbGVJc1J1bm5pbmdfMD1jYXN0PShMUE9MRU9CSkVDVCkKLQotQ09NX09sZUxvYWQ9Ci1DT01fT2xlTG9hZF8wPWNhc3Q9KElTdG9yYWdlICopCi1DT01fT2xlTG9hZF8xPQotQ09NX09sZUxvYWRfMj1jYXN0PShJT2xlQ2xpZW50U2l0ZSAqKQotQ09NX09sZUxvYWRfMz1jYXN0PUxQVk9JRCAqCi0KLUNPTV9PbGVSdW49Ci1DT01fT2xlUnVuXzA9Y2FzdD0oTFBVTktOT1dOKQotCi1DT01fT2xlU2F2ZT0KLUNPTV9PbGVTYXZlXzA9Y2FzdD0oSVBlcnNpc3RTdG9yYWdlICopCi1DT01fT2xlU2F2ZV8xPWNhc3Q9KElTdG9yYWdlICopCi1DT01fT2xlU2F2ZV8yPQotCi1DT01fT2xlU2V0Q2xpcGJvYXJkPQotQ09NX09sZVNldENsaXBib2FyZF8wPWNhc3Q9KElEYXRhT2JqZWN0ICopCi0KLUNPTV9PbGVTZXRDb250YWluZWRPYmplY3Q9Ci1DT01fT2xlU2V0Q29udGFpbmVkT2JqZWN0XzA9Y2FzdD0oTFBVTktOT1dOKQotQ09NX09sZVNldENvbnRhaW5lZE9iamVjdF8xPQotCi1DT01fT2xlU2V0TWVudURlc2NyaXB0b3I9Ci1DT01fT2xlU2V0TWVudURlc2NyaXB0b3JfMD1jYXN0PShIT0xFTUVOVSkKLUNPTV9PbGVTZXRNZW51RGVzY3JpcHRvcl8xPWNhc3Q9KEhXTkQpCi1DT01fT2xlU2V0TWVudURlc2NyaXB0b3JfMj1jYXN0PShIV05EKQotQ09NX09sZVNldE1lbnVEZXNjcmlwdG9yXzM9Y2FzdD0oTFBPTEVJTlBMQUNFRlJBTUUpCi1DT01fT2xlU2V0TWVudURlc2NyaXB0b3JfND1jYXN0PShMUE9MRUlOUExBQ0VBQ1RJVkVPQkpFQ1QpCi0KLUNPTV9PbGVUcmFuc2xhdGVDb2xvcj0KLUNPTV9PbGVUcmFuc2xhdGVDb2xvcl8wPWNhc3Q9KE9MRV9DT0xPUikKLUNPTV9PbGVUcmFuc2xhdGVDb2xvcl8xPWNhc3Q9KEhQQUxFVFRFKQotQ09NX09sZVRyYW5zbGF0ZUNvbG9yXzI9Y2FzdD0oQ09MT1JSRUYgKikKLQotQ09NX1Byb2dJREZyb21DTFNJRD0KLUNPTV9Qcm9nSURGcm9tQ0xTSURfMD0KLUNPTV9Qcm9nSURGcm9tQ0xTSURfMT1jYXN0PUxQT0xFU1RSICoKLQotQ09NX1JlZ2lzdGVyRHJhZ0Ryb3A9Ci1DT01fUmVnaXN0ZXJEcmFnRHJvcF8wPWNhc3Q9KEhXTkQpCi1DT01fUmVnaXN0ZXJEcmFnRHJvcF8xPWNhc3Q9KElEcm9wVGFyZ2V0ICopCi0KLUNPTV9SZWxlYXNlU3RnTWVkaXVtPQotQ09NX1JlbGVhc2VTdGdNZWRpdW1fMD1jYXN0PShTVEdNRURJVU0gKikKLQotQ09NX1Jldm9rZURyYWdEcm9wPQotQ09NX1Jldm9rZURyYWdEcm9wXzA9Y2FzdD0oSFdORCkKLQotQ09NX1N0Z0NyZWF0ZURvY2ZpbGU9Ci1DT01fU3RnQ3JlYXRlRG9jZmlsZV8wPQotQ09NX1N0Z0NyZWF0ZURvY2ZpbGVfMT0KLUNPTV9TdGdDcmVhdGVEb2NmaWxlXzI9Ci1DT01fU3RnQ3JlYXRlRG9jZmlsZV8zPWNhc3Q9SVN0b3JhZ2UgKioKLQotQ09NX1N0Z0lzU3RvcmFnZUZpbGU9Ci1DT01fU3RnSXNTdG9yYWdlRmlsZV8wPWNhc3Q9KGNvbnN0IFdDSEFSICopCi0KLUNPTV9TdGdPcGVuU3RvcmFnZT0KLUNPTV9TdGdPcGVuU3RvcmFnZV8wPWNhc3Q9Y29uc3QgV0NIQVIgKgotQ09NX1N0Z09wZW5TdG9yYWdlXzE9Y2FzdD0oSVN0b3JhZ2UgKikKLUNPTV9TdGdPcGVuU3RvcmFnZV8yPQotQ09NX1N0Z09wZW5TdG9yYWdlXzM9Y2FzdD0oU05CKQotQ09NX1N0Z09wZW5TdG9yYWdlXzQ9Ci1DT01fU3RnT3BlblN0b3JhZ2VfNT1jYXN0PUlTdG9yYWdlICoqCi0KLUNPTV9TdHJpbmdGcm9tQ0xTSUQ9Ci1DT01fU3RyaW5nRnJvbUNMU0lEXzA9Ci1DT01fU3RyaW5nRnJvbUNMU0lEXzE9Y2FzdD1MUE9MRVNUUiAqCi0KLUNPTV9TeXNBbGxvY1N0cmluZz0KLUNPTV9TeXNBbGxvY1N0cmluZ18wPWNhc3Q9KE9MRUNIQVIgKikKLQotQ09NX1N5c0ZyZWVTdHJpbmc9Ci1DT01fU3lzRnJlZVN0cmluZ18wPWNhc3Q9KEJTVFIpCi0KLUNPTV9TeXNTdHJpbmdCeXRlTGVuPQotQ09NX1N5c1N0cmluZ0J5dGVMZW5fMD1jYXN0PShCU1RSKQotCi1DT01fVmFyaWFudENoYW5nZVR5cGU9Ci1DT01fVmFyaWFudENoYW5nZVR5cGVfMD1jYXN0PShWQVJJQU5UQVJHIEZBUiogKQotQ09NX1ZhcmlhbnRDaGFuZ2VUeXBlXzE9Y2FzdD0oVkFSSUFOVEFSRyBGQVIqICkKLUNPTV9WYXJpYW50Q2hhbmdlVHlwZV8yPQotQ09NX1ZhcmlhbnRDaGFuZ2VUeXBlXzM9Y2FzdD0oVkFSVFlQRSkKLQotQ09NX1ZhcmlhbnRDbGVhcj0KLUNPTV9WYXJpYW50Q2xlYXJfMD1jYXN0PShWQVJJQU5UQVJHIEZBUiogKQotCi1DT01fVmFyaWFudEluaXQ9Ci1DT01fVmFyaWFudEluaXRfMD1jYXN0PShWQVJJQU5UQVJHIEZBUiogKQotCi1DT01fVnRibENhbGxfX0lJSUk9Ci1DT01fVnRibENhbGxfX0lJSUlfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJSV8xPQotQ09NX1Z0YmxDYWxsX19JSUlJXzI9Ci1DT01fVnRibENhbGxfX0lJSUlfMz0KLQotQ09NX1Z0YmxDYWxsX19JSUlJST0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlfMz0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlfND0KLQotQ09NX1Z0YmxDYWxsX19JSUlJSUk9Ci1DT01fVnRibENhbGxfX0lJSUlJSV8wPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJXzI9Ci1DT01fVnRibENhbGxfX0lJSUlJSV8zPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlfND0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJXzU9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJST0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSV8wPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJXzE9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSV8zPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJXzQ9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlfNT0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSV82PQotCi1DT01fVnRibENhbGxfX0lJSUlJSUlJPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV8wPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV8xPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV8yPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV8zPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV80PQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV81PQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV82PQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV83PQotCi1DT01fVnRibENhbGxfX0lJSUlJSUlJSUk9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJSUlfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlJSV8xPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSUlJXzI9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJSUlfMz0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlJSV80PQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSUlJXzU9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJSUlfNj0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlJSV83PQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSUlJXzg9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJSUlfOT0KLQotQ09NX1Z0YmxDYWxsX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRFZUQVJHRVRERVZJQ0VfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0laRV8yPQotQ09NX1Z0YmxDYWxsX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRFZUQVJHRVRERVZJQ0VfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0laRV8yXzA9Ci1DT01fVnRibENhbGxfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9EVlRBUkdFVERFVklDRV8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RWVEFSR0VUREVWSUNFXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMl8yPQotQ09NX1Z0YmxDYWxsX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRFZUQVJHRVRERVZJQ0VfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0laRV8yXzM9Ci1DT01fVnRibENhbGxfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9EVlRBUkdFVERFVklDRV8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfND0KLUNPTV9WdGJsQ2FsbF9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RWVEFSR0VUREVWSUNFXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMl81PQotCi1DT01fVnRibENhbGxfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJXzNJPQotQ09NX1Z0YmxDYWxsX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySV8zSV8wPQotQ09NX1Z0YmxDYWxsX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySV8zSV8xPQotQ09NX1Z0YmxDYWxsX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySV8zSV8yPQotQ09NX1Z0YmxDYWxsX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySV8zSV8zPQotQ09NX1Z0YmxDYWxsX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySV8zSV80PQotQ09NX1Z0YmxDYWxsX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySV8zSV81PQotQ09NX1Z0YmxDYWxsX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySV8zSV82PQotCi1DT01fVnRibENhbGxfX0lJSUlfM0k9Ci1DT01fVnRibENhbGxfX0lJSUlfM0lfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJSV8zSV8xPQotQ09NX1Z0YmxDYWxsX19JSUlJXzNJXzI9Ci1DT01fVnRibENhbGxfX0lJSUlfM0lfMz0KLUNPTV9WdGJsQ2FsbF9fSUlJSV8zSV80PQotCi1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yXzNJPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMl8zSV8wPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMl8zSV8xPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMl8zSV8yPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMl8zSV8zPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMl8zSV80PQotCi1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzA9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMl8xPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzM9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUk9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJXzA9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJXzE9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJXzI9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJXzM9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJXzQ9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJXzU9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9ESVNQUEFSQU1TXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRVhDRVBJTkZPXzJfM0k9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRElTUFBBUkFNU18ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0VYQ0VQSU5GT18yXzNJXzA9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRElTUFBBUkFNU18ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0VYQ0VQSU5GT18yXzNJXzE9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRElTUFBBUkFNU18ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0VYQ0VQSU5GT18yXzNJXzI9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRElTUFBBUkFNU18ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0VYQ0VQSU5GT18yXzNJXzM9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRElTUFBBUkFNU18ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0VYQ0VQSU5GT18yXzNJXzQ9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRElTUFBBUkFNU18ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0VYQ0VQSU5GT18yXzNJXzU9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRElTUFBBUkFNU18ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0VYQ0VQSU5GT18yXzNJXzY9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRElTUFBBUkFNU18ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0VYQ0VQSU5GT18yXzNJXzc9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRElTUFBBUkFNU18ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0VYQ0VQSU5GT18yXzNJXzg9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRElTUFBBUkFNU18ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0VYQ0VQSU5GT18yXzNJXzk9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RBVFNUR18yXzNJPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEFUU1RHXzJfM0lfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RBVFNUR18yXzNJXzE9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEdfMl8zSV8yPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEFUU1RHXzJfM0lfMz0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RBVFNUR18yXzNJXzQ9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMklJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18ySUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMklJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzE9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8yPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18ySUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfMz0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMklJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzQ9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl81PQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18ySUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfNj0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMklJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzc9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzI9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0laRV8yXzA9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0laRV8yXzE9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0laRV8yXzI9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0laRV8yXzM9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJWj0KLUNPTV9WdGJsQ2FsbF9fSUlJWl8wPQotQ09NX1Z0YmxDYWxsX19JSUlaXzE9Ci1DT01fVnRibENhbGxfX0lJSVpfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJWl8zPQotCi1DT01fVnRibENhbGxfX0lJSV8zST0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJXzA9Ci1DT01fVnRibENhbGxfX0lJSV8zSV8xPQotQ09NX1Z0YmxDYWxsX19JSUlfM0lfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJXzM9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJSV8zST0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJSV8zSV8wPQotQ09NX1Z0YmxDYWxsX19JSUlfM0lJXzNJXzE9Ci1DT01fVnRibENhbGxfX0lJSV8zSUlfM0lfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJSV8zSV8zPQotQ09NX1Z0YmxDYWxsX19JSUlfM0lJXzNJXzQ9Ci1DT01fVnRibENhbGxfX0lJSV8zSUlfM0lfNT0KLQotQ09NX1Z0YmxDYWxsX19JSUlfM0lfM0lfM0lfM0k9Ci1DT01fVnRibENhbGxfX0lJSV8zSV8zSV8zSV8zSV8wPQotQ09NX1Z0YmxDYWxsX19JSUlfM0lfM0lfM0lfM0lfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzI9Ci1DT01fVnRibENhbGxfX0lJSV8zSV8zSV8zSV8zSV8zPQotQ09NX1Z0YmxDYWxsX19JSUlfM0lfM0lfM0lfM0lfND0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzU9Ci1DT01fVnRibENhbGxfX0lJSV8zSV8zSV8zSV8zSV82PQotCi1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfQ0FVVUlEXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfQ0FVVUlEXzJfMD0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9DQVVVSURfMl8xPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0NBVVVJRF8yXzI9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9DT05UUk9MSU5GT18yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0NPTlRST0xJTkZPXzJfMD0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9DT05UUk9MSU5GT18yXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfQ09OVFJPTElORk9fMl8yPQotCi1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJfMD0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMl8xPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yXzI9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUR01FRElVTV8yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzJfMD0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUR01FRElVTV8yXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMl8yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzJfMz0KLQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzJaPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzJaXzA9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMlpfMT0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUR01FRElVTV8yWl8yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzJaXzM9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMlpfND0KLQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMj0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJfMD0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJfMT0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJfMj0KLQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJSUk9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJSV8wPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJSUlfMT0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUlJXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJSV8zPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJSUlfND0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUlJXzU9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJSV82PQotCi1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJXzNJPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJSV8zSV8wPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJSV8zSV8xPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJSV8zSV8yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJSV8zSV8zPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJSV8zSV80PQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJSV8zSV81PQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJSV8zSV82PQotCi1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EVEVYVF8yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9PTEVDTURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRFRFWFRfMl8wPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9PTEVDTURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRFRFWFRfMl8xPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9PTEVDTURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRFRFWFRfMl8yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9PTEVDTURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRFRFWFRfMl8zPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9PTEVDTURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRFRFWFRfMl80PQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9PTEVDTURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRFRFWFRfMl81PQotCi1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzNJPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMl8zSV8wPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMl8zSV8xPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMl8zSV8yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMl8zSV8zPQotCi1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfTElDSU5GT18yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0xJQ0lORk9fMl8wPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0xJQ0lORk9fMl8xPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0xJQ0lORk9fMl8yPQotCi1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMj0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18yXzA9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMl8xPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJfMj0KLQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzA9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfMT0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8yPQotCi1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJWj0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklaXzA9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJWl8xPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySVpfMj0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklaXzM9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJWl80PQotCi1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMj0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzA9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8xPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfMj0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzM9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlfM0M9Ci1DT01fVnRibENhbGxfX0lJXzNDXzA9Ci1DT01fVnRibENhbGxfX0lJXzNDXzE9Ci1DT01fVnRibENhbGxfX0lJXzNDXzI9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJPQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lfMD0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJXzE9Ci1DT01fVnRibENhbGxfX0lJXzNDSV8yPQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lfMz0KLQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSUlfM0k9Ci1DT01fVnRibENhbGxfX0lJXzNDSUlJSV8zSV8wPQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSUlfM0lfMT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzNJXzI9Ci1DT01fVnRibENhbGxfX0lJXzNDSUlJSV8zSV8zPQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSUlfM0lfND0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzNJXzU9Ci1DT01fVnRibENhbGxfX0lJXzNDSUlJSV8zSV82PQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSUlfM0lfNz0KLQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSV8zST0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0lfMD0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0lfMT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0lfMj0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0lfMz0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0lfND0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0lfNT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0lfNj0KLQotQ09NX1Z0YmxDYWxsX19JSV8zQ18zQz0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NfM0NfMD0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NfM0NfMT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NfM0NfMj0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NfM0NfMz0KLQotQ09NX1Z0YmxDYWxsX19JSV8zST0KLUNPTV9WdGJsQ2FsbF9fSUlfM0lfMD0KLUNPTV9WdGJsQ2FsbF9fSUlfM0lfMT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0lfMj0KLQotQ09NX1dyaXRlQ2xhc3NTdGc9Ci1DT01fV3JpdGVDbGFzc1N0Z18wPWNhc3Q9KElTdG9yYWdlICopCi1DT01fV3JpdGVDbGFzc1N0Z18xPQotCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfQ09NT2JqZWN0PWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0NPTlRST0xJTkZPPQotQ09OVFJPTElORk9fY2I9Ci1DT05UUk9MSU5GT19oQWNjZWw9Y2FzdD0oSEFDQ0VMKQotQ09OVFJPTElORk9fY0FjY2VsPQotQ09OVFJPTElORk9fZHdGbGFncz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9DT1NFUlZFUklORk89Ci1DT1NFUlZFUklORk9fZHdSZXNlcnZlZDE9Ci1DT1NFUlZFUklORk9fcHdzek5hbWU9Y2FzdD0oTFBXU1RSKQotQ09TRVJWRVJJTkZPX3BBdXRoSW5mbz1jYXN0PShDT0FVVEhJTkZPICopCi1DT1NFUlZFUklORk9fZHdSZXNlcnZlZDI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRElTUFBBUkFNUz0KLURJU1BQQVJBTVNfcmd2YXJnPWNhc3Q9KFZBUklBTlRBUkcgRkFSICopCi1ESVNQUEFSQU1TX3JnZGlzcGlkTmFtZWRBcmdzPWNhc3Q9KERJU1BJRCBGQVIgKikKLURJU1BQQVJBTVNfY0FyZ3M9Ci1ESVNQUEFSQU1TX2NOYW1lZEFyZ3M9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRFZUQVJHRVRERVZJQ0U9Ci1EVlRBUkdFVERFVklDRV90ZFNpemU9Ci1EVlRBUkdFVERFVklDRV90ZERyaXZlck5hbWVPZmZzZXQ9Ci1EVlRBUkdFVERFVklDRV90ZERldmljZU5hbWVPZmZzZXQ9Ci1EVlRBUkdFVERFVklDRV90ZFBvcnROYW1lT2Zmc2V0PQotRFZUQVJHRVRERVZJQ0VfdGRFeHREZXZtb2RlT2Zmc2V0PQotRFZUQVJHRVRERVZJQ0VfdGREYXRhPWFjY2Vzc29yPXRkRGF0YVswXQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0VYQ0VQSU5GTz0KLUVYQ0VQSU5GT193Q29kZT0KLUVYQ0VQSU5GT193UmVzZXJ2ZWQ9Ci1FWENFUElORk9fYnN0clNvdXJjZT1jYXN0PShCU1RSKQotRVhDRVBJTkZPX2JzdHJEZXNjcmlwdGlvbj1jYXN0PShCU1RSKQotRVhDRVBJTkZPX2JzdHJIZWxwRmlsZT1jYXN0PShCU1RSKQotRVhDRVBJTkZPX2R3SGVscENvbnRleHQ9Ci1FWENFUElORk9fcHZSZXNlcnZlZD1jYXN0PSh2b2lkIEZBUiAqKQotRVhDRVBJTkZPX3BmbkRlZmVycmVkRmlsbEluPWNhc3Q9KEhSRVNVTFQgKFNUREFQSUNBTExUWVBFIEZBUiogKShzdHJ1Y3QgdGFnRVhDRVBJTkZPIEZBUiopKQotRVhDRVBJTkZPX3Njb2RlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQz0KLUZPUk1BVEVUQ19jZkZvcm1hdD1jYXN0PShDTElQRk9STUFUKQotRk9STUFURVRDX3B0ZD1jYXN0PShEVlRBUkdFVERFVklDRSAqKQotRk9STUFURVRDX2R3QXNwZWN0PQotRk9STUFURVRDX2xpbmRleD0KLUZPUk1BVEVUQ190eW1lZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GVU5DREVTQz0KLUZVTkNERVNDX21lbWlkPWNhc3Q9TUVNQkVSSUQKLUZVTkNERVNDX2xwcmdzY29kZT1jYXN0PVNDT0RFIEZBUiAqCi1GVU5DREVTQ19scHJnZWxlbWRlc2NQYXJhbT1jYXN0PUVMRU1ERVNDIEZBUiAqCi1GVU5DREVTQ19mdW5ja2luZD1jYXN0PUZVTkNLSU5ECi1GVU5DREVTQ19pbnZraW5kPWNhc3Q9SU5WT0tFS0lORAotRlVOQ0RFU0NfY2FsbGNvbnY9Y2FzdD1DQUxMQ09OVgotRlVOQ0RFU0NfY1BhcmFtcz0KLUZVTkNERVNDX2NQYXJhbXNPcHQ9Ci1GVU5DREVTQ19vVmZ0PQotRlVOQ0RFU0NfY1Njb2Rlcz0KLUZVTkNERVNDX2VsZW1kZXNjRnVuY190ZGVzY191bmlvbj1hY2Nlc3Nvcj1lbGVtZGVzY0Z1bmMudGRlc2MubHB0ZGVzYyxjYXN0PShzdHJ1Y3QgRkFSU1RSVUNUIHRhZ1RZUEVERVNDIEZBUiogKQotRlVOQ0RFU0NfZWxlbWRlc2NGdW5jX3RkZXNjX3Z0PWFjY2Vzc29yPWVsZW1kZXNjRnVuYy50ZGVzYy52dAotRlVOQ0RFU0NfZWxlbWRlc2NGdW5jX3BhcmFtZGVzY19wcGFyYW1kZXNjZXg9YWNjZXNzb3I9ZWxlbWRlc2NGdW5jLnBhcmFtZGVzYy5wcGFyYW1kZXNjZXgsY2FzdD0oTFBQQVJBTURFU0NFWCkKLUZVTkNERVNDX2VsZW1kZXNjRnVuY19wYXJhbWRlc2Nfd1BhcmFtRmxhZ3M9YWNjZXNzb3I9ZWxlbWRlc2NGdW5jLnBhcmFtZGVzYy53UGFyYW1GbGFncwotRlVOQ0RFU0Nfd0Z1bmNGbGFncz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEPQotR1VJRF9EYXRhMT0KLUdVSURfRGF0YTI9Ci1HVUlEX0RhdGEzPQotR1VJRF9EYXRhND0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JQWNjZXNzaWJsZT1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JQ2xhc3NGYWN0b3J5Mj1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JQ29ubmVjdGlvblBvaW50PWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lDb25uZWN0aW9uUG9pbnRDb250YWluZXI9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSURhdGFPYmplY3Q9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSURpc3BhdGNoPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lFbnVtPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lFbnVtRk9STUFURVRDPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lFbnVtU1RBVFNURz1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JRW51bVZBUklBTlQ9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSUZvbnQ9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSU1vbmlrZXI9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSU9sZUNvbW1hbmRUYXJnZXQ9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSU9sZUNvbnRyb2w9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSU9sZURvY3VtZW50PWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lPbGVEb2N1bWVudFZpZXc9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSU9sZUluUGxhY2VBY3RpdmVPYmplY3Q9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSU9sZUluUGxhY2VPYmplY3Q9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSU9sZUxpbms9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSU9sZU9iamVjdD1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JT2xlV2luZG93PWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lQZXJzaXN0PWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lQZXJzaXN0U3RvcmFnZT1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JUGVyc2lzdFN0cmVhbUluaXQ9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSVByb3ZpZGVDbGFzc0luZm89ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSVByb3ZpZGVDbGFzc0luZm8yPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lTcGVjaWZ5UHJvcGVydHlQYWdlcz1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JU3RvcmFnZT1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JU3RyZWFtPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lUeXBlSW5mbz1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JVW5rbm93bj1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JVmlld09iamVjdDI9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfTElDSU5GTz0KLUxJQ0lORk9fY2JMaWNJbmZvPQotTElDSU5GT19mUnVudGltZUtleUF2YWlsPQotTElDSU5GT19mTGljVmVyaWZpZWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EPQotT0xFQ01EX2NtZElEPQotT0xFQ01EX2NtZGY9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EVEVYVD0KLU9MRUNNRFRFWFRfY21kdGV4dGY9Ci1PTEVDTURURVhUX2N3QWN0dWFsPQotT0xFQ01EVEVYVF9jd0J1Zj0KLU9MRUNNRFRFWFRfcmd3ej1hY2Nlc3Nvcj1yZ3d6WzBdCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFSU5QTEFDRUZSQU1FSU5GTz0KLU9MRUlOUExBQ0VGUkFNRUlORk9fY2I9Ci1PTEVJTlBMQUNFRlJBTUVJTkZPX2ZNRElBcHA9Ci1PTEVJTlBMQUNFRlJBTUVJTkZPX2h3bmRGcmFtZT1jYXN0PShIV05EKQotT0xFSU5QTEFDRUZSQU1FSU5GT19oYWNjZWw9Y2FzdD0oSEFDQ0VMKQotT0xFSU5QTEFDRUZSQU1FSU5GT19jQWNjZWxFbnRyaWVzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEc9Ci1TVEFUU1RHX3B3Y3NOYW1lPWNhc3Q9KExQV1NUUikKLVNUQVRTVEdfdHlwZT0KLVNUQVRTVEdfY2JTaXplPWFjY2Vzc29yPWNiU2l6ZS5RdWFkUGFydAotU1RBVFNUR19tdGltZV9kd0xvd0RhdGVUaW1lPWFjY2Vzc29yPW10aW1lLmR3TG93RGF0ZVRpbWUKLVNUQVRTVEdfbXRpbWVfZHdIaWdoRGF0ZVRpbWU9YWNjZXNzb3I9bXRpbWUuZHdIaWdoRGF0ZVRpbWUKLVNUQVRTVEdfY3RpbWVfZHdMb3dEYXRlVGltZT1hY2Nlc3Nvcj1jdGltZS5kd0xvd0RhdGVUaW1lCi1TVEFUU1RHX2N0aW1lX2R3SGlnaERhdGVUaW1lPWFjY2Vzc29yPWN0aW1lLmR3SGlnaERhdGVUaW1lCi1TVEFUU1RHX2F0aW1lX2R3TG93RGF0ZVRpbWU9YWNjZXNzb3I9YXRpbWUuZHdMb3dEYXRlVGltZQotU1RBVFNUR19hdGltZV9kd0hpZ2hEYXRlVGltZT1hY2Nlc3Nvcj1hdGltZS5kd0hpZ2hEYXRlVGltZQotU1RBVFNUR19ncmZNb2RlPQotU1RBVFNUR19ncmZMb2Nrc1N1cHBvcnRlZD0KLVNUQVRTVEdfY2xzaWRfRGF0YTE9YWNjZXNzb3I9Y2xzaWQuRGF0YTEKLVNUQVRTVEdfY2xzaWRfRGF0YTI9YWNjZXNzb3I9Y2xzaWQuRGF0YTIKLVNUQVRTVEdfY2xzaWRfRGF0YTM9YWNjZXNzb3I9Y2xzaWQuRGF0YTMKLVNUQVRTVEdfY2xzaWRfRGF0YTQ9YWNjZXNzb3I9Y2xzaWQuRGF0YTQKLVNUQVRTVEdfZ3JmU3RhdGVCaXRzPQotU1RBVFNUR19yZXNlcnZlZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU09Ci1TVEdNRURJVU1fdHltZWQ9Ci1TVEdNRURJVU1fdW5pb25GaWVsZD1hY2Nlc3Nvcj1oR2xvYmFsLGNhc3Q9KEhHTE9CQUwpCi1TVEdNRURJVU1fcFVua0ZvclJlbGVhc2U9Y2FzdD0oSVVua25vd24gKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9UWVBFQVRUUj0KLVRZUEVBVFRSX2d1aWRfRGF0YTE9YWNjZXNzb3I9Z3VpZC5EYXRhMQotVFlQRUFUVFJfZ3VpZF9EYXRhMj1hY2Nlc3Nvcj1ndWlkLkRhdGEyCi1UWVBFQVRUUl9ndWlkX0RhdGEzPWFjY2Vzc29yPWd1aWQuRGF0YTMKLVRZUEVBVFRSX2d1aWRfRGF0YTQ9YWNjZXNzb3I9Z3VpZC5EYXRhNAotVFlQRUFUVFJfbGNpZD0KLVRZUEVBVFRSX2R3UmVzZXJ2ZWQ9Ci1UWVBFQVRUUl9tZW1pZENvbnN0cnVjdG9yPQotVFlQRUFUVFJfbWVtaWREZXN0cnVjdG9yPQotVFlQRUFUVFJfbHBzdHJTY2hlbWE9Y2FzdD0oT0xFQ0hBUiBGQVIgKikKLVRZUEVBVFRSX2NiU2l6ZUluc3RhbmNlPQotVFlQRUFUVFJfdHlwZWtpbmQ9Ci1UWVBFQVRUUl9jRnVuY3M9Ci1UWVBFQVRUUl9jVmFycz0KLVRZUEVBVFRSX2NJbXBsVHlwZXM9Ci1UWVBFQVRUUl9jYlNpemVWZnQ9Ci1UWVBFQVRUUl9jYkFsaWdubWVudD0KLVRZUEVBVFRSX3dUeXBlRmxhZ3M9Ci1UWVBFQVRUUl93TWFqb3JWZXJOdW09Ci1UWVBFQVRUUl93TWlub3JWZXJOdW09Ci1UWVBFQVRUUl90ZGVzY0FsaWFzX3VuaW9uRmllbGQ9YWNjZXNzb3I9dGRlc2NBbGlhcy5scHRkZXNjLGNhc3Q9KHN0cnVjdCBGQVJTVFJVQ1QgdGFnVFlQRURFU0MgRkFSICopCi1UWVBFQVRUUl90ZGVzY0FsaWFzX3Z0PWFjY2Vzc29yPXRkZXNjQWxpYXMudnQKLVRZUEVBVFRSX2lkbGRlc2NUeXBlX2R3UmVzZXJ2ZWQ9YWNjZXNzb3I9aWRsZGVzY1R5cGUuZHdSZXNlcnZlZAotVFlQRUFUVFJfaWRsZGVzY1R5cGVfd0lETEZsYWdzPWFjY2Vzc29yPWlkbGRlc2NUeXBlLndJRExGbGFncwotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1ZBUkRFU0M9Ci1WQVJERVNDX21lbWlkPQotVkFSREVTQ19scHN0clNjaGVtYT1jYXN0PShPTEVDSEFSIEZBUiAqKQotVkFSREVTQ19vSW5zdD0KLVZBUkRFU0NfZWxlbWRlc2NWYXJfdGRlc2NfdW5pb249YWNjZXNzb3I9ZWxlbWRlc2NWYXIudGRlc2MubHB0ZGVzYyxjYXN0PShzdHJ1Y3QgRkFSU1RSVUNUIHRhZ1RZUEVERVNDIEZBUiAqKQotVkFSREVTQ19lbGVtZGVzY1Zhcl90ZGVzY192dD1hY2Nlc3Nvcj1lbGVtZGVzY1Zhci50ZGVzYy52dAotVkFSREVTQ19lbGVtZGVzY1Zhcl9wYXJhbWRlc2NfcHBhcmFtZGVzY2V4PWFjY2Vzc29yPWVsZW1kZXNjVmFyLnBhcmFtZGVzYy5wcGFyYW1kZXNjZXgsY2FzdD0oTFBQQVJBTURFU0NFWCkKLVZBUkRFU0NfZWxlbWRlc2NWYXJfcGFyYW1kZXNjX3dQYXJhbUZsYWdzPWFjY2Vzc29yPWVsZW1kZXNjVmFyLnBhcmFtZGVzYy53UGFyYW1GbGFncwotVkFSREVTQ193VmFyRmxhZ3M9Ci1WQVJERVNDX3ZhcmtpbmQ9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLmdseC5HTFgucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLmdseC5HTFgucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM3YTJjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC5nbHguR0xYLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29wZW5nbF9nbHhfR0xYPQotR0xYX1hWaXN1YWxJbmZvX3NpemVvZj0KLQotR0xYX2dsR2V0SW50ZWdlcnY9Ci1HTFhfZ2xHZXRJbnRlZ2Vydl8wPWNhc3Q9KEdMZW51bSkKLUdMWF9nbEdldEludGVnZXJ2XzE9Y2FzdD0oR0xpbnQgKiksZmxhZ3M9bm9faW4KLQotR0xYX2dsVmlld3BvcnQ9Ci1HTFhfZ2xWaWV3cG9ydF8wPWNhc3Q9KEdMaW50KQotR0xYX2dsVmlld3BvcnRfMT1jYXN0PShHTGludCkKLUdMWF9nbFZpZXdwb3J0XzI9Y2FzdD0oR0xzaXplaSkKLUdMWF9nbFZpZXdwb3J0XzM9Y2FzdD0oR0xzaXplaSkKLQotR0xYX2dsWENob29zZVZpc3VhbD0KLUdMWF9nbFhDaG9vc2VWaXN1YWxfMD1jYXN0PShEaXNwbGF5ICopCi1HTFhfZ2xYQ2hvb3NlVmlzdWFsXzE9Ci1HTFhfZ2xYQ2hvb3NlVmlzdWFsXzI9Ci0KLUdMWF9nbFhDb3B5Q29udGV4dD0KLUdMWF9nbFhDb3B5Q29udGV4dF8wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhDb3B5Q29udGV4dF8xPWNhc3Q9KEdMWENvbnRleHQpCi1HTFhfZ2xYQ29weUNvbnRleHRfMj1jYXN0PShHTFhDb250ZXh0KQotR0xYX2dsWENvcHlDb250ZXh0XzM9Ci0KLUdMWF9nbFhDcmVhdGVDb250ZXh0PQotR0xYX2dsWENyZWF0ZUNvbnRleHRfMD1jYXN0PShEaXNwbGF5ICopCi1HTFhfZ2xYQ3JlYXRlQ29udGV4dF8xPQotR0xYX2dsWENyZWF0ZUNvbnRleHRfMj1jYXN0PShHTFhDb250ZXh0KQotR0xYX2dsWENyZWF0ZUNvbnRleHRfMz0KLQotR0xYX2dsWENyZWF0ZUdMWFBpeG1hcD0KLUdMWF9nbFhDcmVhdGVHTFhQaXhtYXBfMD1jYXN0PShEaXNwbGF5ICopCi1HTFhfZ2xYQ3JlYXRlR0xYUGl4bWFwXzE9Ci1HTFhfZ2xYQ3JlYXRlR0xYUGl4bWFwXzI9Y2FzdD0oUGl4bWFwKQotCi1HTFhfZ2xYRGVzdHJveUNvbnRleHQ9Ci1HTFhfZ2xYRGVzdHJveUNvbnRleHRfMD1jYXN0PShEaXNwbGF5ICopCi1HTFhfZ2xYRGVzdHJveUNvbnRleHRfMT1jYXN0PShHTFhDb250ZXh0KQotCi1HTFhfZ2xYRGVzdHJveUdMWFBpeG1hcD0KLUdMWF9nbFhEZXN0cm95R0xYUGl4bWFwXzA9Y2FzdD0oRGlzcGxheSAqKQotR0xYX2dsWERlc3Ryb3lHTFhQaXhtYXBfMT1jYXN0PShHTFhQaXhtYXApCi0KLUdMWF9nbFhHZXRDbGllbnRTdHJpbmc9Ci1HTFhfZ2xYR2V0Q2xpZW50U3RyaW5nXzA9Y2FzdD0oRGlzcGxheSAqKQotR0xYX2dsWEdldENsaWVudFN0cmluZ18xPQotCi1HTFhfZ2xYR2V0Q29uZmlnPQotR0xYX2dsWEdldENvbmZpZ18wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhHZXRDb25maWdfMT0KLUdMWF9nbFhHZXRDb25maWdfMj0KLUdMWF9nbFhHZXRDb25maWdfMz0KLQotR0xYX2dsWEdldEN1cnJlbnRDb250ZXh0PQotCi1HTFhfZ2xYR2V0Q3VycmVudERyYXdhYmxlPQotCi1HTFhfZ2xYSXNEaXJlY3Q9Ci1HTFhfZ2xYSXNEaXJlY3RfMD1jYXN0PShEaXNwbGF5ICopCi1HTFhfZ2xYSXNEaXJlY3RfMT1jYXN0PShHTFhDb250ZXh0KQotCi1HTFhfZ2xYTWFrZUN1cnJlbnQ9Ci1HTFhfZ2xYTWFrZUN1cnJlbnRfMD1jYXN0PShEaXNwbGF5ICopCi1HTFhfZ2xYTWFrZUN1cnJlbnRfMT1jYXN0PShHTFhEcmF3YWJsZSkKLUdMWF9nbFhNYWtlQ3VycmVudF8yPWNhc3Q9KEdMWENvbnRleHQpCi0KLUdMWF9nbFhRdWVyeUV4dGVuc2lvbj0KLUdMWF9nbFhRdWVyeUV4dGVuc2lvbl8wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhRdWVyeUV4dGVuc2lvbl8xPQotR0xYX2dsWFF1ZXJ5RXh0ZW5zaW9uXzI9Ci0KLUdMWF9nbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmc9Ci1HTFhfZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nXzA9Y2FzdD0oRGlzcGxheSAqKQotR0xYX2dsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZ18xPQotCi1HTFhfZ2xYUXVlcnlTZXJ2ZXJTdHJpbmc9Ci1HTFhfZ2xYUXVlcnlTZXJ2ZXJTdHJpbmdfMD1jYXN0PShEaXNwbGF5ICopCi1HTFhfZ2xYUXVlcnlTZXJ2ZXJTdHJpbmdfMT0KLUdMWF9nbFhRdWVyeVNlcnZlclN0cmluZ18yPQotCi1HTFhfZ2xYUXVlcnlWZXJzaW9uPQotR0xYX2dsWFF1ZXJ5VmVyc2lvbl8wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhRdWVyeVZlcnNpb25fMT1mbGFncz1ub19pbgotR0xYX2dsWFF1ZXJ5VmVyc2lvbl8yPWZsYWdzPW5vX2luCi0KLUdMWF9nbFhTd2FwQnVmZmVycz0KLUdMWF9nbFhTd2FwQnVmZmVyc18wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhTd2FwQnVmZmVyc18xPWNhc3Q9KEdMWERyYXdhYmxlKQotCi1HTFhfZ2xYV2FpdEdMPQotCi1HTFhfZ2xYV2FpdFg9Ci0KLUdMWF9tZW1tb3ZlPQotR0xYX21lbW1vdmVfMD0KLUdMWF9tZW1tb3ZlXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotR0xYX21lbW1vdmVfMj1jYXN0PShzaXplX3QpCi0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29wZW5nbF9nbHhfWFZpc3VhbEluZm89Ci1YVmlzdWFsSW5mb192aXN1YWw9Y2FzdD0oVmlzdWFsICopCi1YVmlzdWFsSW5mb192aXN1YWxpZD0KLVhWaXN1YWxJbmZvX3NjcmVlbj0KLVhWaXN1YWxJbmZvX2RlcHRoPQotWFZpc3VhbEluZm9fY2NsYXNzPWFjY2Vzc29yPWNsYXNzCi1YVmlzdWFsSW5mb19yZWRfbWFzaz0KLVhWaXN1YWxJbmZvX2dyZWVuX21hc2s9Ci1YVmlzdWFsSW5mb19ibHVlX21hc2s9Ci1YVmlzdWFsSW5mb19jb2xvcm1hcF9zaXplPQotWFZpc3VhbEluZm9fYml0c19wZXJfcmdiPQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC5ndGsuR0xYLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC5ndGsuR0xYLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OWI3MTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wuZ3RrLkdMWC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vcGVuZ2xfZ3RrX0dMWD0KLUdMWF9nbFhDaG9vc2VWaXN1YWw9Ci1HTFhfZ2xYQ2hvb3NlVmlzdWFsXzA9Ci1HTFhfZ2xYQ2hvb3NlVmlzdWFsXzE9Ci1HTFhfZ2xYQ2hvb3NlVmlzdWFsXzI9Ci0KLUdMWF9nbFhDb3B5Q29udGV4dD0KLUdMWF9nbFhDb3B5Q29udGV4dF8wPQotR0xYX2dsWENvcHlDb250ZXh0XzE9Ci1HTFhfZ2xYQ29weUNvbnRleHRfMj0KLUdMWF9nbFhDb3B5Q29udGV4dF8zPQotCi1HTFhfZ2xYQ3JlYXRlQ29udGV4dD0KLUdMWF9nbFhDcmVhdGVDb250ZXh0XzA9Ci1HTFhfZ2xYQ3JlYXRlQ29udGV4dF8xPQotR0xYX2dsWENyZWF0ZUNvbnRleHRfMj0KLUdMWF9nbFhDcmVhdGVDb250ZXh0XzM9Ci0KLUdMWF9nbFhDcmVhdGVHTFhQaXhtYXA9Ci1HTFhfZ2xYQ3JlYXRlR0xYUGl4bWFwXzA9Ci1HTFhfZ2xYQ3JlYXRlR0xYUGl4bWFwXzE9Ci1HTFhfZ2xYQ3JlYXRlR0xYUGl4bWFwXzI9Ci0KLUdMWF9nbFhEZXN0cm95Q29udGV4dD0KLUdMWF9nbFhEZXN0cm95Q29udGV4dF8wPQotR0xYX2dsWERlc3Ryb3lDb250ZXh0XzE9Ci0KLUdMWF9nbFhEZXN0cm95R0xYUGl4bWFwPQotR0xYX2dsWERlc3Ryb3lHTFhQaXhtYXBfMD0KLUdMWF9nbFhEZXN0cm95R0xYUGl4bWFwXzE9Ci0KLUdMWF9nbFhHZXRDbGllbnRTdHJpbmc9Ci1HTFhfZ2xYR2V0Q2xpZW50U3RyaW5nXzA9Ci1HTFhfZ2xYR2V0Q2xpZW50U3RyaW5nXzE9Ci0KLUdMWF9nbFhHZXRDb25maWc9Ci1HTFhfZ2xYR2V0Q29uZmlnXzA9Ci1HTFhfZ2xYR2V0Q29uZmlnXzE9Ci1HTFhfZ2xYR2V0Q29uZmlnXzI9Ci1HTFhfZ2xYR2V0Q29uZmlnXzM9Ci0KLUdMWF9nbFhHZXRDdXJyZW50Q29udGV4dD0KLQotR0xYX2dsWEdldEN1cnJlbnREcmF3YWJsZT0KLQotR0xYX2dsWElzRGlyZWN0PQotR0xYX2dsWElzRGlyZWN0XzA9Ci1HTFhfZ2xYSXNEaXJlY3RfMT0KLQotR0xYX2dsWE1ha2VDdXJyZW50PQotR0xYX2dsWE1ha2VDdXJyZW50XzA9Ci1HTFhfZ2xYTWFrZUN1cnJlbnRfMT0KLUdMWF9nbFhNYWtlQ3VycmVudF8yPQotCi1HTFhfZ2xYUXVlcnlFeHRlbnNpb249Ci1HTFhfZ2xYUXVlcnlFeHRlbnNpb25fMD0KLUdMWF9nbFhRdWVyeUV4dGVuc2lvbl8xPQotR0xYX2dsWFF1ZXJ5RXh0ZW5zaW9uXzI9Ci0KLUdMWF9nbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmc9Ci1HTFhfZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nXzA9Ci1HTFhfZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nXzE9Ci0KLUdMWF9nbFhRdWVyeVNlcnZlclN0cmluZz0KLUdMWF9nbFhRdWVyeVNlcnZlclN0cmluZ18wPQotR0xYX2dsWFF1ZXJ5U2VydmVyU3RyaW5nXzE9Ci1HTFhfZ2xYUXVlcnlTZXJ2ZXJTdHJpbmdfMj0KLQotR0xYX2dsWFF1ZXJ5VmVyc2lvbj0KLUdMWF9nbFhRdWVyeVZlcnNpb25fMD0KLUdMWF9nbFhRdWVyeVZlcnNpb25fMT0KLUdMWF9nbFhRdWVyeVZlcnNpb25fMj0KLQotR0xYX2dsWFN3YXBCdWZmZXJzPQotR0xYX2dsWFN3YXBCdWZmZXJzXzA9Ci1HTFhfZ2xYU3dhcEJ1ZmZlcnNfMT0KLQotR0xYX2dsWFVzZVhGb250PQotR0xYX2dsWFVzZVhGb250XzA9Ci1HTFhfZ2xYVXNlWEZvbnRfMT0KLUdMWF9nbFhVc2VYRm9udF8yPQotR0xYX2dsWFVzZVhGb250XzM9Ci0KLUdMWF9nbFhXYWl0R0w9Ci0KLUdMWF9nbFhXYWl0WD0KLQotR0xYX21lbW1vdmU9Ci1HTFhfbWVtbW92ZV8wPQotR0xYX21lbW1vdmVfMT0KLUdMWF9tZW1tb3ZlXzI9Ci0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29wZW5nbF9ndGtfWFZpc3VhbEluZm89Ci1YVmlzdWFsSW5mb192aXN1YWw9Ci1YVmlzdWFsSW5mb192aXN1YWxpZD0KLVhWaXN1YWxJbmZvX3NjcmVlbj0KLVhWaXN1YWxJbmZvX2RlcHRoPQotWFZpc3VhbEluZm9fY2NsYXNzPQotWFZpc3VhbEluZm9fcmVkX21hc2s9Ci1YVmlzdWFsSW5mb19ncmVlbl9tYXNrPQotWFZpc3VhbEluZm9fYmx1ZV9tYXNrPQotWFZpc3VhbEluZm9fY29sb3JtYXBfc2l6ZT0KLVhWaXN1YWxJbmZvX2JpdHNfcGVyX3JnYj0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wud2luMzIuV0dMLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC53aW4zMi5XR0wucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxOTc3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC53aW4zMi5XR0wucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb3BlbmdsX3dpbjMyX0xBWUVSUExBTkVERVNDUklQVE9SPQotTEFZRVJQTEFORURFU0NSSVBUT1JfblNpemU9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9uVmVyc2lvbj0KLUxBWUVSUExBTkVERVNDUklQVE9SX2R3RmxhZ3M9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9pUGl4ZWxUeXBlPQotTEFZRVJQTEFORURFU0NSSVBUT1JfY0NvbG9yQml0cz0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NSZWRCaXRzPQotTEFZRVJQTEFORURFU0NSSVBUT1JfY1JlZFNoaWZ0PQotTEFZRVJQTEFORURFU0NSSVBUT1JfY0dyZWVuQml0cz0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NHcmVlblNoaWZ0PQotTEFZRVJQTEFORURFU0NSSVBUT1JfY0JsdWVCaXRzPQotTEFZRVJQTEFORURFU0NSSVBUT1JfY0JsdWVTaGlmdD0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NBbHBoYUJpdHM9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jQWxwaGFTaGlmdD0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NBY2N1bUJpdHM9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jQWNjdW1SZWRCaXRzPQotTEFZRVJQTEFORURFU0NSSVBUT1JfY0FjY3VtR3JlZW5CaXRzPQotTEFZRVJQTEFORURFU0NSSVBUT1JfY0FjY3VtQmx1ZUJpdHM9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jQWNjdW1BbHBoYUJpdHM9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jRGVwdGhCaXRzPQotTEFZRVJQTEFORURFU0NSSVBUT1JfY1N0ZW5jaWxCaXRzPQotTEFZRVJQTEFORURFU0NSSVBUT1JfY0F1eEJ1ZmZlcnM9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9pTGF5ZXJQbGFuZT0KLUxBWUVSUExBTkVERVNDUklQVE9SX2JSZXNlcnZlZD0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NyVHJhbnNwYXJlbnQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vcGVuZ2xfd2luMzJfUElYRUxGT1JNQVRERVNDUklQVE9SPQotUElYRUxGT1JNQVRERVNDUklQVE9SX25TaXplPQotUElYRUxGT1JNQVRERVNDUklQVE9SX25WZXJzaW9uPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2R3RmxhZ3M9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfaVBpeGVsVHlwZT0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9jQ29sb3JCaXRzPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2NSZWRCaXRzPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2NSZWRTaGlmdD0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9jR3JlZW5CaXRzPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2NHcmVlblNoaWZ0PQotUElYRUxGT1JNQVRERVNDUklQVE9SX2NCbHVlQml0cz0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9jQmx1ZVNoaWZ0PQotUElYRUxGT1JNQVRERVNDUklQVE9SX2NBbHBoYUJpdHM9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfY0FscGhhU2hpZnQ9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfY0FjY3VtQml0cz0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9jQWNjdW1SZWRCaXRzPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2NBY2N1bUdyZWVuQml0cz0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9jQWNjdW1CbHVlQml0cz0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9jQWNjdW1BbHBoYUJpdHM9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfY0RlcHRoQml0cz0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9jU3RlbmNpbEJpdHM9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfY0F1eEJ1ZmZlcnM9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfaUxheWVyVHlwZT0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9iUmVzZXJ2ZWQ9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfZHdMYXllck1hc2s9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfZHdWaXNpYmxlTWFzaz0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9kd0RhbWFnZU1hc2s9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vcGVuZ2xfd2luMzJfV0dMPQotV0dMX0Nob29zZVBpeGVsRm9ybWF0PQotV0dMX0Nob29zZVBpeGVsRm9ybWF0XzA9Y2FzdD0oSERDKQotV0dMX0Nob29zZVBpeGVsRm9ybWF0XzE9Ci0KLVdHTF9EZXNjcmliZVBpeGVsRm9ybWF0PQotV0dMX0Rlc2NyaWJlUGl4ZWxGb3JtYXRfMD1jYXN0PShIREMpCi1XR0xfRGVzY3JpYmVQaXhlbEZvcm1hdF8xPQotV0dMX0Rlc2NyaWJlUGl4ZWxGb3JtYXRfMj0KLVdHTF9EZXNjcmliZVBpeGVsRm9ybWF0XzM9Ci0KLVdHTF9HZXRQaXhlbEZvcm1hdD0KLVdHTF9HZXRQaXhlbEZvcm1hdF8wPWNhc3Q9KEhEQykKLQotV0dMX1NldFBpeGVsRm9ybWF0PQotV0dMX1NldFBpeGVsRm9ybWF0XzA9Y2FzdD0oSERDKQotV0dMX1NldFBpeGVsRm9ybWF0XzE9Ci1XR0xfU2V0UGl4ZWxGb3JtYXRfMj0KLQotV0dMX1N3YXBCdWZmZXJzPQotV0dMX1N3YXBCdWZmZXJzXzA9Y2FzdD0oSERDKQotCi1XR0xfd2dsQ29weUNvbnRleHQ9Ci1XR0xfd2dsQ29weUNvbnRleHRfMD1jYXN0PShIR0xSQykKLVdHTF93Z2xDb3B5Q29udGV4dF8xPWNhc3Q9KEhHTFJDKQotV0dMX3dnbENvcHlDb250ZXh0XzI9Ci0KLVdHTF93Z2xDcmVhdGVDb250ZXh0PQotV0dMX3dnbENyZWF0ZUNvbnRleHRfMD1jYXN0PShIREMpCi0KLVdHTF93Z2xDcmVhdGVMYXllckNvbnRleHQ9Ci1XR0xfd2dsQ3JlYXRlTGF5ZXJDb250ZXh0XzA9Y2FzdD0oSERDKQotV0dMX3dnbENyZWF0ZUxheWVyQ29udGV4dF8xPQotCi1XR0xfd2dsRGVsZXRlQ29udGV4dD0KLVdHTF93Z2xEZWxldGVDb250ZXh0XzA9Y2FzdD0oSEdMUkMpCi0KLVdHTF93Z2xEZXNjcmliZUxheWVyUGxhbmU9Ci1XR0xfd2dsRGVzY3JpYmVMYXllclBsYW5lXzA9Y2FzdD0oSERDKQotV0dMX3dnbERlc2NyaWJlTGF5ZXJQbGFuZV8xPQotV0dMX3dnbERlc2NyaWJlTGF5ZXJQbGFuZV8yPQotV0dMX3dnbERlc2NyaWJlTGF5ZXJQbGFuZV8zPQotV0dMX3dnbERlc2NyaWJlTGF5ZXJQbGFuZV80PQotCi1XR0xfd2dsR2V0Q3VycmVudENvbnRleHQ9Ci0KLVdHTF93Z2xHZXRDdXJyZW50REM9Ci0KLVdHTF93Z2xHZXRMYXllclBhbGV0dGVFbnRyaWVzPQotV0dMX3dnbEdldExheWVyUGFsZXR0ZUVudHJpZXNfMD1jYXN0PShIREMpCi1XR0xfd2dsR2V0TGF5ZXJQYWxldHRlRW50cmllc18xPQotV0dMX3dnbEdldExheWVyUGFsZXR0ZUVudHJpZXNfMj0KLVdHTF93Z2xHZXRMYXllclBhbGV0dGVFbnRyaWVzXzM9Ci1XR0xfd2dsR2V0TGF5ZXJQYWxldHRlRW50cmllc180PQotCi1XR0xfd2dsR2V0UHJvY0FkZHJlc3M9Ci1XR0xfd2dsR2V0UHJvY0FkZHJlc3NfMD0KLQotV0dMX3dnbE1ha2VDdXJyZW50PQotV0dMX3dnbE1ha2VDdXJyZW50XzA9Y2FzdD0oSERDKQotV0dMX3dnbE1ha2VDdXJyZW50XzE9Y2FzdD0oSEdMUkMpCi0KLVdHTF93Z2xSZWFsaXplTGF5ZXJQYWxldHRlPQotV0dMX3dnbFJlYWxpemVMYXllclBhbGV0dGVfMD1jYXN0PShIREMpCi1XR0xfd2dsUmVhbGl6ZUxheWVyUGFsZXR0ZV8xPQotV0dMX3dnbFJlYWxpemVMYXllclBhbGV0dGVfMj0KLQotV0dMX3dnbFNldExheWVyUGFsZXR0ZUVudHJpZXM9Ci1XR0xfd2dsU2V0TGF5ZXJQYWxldHRlRW50cmllc18wPWNhc3Q9KEhEQykKLVdHTF93Z2xTZXRMYXllclBhbGV0dGVFbnRyaWVzXzE9Ci1XR0xfd2dsU2V0TGF5ZXJQYWxldHRlRW50cmllc18yPQotV0dMX3dnbFNldExheWVyUGFsZXR0ZUVudHJpZXNfMz0KLVdHTF93Z2xTZXRMYXllclBhbGV0dGVFbnRyaWVzXzQ9Ci0KLVdHTF93Z2xTaGFyZUxpc3RzPQotV0dMX3dnbFNoYXJlTGlzdHNfMD1jYXN0PShIR0xSQykKLVdHTF93Z2xTaGFyZUxpc3RzXzE9Y2FzdD0oSEdMUkMpCi0KLVdHTF93Z2xTd2FwTGF5ZXJCdWZmZXJzPQotV0dMX3dnbFN3YXBMYXllckJ1ZmZlcnNfMD1jYXN0PShIREMpCi1XR0xfd2dsU3dhcExheWVyQnVmZmVyc18xPQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwucGhvdG9uLk9TLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLnBob3Rvbi5PUy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWMwMmVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwucGhvdG9uLk9TLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fRm9udERldGFpbHM9Ci1Gb250RGV0YWlsc19kZXNjPWNhc3Q9KEZvbnREZXNjcmlwdGlvbikKLUZvbnREZXRhaWxzX3N0ZW09Y2FzdD0oRm9udE5hbWUpCi1Gb250RGV0YWlsc19sb3NpemU9Ci1Gb250RGV0YWlsc19oaXNpemU9Ci1Gb250RGV0YWlsc19mbGFncz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9Gb250UXVlcnlJbmZvPQotRm9udFF1ZXJ5SW5mb19mb250PWNhc3Q9KEZvbnROYW1lKQotRm9udFF1ZXJ5SW5mb19kZXNjPWNhc3Q9KEZvbnREZXNjcmlwdGlvbikKLUZvbnRRdWVyeUluZm9fc2l6ZT0KLUZvbnRRdWVyeUluZm9fc3R5bGU9Ci1Gb250UXVlcnlJbmZvX2FzY2VuZGVyPQotRm9udFF1ZXJ5SW5mb19kZXNjZW5kZXI9Ci1Gb250UXVlcnlJbmZvX3dpZHRoPQotRm9udFF1ZXJ5SW5mb19sb2NoYXI9Ci1Gb250UXVlcnlJbmZvX2hpY2hhcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9PUz0KLU9TX1BmRGVjb21wb3NlU3RlbVRvSUQ9Ci1PU19QZkRlY29tcG9zZVN0ZW1Ub0lEXzA9Ci0KLU9TX1BmRXh0ZW50VGV4dF9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50XzF0XzJJSUk9Ci1PU19QZkV4dGVudFRleHRfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludF8xdF8ySUlJXzA9Ci1PU19QZkV4dGVudFRleHRfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludF8xdF8ySUlJXzE9Ci1PU19QZkV4dGVudFRleHRfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludF8xdF8ySUlJXzI9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfUGZFeHRlbnRUZXh0X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXRfMklJSV8zPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX1BmRXh0ZW50VGV4dF9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50XzF0XzJJSUlfND0KLQotT1NfUGZFeHRlbnRUZXh0X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXRfMl8zQl8zQkk9Ci1PU19QZkV4dGVudFRleHRfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludF8xdF8yXzNCXzNCSV8wPQotT1NfUGZFeHRlbnRUZXh0X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXRfMl8zQl8zQklfMT0KLU9TX1BmRXh0ZW50VGV4dF9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50XzF0XzJfM0JfM0JJXzI9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfUGZFeHRlbnRUZXh0X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXRfMl8zQl8zQklfMz1jYXN0PShjb25zdCBjaGFyICopCi1PU19QZkV4dGVudFRleHRfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludF8xdF8yXzNCXzNCSV80PQotCi1PU19QZkV4dGVudFdpZGVUZXh0PQotT1NfUGZFeHRlbnRXaWRlVGV4dF8wPQotT1NfUGZFeHRlbnRXaWRlVGV4dF8xPQotT1NfUGZFeHRlbnRXaWRlVGV4dF8yPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX1BmRXh0ZW50V2lkZVRleHRfMz1jYXN0PShjb25zdCB1aW50MTZfdCAqKQotT1NfUGZFeHRlbnRXaWRlVGV4dF80PQotCi1PU19QZkZvbnREZXNjcmlwdGlvbj0KLU9TX1BmRm9udERlc2NyaXB0aW9uXzA9Y2FzdD0oRm9udElEICopCi0KLU9TX1BmRm9udEZsYWdzPQotT1NfUGZGb250RmxhZ3NfMD1jYXN0PShGb250SUQgKikKLQotT1NfUGZGb250U2l6ZT0KLU9TX1BmRm9udFNpemVfMD1jYXN0PShGb250SUQgKikKLQotT1NfUGZGcmVlRm9udD0KLU9TX1BmRnJlZUZvbnRfMD1jYXN0PShGb250SUQgKikKLQotT1NfUGZHZW5lcmF0ZUZvbnROYW1lPQotT1NfUGZHZW5lcmF0ZUZvbnROYW1lXzA9Y2FzdD0oY2hhciBjb25zdCAqKQotT1NfUGZHZW5lcmF0ZUZvbnROYW1lXzE9Ci1PU19QZkdlbmVyYXRlRm9udE5hbWVfMj0KLU9TX1BmR2VuZXJhdGVGb250TmFtZV8zPWNhc3Q9KGNoYXIgKikKLQotT1NfUGZMb2FkTWV0cmljcz0KLU9TX1BmTG9hZE1ldHJpY3NfMD1jYXN0PShjb25zdCBjaGFyICopCi0KLU9TX1BmUXVlcnlGb250SW5mbz0KLU9TX1BmUXVlcnlGb250SW5mb18wPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX1BmUXVlcnlGb250SW5mb18xPWNhc3Q9KEZvbnRRdWVyeUluZm8gKikKLQotT1NfUGZRdWVyeUZvbnRzPQotT1NfUGZRdWVyeUZvbnRzXzA9Ci1PU19QZlF1ZXJ5Rm9udHNfMT0KLU9TX1BmUXVlcnlGb250c18yPWNhc3Q9KEZvbnREZXRhaWxzICopCi1PU19QZlF1ZXJ5Rm9udHNfMz0KLQotT1NfUGdBbHBoYU9mZj0KLQotT1NfUGdBbHBoYU9uPQotCi1PU19QZ0NyZWF0ZUdDPQotT1NfUGdDcmVhdGVHQ18wPQotCi1PU19QZ0Rlc3Ryb3lHQz0KLU9TX1BnRGVzdHJveUdDXzA9Y2FzdD0oUGhHQ190ICopCi0KLU9TX1BnRHJhd0FyYz0KLU9TX1BnRHJhd0FyY18wPQotT1NfUGdEcmF3QXJjXzE9Ci1PU19QZ0RyYXdBcmNfMj0KLU9TX1BnRHJhd0FyY18zPQotT1NfUGdEcmF3QXJjXzQ9Ci0KLU9TX1BnRHJhd0Fycm93PQotT1NfUGdEcmF3QXJyb3dfMD0KLU9TX1BnRHJhd0Fycm93XzE9Ci1PU19QZ0RyYXdBcnJvd18yPWNhc3Q9KFBnQ29sb3JfdCkKLU9TX1BnRHJhd0Fycm93XzM9Ci0KLU9TX1BnRHJhd0JpdG1hcD0KLU9TX1BnRHJhd0JpdG1hcF8wPWNhc3Q9KHZvaWQgY29uc3QgKikKLU9TX1BnRHJhd0JpdG1hcF8xPWNhc3Q9KGludCkKLU9TX1BnRHJhd0JpdG1hcF8yPWNhc3Q9KFBoUG9pbnRfdCAqKQotT1NfUGdEcmF3Qml0bWFwXzM9Y2FzdD0oUGhQb2ludF90ICopCi1PU19QZ0RyYXdCaXRtYXBfND1jYXN0PShpbnQpCi1PU19QZ0RyYXdCaXRtYXBfNT1jYXN0PShsb25nKQotCi1PU19QZ0RyYXdFbGxpcHNlPQotT1NfUGdEcmF3RWxsaXBzZV8wPQotT1NfUGdEcmF3RWxsaXBzZV8xPQotT1NfUGdEcmF3RWxsaXBzZV8yPQotCi1PU19QZ0RyYXdHcmFkaWVudD0KLU9TX1BnRHJhd0dyYWRpZW50XzA9Ci1PU19QZ0RyYXdHcmFkaWVudF8xPQotT1NfUGdEcmF3R3JhZGllbnRfMj0KLU9TX1BnRHJhd0dyYWRpZW50XzM9Ci1PU19QZ0RyYXdHcmFkaWVudF80PQotT1NfUGdEcmF3R3JhZGllbnRfNT1jYXN0PShQZ0NvbG9yX3QpCi1PU19QZ0RyYXdHcmFkaWVudF82PWNhc3Q9KFBnQ29sb3JfdCkKLU9TX1BnRHJhd0dyYWRpZW50Xzc9Y2FzdD0oUGdDb2xvcl90KQotT1NfUGdEcmF3R3JhZGllbnRfOD1jYXN0PShQZ0NvbG9yX3QpCi1PU19QZ0RyYXdHcmFkaWVudF85PQotT1NfUGdEcmF3R3JhZGllbnRfMTA9Y2FzdD0odW5zaWduZWQgY2hhciAqKQotCi1PU19QZ0RyYXdJTGluZT0KLU9TX1BnRHJhd0lMaW5lXzA9Ci1PU19QZ0RyYXdJTGluZV8xPQotT1NfUGdEcmF3SUxpbmVfMj0KLU9TX1BnRHJhd0lMaW5lXzM9Ci0KLU9TX1BnRHJhd0lQaXhlbD0KLU9TX1BnRHJhd0lQaXhlbF8wPQotT1NfUGdEcmF3SVBpeGVsXzE9Ci0KLU9TX1BnRHJhd0lSZWN0PQotT1NfUGdEcmF3SVJlY3RfMD0KLU9TX1BnRHJhd0lSZWN0XzE9Ci1PU19QZ0RyYXdJUmVjdF8yPQotT1NfUGdEcmF3SVJlY3RfMz0KLU9TX1BnRHJhd0lSZWN0XzQ9Ci0KLU9TX1BnRHJhd0ltYWdlPQotT1NfUGdEcmF3SW1hZ2VfMD1jYXN0PSh2b2lkIGNvbnN0ICopCi1PU19QZ0RyYXdJbWFnZV8xPQotT1NfUGdEcmF3SW1hZ2VfMj0KLU9TX1BnRHJhd0ltYWdlXzM9Ci1PU19QZ0RyYXdJbWFnZV80PQotT1NfUGdEcmF3SW1hZ2VfNT0KLQotT1NfUGdEcmF3TXVsdGlUZXh0QXJlYT0KLU9TX1BnRHJhd011bHRpVGV4dEFyZWFfMD1jYXN0PShjaGFyICopCi1PU19QZ0RyYXdNdWx0aVRleHRBcmVhXzE9Ci1PU19QZ0RyYXdNdWx0aVRleHRBcmVhXzI9Ci1PU19QZ0RyYXdNdWx0aVRleHRBcmVhXzM9Ci1PU19QZ0RyYXdNdWx0aVRleHRBcmVhXzQ9Ci1PU19QZ0RyYXdNdWx0aVRleHRBcmVhXzU9Ci0KLU9TX1BnRHJhd1BoSW1hZ2VSZWN0bXg9Ci1PU19QZ0RyYXdQaEltYWdlUmVjdG14XzA9Ci1PU19QZ0RyYXdQaEltYWdlUmVjdG14XzE9Y2FzdD0oUGhJbWFnZV90IGNvbnN0ICopCi1PU19QZ0RyYXdQaEltYWdlUmVjdG14XzI9Ci1PU19QZ0RyYXdQaEltYWdlUmVjdG14XzM9Ci0KLU9TX1BnRHJhd1BvbHlnb249Ci1PU19QZ0RyYXdQb2x5Z29uXzA9Y2FzdD0oUGhQb2ludF90IGNvbnN0ICopCi1PU19QZ0RyYXdQb2x5Z29uXzE9Ci1PU19QZ0RyYXdQb2x5Z29uXzI9Y2FzdD0oUGhQb2ludF90IGNvbnN0ICopCi1PU19QZ0RyYXdQb2x5Z29uXzM9Ci0KLU9TX1BnRHJhd1JvdW5kUmVjdD0KLU9TX1BnRHJhd1JvdW5kUmVjdF8wPWNhc3Q9KFBoUmVjdF90IGNvbnN0ICopCi1PU19QZ0RyYXdSb3VuZFJlY3RfMT1jYXN0PShQaFBvaW50X3QgY29uc3QgKikKLU9TX1BnRHJhd1JvdW5kUmVjdF8yPQotCi1PU19QZ0RyYXdUSW1hZ2U9Ci1PU19QZ0RyYXdUSW1hZ2VfMD1jYXN0PSh2b2lkIGNvbnN0ICopCi1PU19QZ0RyYXdUSW1hZ2VfMT0KLU9TX1BnRHJhd1RJbWFnZV8yPWNhc3Q9KFBoUG9pbnRfdCBjb25zdCAqKQotT1NfUGdEcmF3VEltYWdlXzM9Y2FzdD0oUGhEaW1fdCBjb25zdCAqKQotT1NfUGdEcmF3VEltYWdlXzQ9Ci1PU19QZ0RyYXdUSW1hZ2VfNT0KLU9TX1BnRHJhd1RJbWFnZV82PWNhc3Q9KHZvaWQgY29uc3QgKikKLU9TX1BnRHJhd1RJbWFnZV83PQotCi1PU19QZ0RyYXdUZXh0PQotT1NfUGdEcmF3VGV4dF8wPWNhc3Q9KGNoYXIgY29uc3QgKikKLU9TX1BnRHJhd1RleHRfMT0KLU9TX1BnRHJhd1RleHRfMj1jYXN0PShQaFBvaW50X3QgKikKLU9TX1BnRHJhd1RleHRfMz0KLQotT1NfUGdFeHRlbnRNdWx0aVRleHQ9Ci1PU19QZ0V4dGVudE11bHRpVGV4dF8wPWNhc3Q9KFBoUmVjdF90ICopCi1PU19QZ0V4dGVudE11bHRpVGV4dF8xPWNhc3Q9KFBoUG9pbnRfdCAqKQotT1NfUGdFeHRlbnRNdWx0aVRleHRfMj1jYXN0PShjaGFyICopCi1PU19QZ0V4dGVudE11bHRpVGV4dF8zPWNhc3Q9KGNoYXIgKikKLU9TX1BnRXh0ZW50TXVsdGlUZXh0XzQ9Ci1PU19QZ0V4dGVudE11bHRpVGV4dF81PQotCi1PU19QZ0ZsdXNoPQotCi1PU19QZ0dldFZpZGVvTW9kZT0KLU9TX1BnR2V0VmlkZW9Nb2RlXzA9Y2FzdD0oUGdEaXNwbGF5U2V0dGluZ3NfdCAqKSxmbGFncz1pbml0Ci0KLU9TX1BnR2V0VmlkZW9Nb2RlSW5mbz0KLU9TX1BnR2V0VmlkZW9Nb2RlSW5mb18wPQotT1NfUGdHZXRWaWRlb01vZGVJbmZvXzE9Y2FzdD0oUGdWaWRlb01vZGVJbmZvX3QgKikKLQotT1NfUGdSZWFkU2NyZWVuPQotT1NfUGdSZWFkU2NyZWVuXzA9Y2FzdD0oUGhSZWN0X3QgKikKLU9TX1BnUmVhZFNjcmVlbl8xPWNhc3Q9KHZvaWQgKikKLQotT1NfUGdSZWFkU2NyZWVuU2l6ZT0KLU9TX1BnUmVhZFNjcmVlblNpemVfMD1jYXN0PShQaFJlY3RfdCAqKQotCi1PU19QZ1NldEFscGhhPQotT1NfUGdTZXRBbHBoYV8wPQotT1NfUGdTZXRBbHBoYV8xPWNhc3Q9KFBnTWFwX3QgY29uc3QgKikKLU9TX1BnU2V0QWxwaGFfMj1jYXN0PShQZ0dyYWRpZW50X3QgY29uc3QgKikKLU9TX1BnU2V0QWxwaGFfMz0KLU9TX1BnU2V0QWxwaGFfND0KLQotT1NfUGdTZXRDbGlwcGluZz0KLU9TX1BnU2V0Q2xpcHBpbmdfMD0KLU9TX1BnU2V0Q2xpcHBpbmdfMT1jYXN0PShQaFJlY3RfdCBjb25zdCAqKQotCi1PU19QZ1NldERyYXdCdWZmZXJTaXplPQotT1NfUGdTZXREcmF3QnVmZmVyU2l6ZV8wPQotCi1PU19QZ1NldERyYXdNb2RlPQotT1NfUGdTZXREcmF3TW9kZV8wPQotCi1PU19QZ1NldEZpbGxDb2xvcj0KLU9TX1BnU2V0RmlsbENvbG9yXzA9Y2FzdD0oUGdDb2xvcl90KQotCi1PU19QZ1NldEZpbGxUcmFuc1BhdD0KLU9TX1BnU2V0RmlsbFRyYW5zUGF0XzA9Y2FzdD0oUGdQYXR0ZXJuX3QpCi0KLU9TX1BnU2V0Rm9udD0KLU9TX1BnU2V0Rm9udF8wPWNhc3Q9KGNoYXIgY29uc3QgKikKLQotT1NfUGdTZXRHQz0KLU9TX1BnU2V0R0NfMD1jYXN0PShQaEdDX3QgKikKLQotT1NfUGdTZXRNdWx0aUNsaXA9Ci1PU19QZ1NldE11bHRpQ2xpcF8wPQotT1NfUGdTZXRNdWx0aUNsaXBfMT1jYXN0PShQaFJlY3RfdCBjb25zdCAqKQotCi1PU19QZ1NldFBhbGV0dGU9Ci1PU19QZ1NldFBhbGV0dGVfMD1jYXN0PShQZ0NvbG9yX3QgY29uc3QgKikKLU9TX1BnU2V0UGFsZXR0ZV8xPQotT1NfUGdTZXRQYWxldHRlXzI9Ci1PU19QZ1NldFBhbGV0dGVfMz0KLU9TX1BnU2V0UGFsZXR0ZV80PQotT1NfUGdTZXRQYWxldHRlXzU9Ci0KLU9TX1BnU2V0UmVnaW9uPQotT1NfUGdTZXRSZWdpb25fMD1jYXN0PShQaFJpZF90KQotCi1PU19QZ1NldFN0cm9rZUNhcD0KLU9TX1BnU2V0U3Ryb2tlQ2FwXzA9Ci0KLU9TX1BnU2V0U3Ryb2tlQ29sb3I9Ci1PU19QZ1NldFN0cm9rZUNvbG9yXzA9Y2FzdD0oUGdDb2xvcl90KQotCi1PU19QZ1NldFN0cm9rZURhc2g9Ci1PU19QZ1NldFN0cm9rZURhc2hfMD1jYXN0PSh1bnNpZ25lZCBjaGFyIGNvbnN0ICopCi1PU19QZ1NldFN0cm9rZURhc2hfMT0KLU9TX1BnU2V0U3Ryb2tlRGFzaF8yPQotCi1PU19QZ1NldFN0cm9rZUpvaW49Ci1PU19QZ1NldFN0cm9rZUpvaW5fMD0KLQotT1NfUGdTZXRTdHJva2VXaWR0aD0KLU9TX1BnU2V0U3Ryb2tlV2lkdGhfMD0KLQotT1NfUGdTZXRUZXh0Q29sb3I9Ci1PU19QZ1NldFRleHRDb2xvcl8wPWNhc3Q9KFBnQ29sb3JfdCkKLQotT1NfUGdTZXRUZXh0WE9SQ29sb3I9Ci1PU19QZ1NldFRleHRYT1JDb2xvcl8wPWNhc3Q9KFBnQ29sb3JfdCkKLU9TX1BnU2V0VGV4dFhPUkNvbG9yXzE9Y2FzdD0oUGdDb2xvcl90KQotCi1PU19QZ1NldFVzZXJDbGlwPQotT1NfUGdTZXRVc2VyQ2xpcF8wPWNhc3Q9KFBoUmVjdF90IGNvbnN0ICopCi0KLU9TX1BnU2htZW1DcmVhdGU9Ci1PU19QZ1NobWVtQ3JlYXRlXzA9Ci1PU19QZ1NobWVtQ3JlYXRlXzE9Y2FzdD0oY2hhciBjb25zdCAqKQotCi1PU19QZ1NobWVtRGVzdHJveT0KLU9TX1BnU2htZW1EZXN0cm95XzA9Y2FzdD0odm9pZCAqKQotCi1PU19QaEFkZE1lcmdlVGlsZXM9Ci1PU19QaEFkZE1lcmdlVGlsZXNfMD1jYXN0PShQaFRpbGVfdCAqKQotT1NfUGhBZGRNZXJnZVRpbGVzXzE9Y2FzdD0oUGhUaWxlX3QgKikKLU9TX1BoQWRkTWVyZ2VUaWxlc18yPWNhc3Q9KGludCAqKQotCi1PU19QaEFyZWFUb1JlY3Q9Ci1PU19QaEFyZWFUb1JlY3RfMD1jYXN0PShQaEFyZWFfdCBjb25zdCAqKQotT1NfUGhBcmVhVG9SZWN0XzE9Y2FzdD0oUGhSZWN0X3QgKikKLQotT1NfUGhCbGl0PQotT1NfUGhCbGl0XzA9Y2FzdD0oUGhSaWRfdCkKLU9TX1BoQmxpdF8xPWNhc3Q9KGNvbnN0IFBoUmVjdF90ICopCi1PU19QaEJsaXRfMj1jYXN0PShjb25zdCBQaFBvaW50X3QgKikKLQotT1NfUGhDbGlwVGlsaW5ncz0KLU9TX1BoQ2xpcFRpbGluZ3NfMD1jYXN0PShQaFRpbGVfdCAqKQotT1NfUGhDbGlwVGlsaW5nc18xPWNhc3Q9KFBoVGlsZV90ICopCi1PU19QaENsaXBUaWxpbmdzXzI9Y2FzdD0oUGhUaWxlX3QgKiopCi0KLU9TX1BoQ2xpcGJvYXJkQ29weT0KLU9TX1BoQ2xpcGJvYXJkQ29weV8wPQotT1NfUGhDbGlwYm9hcmRDb3B5XzE9Ci1PU19QaENsaXBib2FyZENvcHlfMj1jYXN0PShQaENsaXBIZWFkZXIgY29uc3QgKikKLQotT1NfUGhDbGlwYm9hcmRDb3B5U3RyaW5nPQotT1NfUGhDbGlwYm9hcmRDb3B5U3RyaW5nXzA9Ci1PU19QaENsaXBib2FyZENvcHlTdHJpbmdfMT1jYXN0PShjb25zdCBjaGFyICopCi0KLU9TX1BoQ2xpcGJvYXJkUGFzdGVGaW5pc2g9Ci1PU19QaENsaXBib2FyZFBhc3RlRmluaXNoXzA9Y2FzdD0odm9pZCAqKQotCi1PU19QaENsaXBib2FyZFBhc3RlU3RhcnQ9Ci1PU19QaENsaXBib2FyZFBhc3RlU3RhcnRfMD0KLQotT1NfUGhDbGlwYm9hcmRQYXN0ZVN0cmluZz0KLU9TX1BoQ2xpcGJvYXJkUGFzdGVTdHJpbmdfMD0KLQotT1NfUGhDbGlwYm9hcmRQYXN0ZVR5cGU9Ci1PU19QaENsaXBib2FyZFBhc3RlVHlwZV8wPWNhc3Q9KHZvaWQgKikKLU9TX1BoQ2xpcGJvYXJkUGFzdGVUeXBlXzE9Ci0KLU9TX1BoQ2xpcGJvYXJkUGFzdGVUeXBlTj0KLU9TX1BoQ2xpcGJvYXJkUGFzdGVUeXBlTl8wPWNhc3Q9KHZvaWQgKikKLU9TX1BoQ2xpcGJvYXJkUGFzdGVUeXBlTl8xPQotCi1PU19QaENvYWxlc2NlVGlsZXM9Ci1PU19QaENvYWxlc2NlVGlsZXNfMD1jYXN0PShQaFRpbGVfdCAqKQotCi1PU19QaENvcHlUaWxlcz0KLU9TX1BoQ29weVRpbGVzXzA9Y2FzdD0oUGhUaWxlX3QgKikKLQotT1NfUGhDcmVhdGVJbWFnZT0KLU9TX1BoQ3JlYXRlSW1hZ2VfMD1jYXN0PShQaEltYWdlX3QgKikKLU9TX1BoQ3JlYXRlSW1hZ2VfMT0KLU9TX1BoQ3JlYXRlSW1hZ2VfMj0KLU9TX1BoQ3JlYXRlSW1hZ2VfMz0KLU9TX1BoQ3JlYXRlSW1hZ2VfND1jYXN0PShQZ0NvbG9yX3QgY29uc3QgKikKLU9TX1BoQ3JlYXRlSW1hZ2VfNT0KLU9TX1BoQ3JlYXRlSW1hZ2VfNj0KLQotT1NfUGhEQ1NldEN1cnJlbnQ9Ci1PU19QaERDU2V0Q3VycmVudF8wPWNhc3Q9KHZvaWQgKikKLQotT1NfUGhEZVRyYW5zbGF0ZVRpbGVzPQotT1NfUGhEZVRyYW5zbGF0ZVRpbGVzXzA9Y2FzdD0oUGhUaWxlX3QgKikKLU9TX1BoRGVUcmFuc2xhdGVUaWxlc18xPWNhc3Q9KFBoUG9pbnRfdCBjb25zdCAqKQotCi1PU19QaEV2ZW50TmV4dD0KLU9TX1BoRXZlbnROZXh0XzA9Y2FzdD0odm9pZCAqKQotT1NfUGhFdmVudE5leHRfMT0KLQotT1NfUGhFdmVudFBlZWs9Ci1PU19QaEV2ZW50UGVla18wPWNhc3Q9KHZvaWQgKikKLU9TX1BoRXZlbnRQZWVrXzE9Ci0KLU9TX1BoRnJlZVRpbGVzPQotT1NfUGhGcmVlVGlsZXNfMD1jYXN0PShQaFRpbGVfdCAqKQotCi1PU19QaEdldERhdGE9Ci1PU19QaEdldERhdGFfMD1jYXN0PShQaEV2ZW50X3QgKikKLQotT1NfUGhHZXRNc2dTaXplPQotT1NfUGhHZXRNc2dTaXplXzA9Y2FzdD0oUGhFdmVudF90IGNvbnN0ICopCi0KLU9TX1BoR2V0UmVjdHM9Ci1PU19QaEdldFJlY3RzXzA9Y2FzdD0oUGhFdmVudF90ICopCi0KLU9TX1BoR2V0VGlsZT1mbGFncz1ub19nZW4KLQotT1NfUGhJbml0RHJhZz0KLU9TX1BoSW5pdERyYWdfMD1jYXN0PShQaFJpZF90KQotT1NfUGhJbml0RHJhZ18xPQotT1NfUGhJbml0RHJhZ18yPWNhc3Q9KGNvbnN0IFBoUmVjdF90ICopCi1PU19QaEluaXREcmFnXzM9Y2FzdD0oY29uc3QgUGhSZWN0X3QgKikKLU9TX1BoSW5pdERyYWdfND0KLU9TX1BoSW5pdERyYWdfNT1jYXN0PShQaERpbV90ICopCi1PU19QaEluaXREcmFnXzY9Y2FzdD0oUGhEaW1fdCAqKQotT1NfUGhJbml0RHJhZ183PWNhc3Q9KFBoRGltX3QgKikKLU9TX1BoSW5pdERyYWdfOD1jYXN0PShQaFBvaW50X3QgKikKLU9TX1BoSW5pdERyYWdfOT1jYXN0PShQaEN1cnNvckRlc2NyaXB0aW9uX3QgKikKLQotT1NfUGhJbnB1dEdyb3VwPQotT1NfUGhJbnB1dEdyb3VwXzA9Y2FzdD0oUGhFdmVudF90ICopCi0KLU9TX1BoSW50ZXJzZWN0VGlsaW5ncz0KLU9TX1BoSW50ZXJzZWN0VGlsaW5nc18wPWNhc3Q9KFBoVGlsZV90IGNvbnN0ICopCi1PU19QaEludGVyc2VjdFRpbGluZ3NfMT1jYXN0PShQaFRpbGVfdCBjb25zdCAqKQotT1NfUGhJbnRlcnNlY3RUaWxpbmdzXzI9Ci0KLU9TX1BoS2V5VG9NYj0KLU9TX1BoS2V5VG9NYl8wPWNhc3Q9Y2hhciAqCi1PU19QaEtleVRvTWJfMT0KLQotT1NfUGhNYWtlR2hvc3RCaXRtYXA9Ci1PU19QaE1ha2VHaG9zdEJpdG1hcF8wPWNhc3Q9KFBoSW1hZ2VfdCAqKQotCi1PU19QaE1ha2VUcmFuc0JpdG1hcD0KLU9TX1BoTWFrZVRyYW5zQml0bWFwXzA9Y2FzdD0oUGhJbWFnZV90ICopCi1PU19QaE1ha2VUcmFuc0JpdG1hcF8xPWNhc3Q9KFBnQ29sb3JfdCkKLQotT1NfUGhNZXJnZVRpbGVzPQotT1NfUGhNZXJnZVRpbGVzXzA9Y2FzdD0oUGhUaWxlX3QgKikKLQotT1NfUGhNb3ZlQ3Vyc29yQWJzPQotT1NfUGhNb3ZlQ3Vyc29yQWJzXzA9Ci1PU19QaE1vdmVDdXJzb3JBYnNfMT0KLU9TX1BoTW92ZUN1cnNvckFic18yPQotCi1PU19QaFF1ZXJ5Q3Vyc29yPQotT1NfUGhRdWVyeUN1cnNvcl8wPQotT1NfUGhRdWVyeUN1cnNvcl8xPWNhc3Q9KFBoQ3Vyc29ySW5mb190ICopCi0KLU9TX1BoUXVlcnlSaWRzPQotT1NfUGhRdWVyeVJpZHNfMD0KLU9TX1BoUXVlcnlSaWRzXzE9Y2FzdD0oUGhSaWRfdCkKLU9TX1BoUXVlcnlSaWRzXzI9Ci1PU19QaFF1ZXJ5Umlkc18zPQotT1NfUGhRdWVyeVJpZHNfND0KLU9TX1BoUXVlcnlSaWRzXzU9Y2FzdD0oUGhSaWRfdCkKLU9TX1BoUXVlcnlSaWRzXzY9Y2FzdD0oY29uc3QgUGhSZWN0X3QgKikKLU9TX1BoUXVlcnlSaWRzXzc9Y2FzdD0oUGhSaWRfdCAqKQotT1NfUGhRdWVyeVJpZHNfOD0KLQotT1NfUGhSZWN0SW50ZXJzZWN0PQotT1NfUGhSZWN0SW50ZXJzZWN0XzA9Y2FzdD0oUGhSZWN0X3QgKikKLU9TX1BoUmVjdEludGVyc2VjdF8xPWNhc3Q9KFBoUmVjdF90IGNvbnN0ICopCi0KLU9TX1BoUmVjdFVuaW9uX19JST0KLU9TX1BoUmVjdFVuaW9uX19JSV8wPWNhc3Q9KFBoUmVjdF90ICopCi1PU19QaFJlY3RVbmlvbl9fSUlfMT1jYXN0PShQaFJlY3RfdCBjb25zdCAqKQotCi1PU19QaFJlY3RVbmlvbl9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMj0KLU9TX1BoUmVjdFVuaW9uX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yXzA9Y2FzdD0oUGhSZWN0X3QgKikKLU9TX1BoUmVjdFVuaW9uX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yXzE9Y2FzdD0oUGhSZWN0X3QgY29uc3QgKikKLQotT1NfUGhSZWN0c1RvVGlsZXM9Ci1PU19QaFJlY3RzVG9UaWxlc18wPWNhc3Q9KFBoUmVjdF90ICopCi1PU19QaFJlY3RzVG9UaWxlc18xPQotCi1PU19QaFJlZ2lvblF1ZXJ5PQotT1NfUGhSZWdpb25RdWVyeV8wPWNhc3Q9KFBoUmlkX3QpCi1PU19QaFJlZ2lvblF1ZXJ5XzE9Y2FzdD0oUGhSZWdpb25fdCAqKQotT1NfUGhSZWdpb25RdWVyeV8yPWNhc3Q9KFBoUmVjdF90ICopCi1PU19QaFJlZ2lvblF1ZXJ5XzM9Y2FzdD0odm9pZCAqKQotT1NfUGhSZWdpb25RdWVyeV80PQotCi1PU19QaFJlbGVhc2VJbWFnZT0KLU9TX1BoUmVsZWFzZUltYWdlXzA9Y2FzdD0oUGhJbWFnZV90ICopCi0KLU9TX1BoU29ydFRpbGVzPQotT1NfUGhTb3J0VGlsZXNfMD1jYXN0PShQaFRpbGVfdCAqKQotCi1PU19QaFRpbGVzVG9SZWN0cz0KLU9TX1BoVGlsZXNUb1JlY3RzXzA9Y2FzdD0oUGhUaWxlX3QgKikKLU9TX1BoVGlsZXNUb1JlY3RzXzE9Y2FzdD0oaW50ICopCi0KLU9TX1BoVHJhbnNsYXRlVGlsZXM9Ci1PU19QaFRyYW5zbGF0ZVRpbGVzXzA9Y2FzdD0oUGhUaWxlX3QgKikKLU9TX1BoVHJhbnNsYXRlVGlsZXNfMT1jYXN0PShQaFBvaW50X3QgY29uc3QgKikKLQotT1NfUGhXaW5kb3dRdWVyeVZpc2libGU9Ci1PU19QaFdpbmRvd1F1ZXJ5VmlzaWJsZV8wPQotT1NfUGhXaW5kb3dRdWVyeVZpc2libGVfMT1jYXN0PShQaFJpZF90KQotT1NfUGhXaW5kb3dRdWVyeVZpc2libGVfMj0KLU9TX1BoV2luZG93UXVlcnlWaXNpYmxlXzM9Y2FzdD0oUGhSZWN0X3QgKikKLQotT1NfUGlDcm9wSW1hZ2U9Ci1PU19QaUNyb3BJbWFnZV8wPWNhc3Q9KFBoSW1hZ2VfdCAqKQotT1NfUGlDcm9wSW1hZ2VfMT1jYXN0PShQaFJlY3RfdCBjb25zdCAqKQotT1NfUGlDcm9wSW1hZ2VfMj0KLQotT1NfUGlEdXBsaWNhdGVJbWFnZT0KLU9TX1BpRHVwbGljYXRlSW1hZ2VfMD1jYXN0PShQaEltYWdlX3QgKikKLU9TX1BpRHVwbGljYXRlSW1hZ2VfMT0KLQotT1NfUG1NZW1DcmVhdGVNQz0KLU9TX1BtTWVtQ3JlYXRlTUNfMD1jYXN0PShQaEltYWdlX3QgKikKLU9TX1BtTWVtQ3JlYXRlTUNfMT1jYXN0PShQaERpbV90ICopCi1PU19QbU1lbUNyZWF0ZU1DXzI9Y2FzdD0oUGhQb2ludF90ICopCi0KLU9TX1BtTWVtRmx1c2g9Ci1PU19QbU1lbUZsdXNoXzA9Y2FzdD0oUG1NZW1vcnlDb250ZXh0X3QgKikKLU9TX1BtTWVtRmx1c2hfMT1jYXN0PShQaEltYWdlX3QgKikKLQotT1NfUG1NZW1SZWxlYXNlTUM9Ci1PU19QbU1lbVJlbGVhc2VNQ18wPWNhc3Q9KFBtTWVtb3J5Q29udGV4dF90ICopCi0KLU9TX1BtTWVtU3RhcnQ9Ci1PU19QbU1lbVN0YXJ0XzA9Y2FzdD0oUG1NZW1vcnlDb250ZXh0X3QgKikKLQotT1NfUG1NZW1TdG9wPQotT1NfUG1NZW1TdG9wXzA9Y2FzdD0oUG1NZW1vcnlDb250ZXh0X3QgKikKLQotT1NfUHRBZGRDYWxsYmFjaz0KLU9TX1B0QWRkQ2FsbGJhY2tfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdEFkZENhbGxiYWNrXzE9Ci1PU19QdEFkZENhbGxiYWNrXzI9Y2FzdD0oUHRDYWxsYmFja0ZfdCAqKQotT1NfUHRBZGRDYWxsYmFja18zPWNhc3Q9KHZvaWQgKikKLQotT1NfUHRBZGRFdmVudEhhbmRsZXI9Ci1PU19QdEFkZEV2ZW50SGFuZGxlcl8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0QWRkRXZlbnRIYW5kbGVyXzE9Ci1PU19QdEFkZEV2ZW50SGFuZGxlcl8yPWNhc3Q9KFB0Q2FsbGJhY2tGX3QgKikKLU9TX1B0QWRkRXZlbnRIYW5kbGVyXzM9Y2FzdD0odm9pZCAqKQotCi1PU19QdEFkZEZpbHRlckNhbGxiYWNrPQotT1NfUHRBZGRGaWx0ZXJDYWxsYmFja18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0QWRkRmlsdGVyQ2FsbGJhY2tfMT0KLU9TX1B0QWRkRmlsdGVyQ2FsbGJhY2tfMj1jYXN0PShQdENhbGxiYWNrRl90ICopCi1PU19QdEFkZEZpbHRlckNhbGxiYWNrXzM9Y2FzdD0odm9pZCAqKQotCi1PU19QdEFkZEhvdGtleUhhbmRsZXI9Ci1PU19QdEFkZEhvdGtleUhhbmRsZXJfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdEFkZEhvdGtleUhhbmRsZXJfMT0KLU9TX1B0QWRkSG90a2V5SGFuZGxlcl8yPQotT1NfUHRBZGRIb3RrZXlIYW5kbGVyXzM9Ci1PU19QdEFkZEhvdGtleUhhbmRsZXJfND1jYXN0PSh2b2lkICopCi1PU19QdEFkZEhvdGtleUhhbmRsZXJfNT1jYXN0PShQdENhbGxiYWNrRl90ICopCi0KLU9TX1B0QWxlcnQ9Ci1PU19QdEFsZXJ0XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRBbGVydF8xPWNhc3Q9KFBoUG9pbnRfdCBjb25zdCAqKQotT1NfUHRBbGVydF8yPWNhc3Q9KGNoYXIgY29uc3QgKikKLU9TX1B0QWxlcnRfMz1jYXN0PShQaEltYWdlX3QgY29uc3QgKikKLU9TX1B0QWxlcnRfND1jYXN0PShjaGFyIGNvbnN0ICopCi1PU19QdEFsZXJ0XzU9Y2FzdD0oY2hhciBjb25zdCAqKQotT1NfUHRBbGVydF82PQotT1NfUHRBbGVydF83PWNhc3Q9KGNoYXIgY29uc3QgKiopCi1PU19QdEFsZXJ0Xzg9Y2FzdD0oY2hhciBjb25zdCAqKikKLU9TX1B0QWxlcnRfOT0KLU9TX1B0QWxlcnRfMTA9Ci1PU19QdEFsZXJ0XzExPQotCi1PU19QdEFwcEFkZElucHV0PQotT1NfUHRBcHBBZGRJbnB1dF8wPWNhc3Q9KFB0QXBwQ29udGV4dF90KQotT1NfUHRBcHBBZGRJbnB1dF8xPWNhc3Q9KHBpZF90KQotT1NfUHRBcHBBZGRJbnB1dF8yPWNhc3Q9KFB0SW5wdXRDYWxsYmFja1Byb2NfdCkKLU9TX1B0QXBwQWRkSW5wdXRfMz1jYXN0PSh2b2lkICopCi0KLU9TX1B0QXBwQWRkV29ya1Byb2M9Ci1PU19QdEFwcEFkZFdvcmtQcm9jXzA9Y2FzdD0oUHRBcHBDb250ZXh0X3QpCi1PU19QdEFwcEFkZFdvcmtQcm9jXzE9Y2FzdD0oUHRXb3JrUHJvY190KQotT1NfUHRBcHBBZGRXb3JrUHJvY18yPWNhc3Q9KHZvaWQgKikKLQotT1NfUHRBcHBDcmVhdGVQdWxzZT0KLU9TX1B0QXBwQ3JlYXRlUHVsc2VfMD1jYXN0PShQdEFwcENvbnRleHRfdCkKLU9TX1B0QXBwQ3JlYXRlUHVsc2VfMT0KLQotT1NfUHRBcHBEZWxldGVQdWxzZT0KLU9TX1B0QXBwRGVsZXRlUHVsc2VfMD1jYXN0PShQdEFwcENvbnRleHRfdCkKLU9TX1B0QXBwRGVsZXRlUHVsc2VfMT1jYXN0PShwaWRfdCkKLQotT1NfUHRBcHBQcm9jZXNzRXZlbnQ9Ci1PU19QdEFwcFByb2Nlc3NFdmVudF8wPWNhc3Q9KFB0QXBwQ29udGV4dF90KQotCi1PU19QdEFwcFB1bHNlVHJpZ2dlcj0KLU9TX1B0QXBwUHVsc2VUcmlnZ2VyXzA9Y2FzdD0oUHRBcHBDb250ZXh0X3QpCi1PU19QdEFwcFB1bHNlVHJpZ2dlcl8xPWNhc3Q9KHBpZF90KQotCi1PU19QdEFwcFJlbW92ZUlucHV0PQotT1NfUHRBcHBSZW1vdmVJbnB1dF8wPWNhc3Q9KFB0QXBwQ29udGV4dF90KQotT1NfUHRBcHBSZW1vdmVJbnB1dF8xPWNhc3Q9KFB0SW5wdXRJZF90ICopCi0KLU9TX1B0QXBwUmVtb3ZlV29ya1Byb2M9Ci1PU19QdEFwcFJlbW92ZVdvcmtQcm9jXzA9Y2FzdD0oUHRBcHBDb250ZXh0X3QpCi1PU19QdEFwcFJlbW92ZVdvcmtQcm9jXzE9Y2FzdD0oUHRXb3JrUHJvY0lkX3QgKikKLQotT1NfUHRCZWVwPQotCi1PU19QdEJsaXQ9Ci1PU19QdEJsaXRfMD1jYXN0PShQdFdpZGdldF90IGNvbnN0ICopCi1PU19QdEJsaXRfMT1jYXN0PShQaFJlY3RfdCBjb25zdCAqKQotT1NfUHRCbGl0XzI9Y2FzdD0oUGhQb2ludF90IGNvbnN0ICopCi0KLU9TX1B0QmxvY2tBbGxXaW5kb3dzPQotT1NfUHRCbG9ja0FsbFdpbmRvd3NfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdEJsb2NrQWxsV2luZG93c18xPQotT1NfUHRCbG9ja0FsbFdpbmRvd3NfMj1jYXN0PShQZ0NvbG9yX3QpCi0KLU9TX1B0QmxvY2tXaW5kb3c9Ci1PU19QdEJsb2NrV2luZG93XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRCbG9ja1dpbmRvd18xPQotT1NfUHRCbG9ja1dpbmRvd18yPWNhc3Q9KFBnQ29sb3JfdCkKLQotT1NfUHRCdXR0b249ZmxhZ3M9Y29uc3QKLQotT1NfUHRDYWxjQm9yZGVyPQotT1NfUHRDYWxjQm9yZGVyXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRDYWxjQm9yZGVyXzE9Ci0KLU9TX1B0Q2FsY0NhbnZhcz0KLU9TX1B0Q2FsY0NhbnZhc18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0Q2FsY0NhbnZhc18xPWNhc3Q9KFBoUmVjdF90ICopCi0KLU9TX1B0Q2xpcHBlZEJsaXQ9Ci1PU19QdENsaXBwZWRCbGl0XzA9Y2FzdD0oUHRXaWRnZXRfdCBjb25zdCAqKQotT1NfUHRDbGlwcGVkQmxpdF8xPWNhc3Q9KFBoVGlsZV90IGNvbnN0ICopCi1PU19QdENsaXBwZWRCbGl0XzI9Y2FzdD0oUGhQb2ludF90IGNvbnN0ICopCi1PU19QdENsaXBwZWRCbGl0XzM9Y2FzdD0oUGhUaWxlX3QgY29uc3QgKikKLQotT1NfUHRDb2xvclNlbGVjdD0KLU9TX1B0Q29sb3JTZWxlY3RfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdENvbG9yU2VsZWN0XzE9Y2FzdD0oY2hhciAqKQotT1NfUHRDb2xvclNlbGVjdF8yPQotCi1PU19QdENvbWJvQm94PWZsYWdzPWNvbnN0Ci0KLU9TX1B0Q29udGFpbmVyPWZsYWdzPWNvbnN0Ci0KLU9TX1B0Q29udGFpbmVyRmluZEZvY3VzPQotT1NfUHRDb250YWluZXJGaW5kRm9jdXNfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0Q29udGFpbmVyRm9jdXNOZXh0PQotT1NfUHRDb250YWluZXJGb2N1c05leHRfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdENvbnRhaW5lckZvY3VzTmV4dF8xPWNhc3Q9KFBoRXZlbnRfdCAqKQotCi1PU19QdENvbnRhaW5lckZvY3VzUHJldj0KLU9TX1B0Q29udGFpbmVyRm9jdXNQcmV2XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRDb250YWluZXJGb2N1c1ByZXZfMT1jYXN0PShQaEV2ZW50X3QgKikKLQotT1NfUHRDb250YWluZXJHaXZlRm9jdXM9Ci1PU19QdENvbnRhaW5lckdpdmVGb2N1c18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0Q29udGFpbmVyR2l2ZUZvY3VzXzE9Y2FzdD0oUGhFdmVudF90ICopCi0KLU9TX1B0Q29udGFpbmVySG9sZD0KLU9TX1B0Q29udGFpbmVySG9sZF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRDb250YWluZXJSZWxlYXNlPQotT1NfUHRDb250YWluZXJSZWxlYXNlXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdENyZWF0ZUFwcENvbnRleHQ9Ci0KLU9TX1B0Q3JlYXRlV2lkZ2V0PQotT1NfUHRDcmVhdGVXaWRnZXRfMD1jYXN0PShQdFdpZGdldENsYXNzUmVmX3QgKikKLU9TX1B0Q3JlYXRlV2lkZ2V0XzE9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRDcmVhdGVXaWRnZXRfMj0KLU9TX1B0Q3JlYXRlV2lkZ2V0XzM9Y2FzdD0oUHRBcmdfdCBjb25zdCAqKQotCi1PU19QdENyZWF0ZVdpZGdldENsYXNzPQotT1NfUHRDcmVhdGVXaWRnZXRDbGFzc18wPWNhc3Q9KFB0V2lkZ2V0Q2xhc3NSZWZfdCAqKQotT1NfUHRDcmVhdGVXaWRnZXRDbGFzc18xPQotT1NfUHRDcmVhdGVXaWRnZXRDbGFzc18yPQotT1NfUHRDcmVhdGVXaWRnZXRDbGFzc18zPWNhc3Q9KFB0QXJnX3QgY29uc3QgKikKLQotT1NfUHREYW1hZ2VFeHRlbnQ9Ci1PU19QdERhbWFnZUV4dGVudF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0RGFtYWdlRXh0ZW50XzE9Y2FzdD0oUGhSZWN0X3QgY29uc3QgKikKLQotT1NfUHREYW1hZ2VXaWRnZXQ9Ci1PU19QdERhbWFnZVdpZGdldF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHREZXN0cm95V2lkZ2V0PQotT1NfUHREZXN0cm95V2lkZ2V0XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdERpc2pvaW50PWZsYWdzPWNvbnN0Ci0KLU9TX1B0RW50ZXI9Ci1PU19QdEVudGVyXzA9Ci0KLU9TX1B0RXZlbnRIYW5kbGVyPQotT1NfUHRFdmVudEhhbmRsZXJfMD1jYXN0PShQaEV2ZW50X3QgKikKLQotT1NfUHRFeHRlbnRXaWRnZXQ9Ci1PU19QdEV4dGVudFdpZGdldF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRFeHRlbnRXaWRnZXRGYW1pbHk9Ci1PU19QdEV4dGVudFdpZGdldEZhbWlseV8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRGaWxlU2VsZWN0aW9uPQotT1NfUHRGaWxlU2VsZWN0aW9uXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRGaWxlU2VsZWN0aW9uXzE9Y2FzdD0oUGhQb2ludF90IGNvbnN0ICopCi1PU19QdEZpbGVTZWxlY3Rpb25fMj1jYXN0PShjaGFyIGNvbnN0ICopCi1PU19QdEZpbGVTZWxlY3Rpb25fMz1jYXN0PShjaGFyIGNvbnN0ICopCi1PU19QdEZpbGVTZWxlY3Rpb25fND1jYXN0PShjaGFyIGNvbnN0ICopCi1PU19QdEZpbGVTZWxlY3Rpb25fNT1jYXN0PShjaGFyIGNvbnN0ICopCi1PU19QdEZpbGVTZWxlY3Rpb25fNj1jYXN0PShjaGFyIGNvbnN0ICopCi1PU19QdEZpbGVTZWxlY3Rpb25fNz1jYXN0PShjaGFyIGNvbnN0ICopCi1PU19QdEZpbGVTZWxlY3Rpb25fOD1jYXN0PShQdEZpbGVTZWxlY3Rpb25JbmZvX3QgKiksZmxhZ3M9aW5pdAotT1NfUHRGaWxlU2VsZWN0aW9uXzk9Ci0KLU9TX1B0RmluZERpc2pvaW50PQotT1NfUHRGaW5kRGlzam9pbnRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0Rmx1c2g9Ci0KLU9TX1B0Rm9udFNlbGVjdGlvbj0KLU9TX1B0Rm9udFNlbGVjdGlvbl8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0Rm9udFNlbGVjdGlvbl8xPWNhc3Q9KGNvbnN0IFBoUG9pbnRfdCAqKQotT1NfUHRGb250U2VsZWN0aW9uXzI9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfUHRGb250U2VsZWN0aW9uXzM9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfUHRGb250U2VsZWN0aW9uXzQ9Ci1PU19QdEZvbnRTZWxlY3Rpb25fNT0KLU9TX1B0Rm9udFNlbGVjdGlvbl82PWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotT1NfUHRGb3J3YXJkV2luZG93RXZlbnQ9Ci1PU19QdEZvcndhcmRXaW5kb3dFdmVudF8wPWNhc3Q9KFBoV2luZG93RXZlbnRfdCBjb25zdCAqKQotCi1PU19QdEZyYW1lU2l6ZT0KLU9TX1B0RnJhbWVTaXplXzA9Ci1PU19QdEZyYW1lU2l6ZV8xPQotT1NfUHRGcmFtZVNpemVfMj0KLU9TX1B0RnJhbWVTaXplXzM9Ci1PU19QdEZyYW1lU2l6ZV80PQotT1NfUHRGcmFtZVNpemVfNT0KLQotT1NfUHRHZXRBYnNQb3NpdGlvbj0KLU9TX1B0R2V0QWJzUG9zaXRpb25fMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdEdldEFic1Bvc2l0aW9uXzE9Ci1PU19QdEdldEFic1Bvc2l0aW9uXzI9Ci0KLU9TX1B0R2V0UmVzb3VyY2VzPQotT1NfUHRHZXRSZXNvdXJjZXNfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdEdldFJlc291cmNlc18xPQotT1NfUHRHZXRSZXNvdXJjZXNfMj1jYXN0PShQdEFyZ190ICopCi0KLU9TX1B0R2xvYmFsRm9jdXNOZXh0PQotT1NfUHRHbG9iYWxGb2N1c05leHRfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdEdsb2JhbEZvY3VzTmV4dF8xPWNhc3Q9KFBoRXZlbnRfdCAqKQotCi1PU19QdEdsb2JhbEZvY3VzTmV4dENvbnRhaW5lcj0KLU9TX1B0R2xvYmFsRm9jdXNOZXh0Q29udGFpbmVyXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRHbG9iYWxGb2N1c05leHRDb250YWluZXJfMT1jYXN0PShQaEV2ZW50X3QgKikKLQotT1NfUHRHbG9iYWxGb2N1c1ByZXY9Ci1PU19QdEdsb2JhbEZvY3VzUHJldl8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0R2xvYmFsRm9jdXNQcmV2XzE9Y2FzdD0oUGhFdmVudF90ICopCi0KLU9TX1B0R2xvYmFsRm9jdXNQcmV2Q29udGFpbmVyPQotT1NfUHRHbG9iYWxGb2N1c1ByZXZDb250YWluZXJfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdEdsb2JhbEZvY3VzUHJldkNvbnRhaW5lcl8xPWNhc3Q9KFBoRXZlbnRfdCAqKQotCi1PU19QdEdyb3VwPWZsYWdzPWNvbnN0Ci0KLU9TX1B0SGl0PQotT1NfUHRIaXRfMD1jYXN0PSggUHRXaWRnZXRfdCAqKQotT1NfUHRIaXRfMT0KLU9TX1B0SGl0XzI9Y2FzdD0oUGhSZWN0X3QgY29uc3QgKikKLQotT1NfUHRIb2xkPQotCi1PU19QdEluZmxhdGVCYWxsb29uPQotT1NfUHRJbmZsYXRlQmFsbG9vbl8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0SW5mbGF0ZUJhbGxvb25fMT1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdEluZmxhdGVCYWxsb29uXzI9Ci1PU19QdEluZmxhdGVCYWxsb29uXzM9Y2FzdD0oY2hhciBjb25zdCAqKQotT1NfUHRJbmZsYXRlQmFsbG9vbl80PWNhc3Q9KGNoYXIgY29uc3QgKikKLU9TX1B0SW5mbGF0ZUJhbGxvb25fNT1jYXN0PShQZ0NvbG9yX3QpCi1PU19QdEluZmxhdGVCYWxsb29uXzY9Y2FzdD0oUGdDb2xvcl90KQotCi1PU19QdEluaXQ9Ci1PU19QdEluaXRfMD1jYXN0PShjaGFyIGNvbnN0ICopCi0KLU9TX1B0SXNGb2N1c2VkPQotT1NfUHRJc0ZvY3VzZWRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0TGFiZWw9ZmxhZ3M9Y29uc3QKLQotT1NfUHRMZWF2ZT0KLU9TX1B0TGVhdmVfMD0KLQotT1NfUHRMaXN0PWZsYWdzPWNvbnN0Ci0KLU9TX1B0TGlzdEFkZEl0ZW1zPQotT1NfUHRMaXN0QWRkSXRlbXNfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdExpc3RBZGRJdGVtc18xPWNhc3Q9KGNvbnN0IGNoYXIgKiopCi1PU19QdExpc3RBZGRJdGVtc18yPQotT1NfUHRMaXN0QWRkSXRlbXNfMz0KLQotT1NfUHRMaXN0RGVsZXRlQWxsSXRlbXM9Ci1PU19QdExpc3REZWxldGVBbGxJdGVtc18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRMaXN0RGVsZXRlSXRlbVBvcz0KLU9TX1B0TGlzdERlbGV0ZUl0ZW1Qb3NfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdExpc3REZWxldGVJdGVtUG9zXzE9Ci1PU19QdExpc3REZWxldGVJdGVtUG9zXzI9Ci0KLU9TX1B0TGlzdEdvdG9Qb3M9Ci1PU19QdExpc3RHb3RvUG9zXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRMaXN0R290b1Bvc18xPQotCi1PU19QdExpc3RJdGVtUG9zPQotT1NfUHRMaXN0SXRlbVBvc18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0TGlzdEl0ZW1Qb3NfMT1jYXN0PShjb25zdCBjaGFyICopCi0KLU9TX1B0TGlzdFJlcGxhY2VJdGVtUG9zPQotT1NfUHRMaXN0UmVwbGFjZUl0ZW1Qb3NfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdExpc3RSZXBsYWNlSXRlbVBvc18xPWNhc3Q9KGNvbnN0IGNoYXIgKiopCi1PU19QdExpc3RSZXBsYWNlSXRlbVBvc18yPQotT1NfUHRMaXN0UmVwbGFjZUl0ZW1Qb3NfMz0KLQotT1NfUHRMaXN0U2VsZWN0UG9zPQotT1NfUHRMaXN0U2VsZWN0UG9zXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRMaXN0U2VsZWN0UG9zXzE9Ci0KLU9TX1B0TGlzdFVuc2VsZWN0UG9zPQotT1NfUHRMaXN0VW5zZWxlY3RQb3NfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdExpc3RVbnNlbGVjdFBvc18xPQotCi1PU19QdE1haW5Mb29wPQotCi1PU19QdE1lbnU9ZmxhZ3M9Y29uc3QKLQotT1NfUHRNZW51QmFyPWZsYWdzPWNvbnN0Ci0KLU9TX1B0TWVudUJ1dHRvbj1mbGFncz1jb25zdAotCi1PU19QdE11bHRpVGV4dD1mbGFncz1jb25zdAotCi1PU19QdE5leHRUb3BMZXZlbFdpZGdldD0KLU9TX1B0TmV4dFRvcExldmVsV2lkZ2V0XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdE51bWVyaWNJbnRlZ2VyPWZsYWdzPWNvbnN0Ci0KLU9TX1B0UGFuZT1mbGFncz1jb25zdAotCi1PU19QdFBhbmVsR3JvdXA9ZmxhZ3M9Y29uc3QKLQotT1NfUHRQb3NpdGlvbk1lbnU9Ci1PU19QdFBvc2l0aW9uTWVudV8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0UG9zaXRpb25NZW51XzE9Y2FzdD0oUGhFdmVudF90ICopCi0KLU9TX1B0UHJvZ3Jlc3M9ZmxhZ3M9Y29uc3QKLQotT1NfUHRSZVBhcmVudFdpZGdldD0KLU9TX1B0UmVQYXJlbnRXaWRnZXRfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFJlUGFyZW50V2lkZ2V0XzE9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFJlYWxpemVXaWRnZXQ9Ci1PU19QdFJlYWxpemVXaWRnZXRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0UmVnaW9uPWZsYWdzPWNvbnN0Ci0KLU9TX1B0UmVsZWFzZT0KLQotT1NfUHRSZW1vdmVDYWxsYmFjaz0KLU9TX1B0UmVtb3ZlQ2FsbGJhY2tfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFJlbW92ZUNhbGxiYWNrXzE9Ci1PU19QdFJlbW92ZUNhbGxiYWNrXzI9Y2FzdD0oUHRDYWxsYmFja0ZfdCAqKQotT1NfUHRSZW1vdmVDYWxsYmFja18zPWNhc3Q9KHZvaWQgKikKLQotT1NfUHRSZW1vdmVIb3RrZXlIYW5kbGVyPQotT1NfUHRSZW1vdmVIb3RrZXlIYW5kbGVyXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRSZW1vdmVIb3RrZXlIYW5kbGVyXzE9Ci1PU19QdFJlbW92ZUhvdGtleUhhbmRsZXJfMj0KLU9TX1B0UmVtb3ZlSG90a2V5SGFuZGxlcl8zPQotT1NfUHRSZW1vdmVIb3RrZXlIYW5kbGVyXzQ9Y2FzdD0odm9pZCAqKQotT1NfUHRSZW1vdmVIb3RrZXlIYW5kbGVyXzU9Y2FzdD0oUHRDYWxsYmFja0ZfdCAqKQotCi1PU19QdFNjcm9sbEFyZWE9ZmxhZ3M9Y29uc3QKLQotT1NfUHRTY3JvbGxDb250YWluZXI9ZmxhZ3M9Y29uc3QKLQotT1NfUHRTY3JvbGxiYXI9ZmxhZ3M9Y29uc3QKLQotT1NfUHRTZW5kRXZlbnRUb1dpZGdldD0KLU9TX1B0U2VuZEV2ZW50VG9XaWRnZXRfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFNlbmRFdmVudFRvV2lkZ2V0XzE9Y2FzdD0oUGhFdmVudF90ICopCi0KLU9TX1B0U2VwYXJhdG9yPWZsYWdzPWNvbnN0Ci0KLU9TX1B0U2V0QXJlYUZyb21XaWRnZXRDYW52YXM9Ci1PU19QdFNldEFyZWFGcm9tV2lkZ2V0Q2FudmFzXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRTZXRBcmVhRnJvbVdpZGdldENhbnZhc18xPQotT1NfUHRTZXRBcmVhRnJvbVdpZGdldENhbnZhc18yPQotCi1PU19QdFNldFBhcmVudFdpZGdldD0KLU9TX1B0U2V0UGFyZW50V2lkZ2V0XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFNldFJlc291cmNlPQotT1NfUHRTZXRSZXNvdXJjZV8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0U2V0UmVzb3VyY2VfMT0KLU9TX1B0U2V0UmVzb3VyY2VfMj0KLU9TX1B0U2V0UmVzb3VyY2VfMz0KLQotT1NfUHRTZXRSZXNvdXJjZXM9Ci1PU19QdFNldFJlc291cmNlc18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0U2V0UmVzb3VyY2VzXzE9Ci1PU19QdFNldFJlc291cmNlc18yPWNhc3Q9KFB0QXJnX3QgKikKLQotT1NfUHRTbGlkZXI9ZmxhZ3M9Y29uc3QKLQotT1NfUHRTdXBlckNsYXNzRHJhdz0KLU9TX1B0U3VwZXJDbGFzc0RyYXdfMD1jYXN0PShQdFdpZGdldENsYXNzUmVmX3QgKikKLU9TX1B0U3VwZXJDbGFzc0RyYXdfMT1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFN1cGVyQ2xhc3NEcmF3XzI9Y2FzdD0oUGhUaWxlX3QgY29uc3QgKikKLQotT1NfUHRTeW5jV2lkZ2V0PQotT1NfUHRTeW5jV2lkZ2V0XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFRleHQ9ZmxhZ3M9Y29uc3QKLQotT1NfUHRUZXh0R2V0U2VsZWN0aW9uPQotT1NfUHRUZXh0R2V0U2VsZWN0aW9uXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRUZXh0R2V0U2VsZWN0aW9uXzE9Ci1PU19QdFRleHRHZXRTZWxlY3Rpb25fMj0KLQotT1NfUHRUZXh0TW9kaWZ5VGV4dF9fSUlJSUlJPQotT1NfUHRUZXh0TW9kaWZ5VGV4dF9fSUlJSUlJXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRUZXh0TW9kaWZ5VGV4dF9fSUlJSUlJXzE9Ci1PU19QdFRleHRNb2RpZnlUZXh0X19JSUlJSUlfMj0KLU9TX1B0VGV4dE1vZGlmeVRleHRfX0lJSUlJSV8zPQotT1NfUHRUZXh0TW9kaWZ5VGV4dF9fSUlJSUlJXzQ9Y2FzdD0oY2hhciBjb25zdCAqKQotT1NfUHRUZXh0TW9kaWZ5VGV4dF9fSUlJSUlJXzU9Ci0KLU9TX1B0VGV4dE1vZGlmeVRleHRfX0lJSUlfM0JJPQotT1NfUHRUZXh0TW9kaWZ5VGV4dF9fSUlJSV8zQklfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFRleHRNb2RpZnlUZXh0X19JSUlJXzNCSV8xPQotT1NfUHRUZXh0TW9kaWZ5VGV4dF9fSUlJSV8zQklfMj0KLU9TX1B0VGV4dE1vZGlmeVRleHRfX0lJSUlfM0JJXzM9Ci1PU19QdFRleHRNb2RpZnlUZXh0X19JSUlJXzNCSV80PWNhc3Q9KGNoYXIgY29uc3QgKikKLU9TX1B0VGV4dE1vZGlmeVRleHRfX0lJSUlfM0JJXzU9Ci0KLU9TX1B0VGV4dFNldFNlbGVjdGlvbj0KLU9TX1B0VGV4dFNldFNlbGVjdGlvbl8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0VGV4dFNldFNlbGVjdGlvbl8xPQotT1NfUHRUZXh0U2V0U2VsZWN0aW9uXzI9Ci0KLU9TX1B0VGltZXI9ZmxhZ3M9Y29uc3QKLQotT1NfUHRUb2dnbGVCdXR0b249ZmxhZ3M9Y29uc3QKLQotT1NfUHRUb29sYmFyPWZsYWdzPWNvbnN0Ci0KLU9TX1B0VW5ibG9ja1dpbmRvd3M9Ci1PU19QdFVuYmxvY2tXaW5kb3dzXzA9Y2FzdD0oUHRCbG9ja2VkTGlzdF90ICopCi0KLU9TX1B0VW5yZWFsaXplV2lkZ2V0PQotT1NfUHRVbnJlYWxpemVXaWRnZXRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0VmFsaWRQYXJlbnQ9Ci1PU19QdFZhbGlkUGFyZW50XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRWYWxpZFBhcmVudF8xPWNhc3Q9KFB0V2lkZ2V0Q2xhc3NSZWZfdCAqKQotCi1PU19QdFdlYkNsaWVudD1mbGFncz1jb25zdAotCi1PU19QdFdpZGdldEFyZWE9Ci1PU19QdFdpZGdldEFyZWFfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFdpZGdldEFyZWFfMT1jYXN0PShQaEFyZWFfdCAqKQotCi1PU19QdFdpZGdldEJyb3RoZXJCZWhpbmQ9Ci1PU19QdFdpZGdldEJyb3RoZXJCZWhpbmRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0V2lkZ2V0QnJvdGhlckluRnJvbnQ9Ci1PU19QdFdpZGdldEJyb3RoZXJJbkZyb250XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFdpZGdldENhbnZhc19fSUk9Ci1PU19QdFdpZGdldENhbnZhc19fSUlfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFdpZGdldENhbnZhc19fSUlfMT1jYXN0PShQaFJlY3RfdCAqKQotCi1PU19QdFdpZGdldENhbnZhc19fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yPQotT1NfUHRXaWRnZXRDYW52YXNfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMl8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0V2lkZ2V0Q2FudmFzX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJfMT0KLQotT1NfUHRXaWRnZXRDaGlsZEJhY2s9Ci1PU19QdFdpZGdldENoaWxkQmFja18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRXaWRnZXRDaGlsZEZyb250PQotT1NfUHRXaWRnZXRDaGlsZEZyb250XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFdpZGdldENsYXNzPQotT1NfUHRXaWRnZXRDbGFzc18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRXaWRnZXRFeHRlbnRfX0lJPQotT1NfUHRXaWRnZXRFeHRlbnRfX0lJXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRXaWRnZXRFeHRlbnRfX0lJXzE9Ci0KLU9TX1B0V2lkZ2V0RXh0ZW50X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzI9Ci1PU19QdFdpZGdldEV4dGVudF9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRXaWRnZXRFeHRlbnRfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMl8xPQotCi1PU19QdFdpZGdldEZsYWdzPQotT1NfUHRXaWRnZXRGbGFnc18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRXaWRnZXRJbnNlcnQ9Ci1PU19QdFdpZGdldEluc2VydF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0V2lkZ2V0SW5zZXJ0XzE9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRXaWRnZXRJbnNlcnRfMj0KLQotT1NfUHRXaWRnZXRJc0NsYXNzTWVtYmVyPQotT1NfUHRXaWRnZXRJc0NsYXNzTWVtYmVyXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRXaWRnZXRJc0NsYXNzTWVtYmVyXzE9Y2FzdD0oUHRXaWRnZXRDbGFzc1JlZl90ICopCi0KLU9TX1B0V2lkZ2V0SXNSZWFsaXplZD0KLU9TX1B0V2lkZ2V0SXNSZWFsaXplZF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRXaWRnZXRPZmZzZXQ9Ci1PU19QdFdpZGdldE9mZnNldF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0V2lkZ2V0T2Zmc2V0XzE9Y2FzdD0oUGhQb2ludF90ICopCi0KLU9TX1B0V2lkZ2V0UGFyZW50PQotT1NfUHRXaWRnZXRQYXJlbnRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0V2lkZ2V0UHJlZmVycmVkU2l6ZT0KLU9TX1B0V2lkZ2V0UHJlZmVycmVkU2l6ZV8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0V2lkZ2V0UHJlZmVycmVkU2l6ZV8xPWNhc3Q9KFBoRGltX3QgKikKLQotT1NfUHRXaWRnZXRSaWQ9Ci1PU19QdFdpZGdldFJpZF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRXaWRnZXRUb0JhY2s9Ci1PU19QdFdpZGdldFRvQmFja18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRXaWRnZXRUb0Zyb250PQotT1NfUHRXaWRnZXRUb0Zyb250XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFdpbmRvdz1mbGFncz1jb25zdAotCi1PU19QdFdpbmRvd0ZvY3VzPQotT1NfUHRXaW5kb3dGb2N1c18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRXaW5kb3dHZXRTdGF0ZT0KLU9TX1B0V2luZG93R2V0U3RhdGVfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0V2luZG93VG9CYWNrPQotT1NfUHRXaW5kb3dUb0JhY2tfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0V2luZG93VG9Gcm9udD0KLU9TX1B0V2luZG93VG9Gcm9udF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfZnJlZT0KLU9TX2ZyZWVfMD1jYXN0PSh2b2lkICopCi0KLU9TX2dldGVudj0KLU9TX2dldGVudl8wPWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotT1NfbWFsbG9jPQotT1NfbWFsbG9jXzA9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JSUk9Ci1PU19tZW1tb3ZlX19JSUlfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JSUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19JSUlfMj0KLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BnQWxwaGFfMXRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGdBbHBoYV8xdF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ0FscGhhXzF0XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQgaW5pdAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BnQWxwaGFfMXRfMklfMj0KLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoQXJlYV8xdF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEFyZWFfMXRfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhBcmVhXzF0XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEFyZWFfMXRfMklfMj0KLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoQ3Vyc29yRGVmXzF0XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoQ3Vyc29yRGVmXzF0XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoQ3Vyc29yRGVmXzF0XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEN1cnNvckRlZl8xdF8ySV8yPQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhFdmVudF8xdF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEV2ZW50XzF0XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoRXZlbnRfMXRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoRXZlbnRfMXRfMklfMj0KLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoSW1hZ2VfMXRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhJbWFnZV8xdF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEltYWdlXzF0XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEltYWdlXzF0XzJJXzI9Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50XzF0XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXRfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludF8xdF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludF8xdF8ySV8yPQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludGVyRXZlbnRfMXRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludGVyRXZlbnRfMXRfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludGVyRXZlbnRfMXRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRlckV2ZW50XzF0XzJJXzI9Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJJXzI9Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFRpbGVfMXRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhUaWxlXzF0XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoVGlsZV8xdF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhUaWxlXzF0XzJJXzI9Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFRleHRDYWxsYmFja18xdF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFRleHRDYWxsYmFja18xdF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFRleHRDYWxsYmFja18xdF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRUZXh0Q2FsbGJhY2tfMXRfMklfMj0KLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViQ2xpZW50RGF0YV8xdF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYkNsaWVudERhdGFfMXRfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJDbGllbnREYXRhXzF0XzJJXzE9Y2FzdD1jb25zdCB2b2lkICosZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJDbGllbnREYXRhXzF0XzJJXzI9Y2FzdD1zaXplX3QKLQotT1NfbWVtbW92ZV9fSV8zQkk9Ci1PU19tZW1tb3ZlX19JXzNCSV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lfM0JJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lfM0JJXzI9Ci0KLU9TX21lbW1vdmVfX0lfM0lJPQotT1NfbWVtbW92ZV9fSV8zSUlfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JXzNJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JXzNJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9Gb250RGV0YWlsc18ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9Gb250RGV0YWlsc18ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9Gb250RGV0YWlsc18ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9Gb250RGV0YWlsc18ySUlfMj0KLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGdBbHBoYV8xdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ0FscGhhXzF0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4gaW5pdAotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGdBbHBoYV8xdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ0FscGhhXzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ01hcF8xdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ01hcF8xdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ01hcF8xdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ01hcF8xdF8ySUlfMj0KLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhDbGlwSGVhZGVyXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoQ2xpcEhlYWRlcl8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaENsaXBIZWFkZXJfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhDbGlwSGVhZGVyXzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEV2ZW50XzF0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoRXZlbnRfMXRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhFdmVudF8xdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEV2ZW50XzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEltYWdlXzF0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoSW1hZ2VfMXRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhJbWFnZV8xdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEltYWdlXzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEtleUV2ZW50XzF0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoS2V5RXZlbnRfMXRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhLZXlFdmVudF8xdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEtleUV2ZW50XzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50ZXJFdmVudF8xdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50ZXJFdmVudF8xdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50ZXJFdmVudF8xdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50ZXJFdmVudF8xdF8ySUlfMj0KLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFRpbGVfMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhUaWxlXzF0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoVGlsZV8xdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFRpbGVfMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoV2luZG93RXZlbnRfMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhXaW5kb3dFdmVudF8xdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFdpbmRvd0V2ZW50XzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoV2luZG93RXZlbnRfMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0Q2FsbGJhY2tJbmZvXzF0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0Q2FsbGJhY2tJbmZvXzF0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0Q2FsbGJhY2tJbmZvXzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0Q2FsbGJhY2tJbmZvXzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFNjcm9sbGJhckNhbGxiYWNrXzF0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0U2Nyb2xsYmFyQ2FsbGJhY2tfMXRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRTY3JvbGxiYXJDYWxsYmFja18xdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFNjcm9sbGJhckNhbGxiYWNrXzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFRleHRDYWxsYmFja18xdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFRleHRDYWxsYmFja18xdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFRleHRDYWxsYmFja18xdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFRleHRDYWxsYmFja18xdF8ySUlfMj0KLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJEYXRhUmVxQ2FsbGJhY2tfMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJEYXRhUmVxQ2FsbGJhY2tfMXRfMklJXzA9Y2FzdD12b2lkICoKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViRGF0YVJlcUNhbGxiYWNrXzF0XzJJSV8xPWNhc3Q9Y29uc3Qgdm9pZCAqCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYkRhdGFSZXFDYWxsYmFja18xdF8ySUlfMj0KLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJNZXRhRGF0YUNhbGxiYWNrXzF0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViTWV0YURhdGFDYWxsYmFja18xdF8ySUlfMD1jYXN0PXZvaWQgKgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJNZXRhRGF0YUNhbGxiYWNrXzF0XzJJSV8xPWNhc3Q9Y29uc3Qgdm9pZCAqCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYk1ldGFEYXRhQ2FsbGJhY2tfMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViU3RhdHVzQ2FsbGJhY2tfMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJTdGF0dXNDYWxsYmFja18xdF8ySUlfMD1jYXN0PXZvaWQgKgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJTdGF0dXNDYWxsYmFja18xdF8ySUlfMT1jYXN0PWNvbnN0IHZvaWQgKgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJTdGF0dXNDYWxsYmFja18xdF8ySUlfMj0KLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJXaW5kb3dDYWxsYmFja18xdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYldpbmRvd0NhbGxiYWNrXzF0XzJJSV8wPWNhc3Q9dm9pZCAqCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYldpbmRvd0NhbGxiYWNrXzF0XzJJSV8xPWNhc3Q9Y29uc3Qgdm9pZCAqCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYldpbmRvd0NhbGxiYWNrXzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19fM0JJST0KLU9TX21lbW1vdmVfX18zQklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fXzNCSUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19fM0JJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhDbGlwSGVhZGVyXzJJPQotT1NfbWVtbW92ZV9fXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhDbGlwSGVhZGVyXzJJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhDbGlwSGVhZGVyXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhDbGlwSGVhZGVyXzJJXzI9Ci0KLU9TX21lbW1vdmVfX18zSUlJPQotT1NfbWVtbW92ZV9fXzNJSUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19fM0lJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX18zSUlJXzI9Ci0KLU9TX21lbW1vdmVfX18zU0lJPQotT1NfbWVtbW92ZV9fXzNTSUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19fM1NJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX18zU0lJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1zZXQ9Ci1PU19tZW1zZXRfMD1jYXN0PXZvaWQgKgotT1NfbWVtc2V0XzE9Ci1PU19tZW1zZXRfMj1jYXN0PXNpemVfdAotCi1PU19zdHJkdXA9Ci1PU19zdHJkdXBfMD1jYXN0PShjb25zdCBjaGFyICopCi0KLU9TX3N0cmxlbj0KLU9TX3N0cmxlbl8wPWNhc3Q9KGNvbnN0IGNoYXIqKQotCi1PU191bmFtZT0KLU9TX3VuYW1lXzA9Y2FzdD0odXRzbmFtZSAqKQotCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGdBbHBoYV8xdD0KLVBnQWxwaGFfdF9hbHBoYV9vcD0KLVBnQWxwaGFfdF9zcmNfYWxwaGFfbWFwX2RpbV93PWFjY2Vzc29yPXNyY19hbHBoYV9tYXAuZGltLncKLVBnQWxwaGFfdF9zcmNfYWxwaGFfbWFwX2RpbV9oPWFjY2Vzc29yPXNyY19hbHBoYV9tYXAuZGltLmgKLVBnQWxwaGFfdF9zcmNfYWxwaGFfbWFwX2JwbD1hY2Nlc3Nvcj1zcmNfYWxwaGFfbWFwLmJwbAotUGdBbHBoYV90X3NyY19hbHBoYV9tYXBfYnBwPWFjY2Vzc29yPXNyY19hbHBoYV9tYXAuYnBwCi1QZ0FscGhhX3Rfc3JjX2FscGhhX21hcF9tYXA9YWNjZXNzb3I9c3JjX2FscGhhX21hcC5tYXAsY2FzdD0oY2hhciAqKQotUGdBbHBoYV90X3NyY19nbG9iYWxfYWxwaGE9Ci1QZ0FscGhhX3RfZGVzdF9nbG9iYWxfYWxwaGE9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGdEaXNwbGF5U2V0dGluZ3NfMXQ9Ci1QZ0Rpc3BsYXlTZXR0aW5nc190X21vZGU9Ci1QZ0Rpc3BsYXlTZXR0aW5nc190X3hyZXM9Ci1QZ0Rpc3BsYXlTZXR0aW5nc190X3lyZXM9Ci1QZ0Rpc3BsYXlTZXR0aW5nc190X3JlZnJlc2g9Ci1QZ0Rpc3BsYXlTZXR0aW5nc190X2ZsYWdzPQotUGdEaXNwbGF5U2V0dGluZ3NfdF9yZXNlcnZlZD1jYXN0PShsb25nICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGdNYXBfMXQ9Ci1QZ01hcF90X2RpbV93PWFjY2Vzc29yPWRpbS53Ci1QZ01hcF90X2RpbV9oPWFjY2Vzc29yPWRpbS5oCi1QZ01hcF90X2JwbD0KLVBnTWFwX3RfYnBwPQotUGdNYXBfdF9tYXA9Y2FzdD0oY2hhciAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BnVmlkZW9Nb2RlSW5mb18xdD0KLVBnVmlkZW9Nb2RlSW5mb190X3dpZHRoPQotUGdWaWRlb01vZGVJbmZvX3RfaGVpZ2h0PQotUGdWaWRlb01vZGVJbmZvX3RfYml0c19wZXJfcGl4ZWw9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9ieXRlc19wZXJfc2NhbmxpbmU9Ci1QZ1ZpZGVvTW9kZUluZm9fdF90eXBlPQotUGdWaWRlb01vZGVJbmZvX3RfbW9kZV9jYXBhYmlsaXRpZXMxPQotUGdWaWRlb01vZGVJbmZvX3RfbW9kZV9jYXBhYmlsaXRpZXMyPQotUGdWaWRlb01vZGVJbmZvX3RfbW9kZV9jYXBhYmlsaXRpZXMzPQotUGdWaWRlb01vZGVJbmZvX3RfbW9kZV9jYXBhYmlsaXRpZXM0PQotUGdWaWRlb01vZGVJbmZvX3RfbW9kZV9jYXBhYmlsaXRpZXM1PQotUGdWaWRlb01vZGVJbmZvX3RfbW9kZV9jYXBhYmlsaXRpZXM2PQotUGdWaWRlb01vZGVJbmZvX3RfcmVmcmVzaF9yYXRlcz1jYXN0PShjaGFyICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhBcmVhXzF0PQotUGhBcmVhX3RfcG9zX3g9YWNjZXNzb3I9cG9zLngKLVBoQXJlYV90X3Bvc195PWFjY2Vzc29yPXBvcy55Ci1QaEFyZWFfdF9zaXplX3c9YWNjZXNzb3I9c2l6ZS53Ci1QaEFyZWFfdF9zaXplX2g9YWNjZXNzb3I9c2l6ZS5oCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhDbGlwSGVhZGVyPQotUGhDbGlwSGVhZGVyX3R5cGU9Y2FzdD0oUGhDbGlwSGVhZGVyKQotUGhDbGlwSGVhZGVyX2xlbmd0aD0KLVBoQ2xpcEhlYWRlcl96ZXJvPQotUGhDbGlwSGVhZGVyX2RhdGE9Y2FzdD0odm9pZCAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoQ3Vyc29yRGVmXzF0PQotUGhDdXJzb3JEZWZfdF9oZHJfbGVuPWFjY2Vzc29yPWhkci5sZW4KLVBoQ3Vyc29yRGVmX3RfaGRyX3R5cGU9YWNjZXNzb3I9aGRyLnR5cGUKLVBoQ3Vyc29yRGVmX3Rfc2l6ZTFfeD1hY2Nlc3Nvcj1zaXplMS54Ci1QaEN1cnNvckRlZl90X3NpemUxX3k9YWNjZXNzb3I9c2l6ZTEueQotUGhDdXJzb3JEZWZfdF9vZmZzZXQxX3g9YWNjZXNzb3I9b2Zmc2V0MS54Ci1QaEN1cnNvckRlZl90X29mZnNldDFfeT1hY2Nlc3Nvcj1vZmZzZXQxLnkKLVBoQ3Vyc29yRGVmX3RfY29sb3IxPQotUGhDdXJzb3JEZWZfdF9ieXRlc3BlcmxpbmUxPQotUGhDdXJzb3JEZWZfdF9zaXplMl94PWFjY2Vzc29yPXNpemUyLngKLVBoQ3Vyc29yRGVmX3Rfc2l6ZTJfeT1hY2Nlc3Nvcj1zaXplMi55Ci1QaEN1cnNvckRlZl90X29mZnNldDJfeD1hY2Nlc3Nvcj1vZmZzZXQyLngKLVBoQ3Vyc29yRGVmX3Rfb2Zmc2V0Ml95PWFjY2Vzc29yPW9mZnNldDIueQotUGhDdXJzb3JEZWZfdF9jb2xvcjI9Ci1QaEN1cnNvckRlZl90X2J5dGVzcGVybGluZTI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhDdXJzb3JJbmZvXzF0PQotUGhDdXJzb3JJbmZvX3RfcG9zX3g9YWNjZXNzb3I9cG9zLngKLVBoQ3Vyc29ySW5mb190X3Bvc195PWFjY2Vzc29yPXBvcy55Ci1QaEN1cnNvckluZm9fdF9yZWdpb249Ci1QaEN1cnNvckluZm9fdF9pZ19yZWdpb249Ci1QaEN1cnNvckluZm9fdF9jb2xvcj0KLVBoQ3Vyc29ySW5mb190X2xhc3RfcHJlc3NfeD1hY2Nlc3Nvcj1sYXN0X3ByZXNzLngKLVBoQ3Vyc29ySW5mb190X2xhc3RfcHJlc3NfeT1hY2Nlc3Nvcj1sYXN0X3ByZXNzLnkKLVBoQ3Vyc29ySW5mb190X21zZWM9Ci1QaEN1cnNvckluZm9fdF9zdGVhZHlfeD1hY2Nlc3Nvcj1zdGVhZHkueAotUGhDdXJzb3JJbmZvX3Rfc3RlYWR5X3k9YWNjZXNzb3I9c3RlYWR5LnkKLVBoQ3Vyc29ySW5mb190X2RyYWdnZXI9Ci1QaEN1cnNvckluZm9fdF9kcmFnX2JvdW5kYXJ5X3VsX3g9YWNjZXNzb3I9ZHJhZ19ib3VuZGFyeS51bC54Ci1QaEN1cnNvckluZm9fdF9kcmFnX2JvdW5kYXJ5X3VsX3k9YWNjZXNzb3I9ZHJhZ19ib3VuZGFyeS51bC55Ci1QaEN1cnNvckluZm9fdF9kcmFnX2JvdW5kYXJ5X2xyX3g9YWNjZXNzb3I9ZHJhZ19ib3VuZGFyeS5sci54Ci1QaEN1cnNvckluZm9fdF9kcmFnX2JvdW5kYXJ5X2xyX3k9YWNjZXNzb3I9ZHJhZ19ib3VuZGFyeS5sci55Ci1QaEN1cnNvckluZm9fdF9waGFudG9tX3JpZD0KLVBoQ3Vyc29ySW5mb190X3R5cGU9Ci1QaEN1cnNvckluZm9fdF9pZz0KLVBoQ3Vyc29ySW5mb190X2J1dHRvbl9zdGF0ZT0KLVBoQ3Vyc29ySW5mb190X2NsaWNrX2NvdW50PQotUGhDdXJzb3JJbmZvX3RfemVybzE9Ci1QaEN1cnNvckluZm9fdF9rZXlfbW9kcz0KLVBoQ3Vyc29ySW5mb190X3plcm8yPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoRGltXzF0PQotUGhEaW1fdF93PQotUGhEaW1fdF9oPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoRXZlbnRfMXQ9Ci1QaEV2ZW50X3RfdHlwZT0KLVBoRXZlbnRfdF9zdWJ0eXBlPQotUGhFdmVudF90X3Byb2Nlc3NpbmdfZmxhZ3M9Ci1QaEV2ZW50X3RfZW1pdHRlcl9yaWQ9YWNjZXNzb3I9ZW1pdHRlci5yaWQKLVBoRXZlbnRfdF9lbWl0dGVyX2hhbmRsZT1hY2Nlc3Nvcj1lbWl0dGVyLmhhbmRsZQotUGhFdmVudF90X2NvbGxlY3Rvcl9yaWQ9YWNjZXNzb3I9Y29sbGVjdG9yLnJpZAotUGhFdmVudF90X2NvbGxlY3Rvcl9oYW5kbGU9YWNjZXNzb3I9Y29sbGVjdG9yLmhhbmRsZQotUGhFdmVudF90X2lucHV0X2dyb3VwPQotUGhFdmVudF90X2ZsYWdzPQotUGhFdmVudF90X3RpbWVzdGFtcD0KLVBoRXZlbnRfdF90cmFuc2xhdGlvbl94PWFjY2Vzc29yPXRyYW5zbGF0aW9uLngKLVBoRXZlbnRfdF90cmFuc2xhdGlvbl95PWFjY2Vzc29yPXRyYW5zbGF0aW9uLnkKLVBoRXZlbnRfdF9udW1fcmVjdHM9Ci1QaEV2ZW50X3RfZGF0YV9sZW49Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhJbWFnZV8xdD0KLVBoSW1hZ2VfdF90eXBlPQotUGhJbWFnZV90X2ltYWdlX3RhZz0KLVBoSW1hZ2VfdF9icGw9Ci1QaEltYWdlX3Rfc2l6ZV93PWFjY2Vzc29yPXNpemUudwotUGhJbWFnZV90X3NpemVfaD1hY2Nlc3Nvcj1zaXplLmgKLVBoSW1hZ2VfdF9wYWxldHRlX3RhZz0KLVBoSW1hZ2VfdF9jb2xvcnM9Ci1QaEltYWdlX3RfYWxwaGE9Y2FzdD0oUGdBbHBoYV90ICopCi1QaEltYWdlX3RfdHJhbnNwYXJlbnQ9Ci1QaEltYWdlX3RfZm9ybWF0PQotUGhJbWFnZV90X2ZsYWdzPQotUGhJbWFnZV90X2dob3N0X2JwbD0KLVBoSW1hZ2VfdF9zcGFyZTE9Ci1QaEltYWdlX3RfZ2hvc3RfYml0bWFwPWNhc3Q9KGNoYXIgKikKLVBoSW1hZ2VfdF9tYXNrX2JwbD0KLVBoSW1hZ2VfdF9tYXNrX2JtPWNhc3Q9KGNoYXIgKikKLVBoSW1hZ2VfdF9wYWxldHRlPWNhc3Q9KFBnQ29sb3JfdCAqKQotUGhJbWFnZV90X2ltYWdlPWNhc3Q9KGNoYXIgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEtleUV2ZW50XzF0PQotUGhLZXlFdmVudF90X2tleV9tb2RzPQotUGhLZXlFdmVudF90X2tleV9mbGFncz0KLVBoS2V5RXZlbnRfdF9rZXlfY2FwPQotUGhLZXlFdmVudF90X2tleV9zeW09Ci1QaEtleUV2ZW50X3Rfa2V5X3NjYW49Ci1QaEtleUV2ZW50X3Rfa2V5X3plcm89Ci1QaEtleUV2ZW50X3RfcG9zX3g9YWNjZXNzb3I9cG9zLngKLVBoS2V5RXZlbnRfdF9wb3NfeT1hY2Nlc3Nvcj1wb3MueQotUGhLZXlFdmVudF90X2J1dHRvbl9zdGF0ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50XzF0PQotUGhQb2ludF90X3g9Ci1QaFBvaW50X3RfeT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50ZXJFdmVudF8xdD0KLVBoUG9pbnRlckV2ZW50X3RfcG9zX3g9YWNjZXNzb3I9cG9zLngKLVBoUG9pbnRlckV2ZW50X3RfcG9zX3k9YWNjZXNzb3I9cG9zLnkKLVBoUG9pbnRlckV2ZW50X3RfYnV0dG9ucz0KLVBoUG9pbnRlckV2ZW50X3RfYnV0dG9uX3N0YXRlPQotUGhQb2ludGVyRXZlbnRfdF9jbGlja19jb3VudD0KLVBoUG9pbnRlckV2ZW50X3RfZmxhZ3M9Ci1QaFBvaW50ZXJFdmVudF90X3o9Ci1QaFBvaW50ZXJFdmVudF90X2tleV9tb2RzPQotUGhQb2ludGVyRXZlbnRfdF96ZXJvPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdD0KLVBoUmVjdF90X3VsX3g9YWNjZXNzb3I9dWwueAotUGhSZWN0X3RfdWxfeT1hY2Nlc3Nvcj11bC55Ci1QaFJlY3RfdF9scl94PWFjY2Vzc29yPWxyLngKLVBoUmVjdF90X2xyX3k9YWNjZXNzb3I9bHIueQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVnaW9uXzF0PQotUGhSZWdpb25fdF9yaWQ9Ci1QaFJlZ2lvbl90X2hhbmRsZT0KLVBoUmVnaW9uX3Rfb3duZXI9Ci1QaFJlZ2lvbl90X2ZsYWdzPQotUGhSZWdpb25fdF9zdGF0ZT0KLVBoUmVnaW9uX3RfZXZlbnRzX3NlbnNlPQotUGhSZWdpb25fdF9ldmVudHNfb3BhcXVlPQotUGhSZWdpb25fdF9vcmlnaW5feD1hY2Nlc3Nvcj1vcmlnaW4ueAotUGhSZWdpb25fdF9vcmlnaW5feT1hY2Nlc3Nvcj1vcmlnaW4ueQotUGhSZWdpb25fdF9wYXJlbnQ9Ci1QaFJlZ2lvbl90X2NoaWxkPQotUGhSZWdpb25fdF9icm9faW5fZnJvbnQ9Ci1QaFJlZ2lvbl90X2Jyb19iZWhpbmQ9Ci1QaFJlZ2lvbl90X2N1cnNvcl9jb2xvcj0KLVBoUmVnaW9uX3RfaW5wdXRfZ3JvdXA9Ci1QaFJlZ2lvbl90X2RhdGFfbGVuPQotUGhSZWdpb25fdF9jdXJzb3JfdHlwZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFRpbGVfMXQ9Ci1QaFRpbGVfdF9yZWN0X3VsX3g9YWNjZXNzb3I9cmVjdC51bC54Ci1QaFRpbGVfdF9yZWN0X3VsX3k9YWNjZXNzb3I9cmVjdC51bC55Ci1QaFRpbGVfdF9yZWN0X2xyX3g9YWNjZXNzb3I9cmVjdC5sci54Ci1QaFRpbGVfdF9yZWN0X2xyX3k9YWNjZXNzb3I9cmVjdC5sci55Ci1QaFRpbGVfdF9uZXh0PWNhc3Q9KFBoVGlsZV90ICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhXaW5kb3dFdmVudF8xdD0KLVBoV2luZG93RXZlbnRfdF9ldmVudF9mPQotUGhXaW5kb3dFdmVudF90X3N0YXRlX2Y9Ci1QaFdpbmRvd0V2ZW50X3RfcmlkPQotUGhXaW5kb3dFdmVudF90X3Bvc194PWFjY2Vzc29yPXBvcy54Ci1QaFdpbmRvd0V2ZW50X3RfcG9zX3k9YWNjZXNzb3I9cG9zLnkKLVBoV2luZG93RXZlbnRfdF9zaXplX3c9YWNjZXNzb3I9c2l6ZS53Ci1QaFdpbmRvd0V2ZW50X3Rfc2l6ZV9oPWFjY2Vzc29yPXNpemUuaAotUGhXaW5kb3dFdmVudF90X2V2ZW50X3N0YXRlPQotUGhXaW5kb3dFdmVudF90X2lucHV0X2dyb3VwPQotUGhXaW5kb3dFdmVudF90X3JzdmQwPWFjY2Vzc29yPXJzdmRbMF0KLVBoV2luZG93RXZlbnRfdF9yc3ZkMT1hY2Nlc3Nvcj1yc3ZkWzFdCi1QaFdpbmRvd0V2ZW50X3RfcnN2ZDI9YWNjZXNzb3I9cnN2ZFsyXQotUGhXaW5kb3dFdmVudF90X3JzdmQzPWFjY2Vzc29yPXJzdmRbM10KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdENhbGxiYWNrSW5mb18xdD0KLVB0Q2FsbGJhY2tJbmZvX3RfcmVhc29uPQotUHRDYWxsYmFja0luZm9fdF9yZWFzb25fc3VidHlwZT0KLVB0Q2FsbGJhY2tJbmZvX3RfZXZlbnQ9Y2FzdD0oUGhFdmVudF90ICopCi1QdENhbGxiYWNrSW5mb190X2NiZGF0YT1jYXN0PSh2b2lkICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRDb2xvclNlbGVjdEluZm9fMXQ9Ci1QdENvbG9yU2VsZWN0SW5mb190X2ZsYWdzPQotUHRDb2xvclNlbGVjdEluZm9fdF9uc2VsZWN0b3JzPQotUHRDb2xvclNlbGVjdEluZm9fdF9uY29sb3JfbW9kZWxzPQotUHRDb2xvclNlbGVjdEluZm9fdF9jb2xvcl9tb2RlbHM9Y2FzdD0oUGdDb2xvck1vZGVsX3QgKiopCi1QdENvbG9yU2VsZWN0SW5mb190X3NlbGVjdG9ycz1jYXN0PShQdENvbG9yU2VsZWN0b3JTcGVjX3QgKikKLVB0Q29sb3JTZWxlY3RJbmZvX3RfcG9zX3g9YWNjZXNzb3I9cG9zLngKLVB0Q29sb3JTZWxlY3RJbmZvX3RfcG9zX3k9YWNjZXNzb3I9cG9zLnkKLVB0Q29sb3JTZWxlY3RJbmZvX3Rfc2l6ZV93PWFjY2Vzc29yPXNpemUudwotUHRDb2xvclNlbGVjdEluZm9fdF9zaXplX2g9YWNjZXNzb3I9c2l6ZS5oCi1QdENvbG9yU2VsZWN0SW5mb190X3BhbGV0dGU9YWNjZXNzb3I9cGFsZXR0ZS5pbnN0YW5jZSxjYXN0PSh2b2lkICopCi1QdENvbG9yU2VsZWN0SW5mb190X2FjY2VwdF90ZXh0PWNhc3Q9KGNoYXIgKikKLVB0Q29sb3JTZWxlY3RJbmZvX3RfZGlzbWlzc190ZXh0PWNhc3Q9KGNoYXIgKikKLVB0Q29sb3JTZWxlY3RJbmZvX3RfYWNjZXB0X2Rpc21pc3NfdGV4dD1jYXN0PShjaGFyICopCi1QdENvbG9yU2VsZWN0SW5mb190X2FwcGx5X2Y9Y2FzdD0odm9pZCAqKQotUHRDb2xvclNlbGVjdEluZm9fdF9kYXRhPWNhc3Q9KHZvaWQgKikKLVB0Q29sb3JTZWxlY3RJbmZvX3RfcmdiPQotUHRDb2xvclNlbGVjdEluZm9fdF9kaWFsb2c9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0RmlsZVNlbGVjdGlvbkluZm9fMXQ9Ci1QdEZpbGVTZWxlY3Rpb25JbmZvX3RfcmV0PQotUHRGaWxlU2VsZWN0aW9uSW5mb190X3BhdGg9Ci1QdEZpbGVTZWxlY3Rpb25JbmZvX3RfZGltPQotUHRGaWxlU2VsZWN0aW9uSW5mb190X3Bvcz0KLVB0RmlsZVNlbGVjdGlvbkluZm9fdF9mb3JtYXQ9Ci1QdEZpbGVTZWxlY3Rpb25JbmZvX3RfZnNwZWM9Ci1QdEZpbGVTZWxlY3Rpb25JbmZvX3RfdXNlcl9kYXRhPWNhc3Q9KHZvaWQgKikKLVB0RmlsZVNlbGVjdGlvbkluZm9fdF9jb25maXJtX2Rpc3BsYXk9Y2FzdD0odm9pZCAqKQotUHRGaWxlU2VsZWN0aW9uSW5mb190X2NvbmZpcm1fc2VsZWN0aW9uPWNhc3Q9KHZvaWQgKikKLVB0RmlsZVNlbGVjdGlvbkluZm9fdF9uZXdfZGlyZWN0b3J5PWNhc3Q9KHZvaWQgKikKLVB0RmlsZVNlbGVjdGlvbkluZm9fdF9idG4xPWNhc3Q9KGNoYXIgKikKLVB0RmlsZVNlbGVjdGlvbkluZm9fdF9idG4yPWNhc3Q9KGNoYXIgKikKLVB0RmlsZVNlbGVjdGlvbkluZm9fdF9udW1fYXJncz0KLVB0RmlsZVNlbGVjdGlvbkluZm9fdF9hcmdzPWNhc3Q9KHZvaWQgKikKLVB0RmlsZVNlbGVjdGlvbkluZm9fdF9taW5mbz1jYXN0PShQdEZpbGVTZWxlY3RvckluZm9fdCAqKQotUHRGaWxlU2VsZWN0aW9uSW5mb190X3NwYXJlPWNhc3Q9KGxvbmcgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFNjcm9sbGJhckNhbGxiYWNrXzF0PQotUHRTY3JvbGxiYXJDYWxsYmFja190X2FjdGlvbj0KLVB0U2Nyb2xsYmFyQ2FsbGJhY2tfdF9wb3NpdGlvbj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFRleHRDYWxsYmFja18xdD0KLVB0VGV4dENhbGxiYWNrX3Rfc3RhcnRfcG9zPQotUHRUZXh0Q2FsbGJhY2tfdF9lbmRfcG9zPQotUHRUZXh0Q2FsbGJhY2tfdF9jdXJfaW5zZXJ0PQotUHRUZXh0Q2FsbGJhY2tfdF9uZXdfaW5zZXJ0PQotUHRUZXh0Q2FsbGJhY2tfdF9sZW5ndGg9Ci1QdFRleHRDYWxsYmFja190X3Jlc2VydmVkPQotUHRUZXh0Q2FsbGJhY2tfdF90ZXh0PWNhc3Q9KGNoYXIgKikKLVB0VGV4dENhbGxiYWNrX3RfZG9pdD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYkNsaWVudERhdGFfMXQ9Ci1QdFdlYkNsaWVudERhdGFfdF90eXBlPQotUHRXZWJDbGllbnREYXRhX3RfdXJsPQotUHRXZWJDbGllbnREYXRhX3RfbGVuZ3RoPQotUHRXZWJDbGllbnREYXRhX3RfZGF0YT1jYXN0PWNoYXIgKgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViRGF0YVJlcUNhbGxiYWNrXzF0PQotUHRXZWJEYXRhUmVxQ2FsbGJhY2tfdF90eXBlPQotUHRXZWJEYXRhUmVxQ2FsbGJhY2tfdF9sZW5ndGg9Ci1QdFdlYkRhdGFSZXFDYWxsYmFja190X3VybD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYk1ldGFEYXRhQ2FsbGJhY2tfMXQ9Ci1QdFdlYk1ldGFEYXRhQ2FsbGJhY2tfdF9uYW1lPQotUHRXZWJNZXRhRGF0YUNhbGxiYWNrX3RfdmFsdWU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJTdGF0dXNDYWxsYmFja18xdD0KLVB0V2ViU3RhdHVzQ2FsbGJhY2tfdF9kZXNjPQotUHRXZWJTdGF0dXNDYWxsYmFja190X3R5cGU9Ci1QdFdlYlN0YXR1c0NhbGxiYWNrX3RfdXJsPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViV2luZG93Q2FsbGJhY2tfMXQ9Ci1QdFdlYldpbmRvd0NhbGxiYWNrX3Rfc2l6ZV93PWFjY2Vzc29yPXNpemUudwotUHRXZWJXaW5kb3dDYWxsYmFja190X3NpemVfaD1hY2Nlc3Nvcj1zaXplLmgKLVB0V2ViV2luZG93Q2FsbGJhY2tfdF9mbGFncz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl91dHNuYW1lPQotdXRzbmFtZV9zeXNuYW1lPQotdXRzbmFtZV9ub2RlbmFtZT0KLXV0c25hbWVfcmVsZWFzZT0KLXV0c25hbWVfdmVyc2lvbj0KLXV0c25hbWVfbWFjaGluZT0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjIxMjdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXN3dF9jb3B5cmlnaHQ9LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblwKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi0gKlxuXAotICogQ29udHJpYnV0b3JzOlxuXAotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuXAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4KLXN3dF9wcm9wZXJ0aWVzX2NvcHlyaWdodD0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLSNcblwKLSMgQ29udHJpYnV0b3JzOlxuXAotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG5cCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zd3RfbWFpbl9jbGFzc2VzPVwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5hY2Nlc3NpYmlsaXR5Lmd0ay5BVEssLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFBJL2d0ay9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2FyYm9uLk9TLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBQSS9jYXJib24vbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNkZS5DREUsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFByb2dyYW0vY2RlL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5nbm9tZS5HTk9NRSwuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUHJvZ3JhbS9nbm9tZS9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ3RrLkdUSywuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvbW90aWZfZ3RrL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsuT1MsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFBJL2d0ay9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW90aWYuT1MsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFBJL21vdGlmL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5tb3ppbGxhLlhQQ09NLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBNb3ppbGxhL2NvbW1vbi9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLkNPTSwuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvd2luMzIvbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLnBob3Rvbi5PUywuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvcGhvdG9uL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUywuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvd2luMzIvbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmdkaXAuR2RpcCwuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvd2luMzIvbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhaXJvLkNhaXJvLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBQSS9jYWlyby9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLmdseC5HTFgsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIE9wZW5HTC9nbHgvbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC53aW4zMi5XR0wsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIE9wZW5HTC93aW4zMi9saWJyYXJ5LwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzFiZDllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQyOTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0FDQ0VMPQotQUNDRUxfZlZpcnQ9Ci1BQ0NFTF9rZXk9Ci1BQ0NFTF9jbWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CSVRNQVA9Ci1CSVRNQVBfYm1UeXBlPQotQklUTUFQX2JtV2lkdGg9Ci1CSVRNQVBfYm1IZWlnaHQ9Ci1CSVRNQVBfYm1XaWR0aEJ5dGVzPQotQklUTUFQX2JtUGxhbmVzPQotQklUTUFQX2JtQml0c1BpeGVsPQotQklUTUFQX2JtQml0cz1jYXN0PShMUFZPSUQpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CSVRNQVBJTkZPSEVBREVSPQotQklUTUFQSU5GT0hFQURFUl9iaVNpemU9Ci1CSVRNQVBJTkZPSEVBREVSX2JpV2lkdGg9Ci1CSVRNQVBJTkZPSEVBREVSX2JpSGVpZ2h0PQotQklUTUFQSU5GT0hFQURFUl9iaVBsYW5lcz0KLUJJVE1BUElORk9IRUFERVJfYmlCaXRDb3VudD0KLUJJVE1BUElORk9IRUFERVJfYmlDb21wcmVzc2lvbj0KLUJJVE1BUElORk9IRUFERVJfYmlTaXplSW1hZ2U9Ci1CSVRNQVBJTkZPSEVBREVSX2JpWFBlbHNQZXJNZXRlcj0KLUJJVE1BUElORk9IRUFERVJfYmlZUGVsc1Blck1ldGVyPQotQklUTUFQSU5GT0hFQURFUl9iaUNsclVzZWQ9Ci1CSVRNQVBJTkZPSEVBREVSX2JpQ2xySW1wb3J0YW50PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQkxFTkRGVU5DVElPTj0KLUJMRU5ERlVOQ1RJT05fQmxlbmRPcD0KLUJMRU5ERlVOQ1RJT05fQmxlbmRGbGFncz0KLUJMRU5ERlVOQ1RJT05fU291cmNlQ29uc3RhbnRBbHBoYT0KLUJMRU5ERlVOQ1RJT05fQWxwaGFGb3JtYXQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CUk9XU0VJTkZPPQotQlJPV1NFSU5GT19od25kT3duZXI9Y2FzdD0oSFdORCkKLUJST1dTRUlORk9fcGlkbFJvb3Q9Y2FzdD0oTFBDSVRFTUlETElTVCkKLUJST1dTRUlORk9fcHN6RGlzcGxheU5hbWU9Y2FzdD0oTFBUU1RSKQotQlJPV1NFSU5GT19scHN6VGl0bGU9Y2FzdD0oTFBDVFNUUikKLUJST1dTRUlORk9fdWxGbGFncz0KLUJST1dTRUlORk9fbHBmbj1jYXN0PShCRkZDQUxMQkFDSykKLUJST1dTRUlORk9fbFBhcmFtPQotQlJPV1NFSU5GT19pSW1hZ2U9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CVVRUT05fMUlNQUdFTElTVD0KLUJVVFRPTl9JTUFHRUxJU1RfaGltbD1jYXN0PUhJTUFHRUxJU1QKLUJVVFRPTl9JTUFHRUxJU1RfbWFyZ2luX2xlZnQ9YWNjZXNzb3I9bWFyZ2luLmxlZnQsY2FzdD1MT05HCi1CVVRUT05fSU1BR0VMSVNUX21hcmdpbl90b3A9YWNjZXNzb3I9bWFyZ2luLnRvcCxjYXN0PUxPTkcKLUJVVFRPTl9JTUFHRUxJU1RfbWFyZ2luX3JpZ2h0PWFjY2Vzc29yPW1hcmdpbi5yaWdodCxjYXN0PUxPTkcKLUJVVFRPTl9JTUFHRUxJU1RfbWFyZ2luX2JvdHRvbT1hY2Nlc3Nvcj1tYXJnaW4uYm90dG9tLGNhc3Q9TE9ORwotQlVUVE9OX0lNQUdFTElTVF91QWxpZ249Y2FzdD1VSU5UCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9DSE9PU0VDT0xPUj0KLUNIT09TRUNPTE9SX2xTdHJ1Y3RTaXplPQotQ0hPT1NFQ09MT1JfaHduZE93bmVyPWNhc3Q9KEhXTkQpCi1DSE9PU0VDT0xPUl9oSW5zdGFuY2U9Y2FzdD0oSEFORExFKQotQ0hPT1NFQ09MT1JfcmdiUmVzdWx0PQotQ0hPT1NFQ09MT1JfbHBDdXN0Q29sb3JzPWNhc3Q9KENPTE9SUkVGICopCi1DSE9PU0VDT0xPUl9GbGFncz0KLUNIT09TRUNPTE9SX2xDdXN0RGF0YT0KLUNIT09TRUNPTE9SX2xwZm5Ib29rPWNhc3Q9KExQQ0NIT09LUFJPQykKLUNIT09TRUNPTE9SX2xwVGVtcGxhdGVOYW1lPWNhc3Q9KExQQ1RTVFIpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9DSE9PU0VGT05UPQotQ0hPT1NFRk9OVF9sU3RydWN0U2l6ZT0KLUNIT09TRUZPTlRfaHduZE93bmVyPWNhc3Q9KEhXTkQpCi1DSE9PU0VGT05UX2hEQz1jYXN0PShIREMpCi1DSE9PU0VGT05UX2xwTG9nRm9udD1jYXN0PShMUExPR0ZPTlQpCi1DSE9PU0VGT05UX2lQb2ludFNpemU9Ci1DSE9PU0VGT05UX0ZsYWdzPQotQ0hPT1NFRk9OVF9yZ2JDb2xvcnM9Ci1DSE9PU0VGT05UX2xDdXN0RGF0YT0KLUNIT09TRUZPTlRfbHBmbkhvb2s9Y2FzdD0oTFBDRkhPT0tQUk9DKQotQ0hPT1NFRk9OVF9scFRlbXBsYXRlTmFtZT1jYXN0PShMUENUU1RSKQotQ0hPT1NFRk9OVF9oSW5zdGFuY2U9Y2FzdD0oSElOU1RBTkNFKQotQ0hPT1NFRk9OVF9scHN6U3R5bGU9Y2FzdD0oTFBUU1RSKQotQ0hPT1NFRk9OVF9uRm9udFR5cGU9Ci1DSE9PU0VGT05UX25TaXplTWluPQotQ0hPT1NFRk9OVF9uU2l6ZU1heD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0NPTUJPQk9YSU5GTz0KLUNPTUJPQk9YSU5GT19jYlNpemU9Ci1DT01CT0JPWElORk9faXRlbUxlZnQ9YWNjZXNzb3I9cmNJdGVtLmxlZnQKLUNPTUJPQk9YSU5GT19pdGVtVG9wPWFjY2Vzc29yPXJjSXRlbS50b3AKLUNPTUJPQk9YSU5GT19pdGVtUmlnaHQ9YWNjZXNzb3I9cmNJdGVtLnJpZ2h0Ci1DT01CT0JPWElORk9faXRlbUJvdHRvbT1hY2Nlc3Nvcj1yY0l0ZW0uYm90dG9tCi1DT01CT0JPWElORk9fYnV0dG9uTGVmdD1hY2Nlc3Nvcj1yY0J1dHRvbi5sZWZ0Ci1DT01CT0JPWElORk9fYnV0dG9uVG9wPWFjY2Vzc29yPXJjQnV0dG9uLnRvcAotQ09NQk9CT1hJTkZPX2J1dHRvblJpZ2h0PWFjY2Vzc29yPXJjQnV0dG9uLnJpZ2h0Ci1DT01CT0JPWElORk9fYnV0dG9uQm90dG9tPWFjY2Vzc29yPXJjQnV0dG9uLmJvdHRvbQotQ09NQk9CT1hJTkZPX3N0YXRlQnV0dG9uPQotQ09NQk9CT1hJTkZPX2h3bmRDb21ibz1jYXN0PUhXTkQKLUNPTUJPQk9YSU5GT19od25kSXRlbT1jYXN0PUhXTkQKLUNPTUJPQk9YSU5GT19od25kTGlzdD1jYXN0PUhXTkQKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0NPTVBPU0lUSU9ORk9STT0KLUNPTVBPU0lUSU9ORk9STV9kd1N0eWxlPQotQ09NUE9TSVRJT05GT1JNX3g9YWNjZXNzb3I9cHRDdXJyZW50UG9zLngKLUNPTVBPU0lUSU9ORk9STV95PWFjY2Vzc29yPXB0Q3VycmVudFBvcy55Ci1DT01QT1NJVElPTkZPUk1fbGVmdD1hY2Nlc3Nvcj1yY0FyZWEubGVmdAotQ09NUE9TSVRJT05GT1JNX3RvcD1hY2Nlc3Nvcj1yY0FyZWEudG9wCi1DT01QT1NJVElPTkZPUk1fcmlnaHQ9YWNjZXNzb3I9cmNBcmVhLnJpZ2h0Ci1DT01QT1NJVElPTkZPUk1fYm90dG9tPWFjY2Vzc29yPXJjQXJlYS5ib3R0b20KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0NSRUFURVNUUlVDVD0KLUNSRUFURVNUUlVDVF9scENyZWF0ZVBhcmFtcz1jYXN0PShMUFZPSUQpCi1DUkVBVEVTVFJVQ1RfaEluc3RhbmNlPWNhc3Q9KEhJTlNUQU5DRSkKLUNSRUFURVNUUlVDVF9oTWVudT1jYXN0PShITUVOVSkKLUNSRUFURVNUUlVDVF9od25kUGFyZW50PWNhc3Q9KEhXTkQpCi1DUkVBVEVTVFJVQ1RfY3k9Ci1DUkVBVEVTVFJVQ1RfY3g9Ci1DUkVBVEVTVFJVQ1RfeT0KLUNSRUFURVNUUlVDVF94PQotQ1JFQVRFU1RSVUNUX3N0eWxlPQotQ1JFQVRFU1RSVUNUX2xwc3pOYW1lPWNhc3Q9KExQQ1RTVFIpCi1DUkVBVEVTVFJVQ1RfbHBzekNsYXNzPWNhc3Q9KExQQ1RTVFIpCi1DUkVBVEVTVFJVQ1RfZHdFeFN0eWxlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRElCU0VDVElPTj0KLURJQlNFQ1RJT05fYmlTaXplPWFjY2Vzc29yPWRzQm1paC5iaVNpemUKLURJQlNFQ1RJT05fYmlXaWR0aD1hY2Nlc3Nvcj1kc0JtaWguYmlXaWR0aAotRElCU0VDVElPTl9iaUhlaWdodD1hY2Nlc3Nvcj1kc0JtaWguYmlIZWlnaHQKLURJQlNFQ1RJT05fYmlQbGFuZXM9YWNjZXNzb3I9ZHNCbWloLmJpUGxhbmVzCi1ESUJTRUNUSU9OX2JpQml0Q291bnQ9YWNjZXNzb3I9ZHNCbWloLmJpQml0Q291bnQKLURJQlNFQ1RJT05fYmlDb21wcmVzc2lvbj1hY2Nlc3Nvcj1kc0JtaWguYmlDb21wcmVzc2lvbgotRElCU0VDVElPTl9iaVNpemVJbWFnZT1hY2Nlc3Nvcj1kc0JtaWguYmlTaXplSW1hZ2UKLURJQlNFQ1RJT05fYmlYUGVsc1Blck1ldGVyPWFjY2Vzc29yPWRzQm1paC5iaVhQZWxzUGVyTWV0ZXIKLURJQlNFQ1RJT05fYmlZUGVsc1Blck1ldGVyPWFjY2Vzc29yPWRzQm1paC5iaVlQZWxzUGVyTWV0ZXIKLURJQlNFQ1RJT05fYmlDbHJVc2VkPWFjY2Vzc29yPWRzQm1paC5iaUNsclVzZWQKLURJQlNFQ1RJT05fYmlDbHJJbXBvcnRhbnQ9YWNjZXNzb3I9ZHNCbWloLmJpQ2xySW1wb3J0YW50Ci1ESUJTRUNUSU9OX2RzQml0ZmllbGRzMD1hY2Nlc3Nvcj1kc0JpdGZpZWxkc1swXQotRElCU0VDVElPTl9kc0JpdGZpZWxkczE9YWNjZXNzb3I9ZHNCaXRmaWVsZHNbMV0KLURJQlNFQ1RJT05fZHNCaXRmaWVsZHMyPWFjY2Vzc29yPWRzQml0ZmllbGRzWzJdCi1ESUJTRUNUSU9OX2RzaFNlY3Rpb249Y2FzdD0oSEFORExFKQotRElCU0VDVElPTl9kc09mZnNldD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RMTFZFUlNJT05JTkZPPQotRExMVkVSU0lPTklORk9fY2JTaXplPQotRExMVkVSU0lPTklORk9fZHdNYWpvclZlcnNpb249Ci1ETExWRVJTSU9OSU5GT19kd01pbm9yVmVyc2lvbj0KLURMTFZFUlNJT05JTkZPX2R3QnVpbGROdW1iZXI9Ci1ETExWRVJTSU9OSU5GT19kd1BsYXRmb3JtSUQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ET0NJTkZPPQotRE9DSU5GT19jYlNpemU9Ci1ET0NJTkZPX2xwc3pEb2NOYW1lPWNhc3Q9KExQQ1RTVFIpCi1ET0NJTkZPX2xwc3pPdXRwdXQ9Y2FzdD0oTFBDVFNUUikKLURPQ0lORk9fbHBzekRhdGF0eXBlPWNhc3Q9KExQQ1RTVFIpCi1ET0NJTkZPX2Z3VHlwZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RSQVdJVEVNU1RSVUNUPQotRFJBV0lURU1TVFJVQ1RfQ3RsVHlwZT0KLURSQVdJVEVNU1RSVUNUX0N0bElEPQotRFJBV0lURU1TVFJVQ1RfaXRlbUlEPQotRFJBV0lURU1TVFJVQ1RfaXRlbUFjdGlvbj0KLURSQVdJVEVNU1RSVUNUX2l0ZW1TdGF0ZT0KLURSQVdJVEVNU1RSVUNUX2h3bmRJdGVtPWNhc3Q9KEhXTkQpCi1EUkFXSVRFTVNUUlVDVF9oREM9Y2FzdD0oSERDKQotRFJBV0lURU1TVFJVQ1RfbGVmdD1hY2Nlc3Nvcj1yY0l0ZW0ubGVmdAotRFJBV0lURU1TVFJVQ1RfdG9wPWFjY2Vzc29yPXJjSXRlbS50b3AKLURSQVdJVEVNU1RSVUNUX2JvdHRvbT1hY2Nlc3Nvcj1yY0l0ZW0uYm90dG9tCi1EUkFXSVRFTVNUUlVDVF9yaWdodD1hY2Nlc3Nvcj1yY0l0ZW0ucmlnaHQKLURSQVdJVEVNU1RSVUNUX2l0ZW1EYXRhPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRFJPUEZJTEVTPQotRFJPUEZJTEVTX3BGaWxlcz0KLURST1BGSUxFU19wdF94PWFjY2Vzc29yPXB0LngKLURST1BGSUxFU19wdF95PWFjY2Vzc29yPXB0LnkKLURST1BGSUxFU19mTkM9Ci1EUk9QRklMRVNfZldpZGU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9FWFRMT0dQRU49Ci1FWFRMT0dQRU5fZWxwUGVuU3R5bGU9Ci1FWFRMT0dQRU5fZWxwV2lkdGg9Ci1FWFRMT0dQRU5fZWxwQnJ1c2hTdHlsZT0KLUVYVExPR1BFTl9lbHBDb2xvcj0KLUVYVExPR1BFTl9lbHBIYXRjaD0KLUVYVExPR1BFTl9lbHBOdW1FbnRyaWVzPQotRVhUTE9HUEVOX2VscFN0eWxlRW50cnk9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9GSUxFVElNRT0KLUZJTEVUSU1FX2R3TG93RGF0ZVRpbWU9Ci1GSUxFVElNRV9kd0hpZ2hEYXRlVGltZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0dDUF8xUkVTVUxUUz0KLUdDUF9SRVNVTFRTX2xTdHJ1Y3RTaXplPQotR0NQX1JFU1VMVFNfbHBPdXRTdHJpbmc9Y2FzdD0oTFBUU1RSKQotR0NQX1JFU1VMVFNfbHBPcmRlcj1jYXN0PShVSU5UICAqKQotR0NQX1JFU1VMVFNfbHBEeD1jYXN0PShpbnQgICopCi1HQ1BfUkVTVUxUU19scENhcmV0UG9zPWNhc3Q9KGludCAgKikKLUdDUF9SRVNVTFRTX2xwQ2xhc3M9Y2FzdD0oTFBTVFIpCi1HQ1BfUkVTVUxUU19scEdseXBocz1jYXN0PShMUFdTVFIpCi1HQ1BfUkVTVUxUU19uR2x5cGhzPQotR0NQX1JFU1VMVFNfbk1heEZpdD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0dSQURJRU5UXzFSRUNUPQotR1JBRElFTlRfUkVDVF9VcHBlckxlZnQ9Ci1HUkFESUVOVF9SRUNUX0xvd2VyUmlnaHQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9HVUlUSFJFQURJTkZPPQotR1VJVEhSRUFESU5GT19jYlNpemU9Y2FzdD0oRFdPUkQpCi1HVUlUSFJFQURJTkZPX2ZsYWdzPWNhc3Q9KERXT1JEKQotR1VJVEhSRUFESU5GT19od25kQWN0aXZlPWNhc3Q9KEhXTkQpCi1HVUlUSFJFQURJTkZPX2h3bmRGb2N1cz1jYXN0PShIV05EKQotR1VJVEhSRUFESU5GT19od25kQ2FwdHVyZT1jYXN0PShIV05EKQotR1VJVEhSRUFESU5GT19od25kTWVudU93bmVyPWNhc3Q9KEhXTkQpCi1HVUlUSFJFQURJTkZPX2h3bmRNb3ZlU2l6ZT1jYXN0PShIV05EKQotR1VJVEhSRUFESU5GT19od25kQ2FyZXQ9Y2FzdD0oSFdORCkKLUdVSVRIUkVBRElORk9fbGVmdD1hY2Nlc3Nvcj1yY0NhcmV0LmxlZnQKLUdVSVRIUkVBRElORk9fdG9wPWFjY2Vzc29yPXJjQ2FyZXQudG9wCi1HVUlUSFJFQURJTkZPX3JpZ2h0PWFjY2Vzc29yPXJjQ2FyZXQucmlnaHQKLUdVSVRIUkVBRElORk9fYm90dG9tPWFjY2Vzc29yPXJjQ2FyZXQuYm90dG9tCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRElURU09Ci1IRElURU1fbWFzaz0KLUhESVRFTV9jeHk9Ci1IRElURU1fcHN6VGV4dD1jYXN0PShMUFRTVFIpCi1IRElURU1faGJtPWNhc3Q9KEhCSVRNQVApCi1IRElURU1fY2NoVGV4dE1heD0KLUhESVRFTV9mbXQ9Ci1IRElURU1fbFBhcmFtPQotSERJVEVNX2lJbWFnZT0KLUhESVRFTV9pT3JkZXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRExBWU9VVD0KLUhETEFZT1VUX3ByYz1jYXN0PVJFQ1QgKgotSERMQVlPVVRfcHdwb3M9Y2FzdD0oV0lORE9XUE9TICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRUxQSU5GTz0KLUhFTFBJTkZPX2NiU2l6ZT0KLUhFTFBJTkZPX2lDb250ZXh0VHlwZT0KLUhFTFBJTkZPX2lDdHJsSWQ9Ci1IRUxQSU5GT19oSXRlbUhhbmRsZT1jYXN0PShIQU5ETEUpCi1IRUxQSU5GT19kd0NvbnRleHRJZD0KLUhFTFBJTkZPX3g9YWNjZXNzb3I9TW91c2VQb3MueAotSEVMUElORk9feT1hY2Nlc3Nvcj1Nb3VzZVBvcy55Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ISUdIQ09OVFJBU1Q9Ci1ISUdIQ09OVFJBU1RfY2JTaXplPQotSElHSENPTlRSQVNUX2R3RmxhZ3M9Ci1ISUdIQ09OVFJBU1RfbHBzekRlZmF1bHRTY2hlbWU9Y2FzdD1MUFRTVFIKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0lDT05JTkZPPQotSUNPTklORk9fZkljb249Ci1JQ09OSU5GT194SG90c3BvdD0KLUlDT05JTkZPX3lIb3RzcG90PQotSUNPTklORk9faGJtTWFzaz1jYXN0PShIQklUTUFQKQotSUNPTklORk9faGJtQ29sb3I9Y2FzdD0oSEJJVE1BUCkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0lOSVRDT01NT05DT05UUk9MU0VYPQotSU5JVENPTU1PTkNPTlRST0xTRVhfZHdTaXplPQotSU5JVENPTU1PTkNPTlRST0xTRVhfZHdJQ0M9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9JTlBVVD0KLUlOUFVUX3R5cGU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9LRVlCRElOUFVUPQotS0VZQkRJTlBVVF93Vms9Ci1LRVlCRElOUFVUX3dTY2FuPQotS0VZQkRJTlBVVF9kd0ZsYWdzPQotS0VZQkRJTlBVVF90aW1lPQotS0VZQkRJTlBVVF9kd0V4dHJhSW5mbz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xJVEVNPQotTElURU1fbWFzaz0KLUxJVEVNX2lMaW5rPQotTElURU1fc3RhdGU9Ci1MSVRFTV9zdGF0ZU1hc2s9Ci1MSVRFTV9zeklEPQotTElURU1fc3pVcmw9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dCUlVTSD0KLUxPR0JSVVNIX2xiU3R5bGU9Ci1MT0dCUlVTSF9sYkNvbG9yPQotTE9HQlJVU0hfbGJIYXRjaD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlQ9Ci1MT0dGT05UX2xmSGVpZ2h0PQotTE9HRk9OVF9sZldpZHRoPQotTE9HRk9OVF9sZkVzY2FwZW1lbnQ9Ci1MT0dGT05UX2xmT3JpZW50YXRpb249Ci1MT0dGT05UX2xmV2VpZ2h0PQotTE9HRk9OVF9sZkl0YWxpYz0KLUxPR0ZPTlRfbGZVbmRlcmxpbmU9Ci1MT0dGT05UX2xmU3RyaWtlT3V0PQotTE9HRk9OVF9sZkNoYXJTZXQ9Ci1MT0dGT05UX2xmT3V0UHJlY2lzaW9uPQotTE9HRk9OVF9sZkNsaXBQcmVjaXNpb249Ci1MT0dGT05UX2xmUXVhbGl0eT0KLUxPR0ZPTlRfbGZQaXRjaEFuZEZhbWlseT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRBPQotTE9HRk9OVEFfbGZGYWNlTmFtZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRXPQotTE9HRk9OVFdfbGZGYWNlTmFtZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR1BFTj0KLUxPR1BFTl9sb3BuU3R5bGU9Ci1MT0dQRU5feD1hY2Nlc3Nvcj1sb3BuV2lkdGgueAotTE9HUEVOX3k9YWNjZXNzb3I9bG9wbldpZHRoLnkKLUxPR1BFTl9sb3BuQ29sb3I9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MUkVTVUxUPWZsYWdzPW5vX2dlbgotTFJFU1VMVF92YWx1ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWQ09MVU1OPQotTFZDT0xVTU5fbWFzaz0KLUxWQ09MVU1OX2ZtdD0KLUxWQ09MVU1OX2N4PQotTFZDT0xVTU5fcHN6VGV4dD1jYXN0PShMUFRTVFIpCi1MVkNPTFVNTl9jY2hUZXh0TWF4PQotTFZDT0xVTU5faVN1Ykl0ZW09Ci1MVkNPTFVNTl9pSW1hZ2U9Ci1MVkNPTFVNTl9pT3JkZXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVkhJVFRFU1RJTkZPPQotTFZISVRURVNUSU5GT194PWFjY2Vzc29yPXB0LngKLUxWSElUVEVTVElORk9feT1hY2Nlc3Nvcj1wdC55Ci1MVkhJVFRFU1RJTkZPX2ZsYWdzPQotTFZISVRURVNUSU5GT19pSXRlbT0KLUxWSElUVEVTVElORk9faVN1Ykl0ZW09Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU09Ci1MVklURU1fbWFzaz0KLUxWSVRFTV9pSXRlbT0KLUxWSVRFTV9pU3ViSXRlbT0KLUxWSVRFTV9zdGF0ZT0KLUxWSVRFTV9zdGF0ZU1hc2s9Ci1MVklURU1fcHN6VGV4dD1jYXN0PShMUFRTVFIpCi1MVklURU1fY2NoVGV4dE1heD0KLUxWSVRFTV9pSW1hZ2U9Ci1MVklURU1fbFBhcmFtPQotTFZJVEVNX2lJbmRlbnQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NQVJHSU5TPQotTUFSR0lOU19jeExlZnRXaWR0aD0KLU1BUkdJTlNfY3hSaWdodFdpZHRoPQotTUFSR0lOU19jeVRvcEhlaWdodD0KLU1BUkdJTlNfY3lCb3R0b21IZWlnaHQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NRUFTVVJFSVRFTVNUUlVDVD0KLU1FQVNVUkVJVEVNU1RSVUNUX0N0bFR5cGU9Ci1NRUFTVVJFSVRFTVNUUlVDVF9DdGxJRD0KLU1FQVNVUkVJVEVNU1RSVUNUX2l0ZW1JRD0KLU1FQVNVUkVJVEVNU1RSVUNUX2l0ZW1XaWR0aD0KLU1FQVNVUkVJVEVNU1RSVUNUX2l0ZW1IZWlnaHQ9Ci1NRUFTVVJFSVRFTVNUUlVDVF9pdGVtRGF0YT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01FTlVCQVJJTkZPPQotTUVOVUJBUklORk9fY2JTaXplPQotTUVOVUJBUklORk9fbGVmdD1hY2Nlc3Nvcj1yY0Jhci5sZWZ0Ci1NRU5VQkFSSU5GT190b3A9YWNjZXNzb3I9cmNCYXIudG9wCi1NRU5VQkFSSU5GT19yaWdodD1hY2Nlc3Nvcj1yY0Jhci5yaWdodAotTUVOVUJBUklORk9fYm90dG9tPWFjY2Vzc29yPXJjQmFyLmJvdHRvbQotTUVOVUJBUklORk9faE1lbnU9Y2FzdD0oSE1FTlUpCi1NRU5VQkFSSU5GT19od25kTWVudT1jYXN0PShIV05EKQotTUVOVUJBUklORk9fZkJhckZvY3VzZWQ9Ci1NRU5VQkFSSU5GT19mRm9jdXNlZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01FTlVJTkZPPQotTUVOVUlORk9fY2JTaXplPQotTUVOVUlORk9fZk1hc2s9Ci1NRU5VSU5GT19kd1N0eWxlPQotTUVOVUlORk9fY3lNYXg9Ci1NRU5VSU5GT19oYnJCYWNrPWNhc3Q9KEhCUlVTSCkKLU1FTlVJTkZPX2R3Q29udGV4dEhlbHBJRD0KLU1FTlVJTkZPX2R3TWVudURhdGE9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NRU5VSVRFTUlORk89Ci1NRU5VSVRFTUlORk9fY2JTaXplPQotTUVOVUlURU1JTkZPX2ZNYXNrPQotTUVOVUlURU1JTkZPX2ZUeXBlPQotTUVOVUlURU1JTkZPX2ZTdGF0ZT0KLU1FTlVJVEVNSU5GT193SUQ9Ci1NRU5VSVRFTUlORk9faFN1Yk1lbnU9Y2FzdD0oSE1FTlUpCi1NRU5VSVRFTUlORk9faGJtcENoZWNrZWQ9Y2FzdD0oSEJJVE1BUCkKLU1FTlVJVEVNSU5GT19oYm1wVW5jaGVja2VkPWNhc3Q9KEhCSVRNQVApCi1NRU5VSVRFTUlORk9fZHdJdGVtRGF0YT0KLU1FTlVJVEVNSU5GT19kd1R5cGVEYXRhPWNhc3Q9KExQVFNUUikKLU1FTlVJVEVNSU5GT19jY2g9Ci1NRU5VSVRFTUlORk9faGJtcEl0ZW09Y2FzdD0oSEJJVE1BUCksZmxhZ3M9bm9fd2luY2UKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01JTk1BWElORk89Ci1NSU5NQVhJTkZPX3B0UmVzZXJ2ZWRfeD1hY2Nlc3Nvcj1wdFJlc2VydmVkLngKLU1JTk1BWElORk9fcHRSZXNlcnZlZF95PWFjY2Vzc29yPXB0UmVzZXJ2ZWQueQotTUlOTUFYSU5GT19wdE1heFNpemVfeD1hY2Nlc3Nvcj1wdE1heFNpemUueAotTUlOTUFYSU5GT19wdE1heFNpemVfeT1hY2Nlc3Nvcj1wdE1heFNpemUueQotTUlOTUFYSU5GT19wdE1heFBvc2l0aW9uX3g9YWNjZXNzb3I9cHRNYXhQb3NpdGlvbi54Ci1NSU5NQVhJTkZPX3B0TWF4UG9zaXRpb25feT1hY2Nlc3Nvcj1wdE1heFBvc2l0aW9uLnkKLU1JTk1BWElORk9fcHRNaW5UcmFja1NpemVfeD1hY2Nlc3Nvcj1wdE1pblRyYWNrU2l6ZS54Ci1NSU5NQVhJTkZPX3B0TWluVHJhY2tTaXplX3k9YWNjZXNzb3I9cHRNaW5UcmFja1NpemUueQotTUlOTUFYSU5GT19wdE1heFRyYWNrU2l6ZV94PWFjY2Vzc29yPXB0TWF4VHJhY2tTaXplLngKLU1JTk1BWElORk9fcHRNYXhUcmFja1NpemVfeT1hY2Nlc3Nvcj1wdE1heFRyYWNrU2l6ZS55Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NT05JVE9SSU5GTz0KLU1PTklUT1JJTkZPX2NiU2l6ZT0KLU1PTklUT1JJTkZPX3JjTW9uaXRvcl9sZWZ0PWFjY2Vzc29yPXJjTW9uaXRvci5sZWZ0Ci1NT05JVE9SSU5GT19yY01vbml0b3JfdG9wPWFjY2Vzc29yPXJjTW9uaXRvci50b3AKLU1PTklUT1JJTkZPX3JjTW9uaXRvcl9yaWdodD1hY2Nlc3Nvcj1yY01vbml0b3IucmlnaHQKLU1PTklUT1JJTkZPX3JjTW9uaXRvcl9ib3R0b209YWNjZXNzb3I9cmNNb25pdG9yLmJvdHRvbQotTU9OSVRPUklORk9fcmNXb3JrX2xlZnQ9YWNjZXNzb3I9cmNXb3JrLmxlZnQKLU1PTklUT1JJTkZPX3JjV29ya190b3A9YWNjZXNzb3I9cmNXb3JrLnRvcAotTU9OSVRPUklORk9fcmNXb3JrX3JpZ2h0PWFjY2Vzc29yPXJjV29yay5yaWdodAotTU9OSVRPUklORk9fcmNXb3JrX2JvdHRvbT1hY2Nlc3Nvcj1yY1dvcmsuYm90dG9tCi1NT05JVE9SSU5GT19kd0ZsYWdzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTU9VU0VJTlBVVD0KLU1PVVNFSU5QVVRfZHg9Ci1NT1VTRUlOUFVUX2R5PQotTU9VU0VJTlBVVF9tb3VzZURhdGE9Ci1NT1VTRUlOUFVUX2R3RmxhZ3M9Ci1NT1VTRUlOUFVUX3RpbWU9Ci1NT1VTRUlOUFVUX2R3RXh0cmFJbmZvPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHPQotTVNHX2h3bmQ9Y2FzdD0oSFdORCkKLU1TR19tZXNzYWdlPQotTVNHX3dQYXJhbT0KLU1TR19sUGFyYW09Ci1NU0dfdGltZT0KLU1TR194PWFjY2Vzc29yPXB0LngKLU1TR195PWFjY2Vzc29yPXB0LnkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NQ1VTVE9NRFJBVz0KLU5NQ1VTVE9NRFJBV19kd0RyYXdTdGFnZT0KLU5NQ1VTVE9NRFJBV19oZGM9Y2FzdD0oSERDKQotTk1DVVNUT01EUkFXX2xlZnQ9YWNjZXNzb3I9cmMubGVmdAotTk1DVVNUT01EUkFXX3RvcD1hY2Nlc3Nvcj1yYy50b3AKLU5NQ1VTVE9NRFJBV19yaWdodD1hY2Nlc3Nvcj1yYy5yaWdodAotTk1DVVNUT01EUkFXX2JvdHRvbT1hY2Nlc3Nvcj1yYy5ib3R0b20KLU5NQ1VTVE9NRFJBV19kd0l0ZW1TcGVjPQotTk1DVVNUT01EUkFXX3VJdGVtU3RhdGU9Ci1OTUNVU1RPTURSQVdfbEl0ZW1sUGFyYW09Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUhEUj0KLU5NSERSX2h3bmRGcm9tPWNhc3Q9KEhXTkQpCi1OTUhEUl9pZEZyb209Ci1OTUhEUl9jb2RlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1IRUFERVI9Ci1OTUhFQURFUl9pSXRlbT0KLU5NSEVBREVSX2lCdXR0b249Ci1OTUhFQURFUl9waXRlbT1jYXN0PShIRElURU0gRkFSICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxJTks9Ci1OTUxJTktfbWFzaz1hY2Nlc3Nvcj1pdGVtLm1hc2sKLU5NTElOS19pTGluaz1hY2Nlc3Nvcj1pdGVtLmlMaW5rCi1OTUxJTktfc3RhdGU9YWNjZXNzb3I9aXRlbS5zdGF0ZQotTk1MSU5LX3N0YXRlTWFzaz1hY2Nlc3Nvcj1pdGVtLnN0YXRlTWFzawotTk1MSU5LX3N6SUQ9YWNjZXNzb3I9aXRlbS5zeklECi1OTUxJTktfc3pVcmw9YWNjZXNzb3I9aXRlbS5zelVybAotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MSVNUVklFVz0KLU5NTElTVFZJRVdfaUl0ZW09Ci1OTUxJU1RWSUVXX2lTdWJJdGVtPQotTk1MSVNUVklFV191TmV3U3RhdGU9Ci1OTUxJU1RWSUVXX3VPbGRTdGF0ZT0KLU5NTElTVFZJRVdfdUNoYW5nZWQ9Ci1OTUxJU1RWSUVXX3g9YWNjZXNzb3I9cHRBY3Rpb24ueAotTk1MSVNUVklFV195PWFjY2Vzc29yPXB0QWN0aW9uLnkKLU5NTElTVFZJRVdfbFBhcmFtPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkNVU1RPTURSQVc9Ci1OTUxWQ1VTVE9NRFJBV19jbHJUZXh0PQotTk1MVkNVU1RPTURSQVdfY2xyVGV4dEJrPQotTk1MVkNVU1RPTURSQVdfaVN1Ykl0ZW09Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWRElTUElORk89Ci1OTUxWRElTUElORk9fbWFzaz1hY2Nlc3Nvcj1pdGVtLm1hc2sKLU5NTFZESVNQSU5GT19pSXRlbT1hY2Nlc3Nvcj1pdGVtLmlJdGVtCi1OTUxWRElTUElORk9faVN1Ykl0ZW09YWNjZXNzb3I9aXRlbS5pU3ViSXRlbQotTk1MVkRJU1BJTkZPX3N0YXRlPWFjY2Vzc29yPWl0ZW0uc3RhdGUKLU5NTFZESVNQSU5GT19zdGF0ZU1hc2s9YWNjZXNzb3I9aXRlbS5zdGF0ZU1hc2sKLU5NTFZESVNQSU5GT19wc3pUZXh0PWFjY2Vzc29yPWl0ZW0ucHN6VGV4dCxjYXN0PUxQVFNUUgotTk1MVkRJU1BJTkZPX2NjaFRleHRNYXg9YWNjZXNzb3I9aXRlbS5jY2hUZXh0TWF4Ci1OTUxWRElTUElORk9faUltYWdlPWFjY2Vzc29yPWl0ZW0uaUltYWdlCi1OTUxWRElTUElORk9fbFBhcmFtPWFjY2Vzc29yPWl0ZW0ubFBhcmFtCi1OTUxWRElTUElORk9faUluZGVudD1hY2Nlc3Nvcj1pdGVtLmlJbmRlbnQKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZGSU5ESVRFTT0KLU5NTFZGSU5ESVRFTV9pU3RhcnQ9Ci1OTUxWRklORElURU1fZmxhZ3M9YWNjZXNzb3I9bHZmaS5mbGFncwotTk1MVkZJTkRJVEVNX3Bzej1hY2Nlc3Nvcj1sdmZpLnBzeixjYXN0PUxQQ1RTVFIKLU5NTFZGSU5ESVRFTV9sUGFyYW09YWNjZXNzb3I9bHZmaS5sUGFyYW0KLU5NTFZGSU5ESVRFTV94PWFjY2Vzc29yPWx2ZmkucHQueAotTk1MVkZJTkRJVEVNX3k9YWNjZXNzb3I9bHZmaS5wdC55Ci1OTUxWRklORElURU1fdmtEaXJlY3Rpb249YWNjZXNzb3I9bHZmaS52a0RpcmVjdGlvbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1SRUJBUkNIRVZST049Ci1OTVJFQkFSQ0hFVlJPTl91QmFuZD0KLU5NUkVCQVJDSEVWUk9OX3dJRD0KLU5NUkVCQVJDSEVWUk9OX2xQYXJhbT0KLU5NUkVCQVJDSEVWUk9OX2xlZnQ9YWNjZXNzb3I9cmMubGVmdAotTk1SRUJBUkNIRVZST05fdG9wPWFjY2Vzc29yPXJjLnRvcAotTk1SRUJBUkNIRVZST05fcmlnaHQ9YWNjZXNzb3I9cmMucmlnaHQKLU5NUkVCQVJDSEVWUk9OX2JvdHRvbT1hY2Nlc3Nvcj1yYy5ib3R0b20KLU5NUkVCQVJDSEVWUk9OX2xQYXJhbU5NPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1SRUJBUkNISUxEU0laRT0KLU5NUkVCQVJDSElMRFNJWkVfdUJhbmQ9Ci1OTVJFQkFSQ0hJTERTSVpFX3dJRD0KLU5NUkVCQVJDSElMRFNJWkVfcmNDaGlsZF9sZWZ0PWFjY2Vzc29yPXJjQ2hpbGQubGVmdAotTk1SRUJBUkNISUxEU0laRV9yY0NoaWxkX3RvcD1hY2Nlc3Nvcj1yY0NoaWxkLnRvcAotTk1SRUJBUkNISUxEU0laRV9yY0NoaWxkX3JpZ2h0PWFjY2Vzc29yPXJjQ2hpbGQucmlnaHQKLU5NUkVCQVJDSElMRFNJWkVfcmNDaGlsZF9ib3R0b209YWNjZXNzb3I9cmNDaGlsZC5ib3R0b20KLU5NUkVCQVJDSElMRFNJWkVfcmNCYW5kX2xlZnQ9YWNjZXNzb3I9cmNCYW5kLmxlZnQKLU5NUkVCQVJDSElMRFNJWkVfcmNCYW5kX3RvcD1hY2Nlc3Nvcj1yY0JhbmQudG9wCi1OTVJFQkFSQ0hJTERTSVpFX3JjQmFuZF9yaWdodD1hY2Nlc3Nvcj1yY0JhbmQucmlnaHQKLU5NUkVCQVJDSElMRFNJWkVfcmNCYW5kX2JvdHRvbT1hY2Nlc3Nvcj1yY0JhbmQuYm90dG9tCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVJHSU5GTz0KLU5NUkdJTkZPX3g9YWNjZXNzb3I9cHRBY3Rpb24ueAotTk1SR0lORk9feT1hY2Nlc3Nvcj1wdEFjdGlvbi55Ci1OTVJHSU5GT19kd0l0ZW1TcGVjPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UQkhPVElURU09Ci1OTVRCSE9USVRFTV9pZE9sZD0KLU5NVEJIT1RJVEVNX2lkTmV3PQotTk1UQkhPVElURU1fZHdGbGFncz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVE9PTEJBUj0KLU5NVE9PTEJBUl9pSXRlbT0KLU5NVE9PTEJBUl9pQml0bWFwPWFjY2Vzc29yPXRiQnV0dG9uLmlCaXRtYXAKLU5NVE9PTEJBUl9pZENvbW1hbmQ9YWNjZXNzb3I9dGJCdXR0b24uaWRDb21tYW5kCi1OTVRPT0xCQVJfZnNTdGF0ZT1hY2Nlc3Nvcj10YkJ1dHRvbi5mc1N0YXRlCi1OTVRPT0xCQVJfZnNTdHlsZT1hY2Nlc3Nvcj10YkJ1dHRvbi5mc1N0eWxlCi1OTVRPT0xCQVJfZHdEYXRhPWFjY2Vzc29yPXRiQnV0dG9uLmR3RGF0YQotTk1UT09MQkFSX2lTdHJpbmc9YWNjZXNzb3I9dGJCdXR0b24uaVN0cmluZwotTk1UT09MQkFSX2NjaFRleHQ9Ci1OTVRPT0xCQVJfcHN6VGV4dD1jYXN0PShMUFRTVFIpCi1OTVRPT0xCQVJfbGVmdD1hY2Nlc3Nvcj1yY0J1dHRvbi5sZWZ0LGZsYWdzPW5vX3dpbmNlCi1OTVRPT0xCQVJfdG9wPWFjY2Vzc29yPXJjQnV0dG9uLnRvcCxmbGFncz1ub193aW5jZQotTk1UT09MQkFSX3JpZ2h0PWFjY2Vzc29yPXJjQnV0dG9uLnJpZ2h0LGZsYWdzPW5vX3dpbmNlCi1OTVRPT0xCQVJfYm90dG9tPWFjY2Vzc29yPXJjQnV0dG9uLmJvdHRvbSxmbGFncz1ub193aW5jZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPPQotTk1UVERJU1BJTkZPX2xwc3pUZXh0PWNhc3Q9KHZvaWQgKikKLU5NVFRESVNQSU5GT19oaW5zdD1jYXN0PShISU5TVEFOQ0UpCi1OTVRURElTUElORk9fdUZsYWdzPQotTk1UVERJU1BJTkZPX2xQYXJhbT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFRESVNQSU5GT0E9Ci1OTVRURElTUElORk9BX3N6VGV4dD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFRESVNQSU5GT1c9Ci1OTVRURElTUElORk9XX3N6VGV4dD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZDVVNUT01EUkFXPQotTk1UVkNVU1RPTURSQVdfY2xyVGV4dD0KLU5NVFZDVVNUT01EUkFXX2NsclRleHRCaz0KLU5NVFZDVVNUT01EUkFXX2lMZXZlbD1mbGFncz1ub193aW5jZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkRJU1BJTkZPPQotTk1UVkRJU1BJTkZPX21hc2s9YWNjZXNzb3I9aXRlbS5tYXNrCi1OTVRWRElTUElORk9faEl0ZW09YWNjZXNzb3I9aXRlbS5oSXRlbSxjYXN0PUhUUkVFSVRFTQotTk1UVkRJU1BJTkZPX3N0YXRlPWFjY2Vzc29yPWl0ZW0uc3RhdGUKLU5NVFZESVNQSU5GT19zdGF0ZU1hc2s9YWNjZXNzb3I9aXRlbS5zdGF0ZU1hc2sKLU5NVFZESVNQSU5GT19wc3pUZXh0PWFjY2Vzc29yPWl0ZW0ucHN6VGV4dCxjYXN0PUxQVFNUUgotTk1UVkRJU1BJTkZPX2NjaFRleHRNYXg9YWNjZXNzb3I9aXRlbS5jY2hUZXh0TWF4Ci1OTVRWRElTUElORk9faUltYWdlPWFjY2Vzc29yPWl0ZW0uaUltYWdlCi1OTVRWRElTUElORk9faVNlbGVjdGVkSW1hZ2U9YWNjZXNzb3I9aXRlbS5pU2VsZWN0ZWRJbWFnZQotTk1UVkRJU1BJTkZPX2NDaGlsZHJlbj1hY2Nlc3Nvcj1pdGVtLmNDaGlsZHJlbgotTk1UVkRJU1BJTkZPX2xQYXJhbT1hY2Nlc3Nvcj1pdGVtLmxQYXJhbQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1VUERPV049Ci1OTVVQRE9XTl9pUG9zPQotTk1VUERPV05faURlbHRhPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk9OQ0xJRU5UTUVUUklDUz0KLU5PTkNMSUVOVE1FVFJJQ1NfY2JTaXplPQotTk9OQ0xJRU5UTUVUUklDU19pQm9yZGVyV2lkdGg9Ci1OT05DTElFTlRNRVRSSUNTX2lTY3JvbGxXaWR0aD0KLU5PTkNMSUVOVE1FVFJJQ1NfaVNjcm9sbEhlaWdodD0KLU5PTkNMSUVOVE1FVFJJQ1NfaUNhcHRpb25XaWR0aD0KLU5PTkNMSUVOVE1FVFJJQ1NfaUNhcHRpb25IZWlnaHQ9Ci1OT05DTElFTlRNRVRSSUNTX2lTbUNhcHRpb25XaWR0aD0KLU5PTkNMSUVOVE1FVFJJQ1NfaVNtQ2FwdGlvbkhlaWdodD0KLU5PTkNMSUVOVE1FVFJJQ1NfaU1lbnVXaWR0aD0KLU5PTkNMSUVOVE1FVFJJQ1NfaU1lbnVIZWlnaHQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OT05DTElFTlRNRVRSSUNTQT0KLU5PTkNMSUVOVE1FVFJJQ1NBX2xmQ2FwdGlvbkZvbnQ9Ci1OT05DTElFTlRNRVRSSUNTQV9sZlNtQ2FwdGlvbkZvbnQ9Ci1OT05DTElFTlRNRVRSSUNTQV9sZk1lbnVGb250PQotTk9OQ0xJRU5UTUVUUklDU0FfbGZTdGF0dXNGb250PQotTk9OQ0xJRU5UTUVUUklDU0FfbGZNZXNzYWdlRm9udD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05PTkNMSUVOVE1FVFJJQ1NXPQotTk9OQ0xJRU5UTUVUUklDU1dfbGZDYXB0aW9uRm9udD0KLU5PTkNMSUVOVE1FVFJJQ1NXX2xmU21DYXB0aW9uRm9udD0KLU5PTkNMSUVOVE1FVFJJQ1NXX2xmTWVudUZvbnQ9Ci1OT05DTElFTlRNRVRSSUNTV19sZlN0YXR1c0ZvbnQ9Ci1OT05DTElFTlRNRVRSSUNTV19sZk1lc3NhZ2VGb250PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk9USUZZSUNPTkRBVEE9Ci1OT1RJRllJQ09OREFUQV9jYlNpemU9Ci1OT1RJRllJQ09OREFUQV9oV25kPWNhc3Q9KEhXTkQpCi1OT1RJRllJQ09OREFUQV91SUQ9Ci1OT1RJRllJQ09OREFUQV91RmxhZ3M9Ci1OT1RJRllJQ09OREFUQV91Q2FsbGJhY2tNZXNzYWdlPQotTk9USUZZSUNPTkRBVEFfaEljb249Y2FzdD0oSElDT04pCi1OT1RJRllJQ09OREFUQV9kd1N0YXRlPWZsYWdzPW5vX3dpbmNlCi1OT1RJRllJQ09OREFUQV9kd1N0YXRlTWFzaz1mbGFncz1ub193aW5jZQotTk9USUZZSUNPTkRBVEFfdVZlcnNpb249ZmxhZ3M9bm9fd2luY2UKLU5PVElGWUlDT05EQVRBX2R3SW5mb0ZsYWdzPWZsYWdzPW5vX3dpbmNlCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OT1RJRllJQ09OREFUQUE9Ci1OT1RJRllJQ09OREFUQUFfc3pUaXA9Y2FzdD0oVENIQVIpCi1OT1RJRllJQ09OREFUQUFfc3pJbmZvPWNhc3Q9KFRDSEFSKSxmbGFncz1ub193aW5jZQotTk9USUZZSUNPTkRBVEFBX3N6SW5mb1RpdGxlPWNhc3Q9KFRDSEFSKSxmbGFncz1ub193aW5jZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk9USUZZSUNPTkRBVEFXPQotTk9USUZZSUNPTkRBVEFXX3N6VGlwPWNhc3Q9KFRDSEFSKQotTk9USUZZSUNPTkRBVEFXX3N6SW5mbz1jYXN0PShUQ0hBUiksZmxhZ3M9bm9fd2luY2UKLU5PVElGWUlDT05EQVRBV19zekluZm9UaXRsZT1jYXN0PShUQ0hBUiksZmxhZ3M9bm9fd2luY2UKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09QRU5GSUxFTkFNRT0KLU9QRU5GSUxFTkFNRV9sU3RydWN0U2l6ZT0KLU9QRU5GSUxFTkFNRV9od25kT3duZXI9Y2FzdD0oSFdORCkKLU9QRU5GSUxFTkFNRV9oSW5zdGFuY2U9Y2FzdD0oSElOU1RBTkNFKQotT1BFTkZJTEVOQU1FX2xwc3RyRmlsdGVyPWNhc3Q9KExQQ1RTVFIpCi1PUEVORklMRU5BTUVfbHBzdHJDdXN0b21GaWx0ZXI9Y2FzdD0oTFBUU1RSKQotT1BFTkZJTEVOQU1FX25NYXhDdXN0RmlsdGVyPQotT1BFTkZJTEVOQU1FX25GaWx0ZXJJbmRleD0KLU9QRU5GSUxFTkFNRV9scHN0ckZpbGU9Y2FzdD0oTFBUU1RSKQotT1BFTkZJTEVOQU1FX25NYXhGaWxlPQotT1BFTkZJTEVOQU1FX2xwc3RyRmlsZVRpdGxlPWNhc3Q9KExQVFNUUikKLU9QRU5GSUxFTkFNRV9uTWF4RmlsZVRpdGxlPQotT1BFTkZJTEVOQU1FX2xwc3RySW5pdGlhbERpcj1jYXN0PShMUENUU1RSKQotT1BFTkZJTEVOQU1FX2xwc3RyVGl0bGU9Y2FzdD0oTFBDVFNUUikKLU9QRU5GSUxFTkFNRV9GbGFncz0KLU9QRU5GSUxFTkFNRV9uRmlsZU9mZnNldD0KLU9QRU5GSUxFTkFNRV9uRmlsZUV4dGVuc2lvbj0KLU9QRU5GSUxFTkFNRV9scHN0ckRlZkV4dD1jYXN0PShMUENUU1RSKQotT1BFTkZJTEVOQU1FX2xDdXN0RGF0YT0KLU9QRU5GSUxFTkFNRV9scGZuSG9vaz1jYXN0PShMUE9GTkhPT0tQUk9DKQotT1BFTkZJTEVOQU1FX2xwVGVtcGxhdGVOYW1lPWNhc3Q9KExQQ1RTVFIpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9PUz0KLU9TX0Fib3J0RG9jPQotT1NfQWJvcnREb2NfMD1jYXN0PShIREMpCi0KLU9TX0FjdGl2YXRlS2V5Ym9hcmRMYXlvdXQ9Ci1PU19BY3RpdmF0ZUtleWJvYXJkTGF5b3V0XzA9Y2FzdD0oSEtMKQotT1NfQWN0aXZhdGVLZXlib2FyZExheW91dF8xPQotCi1PU19BZGp1c3RXaW5kb3dSZWN0RXg9Ci1PU19BZGp1c3RXaW5kb3dSZWN0RXhfMD0KLU9TX0FkanVzdFdpbmRvd1JlY3RFeF8xPQotT1NfQWRqdXN0V2luZG93UmVjdEV4XzI9Ci1PU19BZGp1c3RXaW5kb3dSZWN0RXhfMz0KLQotT1NfQWxwaGFCbGVuZD1mbGFncz1keW5hbWljCi1PU19BbHBoYUJsZW5kXzA9Ci1PU19BbHBoYUJsZW5kXzE9Ci1PU19BbHBoYUJsZW5kXzI9Ci1PU19BbHBoYUJsZW5kXzM9Ci1PU19BbHBoYUJsZW5kXzQ9Ci1PU19BbHBoYUJsZW5kXzU9Ci1PU19BbHBoYUJsZW5kXzY9Ci1PU19BbHBoYUJsZW5kXzc9Ci1PU19BbHBoYUJsZW5kXzg9Ci1PU19BbHBoYUJsZW5kXzk9Ci1PU19BbHBoYUJsZW5kXzEwPWZsYWdzPXN0cnVjdAotCi1PU19BcmM9Ci1PU19BcmNfMD1jYXN0PShIREMpCi1PU19BcmNfMT0KLU9TX0FyY18yPQotT1NfQXJjXzM9Ci1PU19BcmNfND0KLU9TX0FyY181PQotT1NfQXJjXzY9Ci1PU19BcmNfNz0KLU9TX0FyY184PQotCi1PU19CZWdpbkRlZmVyV2luZG93UG9zPQotT1NfQmVnaW5EZWZlcldpbmRvd1Bvc18wPQotCi1PU19CZWdpblBhaW50PQotT1NfQmVnaW5QYWludF8wPWNhc3Q9KEhXTkQpCi1PU19CZWdpblBhaW50XzE9Ci0KLU9TX0JlZ2luUGF0aD0KLU9TX0JlZ2luUGF0aF8wPWNhc3Q9KEhEQykKLQotT1NfQml0Qmx0PQotT1NfQml0Qmx0XzA9Y2FzdD0oSERDKQotT1NfQml0Qmx0XzE9Ci1PU19CaXRCbHRfMj0KLU9TX0JpdEJsdF8zPQotT1NfQml0Qmx0XzQ9Ci1PU19CaXRCbHRfNT1jYXN0PShIREMpCi1PU19CaXRCbHRfNj0KLU9TX0JpdEJsdF83PQotT1NfQml0Qmx0Xzg9Ci0KLU9TX0JyaW5nV2luZG93VG9Ub3A9Ci1PU19CcmluZ1dpbmRvd1RvVG9wXzA9Y2FzdD0oSFdORCkKLQotT1NfQ2FsbD0KLU9TX0NhbGxfMD1jYXN0PShETExHRVRWRVJTSU9OUFJPQykKLU9TX0NhbGxfMT0KLQotT1NfQ2FsbE5leHRIb29rRXg9Ci1PU19DYWxsTmV4dEhvb2tFeF8wPWNhc3Q9KEhIT09LKQotT1NfQ2FsbE5leHRIb29rRXhfMT0KLU9TX0NhbGxOZXh0SG9va0V4XzI9Y2FzdD0oV1BBUkFNKQotT1NfQ2FsbE5leHRIb29rRXhfMz1jYXN0PShMUEFSQU0pCi0KLU9TX0NhbGxXaW5kb3dQcm9jQT0KLU9TX0NhbGxXaW5kb3dQcm9jQV8wPWNhc3Q9KFdORFBST0MpCi1PU19DYWxsV2luZG93UHJvY0FfMT1jYXN0PShIV05EKQotT1NfQ2FsbFdpbmRvd1Byb2NBXzI9Ci1PU19DYWxsV2luZG93UHJvY0FfMz0KLU9TX0NhbGxXaW5kb3dQcm9jQV80PQotCi1PU19DYWxsV2luZG93UHJvY1c9Ci1PU19DYWxsV2luZG93UHJvY1dfMD1jYXN0PShXTkRQUk9DKQotT1NfQ2FsbFdpbmRvd1Byb2NXXzE9Y2FzdD0oSFdORCkKLU9TX0NhbGxXaW5kb3dQcm9jV18yPQotT1NfQ2FsbFdpbmRvd1Byb2NXXzM9Ci1PU19DYWxsV2luZG93UHJvY1dfND0KLQotT1NfQ2hhckxvd2VyQT0KLU9TX0NoYXJMb3dlckFfMD1jYXN0PShMUFNUUikKLQotT1NfQ2hhckxvd2VyVz0KLU9TX0NoYXJMb3dlcldfMD1jYXN0PShMUFdTVFIpCi0KLU9TX0NoYXJVcHBlckE9Ci1PU19DaGFyVXBwZXJBXzA9Y2FzdD0oTFBTVFIpCi0KLU9TX0NoYXJVcHBlclc9Ci1PU19DaGFyVXBwZXJXXzA9Y2FzdD0oTFBXU1RSKQotCi1PU19DaGVja01lbnVJdGVtPQotT1NfQ2hlY2tNZW51SXRlbV8wPWNhc3Q9KEhNRU5VKQotT1NfQ2hlY2tNZW51SXRlbV8xPWNhc3Q9KFVJTlQpCi1PU19DaGVja01lbnVJdGVtXzI9Y2FzdD0oVUlOVCkKLQotT1NfQ2hvb3NlQ29sb3JBPQotT1NfQ2hvb3NlQ29sb3JBXzA9Ci0KLU9TX0Nob29zZUNvbG9yVz0KLU9TX0Nob29zZUNvbG9yV18wPWNhc3Q9KExQQ0hPT1NFQ09MT1JXKQotCi1PU19DaG9vc2VGb250QT0KLU9TX0Nob29zZUZvbnRBXzA9Ci0KLU9TX0Nob29zZUZvbnRXPQotT1NfQ2hvb3NlRm9udFdfMD1jYXN0PShMUENIT09TRUZPTlRXKQotCi1PU19DbGllbnRUb1NjcmVlbj0KLU9TX0NsaWVudFRvU2NyZWVuXzA9Y2FzdD0oSFdORCkKLU9TX0NsaWVudFRvU2NyZWVuXzE9Ci0KLU9TX0Nsb3NlQ2xpcGJvYXJkPQotCi1PU19DbG9zZVRoZW1lRGF0YT1mbGFncz1keW5hbWljCi1PU19DbG9zZVRoZW1lRGF0YV8wPWNhc3Q9SFRIRU1FCi0KLU9TX0NvQ3JlYXRlSW5zdGFuY2U9Ci1PU19Db0NyZWF0ZUluc3RhbmNlXzA9Y2FzdD1SRUZDTFNJRAotT1NfQ29DcmVhdGVJbnN0YW5jZV8xPWNhc3Q9TFBVTktOT1dOCi1PU19Db0NyZWF0ZUluc3RhbmNlXzI9Ci1PU19Db0NyZWF0ZUluc3RhbmNlXzM9Y2FzdD1SRUZJSUQKLU9TX0NvQ3JlYXRlSW5zdGFuY2VfND1jYXN0PUxQVk9JRCAqCi0KLU9TX0NvbWJpbmVSZ249Ci1PU19Db21iaW5lUmduXzA9Y2FzdD0oSFJHTikKLU9TX0NvbWJpbmVSZ25fMT1jYXN0PShIUkdOKQotT1NfQ29tYmluZVJnbl8yPWNhc3Q9KEhSR04pCi1PU19Db21iaW5lUmduXzM9Ci0KLU9TX0NvbW1EbGdFeHRlbmRlZEVycm9yPQotCi1PU19Db21tYW5kQmFyX0FkZEFkb3JubWVudHM9Ci1PU19Db21tYW5kQmFyX0FkZEFkb3JubWVudHNfMD1jYXN0PShIV05EKQotT1NfQ29tbWFuZEJhcl9BZGRBZG9ybm1lbnRzXzE9Ci1PU19Db21tYW5kQmFyX0FkZEFkb3JubWVudHNfMj0KLQotT1NfQ29tbWFuZEJhcl9DcmVhdGU9Ci1PU19Db21tYW5kQmFyX0NyZWF0ZV8wPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0NvbW1hbmRCYXJfQ3JlYXRlXzE9Y2FzdD0oSFdORCkKLU9TX0NvbW1hbmRCYXJfQ3JlYXRlXzI9Ci0KLU9TX0NvbW1hbmRCYXJfRGVzdHJveT0KLU9TX0NvbW1hbmRCYXJfRGVzdHJveV8wPWNhc3Q9KEhXTkQpCi0KLU9TX0NvbW1hbmRCYXJfRHJhd01lbnVCYXI9Ci1PU19Db21tYW5kQmFyX0RyYXdNZW51QmFyXzA9Y2FzdD0oSFdORCkKLU9TX0NvbW1hbmRCYXJfRHJhd01lbnVCYXJfMT1jYXN0PShXT1JEKQotCi1PU19Db21tYW5kQmFyX0hlaWdodD0KLU9TX0NvbW1hbmRCYXJfSGVpZ2h0XzA9Y2FzdD0oSFdORCkKLQotT1NfQ29tbWFuZEJhcl9JbnNlcnRNZW51YmFyRXg9Ci1PU19Db21tYW5kQmFyX0luc2VydE1lbnViYXJFeF8wPWNhc3Q9KEhXTkQpCi1PU19Db21tYW5kQmFyX0luc2VydE1lbnViYXJFeF8xPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0NvbW1hbmRCYXJfSW5zZXJ0TWVudWJhckV4XzI9Y2FzdD0oTFBUU1RSKQotT1NfQ29tbWFuZEJhcl9JbnNlcnRNZW51YmFyRXhfMz1jYXN0PShXT1JEKQotCi1PU19Db21tYW5kQmFyX1Nob3c9Ci1PU19Db21tYW5kQmFyX1Nob3dfMD1jYXN0PShIV05EKQotT1NfQ29tbWFuZEJhcl9TaG93XzE9Y2FzdD0oQk9PTCkKLQotT1NfQ29weUltYWdlPQotT1NfQ29weUltYWdlXzA9Y2FzdD0oSEFORExFKQotT1NfQ29weUltYWdlXzE9Ci1PU19Db3B5SW1hZ2VfMj0KLU9TX0NvcHlJbWFnZV8zPQotT1NfQ29weUltYWdlXzQ9Ci0KLU9TX0NyZWF0ZUFjY2VsZXJhdG9yVGFibGVBPQotT1NfQ3JlYXRlQWNjZWxlcmF0b3JUYWJsZUFfMD1jYXN0PShMUEFDQ0VMKQotT1NfQ3JlYXRlQWNjZWxlcmF0b3JUYWJsZUFfMT0KLQotT1NfQ3JlYXRlQWNjZWxlcmF0b3JUYWJsZVc9Ci1PU19DcmVhdGVBY2NlbGVyYXRvclRhYmxlV18wPWNhc3Q9KExQQUNDRUwpCi1PU19DcmVhdGVBY2NlbGVyYXRvclRhYmxlV18xPQotCi1PU19DcmVhdGVCaXRtYXA9Ci1PU19DcmVhdGVCaXRtYXBfMD0KLU9TX0NyZWF0ZUJpdG1hcF8xPQotT1NfQ3JlYXRlQml0bWFwXzI9Ci1PU19DcmVhdGVCaXRtYXBfMz0KLU9TX0NyZWF0ZUJpdG1hcF80PWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi0KLU9TX0NyZWF0ZUNhcmV0PQotT1NfQ3JlYXRlQ2FyZXRfMD1jYXN0PShIV05EKQotT1NfQ3JlYXRlQ2FyZXRfMT1jYXN0PShIQklUTUFQKQotT1NfQ3JlYXRlQ2FyZXRfMj0KLU9TX0NyZWF0ZUNhcmV0XzM9Ci0KLU9TX0NyZWF0ZUNvbXBhdGlibGVCaXRtYXA9Ci1PU19DcmVhdGVDb21wYXRpYmxlQml0bWFwXzA9Y2FzdD0oSERDKQotT1NfQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcF8xPQotT1NfQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcF8yPQotCi1PU19DcmVhdGVDb21wYXRpYmxlREM9Ci1PU19DcmVhdGVDb21wYXRpYmxlRENfMD1jYXN0PShIREMpCi0KLU9TX0NyZWF0ZUN1cnNvcj0KLU9TX0NyZWF0ZUN1cnNvcl8wPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0NyZWF0ZUN1cnNvcl8xPQotT1NfQ3JlYXRlQ3Vyc29yXzI9Ci1PU19DcmVhdGVDdXJzb3JfMz0KLU9TX0NyZWF0ZUN1cnNvcl80PQotT1NfQ3JlYXRlQ3Vyc29yXzU9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX0NyZWF0ZUN1cnNvcl82PWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi0KLU9TX0NyZWF0ZURDQT0KLU9TX0NyZWF0ZURDQV8wPWNhc3Q9KExQU1RSKQotT1NfQ3JlYXRlRENBXzE9Y2FzdD0oTFBTVFIpCi1PU19DcmVhdGVEQ0FfMj1jYXN0PShMUFNUUikKLU9TX0NyZWF0ZURDQV8zPWNhc3Q9KENPTlNUIERFVk1PREUgKikKLQotT1NfQ3JlYXRlRENXPQotT1NfQ3JlYXRlRENXXzA9Y2FzdD0oTFBXU1RSKQotT1NfQ3JlYXRlRENXXzE9Y2FzdD0oTFBXU1RSKQotT1NfQ3JlYXRlRENXXzI9Y2FzdD0oTFBXU1RSKQotT1NfQ3JlYXRlRENXXzM9Y2FzdD0oQ09OU1QgREVWTU9ERVcgKikKLQotT1NfQ3JlYXRlRElCU2VjdGlvbj0KLU9TX0NyZWF0ZURJQlNlY3Rpb25fMD1jYXN0PShIREMpCi1PU19DcmVhdGVESUJTZWN0aW9uXzE9Y2FzdD0oQklUTUFQSU5GTyAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX0NyZWF0ZURJQlNlY3Rpb25fMj0KLU9TX0NyZWF0ZURJQlNlY3Rpb25fMz1jYXN0PShWT0lEICoqKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfQ3JlYXRlRElCU2VjdGlvbl80PWNhc3Q9KEhBTkRMRSkKLU9TX0NyZWF0ZURJQlNlY3Rpb25fNT0KLQotT1NfQ3JlYXRlRm9udEluZGlyZWN0QV9fST0KLU9TX0NyZWF0ZUZvbnRJbmRpcmVjdEFfX0lfMD1jYXN0PShMUExPR0ZPTlRBKQotCi1PU19DcmVhdGVGb250SW5kaXJlY3RBX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRBXzI9Ci1PU19DcmVhdGVGb250SW5kaXJlY3RBX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRBXzJfMD1mbGFncz1ub19vdXQKLQotT1NfQ3JlYXRlRm9udEluZGlyZWN0V19fST0KLU9TX0NyZWF0ZUZvbnRJbmRpcmVjdFdfX0lfMD1jYXN0PShMUExPR0ZPTlRXKQotCi1PU19DcmVhdGVGb250SW5kaXJlY3RXX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRXXzI9Ci1PU19DcmVhdGVGb250SW5kaXJlY3RXX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRXXzJfMD1mbGFncz1ub19vdXQKLQotT1NfQ3JlYXRlSWNvbkluZGlyZWN0PQotT1NfQ3JlYXRlSWNvbkluZGlyZWN0XzA9ZmxhZ3M9bm9fb3V0Ci0KLU9TX0NyZWF0ZU1lbnU9Ci0KLU9TX0NyZWF0ZVBhbGV0dGU9Ci1PU19DcmVhdGVQYWxldHRlXzA9Y2FzdD0oTE9HUEFMRVRURSAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLQotT1NfQ3JlYXRlUGF0dGVybkJydXNoPQotT1NfQ3JlYXRlUGF0dGVybkJydXNoXzA9Y2FzdD0oSEJJVE1BUCkKLQotT1NfQ3JlYXRlUGVuPQotT1NfQ3JlYXRlUGVuXzA9Ci1PU19DcmVhdGVQZW5fMT0KLU9TX0NyZWF0ZVBlbl8yPWNhc3Q9KENPTE9SUkVGKQotCi1PU19DcmVhdGVQb2x5Z29uUmduPQotT1NfQ3JlYXRlUG9seWdvblJnbl8wPWNhc3Q9KENPTlNUIFBPSU5UICopCi1PU19DcmVhdGVQb2x5Z29uUmduXzE9Ci1PU19DcmVhdGVQb2x5Z29uUmduXzI9Ci0KLU9TX0NyZWF0ZVBvcHVwTWVudT0KLQotT1NfQ3JlYXRlUmVjdFJnbj0KLU9TX0NyZWF0ZVJlY3RSZ25fMD0KLU9TX0NyZWF0ZVJlY3RSZ25fMT0KLU9TX0NyZWF0ZVJlY3RSZ25fMj0KLU9TX0NyZWF0ZVJlY3RSZ25fMz0KLQotT1NfQ3JlYXRlU29saWRCcnVzaD0KLU9TX0NyZWF0ZVNvbGlkQnJ1c2hfMD1jYXN0PShDT0xPUlJFRikKLQotT1NfQ3JlYXRlU3RyZWFtT25IR2xvYmFsPQotT1NfQ3JlYXRlU3RyZWFtT25IR2xvYmFsXzA9Y2FzdD1IR0xPQkFMCi1PU19DcmVhdGVTdHJlYW1PbkhHbG9iYWxfMT1jYXN0PUJPT0wKLU9TX0NyZWF0ZVN0cmVhbU9uSEdsb2JhbF8yPWNhc3Q9TFBTVFJFQU0gKgotCi1PU19DcmVhdGVXaW5kb3dFeEE9Ci1PU19DcmVhdGVXaW5kb3dFeEFfMD0KLU9TX0NyZWF0ZVdpbmRvd0V4QV8xPWNhc3Q9KExQU1RSKQotT1NfQ3JlYXRlV2luZG93RXhBXzI9Ci1PU19DcmVhdGVXaW5kb3dFeEFfMz0KLU9TX0NyZWF0ZVdpbmRvd0V4QV80PQotT1NfQ3JlYXRlV2luZG93RXhBXzU9Ci1PU19DcmVhdGVXaW5kb3dFeEFfNj0KLU9TX0NyZWF0ZVdpbmRvd0V4QV83PQotT1NfQ3JlYXRlV2luZG93RXhBXzg9Y2FzdD0oSFdORCkKLU9TX0NyZWF0ZVdpbmRvd0V4QV85PWNhc3Q9KEhNRU5VKQotT1NfQ3JlYXRlV2luZG93RXhBXzEwPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0NyZWF0ZVdpbmRvd0V4QV8xMT0KLQotT1NfQ3JlYXRlV2luZG93RXhXPQotT1NfQ3JlYXRlV2luZG93RXhXXzA9Ci1PU19DcmVhdGVXaW5kb3dFeFdfMT1jYXN0PShMUFdTVFIpCi1PU19DcmVhdGVXaW5kb3dFeFdfMj1jYXN0PShMUFdTVFIpCi1PU19DcmVhdGVXaW5kb3dFeFdfMz0KLU9TX0NyZWF0ZVdpbmRvd0V4V180PQotT1NfQ3JlYXRlV2luZG93RXhXXzU9Ci1PU19DcmVhdGVXaW5kb3dFeFdfNj0KLU9TX0NyZWF0ZVdpbmRvd0V4V183PQotT1NfQ3JlYXRlV2luZG93RXhXXzg9Y2FzdD0oSFdORCkKLU9TX0NyZWF0ZVdpbmRvd0V4V185PWNhc3Q9KEhNRU5VKQotT1NfQ3JlYXRlV2luZG93RXhXXzEwPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0NyZWF0ZVdpbmRvd0V4V18xMT0KLQotT1NfRGVmRnJhbWVQcm9jQT0KLU9TX0RlZkZyYW1lUHJvY0FfMD1jYXN0PShIV05EKQotT1NfRGVmRnJhbWVQcm9jQV8xPWNhc3Q9KEhXTkQpCi1PU19EZWZGcmFtZVByb2NBXzI9Ci1PU19EZWZGcmFtZVByb2NBXzM9Y2FzdD0oV1BBUkFNKQotT1NfRGVmRnJhbWVQcm9jQV80PWNhc3Q9KExQQVJBTSkKLQotT1NfRGVmRnJhbWVQcm9jVz0KLU9TX0RlZkZyYW1lUHJvY1dfMD1jYXN0PShIV05EKQotT1NfRGVmRnJhbWVQcm9jV18xPWNhc3Q9KEhXTkQpCi1PU19EZWZGcmFtZVByb2NXXzI9Ci1PU19EZWZGcmFtZVByb2NXXzM9Y2FzdD0oV1BBUkFNKQotT1NfRGVmRnJhbWVQcm9jV180PWNhc3Q9KExQQVJBTSkKLQotT1NfRGVmTURJQ2hpbGRQcm9jQT0KLU9TX0RlZk1ESUNoaWxkUHJvY0FfMD1jYXN0PShIV05EKQotT1NfRGVmTURJQ2hpbGRQcm9jQV8xPQotT1NfRGVmTURJQ2hpbGRQcm9jQV8yPWNhc3Q9KFdQQVJBTSkKLU9TX0RlZk1ESUNoaWxkUHJvY0FfMz1jYXN0PShMUEFSQU0pCi0KLU9TX0RlZk1ESUNoaWxkUHJvY1c9Ci1PU19EZWZNRElDaGlsZFByb2NXXzA9Y2FzdD0oSFdORCkKLU9TX0RlZk1ESUNoaWxkUHJvY1dfMT0KLU9TX0RlZk1ESUNoaWxkUHJvY1dfMj1jYXN0PShXUEFSQU0pCi1PU19EZWZNRElDaGlsZFByb2NXXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19EZWZXaW5kb3dQcm9jQT0KLU9TX0RlZldpbmRvd1Byb2NBXzA9Y2FzdD0oSFdORCkKLU9TX0RlZldpbmRvd1Byb2NBXzE9Ci1PU19EZWZXaW5kb3dQcm9jQV8yPWNhc3Q9KFdQQVJBTSkKLU9TX0RlZldpbmRvd1Byb2NBXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19EZWZXaW5kb3dQcm9jVz0KLU9TX0RlZldpbmRvd1Byb2NXXzA9Y2FzdD0oSFdORCkKLU9TX0RlZldpbmRvd1Byb2NXXzE9Ci1PU19EZWZXaW5kb3dQcm9jV18yPWNhc3Q9KFdQQVJBTSkKLU9TX0RlZldpbmRvd1Byb2NXXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19EZWZlcldpbmRvd1Bvcz0KLU9TX0RlZmVyV2luZG93UG9zXzA9Y2FzdD0oSERXUCkKLU9TX0RlZmVyV2luZG93UG9zXzE9Y2FzdD0oSFdORCkKLU9TX0RlZmVyV2luZG93UG9zXzI9Y2FzdD0oSFdORCkKLU9TX0RlZmVyV2luZG93UG9zXzM9Ci1PU19EZWZlcldpbmRvd1Bvc180PQotT1NfRGVmZXJXaW5kb3dQb3NfNT0KLU9TX0RlZmVyV2luZG93UG9zXzY9Ci1PU19EZWZlcldpbmRvd1Bvc183PQotCi1PU19EZWxldGVEQz0KLU9TX0RlbGV0ZURDXzA9Y2FzdD0oSERDKQotCi1PU19EZWxldGVNZW51PQotT1NfRGVsZXRlTWVudV8wPWNhc3Q9KEhNRU5VKQotT1NfRGVsZXRlTWVudV8xPQotT1NfRGVsZXRlTWVudV8yPQotCi1PU19EZWxldGVPYmplY3Q9Ci1PU19EZWxldGVPYmplY3RfMD1jYXN0PShIR0RJT0JKKQotCi1PU19EZXN0cm95QWNjZWxlcmF0b3JUYWJsZT0KLU9TX0Rlc3Ryb3lBY2NlbGVyYXRvclRhYmxlXzA9Y2FzdD0oSEFDQ0VMKQotCi1PU19EZXN0cm95Q2FyZXQ9Ci0KLU9TX0Rlc3Ryb3lDdXJzb3I9Ci1PU19EZXN0cm95Q3Vyc29yXzA9Y2FzdD0oSENVUlNPUikKLQotT1NfRGVzdHJveUljb249Ci1PU19EZXN0cm95SWNvbl8wPWNhc3Q9KEhJQ09OKQotCi1PU19EZXN0cm95TWVudT0KLU9TX0Rlc3Ryb3lNZW51XzA9Y2FzdD0oSE1FTlUpCi0KLU9TX0Rlc3Ryb3lXaW5kb3c9Ci1PU19EZXN0cm95V2luZG93XzA9Y2FzdD0oSFdORCkKLQotT1NfRGlzcGF0Y2hNZXNzYWdlQT0KLU9TX0Rpc3BhdGNoTWVzc2FnZUFfMD0KLQotT1NfRGlzcGF0Y2hNZXNzYWdlVz0KLU9TX0Rpc3BhdGNoTWVzc2FnZVdfMD0KLQotT1NfRHJhZ0RldGVjdD0KLU9TX0RyYWdEZXRlY3RfMD1jYXN0PShIV05EKQotT1NfRHJhZ0RldGVjdF8xPWZsYWdzPXN0cnVjdAotCi1PU19EcmFnRmluaXNoPQotT1NfRHJhZ0ZpbmlzaF8wPWNhc3Q9KEhEUk9QKQotCi1PU19EcmFnUXVlcnlGaWxlQT0KLU9TX0RyYWdRdWVyeUZpbGVBXzA9Y2FzdD0oSERST1ApCi1PU19EcmFnUXVlcnlGaWxlQV8xPQotT1NfRHJhZ1F1ZXJ5RmlsZUFfMj1jYXN0PShMUFRTVFIpCi1PU19EcmFnUXVlcnlGaWxlQV8zPQotCi1PU19EcmFnUXVlcnlGaWxlVz0KLU9TX0RyYWdRdWVyeUZpbGVXXzA9Y2FzdD0oSERST1ApCi1PU19EcmFnUXVlcnlGaWxlV18xPQotT1NfRHJhZ1F1ZXJ5RmlsZVdfMj1jYXN0PShMUFdTVFIpCi1PU19EcmFnUXVlcnlGaWxlV18zPQotCi1PU19EcmF3RWRnZT0KLU9TX0RyYXdFZGdlXzA9Y2FzdD0oSERDKQotT1NfRHJhd0VkZ2VfMT0KLU9TX0RyYXdFZGdlXzI9Ci1PU19EcmF3RWRnZV8zPQotCi1PU19EcmF3Rm9jdXNSZWN0PQotT1NfRHJhd0ZvY3VzUmVjdF8wPWNhc3Q9KEhEQykKLU9TX0RyYXdGb2N1c1JlY3RfMT0KLQotT1NfRHJhd0ZyYW1lQ29udHJvbD0KLU9TX0RyYXdGcmFtZUNvbnRyb2xfMD1jYXN0PShIREMpCi1PU19EcmF3RnJhbWVDb250cm9sXzE9Ci1PU19EcmF3RnJhbWVDb250cm9sXzI9Ci1PU19EcmF3RnJhbWVDb250cm9sXzM9Ci0KLU9TX0RyYXdJY29uRXg9Ci1PU19EcmF3SWNvbkV4XzA9Y2FzdD0oSERDKQotT1NfRHJhd0ljb25FeF8xPQotT1NfRHJhd0ljb25FeF8yPQotT1NfRHJhd0ljb25FeF8zPWNhc3Q9KEhJQ09OKQotT1NfRHJhd0ljb25FeF80PQotT1NfRHJhd0ljb25FeF81PQotT1NfRHJhd0ljb25FeF82PQotT1NfRHJhd0ljb25FeF83PWNhc3Q9KEhCUlVTSCkKLU9TX0RyYXdJY29uRXhfOD0KLQotT1NfRHJhd01lbnVCYXI9Ci1PU19EcmF3TWVudUJhcl8wPWNhc3Q9KEhXTkQpCi0KLU9TX0RyYXdTdGF0ZUE9Ci1PU19EcmF3U3RhdGVBXzA9Y2FzdD0oSERDKQotT1NfRHJhd1N0YXRlQV8xPWNhc3Q9KEhCUlVTSCkKLU9TX0RyYXdTdGF0ZUFfMj1jYXN0PShEUkFXU1RBVEVQUk9DKQotT1NfRHJhd1N0YXRlQV8zPWNhc3Q9KExQQVJBTSkKLU9TX0RyYXdTdGF0ZUFfND1jYXN0PShXUEFSQU0pCi1PU19EcmF3U3RhdGVBXzU9Ci1PU19EcmF3U3RhdGVBXzY9Ci1PU19EcmF3U3RhdGVBXzc9Ci1PU19EcmF3U3RhdGVBXzg9Ci1PU19EcmF3U3RhdGVBXzk9Ci0KLU9TX0RyYXdTdGF0ZVc9Ci1PU19EcmF3U3RhdGVXXzA9Y2FzdD0oSERDKQotT1NfRHJhd1N0YXRlV18xPWNhc3Q9KEhCUlVTSCkKLU9TX0RyYXdTdGF0ZVdfMj1jYXN0PShEUkFXU1RBVEVQUk9DKQotT1NfRHJhd1N0YXRlV18zPWNhc3Q9KExQQVJBTSkKLU9TX0RyYXdTdGF0ZVdfND1jYXN0PShXUEFSQU0pCi1PU19EcmF3U3RhdGVXXzU9Ci1PU19EcmF3U3RhdGVXXzY9Ci1PU19EcmF3U3RhdGVXXzc9Ci1PU19EcmF3U3RhdGVXXzg9Ci1PU19EcmF3U3RhdGVXXzk9Ci0KLU9TX0RyYXdUZXh0QT0KLU9TX0RyYXdUZXh0QV8wPWNhc3Q9KEhEQykKLU9TX0RyYXdUZXh0QV8xPWNhc3Q9KExQU1RSKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX0RyYXdUZXh0QV8yPQotT1NfRHJhd1RleHRBXzM9Ci1PU19EcmF3VGV4dEFfND0KLQotT1NfRHJhd1RleHRXPQotT1NfRHJhd1RleHRXXzA9Y2FzdD0oSERDKQotT1NfRHJhd1RleHRXXzE9Y2FzdD0oTFBXU1RSKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX0RyYXdUZXh0V18yPQotT1NfRHJhd1RleHRXXzM9Ci1PU19EcmF3VGV4dFdfND0KLQotT1NfRHJhd1RoZW1lQmFja2dyb3VuZD1mbGFncz1keW5hbWljCi1PU19EcmF3VGhlbWVCYWNrZ3JvdW5kXzA9Y2FzdD1IVEhFTUUKLU9TX0RyYXdUaGVtZUJhY2tncm91bmRfMT1jYXN0PUhEQwotT1NfRHJhd1RoZW1lQmFja2dyb3VuZF8yPQotT1NfRHJhd1RoZW1lQmFja2dyb3VuZF8zPQotT1NfRHJhd1RoZW1lQmFja2dyb3VuZF80PWNhc3Q9Y29uc3QgUkVDVCAqCi1PU19EcmF3VGhlbWVCYWNrZ3JvdW5kXzU9Y2FzdD1jb25zdCBSRUNUICoKLQotT1NfRWxsaXBzZT0KLU9TX0VsbGlwc2VfMD1jYXN0PShIREMpCi1PU19FbGxpcHNlXzE9Ci1PU19FbGxpcHNlXzI9Ci1PU19FbGxpcHNlXzM9Ci1PU19FbGxpcHNlXzQ9Ci0KLU9TX0VuYWJsZU1lbnVJdGVtPQotT1NfRW5hYmxlTWVudUl0ZW1fMD1jYXN0PShITUVOVSkKLU9TX0VuYWJsZU1lbnVJdGVtXzE9Ci1PU19FbmFibGVNZW51SXRlbV8yPQotCi1PU19FbmFibGVTY3JvbGxCYXI9Ci1PU19FbmFibGVTY3JvbGxCYXJfMD1jYXN0PShIV05EKQotT1NfRW5hYmxlU2Nyb2xsQmFyXzE9Ci1PU19FbmFibGVTY3JvbGxCYXJfMj0KLQotT1NfRW5hYmxlV2luZG93PQotT1NfRW5hYmxlV2luZG93XzA9Y2FzdD0oSFdORCkKLU9TX0VuYWJsZVdpbmRvd18xPQotCi1PU19FbmREZWZlcldpbmRvd1Bvcz0KLU9TX0VuZERlZmVyV2luZG93UG9zXzA9Y2FzdD0oSERXUCkKLQotT1NfRW5kRG9jPQotT1NfRW5kRG9jXzA9Y2FzdD0oSERDKQotCi1PU19FbmRQYWdlPQotT1NfRW5kUGFnZV8wPWNhc3Q9KEhEQykKLQotT1NfRW5kUGFpbnQ9Ci1PU19FbmRQYWludF8wPWNhc3Q9KEhXTkQpCi1PU19FbmRQYWludF8xPQotCi1PU19FbmRQYXRoPQotT1NfRW5kUGF0aF8wPWNhc3Q9KEhEQykKLQotT1NfRW51bURpc3BsYXlNb25pdG9ycz1mbGFncz1keW5hbWljCi1PU19FbnVtRGlzcGxheU1vbml0b3JzXzA9Y2FzdD0oSERDKQotT1NfRW51bURpc3BsYXlNb25pdG9yc18xPWNhc3Q9KExQQ1JFQ1QpCi1PU19FbnVtRGlzcGxheU1vbml0b3JzXzI9Y2FzdD0oTU9OSVRPUkVOVU1QUk9DKQotT1NfRW51bURpc3BsYXlNb25pdG9yc18zPWNhc3Q9KExQQVJBTSkKLQotT1NfRW51bUZvbnRGYW1pbGllc0E9Ci1PU19FbnVtRm9udEZhbWlsaWVzQV8wPWNhc3Q9KEhEQykKLU9TX0VudW1Gb250RmFtaWxpZXNBXzE9Y2FzdD0oTFBTVFIpCi1PU19FbnVtRm9udEZhbWlsaWVzQV8yPWNhc3Q9KEZPTlRFTlVNUFJPQykKLU9TX0VudW1Gb250RmFtaWxpZXNBXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19FbnVtRm9udEZhbWlsaWVzRXhBPQotT1NfRW51bUZvbnRGYW1pbGllc0V4QV8wPWNhc3Q9SERDCi1PU19FbnVtRm9udEZhbWlsaWVzRXhBXzE9Y2FzdD1MUExPR0ZPTlRBCi1PU19FbnVtRm9udEZhbWlsaWVzRXhBXzI9Y2FzdD0oRk9OVEVOVU1QUk9DQSkKLU9TX0VudW1Gb250RmFtaWxpZXNFeEFfMz1jYXN0PShMUEFSQU0pCi1PU19FbnVtRm9udEZhbWlsaWVzRXhBXzQ9Ci0KLU9TX0VudW1Gb250RmFtaWxpZXNFeFc9Ci1PU19FbnVtRm9udEZhbWlsaWVzRXhXXzA9Y2FzdD1IREMKLU9TX0VudW1Gb250RmFtaWxpZXNFeFdfMT1jYXN0PUxQTE9HRk9OVFcKLU9TX0VudW1Gb250RmFtaWxpZXNFeFdfMj1jYXN0PUZPTlRFTlVNUFJPQ1cKLU9TX0VudW1Gb250RmFtaWxpZXNFeFdfMz1jYXN0PUxQQVJBTQotT1NfRW51bUZvbnRGYW1pbGllc0V4V180PQotCi1PU19FbnVtRm9udEZhbWlsaWVzVz0KLU9TX0VudW1Gb250RmFtaWxpZXNXXzA9Y2FzdD0oSERDKQotT1NfRW51bUZvbnRGYW1pbGllc1dfMT1jYXN0PShMUENXU1RSKQotT1NfRW51bUZvbnRGYW1pbGllc1dfMj1jYXN0PShGT05URU5VTVBST0NXKQotT1NfRW51bUZvbnRGYW1pbGllc1dfMz1jYXN0PShMUEFSQU0pCi0KLU9TX0VudW1TeXN0ZW1MYW5ndWFnZUdyb3Vwc0E9ZmxhZ3M9ZHluYW1pYwotT1NfRW51bVN5c3RlbUxhbmd1YWdlR3JvdXBzQV8wPWNhc3Q9KExBTkdVQUdFR1JPVVBfRU5VTVBST0NBKQotT1NfRW51bVN5c3RlbUxhbmd1YWdlR3JvdXBzQV8xPQotT1NfRW51bVN5c3RlbUxhbmd1YWdlR3JvdXBzQV8yPWNhc3Q9KExPTkdfUFRSKQotCi1PU19FbnVtU3lzdGVtTGFuZ3VhZ2VHcm91cHNXPWZsYWdzPWR5bmFtaWMKLU9TX0VudW1TeXN0ZW1MYW5ndWFnZUdyb3Vwc1dfMD1jYXN0PShMQU5HVUFHRUdST1VQX0VOVU1QUk9DVykKLU9TX0VudW1TeXN0ZW1MYW5ndWFnZUdyb3Vwc1dfMT0KLU9TX0VudW1TeXN0ZW1MYW5ndWFnZUdyb3Vwc1dfMj1jYXN0PShMT05HX1BUUikKLQotT1NfRW51bVN5c3RlbUxvY2FsZXNBPQotT1NfRW51bVN5c3RlbUxvY2FsZXNBXzA9Y2FzdD0oTE9DQUxFX0VOVU1QUk9DQSkKLU9TX0VudW1TeXN0ZW1Mb2NhbGVzQV8xPQotCi1PU19FbnVtU3lzdGVtTG9jYWxlc1c9Ci1PU19FbnVtU3lzdGVtTG9jYWxlc1dfMD1jYXN0PShMT0NBTEVfRU5VTVBST0NXKQotT1NfRW51bVN5c3RlbUxvY2FsZXNXXzE9Ci0KLU9TX0VxdWFsUmVjdD0KLU9TX0VxdWFsUmVjdF8wPWNhc3Q9KENPTlNUIFJFQ1QgKiksZmxhZ3M9bm9fb3V0Ci1PU19FcXVhbFJlY3RfMT1jYXN0PShDT05TVCBSRUNUICopLGZsYWdzPW5vX291dAotCi1PU19FcXVhbFJnbj0KLU9TX0VxdWFsUmduXzA9Y2FzdD0oSFJHTikKLU9TX0VxdWFsUmduXzE9Y2FzdD0oSFJHTikKLQotT1NfRXhjbHVkZUNsaXBSZWN0PQotT1NfRXhjbHVkZUNsaXBSZWN0XzA9Y2FzdD1IREMKLU9TX0V4Y2x1ZGVDbGlwUmVjdF8xPQotT1NfRXhjbHVkZUNsaXBSZWN0XzI9Ci1PU19FeGNsdWRlQ2xpcFJlY3RfMz0KLU9TX0V4Y2x1ZGVDbGlwUmVjdF80PQotCi1PU19FeHBhbmRFbnZpcm9ubWVudFN0cmluZ3NBPQotT1NfRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzQV8wPQotT1NfRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzQV8xPQotT1NfRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzQV8yPQotCi1PU19FeHBhbmRFbnZpcm9ubWVudFN0cmluZ3NXPQotT1NfRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzV18wPQotT1NfRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzV18xPQotT1NfRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzV18yPQotCi1PU19FeHRDcmVhdGVQZW49Ci1PU19FeHRDcmVhdGVQZW5fMD0KLU9TX0V4dENyZWF0ZVBlbl8xPQotT1NfRXh0Q3JlYXRlUGVuXzI9Y2FzdD1DT05TVCBMT0dCUlVTSCAqCi1PU19FeHRDcmVhdGVQZW5fMz0KLU9TX0V4dENyZWF0ZVBlbl80PWNhc3Q9Q09OU1QgRFdPUkQgKgotCi1PU19FeHRDcmVhdGVSZWdpb249Ci1PU19FeHRDcmVhdGVSZWdpb25fMD1jYXN0PVhGT1JNICoKLU9TX0V4dENyZWF0ZVJlZ2lvbl8xPQotT1NfRXh0Q3JlYXRlUmVnaW9uXzI9Y2FzdD1DT05TVCBSR05EQVRBICoKLQotT1NfRXh0VGV4dE91dEE9Ci1PU19FeHRUZXh0T3V0QV8wPWNhc3Q9KEhEQykKLU9TX0V4dFRleHRPdXRBXzE9Ci1PU19FeHRUZXh0T3V0QV8yPQotT1NfRXh0VGV4dE91dEFfMz0KLU9TX0V4dFRleHRPdXRBXzQ9ZmxhZ3M9bm9fb3V0Ci1PU19FeHRUZXh0T3V0QV81PWNhc3Q9KExQU1RSKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX0V4dFRleHRPdXRBXzY9Ci1PU19FeHRUZXh0T3V0QV83PWNhc3Q9KENPTlNUIElOVCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLQotT1NfRXh0VGV4dE91dFc9Ci1PU19FeHRUZXh0T3V0V18wPWNhc3Q9KEhEQykKLU9TX0V4dFRleHRPdXRXXzE9Ci1PU19FeHRUZXh0T3V0V18yPQotT1NfRXh0VGV4dE91dFdfMz0KLU9TX0V4dFRleHRPdXRXXzQ9ZmxhZ3M9bm9fb3V0Ci1PU19FeHRUZXh0T3V0V181PWNhc3Q9KExQV1NUUiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19FeHRUZXh0T3V0V182PQotT1NfRXh0VGV4dE91dFdfNz1jYXN0PShDT05TVCBJTlQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi0KLU9TX0V4dHJhY3RJY29uRXhBPQotT1NfRXh0cmFjdEljb25FeEFfMD1jYXN0PShMUFNUUikKLU9TX0V4dHJhY3RJY29uRXhBXzE9Ci1PU19FeHRyYWN0SWNvbkV4QV8yPWNhc3Q9KEhJQ09OIEZBUiAqKQotT1NfRXh0cmFjdEljb25FeEFfMz1jYXN0PShISUNPTiBGQVIgKikKLU9TX0V4dHJhY3RJY29uRXhBXzQ9Ci0KLU9TX0V4dHJhY3RJY29uRXhXPQotT1NfRXh0cmFjdEljb25FeFdfMD1jYXN0PShMUFdTVFIpCi1PU19FeHRyYWN0SWNvbkV4V18xPQotT1NfRXh0cmFjdEljb25FeFdfMj1jYXN0PShISUNPTiBGQVIgKikKLU9TX0V4dHJhY3RJY29uRXhXXzM9Y2FzdD0oSElDT04gRkFSICopCi1PU19FeHRyYWN0SWNvbkV4V180PQotCi1PU19GaWxsUGF0aD0KLU9TX0ZpbGxQYXRoXzA9Y2FzdD0oSERDKQotCi1PU19GaWxsUmVjdD0KLU9TX0ZpbGxSZWN0XzA9Y2FzdD0oSERDKQotT1NfRmlsbFJlY3RfMT1mbGFncz1ub19vdXQKLU9TX0ZpbGxSZWN0XzI9Y2FzdD0oSEJSVVNIKQotCi1PU19GaW5kV2luZG93QT0KLU9TX0ZpbmRXaW5kb3dBXzA9Y2FzdD0oTFBTVFIpCi1PU19GaW5kV2luZG93QV8xPWNhc3Q9KExQU1RSKQotCi1PU19GaW5kV2luZG93Vz0KLU9TX0ZpbmRXaW5kb3dXXzA9Y2FzdD0oTFBXU1RSKQotT1NfRmluZFdpbmRvd1dfMT1jYXN0PShMUFdTVFIpCi0KLU9TX0Zvcm1hdE1lc3NhZ2VBPQotT1NfRm9ybWF0TWVzc2FnZUFfMD0KLU9TX0Zvcm1hdE1lc3NhZ2VBXzE9Y2FzdD1MUENWT0lECi1PU19Gb3JtYXRNZXNzYWdlQV8yPQotT1NfRm9ybWF0TWVzc2FnZUFfMz0KLU9TX0Zvcm1hdE1lc3NhZ2VBXzQ9Y2FzdD1MUFNUUgotT1NfRm9ybWF0TWVzc2FnZUFfNT0KLU9TX0Zvcm1hdE1lc3NhZ2VBXzY9Y2FzdD12YV9saXN0KgotCi1PU19Gb3JtYXRNZXNzYWdlVz0KLU9TX0Zvcm1hdE1lc3NhZ2VXXzA9Ci1PU19Gb3JtYXRNZXNzYWdlV18xPWNhc3Q9TFBDVk9JRAotT1NfRm9ybWF0TWVzc2FnZVdfMj0KLU9TX0Zvcm1hdE1lc3NhZ2VXXzM9Ci1PU19Gb3JtYXRNZXNzYWdlV180PWNhc3Q9TFBXU1RSCi1PU19Gb3JtYXRNZXNzYWdlV181PQotT1NfRm9ybWF0TWVzc2FnZVdfNj1jYXN0PXZhX2xpc3QqCi0KLU9TX0ZyZWVMaWJyYXJ5PQotT1NfRnJlZUxpYnJhcnlfMD1jYXN0PShITU9EVUxFKQotCi1PU19HZGlTZXRCYXRjaExpbWl0PQotT1NfR2RpU2V0QmF0Y2hMaW1pdF8wPWNhc3Q9RFdPUkQKLQotT1NfR2V0QUNQPQotCi1PU19HZXRBY3RpdmVXaW5kb3c9Ci0KLU9TX0dldEJrQ29sb3I9Ci1PU19HZXRCa0NvbG9yXzA9Y2FzdD0oSERDKQotCi1PU19HZXRDYXB0dXJlPQotCi1PU19HZXRDYXJldFBvcz0KLU9TX0dldENhcmV0UG9zXzA9Ci0KLU9TX0dldENoYXJBQkNXaWR0aHNBPQotT1NfR2V0Q2hhckFCQ1dpZHRoc0FfMD1jYXN0PShIREMpCi1PU19HZXRDaGFyQUJDV2lkdGhzQV8xPQotT1NfR2V0Q2hhckFCQ1dpZHRoc0FfMj0KLU9TX0dldENoYXJBQkNXaWR0aHNBXzM9Y2FzdD0oTFBBQkMpLGZsYWdzPW5vX2luIGNyaXRpY2FsCi0KLU9TX0dldENoYXJBQkNXaWR0aHNXPQotT1NfR2V0Q2hhckFCQ1dpZHRoc1dfMD1jYXN0PShIREMpCi1PU19HZXRDaGFyQUJDV2lkdGhzV18xPQotT1NfR2V0Q2hhckFCQ1dpZHRoc1dfMj0KLU9TX0dldENoYXJBQkNXaWR0aHNXXzM9Y2FzdD0oTFBBQkMpLGZsYWdzPW5vX2luIGNyaXRpY2FsCi0KLU9TX0dldENoYXJXaWR0aEE9Ci1PU19HZXRDaGFyV2lkdGhBXzA9Y2FzdD0oSERDKQotT1NfR2V0Q2hhcldpZHRoQV8xPQotT1NfR2V0Q2hhcldpZHRoQV8yPQotT1NfR2V0Q2hhcldpZHRoQV8zPWNhc3Q9KExQSU5UKSxmbGFncz1ub19pbiBjcml0aWNhbAotCi1PU19HZXRDaGFyV2lkdGhXPQotT1NfR2V0Q2hhcldpZHRoV18wPWNhc3Q9KEhEQykKLU9TX0dldENoYXJXaWR0aFdfMT0KLU9TX0dldENoYXJXaWR0aFdfMj0KLU9TX0dldENoYXJXaWR0aFdfMz1jYXN0PShMUElOVCksZmxhZ3M9bm9faW4gY3JpdGljYWwKLQotT1NfR2V0Q2hhcmFjdGVyUGxhY2VtZW50QT0KLU9TX0dldENoYXJhY3RlclBsYWNlbWVudEFfMD1jYXN0PShIREMpCi1PU19HZXRDaGFyYWN0ZXJQbGFjZW1lbnRBXzE9Y2FzdD0oTFBTVFIpLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfR2V0Q2hhcmFjdGVyUGxhY2VtZW50QV8yPQotT1NfR2V0Q2hhcmFjdGVyUGxhY2VtZW50QV8zPQotT1NfR2V0Q2hhcmFjdGVyUGxhY2VtZW50QV80PQotT1NfR2V0Q2hhcmFjdGVyUGxhY2VtZW50QV81PQotCi1PU19HZXRDaGFyYWN0ZXJQbGFjZW1lbnRXPQotT1NfR2V0Q2hhcmFjdGVyUGxhY2VtZW50V18wPWNhc3Q9KEhEQykKLU9TX0dldENoYXJhY3RlclBsYWNlbWVudFdfMT1jYXN0PShMUFdTVFIpLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfR2V0Q2hhcmFjdGVyUGxhY2VtZW50V18yPQotT1NfR2V0Q2hhcmFjdGVyUGxhY2VtZW50V18zPQotT1NfR2V0Q2hhcmFjdGVyUGxhY2VtZW50V180PWNhc3Q9KExQR0NQX1JFU1VMVFNXKQotT1NfR2V0Q2hhcmFjdGVyUGxhY2VtZW50V181PQotCi1PU19HZXRDbGFzc0luZm9BPQotT1NfR2V0Q2xhc3NJbmZvQV8wPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0dldENsYXNzSW5mb0FfMT1jYXN0PShMUFNUUikKLU9TX0dldENsYXNzSW5mb0FfMj0KLQotT1NfR2V0Q2xhc3NJbmZvVz0KLU9TX0dldENsYXNzSW5mb1dfMD1jYXN0PShISU5TVEFOQ0UpCi1PU19HZXRDbGFzc0luZm9XXzE9Y2FzdD0oTFBXU1RSKQotT1NfR2V0Q2xhc3NJbmZvV18yPWNhc3Q9KExQV05EQ0xBU1NXKQotCi1PU19HZXRDbGFzc05hbWVBPQotT1NfR2V0Q2xhc3NOYW1lQV8wPWNhc3Q9SFdORAotT1NfR2V0Q2xhc3NOYW1lQV8xPQotT1NfR2V0Q2xhc3NOYW1lQV8yPQotCi1PU19HZXRDbGFzc05hbWVXPQotT1NfR2V0Q2xhc3NOYW1lV18wPWNhc3Q9SFdORAotT1NfR2V0Q2xhc3NOYW1lV18xPQotT1NfR2V0Q2xhc3NOYW1lV18yPQotCi1PU19HZXRDbGllbnRSZWN0PQotT1NfR2V0Q2xpZW50UmVjdF8wPWNhc3Q9KEhXTkQpCi1PU19HZXRDbGllbnRSZWN0XzE9Ci0KLU9TX0dldENsaXBCb3g9Ci1PU19HZXRDbGlwQm94XzA9Y2FzdD0oSERDKQotT1NfR2V0Q2xpcEJveF8xPQotCi1PU19HZXRDbGlwUmduPQotT1NfR2V0Q2xpcFJnbl8wPWNhc3Q9KEhEQykKLU9TX0dldENsaXBSZ25fMT1jYXN0PShIUkdOKQotCi1PU19HZXRDbGlwYm9hcmREYXRhPQotT1NfR2V0Q2xpcGJvYXJkRGF0YV8wPQotCi1PU19HZXRDbGlwYm9hcmRGb3JtYXROYW1lQT0KLU9TX0dldENsaXBib2FyZEZvcm1hdE5hbWVBXzA9Ci1PU19HZXRDbGlwYm9hcmRGb3JtYXROYW1lQV8xPQotT1NfR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZUFfMj0KLQotT1NfR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZVc9Ci1PU19HZXRDbGlwYm9hcmRGb3JtYXROYW1lV18wPQotT1NfR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZVdfMT1jYXN0PShMUFdTVFIpCi1PU19HZXRDbGlwYm9hcmRGb3JtYXROYW1lV18yPQotCi1PU19HZXRDb21ib0JveEluZm89ZmxhZ3M9ZHluYW1pYwotT1NfR2V0Q29tYm9Cb3hJbmZvXzA9Y2FzdD0oSFdORCkKLU9TX0dldENvbWJvQm94SW5mb18xPQotCi1PU19HZXRDdXJyZW50T2JqZWN0PQotT1NfR2V0Q3VycmVudE9iamVjdF8wPWNhc3Q9KEhEQykKLU9TX0dldEN1cnJlbnRPYmplY3RfMT0KLQotT1NfR2V0Q3VycmVudFByb2Nlc3NJZD0KLQotT1NfR2V0Q3VycmVudFRocmVhZElkPQotCi1PU19HZXRDdXJzb3I9Ci0KLU9TX0dldEN1cnNvclBvcz0KLU9TX0dldEN1cnNvclBvc18wPQotCi1PU19HZXREQz0KLU9TX0dldERDXzA9Y2FzdD0oSFdORCkKLQotT1NfR2V0RENFeD0KLU9TX0dldERDRXhfMD1jYXN0PShIV05EKQotT1NfR2V0RENFeF8xPWNhc3Q9KEhSR04pCi1PU19HZXREQ0V4XzI9Ci0KLU9TX0dldERJQkNvbG9yVGFibGU9Ci1PU19HZXRESUJDb2xvclRhYmxlXzA9Y2FzdD0oSERDKQotT1NfR2V0RElCQ29sb3JUYWJsZV8xPQotT1NfR2V0RElCQ29sb3JUYWJsZV8yPQotT1NfR2V0RElCQ29sb3JUYWJsZV8zPWNhc3Q9KFJHQlFVQUQgKiksZmxhZ3M9bm9faW4gY3JpdGljYWwKLQotT1NfR2V0RElCaXRzPQotT1NfR2V0RElCaXRzXzA9Y2FzdD0oSERDKQotT1NfR2V0RElCaXRzXzE9Y2FzdD0oSEJJVE1BUCkKLU9TX0dldERJQml0c18yPQotT1NfR2V0RElCaXRzXzM9Ci1PU19HZXRESUJpdHNfND1jYXN0PShMUFZPSUQpCi1PU19HZXRESUJpdHNfNT1jYXN0PShMUEJJVE1BUElORk8pLGZsYWdzPWNyaXRpY2FsCi1PU19HZXRESUJpdHNfNj0KLQotT1NfR2V0RGVza3RvcFdpbmRvdz0KLQotT1NfR2V0RGV2aWNlQ2Fwcz0KLU9TX0dldERldmljZUNhcHNfMD1jYXN0PShIREMpCi1PU19HZXREZXZpY2VDYXBzXzE9Ci0KLU9TX0dldERpYWxvZ0Jhc2VVbml0cz0KLQotT1NfR2V0RGxnSXRlbT0KLU9TX0dldERsZ0l0ZW1fMD1jYXN0PShIV05EKQotT1NfR2V0RGxnSXRlbV8xPQotCi1PU19HZXREb3VibGVDbGlja1RpbWU9Ci0KLU9TX0dldEZvY3VzPQotCi1PU19HZXRGb250TGFuZ3VhZ2VJbmZvPQotT1NfR2V0Rm9udExhbmd1YWdlSW5mb18wPWNhc3Q9KEhEQykKLQotT1NfR2V0Rm9yZWdyb3VuZFdpbmRvdz0KLQotT1NfR2V0R1VJVGhyZWFkSW5mbz0KLU9TX0dldEdVSVRocmVhZEluZm9fMD1jYXN0PShEV09SRCkKLU9TX0dldEdVSVRocmVhZEluZm9fMT1jYXN0PShMUEdVSVRIUkVBRElORk8pCi0KLU9TX0dldEljb25JbmZvPQotT1NfR2V0SWNvbkluZm9fMD1jYXN0PShISUNPTikKLU9TX0dldEljb25JbmZvXzE9ZmxhZ3M9bm9faW4KLQotT1NfR2V0S2V5TmFtZVRleHRBPQotT1NfR2V0S2V5TmFtZVRleHRBXzA9Ci1PU19HZXRLZXlOYW1lVGV4dEFfMT1jYXN0PShMUFNUUikKLU9TX0dldEtleU5hbWVUZXh0QV8yPQotCi1PU19HZXRLZXlOYW1lVGV4dFc9Ci1PU19HZXRLZXlOYW1lVGV4dFdfMD0KLU9TX0dldEtleU5hbWVUZXh0V18xPWNhc3Q9KExQV1NUUikKLU9TX0dldEtleU5hbWVUZXh0V18yPQotCi1PU19HZXRLZXlTdGF0ZT0KLU9TX0dldEtleVN0YXRlXzA9Ci0KLU9TX0dldEtleWJvYXJkTGF5b3V0PQotT1NfR2V0S2V5Ym9hcmRMYXlvdXRfMD0KLQotT1NfR2V0S2V5Ym9hcmRMYXlvdXRMaXN0PQotT1NfR2V0S2V5Ym9hcmRMYXlvdXRMaXN0XzA9Ci1PU19HZXRLZXlib2FyZExheW91dExpc3RfMT1jYXN0PShIS0wgRkFSICopCi0KLU9TX0dldEtleWJvYXJkU3RhdGU9Ci1PU19HZXRLZXlib2FyZFN0YXRlXzA9Y2FzdD0oUEJZVEUpCi0KLU9TX0dldExhc3RBY3RpdmVQb3B1cD0KLU9TX0dldExhc3RBY3RpdmVQb3B1cF8wPWNhc3Q9KEhXTkQpCi0KLU9TX0dldExhc3RFcnJvcj0KLQotT1NfR2V0TGF5b3V0PWZsYWdzPWR5bmFtaWMKLU9TX0dldExheW91dF8wPWNhc3Q9KEhEQykKLQotT1NfR2V0TGlicmFyeUhhbmRsZT1mbGFncz1ub19nZW4KLQotT1NfR2V0TG9jYWxlSW5mb0E9Ci1PU19HZXRMb2NhbGVJbmZvQV8wPQotT1NfR2V0TG9jYWxlSW5mb0FfMT0KLU9TX0dldExvY2FsZUluZm9BXzI9Y2FzdD0oTFBTVFIpCi1PU19HZXRMb2NhbGVJbmZvQV8zPQotCi1PU19HZXRMb2NhbGVJbmZvVz0KLU9TX0dldExvY2FsZUluZm9XXzA9Ci1PU19HZXRMb2NhbGVJbmZvV18xPQotT1NfR2V0TG9jYWxlSW5mb1dfMj1jYXN0PShMUFdTVFIpCi1PU19HZXRMb2NhbGVJbmZvV18zPQotCi1PU19HZXRNZW51PQotT1NfR2V0TWVudV8wPWNhc3Q9KEhXTkQpCi0KLU9TX0dldE1lbnVCYXJJbmZvPWZsYWdzPWR5bmFtaWMKLU9TX0dldE1lbnVCYXJJbmZvXzA9Ci1PU19HZXRNZW51QmFySW5mb18xPQotT1NfR2V0TWVudUJhckluZm9fMj0KLU9TX0dldE1lbnVCYXJJbmZvXzM9Ci0KLU9TX0dldE1lbnVEZWZhdWx0SXRlbT0KLU9TX0dldE1lbnVEZWZhdWx0SXRlbV8wPWNhc3Q9KEhNRU5VKQotT1NfR2V0TWVudURlZmF1bHRJdGVtXzE9Ci1PU19HZXRNZW51RGVmYXVsdEl0ZW1fMj0KLQotT1NfR2V0TWVudUluZm89ZmxhZ3M9ZHluYW1pYwotT1NfR2V0TWVudUluZm9fMD1jYXN0PShITUVOVSkKLU9TX0dldE1lbnVJbmZvXzE9Ci0KLU9TX0dldE1lbnVJdGVtQ291bnQ9Ci1PU19HZXRNZW51SXRlbUNvdW50XzA9Y2FzdD0oSE1FTlUpCi0KLU9TX0dldE1lbnVJdGVtSW5mb0E9Ci1PU19HZXRNZW51SXRlbUluZm9BXzA9Y2FzdD0oSE1FTlUpCi1PU19HZXRNZW51SXRlbUluZm9BXzE9Ci1PU19HZXRNZW51SXRlbUluZm9BXzI9Ci1PU19HZXRNZW51SXRlbUluZm9BXzM9Ci0KLU9TX0dldE1lbnVJdGVtSW5mb1c9Ci1PU19HZXRNZW51SXRlbUluZm9XXzA9Y2FzdD0oSE1FTlUpCi1PU19HZXRNZW51SXRlbUluZm9XXzE9Ci1PU19HZXRNZW51SXRlbUluZm9XXzI9Ci1PU19HZXRNZW51SXRlbUluZm9XXzM9Y2FzdD0oTFBNRU5VSVRFTUlORk9XKQotCi1PU19HZXRNZW51SXRlbVJlY3Q9Ci1PU19HZXRNZW51SXRlbVJlY3RfMD1jYXN0PShIV05EKQotT1NfR2V0TWVudUl0ZW1SZWN0XzE9Y2FzdD0oSE1FTlUpCi1PU19HZXRNZW51SXRlbVJlY3RfMj0KLU9TX0dldE1lbnVJdGVtUmVjdF8zPQotCi1PU19HZXRNZXNzYWdlQT0KLU9TX0dldE1lc3NhZ2VBXzA9Ci1PU19HZXRNZXNzYWdlQV8xPWNhc3Q9KEhXTkQpCi1PU19HZXRNZXNzYWdlQV8yPQotT1NfR2V0TWVzc2FnZUFfMz0KLQotT1NfR2V0TWVzc2FnZVBvcz0KLQotT1NfR2V0TWVzc2FnZVRpbWU9Ci0KLU9TX0dldE1lc3NhZ2VXPQotT1NfR2V0TWVzc2FnZVdfMD0KLU9TX0dldE1lc3NhZ2VXXzE9Y2FzdD0oSFdORCkKLU9TX0dldE1lc3NhZ2VXXzI9Ci1PU19HZXRNZXNzYWdlV18zPQotCi1PU19HZXRNZXRhUmduPQotT1NfR2V0TWV0YVJnbl8wPWNhc3Q9SERDCi1PU19HZXRNZXRhUmduXzE9Y2FzdD1IUkdOCi0KLU9TX0dldE1vZHVsZUhhbmRsZUE9Ci1PU19HZXRNb2R1bGVIYW5kbGVBXzA9Y2FzdD0oTFBTVFIpCi0KLU9TX0dldE1vZHVsZUhhbmRsZVc9Ci1PU19HZXRNb2R1bGVIYW5kbGVXXzA9Y2FzdD0oTFBXU1RSKQotCi1PU19HZXRNb25pdG9ySW5mb0E9ZmxhZ3M9ZHluYW1pYwotT1NfR2V0TW9uaXRvckluZm9BXzA9Y2FzdD0oSE1PTklUT1IpCi1PU19HZXRNb25pdG9ySW5mb0FfMT1jYXN0PShMUE1PTklUT1JJTkZPKQotCi1PU19HZXRNb25pdG9ySW5mb1c9ZmxhZ3M9ZHluYW1pYwotT1NfR2V0TW9uaXRvckluZm9XXzA9Y2FzdD0oSE1PTklUT1IpCi1PU19HZXRNb25pdG9ySW5mb1dfMT1jYXN0PShMUE1PTklUT1JJTkZPKQotCi1PU19HZXROZWFyZXN0UGFsZXR0ZUluZGV4PQotT1NfR2V0TmVhcmVzdFBhbGV0dGVJbmRleF8wPWNhc3Q9KEhQQUxFVFRFKQotT1NfR2V0TmVhcmVzdFBhbGV0dGVJbmRleF8xPWNhc3Q9KENPTE9SUkVGKQotCi1PU19HZXRPYmplY3RBX19JSUk9Ci1PU19HZXRPYmplY3RBX19JSUlfMD1jYXN0PShIR0RJT0JKKQotT1NfR2V0T2JqZWN0QV9fSUlJXzE9Ci1PU19HZXRPYmplY3RBX19JSUlfMj1jYXN0PUxQVk9JRCxmbGFncz1ub19pbgotCi1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQXzI9Ci1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQXzJfMD1jYXN0PShIR0RJT0JKKQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JJVE1BUF8yXzE9Ci1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQXzJfMj1mbGFncz1ub19pbgotCi1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRElCU0VDVElPTl8yPQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RJQlNFQ1RJT05fMl8wPWNhc3Q9KEhHRElPQkopCi1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRElCU0VDVElPTl8yXzE9Ci1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRElCU0VDVElPTl8yXzI9ZmxhZ3M9bm9faW4KLQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0VYVExPR1BFTl8yPQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0VYVExPR1BFTl8yXzA9Y2FzdD0oSEdESU9CSikKLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9FWFRMT0dQRU5fMl8xPQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0VYVExPR1BFTl8yXzI9ZmxhZ3M9bm9faW4KLQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0JSVVNIXzI9Ci1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HQlJVU0hfMl8wPWNhc3Q9KEhHRElPQkopCi1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HQlJVU0hfMl8xPQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0JSVVNIXzJfMj1mbGFncz1ub19pbgotCi1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEFfMj0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UQV8yXzA9Y2FzdD0oSEdESU9CSikKLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UQV8yXzE9Ci1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEFfMl8yPWZsYWdzPW5vX2luCi0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dQRU5fMj0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dQRU5fMl8wPWNhc3Q9KEhHRElPQkopCi1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HUEVOXzJfMT0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dQRU5fMl8yPWZsYWdzPW5vX2luCi0KLU9TX0dldE9iamVjdFdfX0lJST0KLU9TX0dldE9iamVjdFdfX0lJSV8wPWNhc3Q9KEhHRElPQkopCi1PU19HZXRPYmplY3RXX19JSUlfMT0KLU9TX0dldE9iamVjdFdfX0lJSV8yPWNhc3Q9TFBWT0lELGZsYWdzPW5vX2luCi0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CSVRNQVBfMj0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CSVRNQVBfMl8wPWNhc3Q9KEhHRElPQkopCi1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQXzJfMT0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CSVRNQVBfMl8yPWZsYWdzPW5vX2luCi0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ESUJTRUNUSU9OXzI9Ci1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRElCU0VDVElPTl8yXzA9Y2FzdD0oSEdESU9CSikKLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ESUJTRUNUSU9OXzJfMT0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ESUJTRUNUSU9OXzJfMj1mbGFncz1ub19pbgotCi1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRVhUTE9HUEVOXzI9Ci1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRVhUTE9HUEVOXzJfMD1jYXN0PShIR0RJT0JKKQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0VYVExPR1BFTl8yXzE9Ci1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRVhUTE9HUEVOXzJfMj1mbGFncz1ub19pbgotCi1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HQlJVU0hfMj0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dCUlVTSF8yXzA9Y2FzdD0oSEdESU9CSikKLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dCUlVTSF8yXzE9Ci1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HQlJVU0hfMl8yPWZsYWdzPW5vX2luCi0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UV18yPQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRXXzJfMD1jYXN0PShIR0RJT0JKKQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRXXzJfMT0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UV18yXzI9ZmxhZ3M9bm9faW4KLQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR1BFTl8yPQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR1BFTl8yXzA9Y2FzdD0oSEdESU9CSikKLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dQRU5fMl8xPQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR1BFTl8yXzI9ZmxhZ3M9bm9faW4KLQotT1NfR2V0T3BlbkZpbGVOYW1lQT0KLU9TX0dldE9wZW5GaWxlTmFtZUFfMD0KLQotT1NfR2V0T3BlbkZpbGVOYW1lVz0KLU9TX0dldE9wZW5GaWxlTmFtZVdfMD1jYXN0PShMUE9QRU5GSUxFTkFNRVcpCi0KLU9TX0dldFBhbGV0dGVFbnRyaWVzPQotT1NfR2V0UGFsZXR0ZUVudHJpZXNfMD1jYXN0PShIUEFMRVRURSkKLU9TX0dldFBhbGV0dGVFbnRyaWVzXzE9Ci1PU19HZXRQYWxldHRlRW50cmllc18yPQotT1NfR2V0UGFsZXR0ZUVudHJpZXNfMz1jYXN0PShMUFBBTEVUVEVFTlRSWSksZmxhZ3M9bm9faW4gY3JpdGljYWwKLQotT1NfR2V0UGFyZW50PQotT1NfR2V0UGFyZW50XzA9Y2FzdD0oSFdORCkKLQotT1NfR2V0UGl4ZWw9Ci1PU19HZXRQaXhlbF8wPWNhc3Q9KEhEQykKLU9TX0dldFBpeGVsXzE9Ci1PU19HZXRQaXhlbF8yPQotCi1PU19HZXRQb2x5RmlsbE1vZGU9Ci1PU19HZXRQb2x5RmlsbE1vZGVfMD1jYXN0PUhEQwotCi1PU19HZXRQcm9jQWRkcmVzcz0KLU9TX0dldFByb2NBZGRyZXNzXzA9Y2FzdD0oSE1PRFVMRSkKLU9TX0dldFByb2NBZGRyZXNzXzE9Y2FzdD0oTFBDVFNUUikKLQotT1NfR2V0UHJvY2Vzc0hlYXA9Ci0KLU9TX0dldFByb2ZpbGVTdHJpbmdBPQotT1NfR2V0UHJvZmlsZVN0cmluZ0FfMD1jYXN0PShMUFNUUikKLU9TX0dldFByb2ZpbGVTdHJpbmdBXzE9Y2FzdD0oTFBTVFIpCi1PU19HZXRQcm9maWxlU3RyaW5nQV8yPWNhc3Q9KExQU1RSKQotT1NfR2V0UHJvZmlsZVN0cmluZ0FfMz1jYXN0PShMUFNUUikKLU9TX0dldFByb2ZpbGVTdHJpbmdBXzQ9Ci0KLU9TX0dldFByb2ZpbGVTdHJpbmdXPQotT1NfR2V0UHJvZmlsZVN0cmluZ1dfMD1jYXN0PShMUFdTVFIpCi1PU19HZXRQcm9maWxlU3RyaW5nV18xPWNhc3Q9KExQV1NUUikKLU9TX0dldFByb2ZpbGVTdHJpbmdXXzI9Y2FzdD0oTFBXU1RSKQotT1NfR2V0UHJvZmlsZVN0cmluZ1dfMz1jYXN0PShMUFdTVFIpCi1PU19HZXRQcm9maWxlU3RyaW5nV180PQotCi1PU19HZXRQcm9wQT0KLU9TX0dldFByb3BBXzA9Y2FzdD1IV05ECi1PU19HZXRQcm9wQV8xPWNhc3Q9TFBDVFNUUgotCi1PU19HZXRQcm9wVz0KLU9TX0dldFByb3BXXzA9Y2FzdD1IV05ECi1PU19HZXRQcm9wV18xPWNhc3Q9KExQQ1dTVFIpCi0KLU9TX0dldFJPUDI9Ci1PU19HZXRST1AyXzA9Y2FzdD0oSERDKQotCi1PU19HZXRSYW5kb21SZ249Ci1PU19HZXRSYW5kb21SZ25fMD1jYXN0PUhEQwotT1NfR2V0UmFuZG9tUmduXzE9Y2FzdD1IUkdOCi1PU19HZXRSYW5kb21SZ25fMj0KLQotT1NfR2V0UmVnaW9uRGF0YT0KLU9TX0dldFJlZ2lvbkRhdGFfMD1jYXN0PShIUkdOKQotT1NfR2V0UmVnaW9uRGF0YV8xPQotT1NfR2V0UmVnaW9uRGF0YV8yPWNhc3Q9KFJHTkRBVEEgKiksZmxhZ3M9bm9faW4gY3JpdGljYWwKLQotT1NfR2V0UmduQm94PQotT1NfR2V0UmduQm94XzA9Y2FzdD0oSFJHTikKLU9TX0dldFJnbkJveF8xPWZsYWdzPW5vX2luCi0KLU9TX0dldFNhdmVGaWxlTmFtZUE9Ci1PU19HZXRTYXZlRmlsZU5hbWVBXzA9Ci0KLU9TX0dldFNhdmVGaWxlTmFtZVc9Ci1PU19HZXRTYXZlRmlsZU5hbWVXXzA9Y2FzdD0oTFBPUEVORklMRU5BTUVXKQotCi1PU19HZXRTY3JvbGxJbmZvPQotT1NfR2V0U2Nyb2xsSW5mb18wPWNhc3Q9KEhXTkQpCi1PU19HZXRTY3JvbGxJbmZvXzE9Ci1PU19HZXRTY3JvbGxJbmZvXzI9Ci0KLU9TX0dldFN0b2NrT2JqZWN0PQotT1NfR2V0U3RvY2tPYmplY3RfMD0KLQotT1NfR2V0U3lzQ29sb3I9Ci1PU19HZXRTeXNDb2xvcl8wPQotCi1PU19HZXRTeXNDb2xvckJydXNoPQotT1NfR2V0U3lzQ29sb3JCcnVzaF8wPQotCi1PU19HZXRTeXN0ZW1EZWZhdWx0VUlMYW5ndWFnZT1mbGFncz1keW5hbWljCi0KLU9TX0dldFN5c3RlbU1lbnU9Ci1PU19HZXRTeXN0ZW1NZW51XzA9Y2FzdD0oSFdORCkKLU9TX0dldFN5c3RlbU1lbnVfMT0KLQotT1NfR2V0U3lzdGVtTWV0cmljcz0KLU9TX0dldFN5c3RlbU1ldHJpY3NfMD0KLQotT1NfR2V0U3lzdGVtUGFsZXR0ZUVudHJpZXM9Ci1PU19HZXRTeXN0ZW1QYWxldHRlRW50cmllc18wPWNhc3Q9KEhEQykKLU9TX0dldFN5c3RlbVBhbGV0dGVFbnRyaWVzXzE9Y2FzdD0oVUlOVCkKLU9TX0dldFN5c3RlbVBhbGV0dGVFbnRyaWVzXzI9Y2FzdD0oVUlOVCkKLU9TX0dldFN5c3RlbVBhbGV0dGVFbnRyaWVzXzM9Y2FzdD0oTFBQQUxFVFRFRU5UUlkpLGZsYWdzPW5vX2luIGNyaXRpY2FsCi0KLU9TX0dldFRleHRDaGFyc2V0PQotT1NfR2V0VGV4dENoYXJzZXRfMD1jYXN0PShIREMpCi0KLU9TX0dldFRleHRDb2xvcj0KLU9TX0dldFRleHRDb2xvcl8wPWNhc3Q9KEhEQykKLQotT1NfR2V0VGV4dEV4dGVudFBvaW50MzJBPQotT1NfR2V0VGV4dEV4dGVudFBvaW50MzJBXzA9Y2FzdD0oSERDKQotT1NfR2V0VGV4dEV4dGVudFBvaW50MzJBXzE9Y2FzdD0oTFBTVFIpLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfR2V0VGV4dEV4dGVudFBvaW50MzJBXzI9Ci1PU19HZXRUZXh0RXh0ZW50UG9pbnQzMkFfMz1mbGFncz1ub19pbgotCi1PU19HZXRUZXh0RXh0ZW50UG9pbnQzMlc9Ci1PU19HZXRUZXh0RXh0ZW50UG9pbnQzMldfMD1jYXN0PShIREMpCi1PU19HZXRUZXh0RXh0ZW50UG9pbnQzMldfMT1jYXN0PShMUFdTVFIpLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfR2V0VGV4dEV4dGVudFBvaW50MzJXXzI9Ci1PU19HZXRUZXh0RXh0ZW50UG9pbnQzMldfMz1mbGFncz1ub19pbgotCi1PU19HZXRUZXh0TWV0cmljc0E9Ci1PU19HZXRUZXh0TWV0cmljc0FfMD1jYXN0PShIREMpCi1PU19HZXRUZXh0TWV0cmljc0FfMT1mbGFncz1ub19pbgotCi1PU19HZXRUZXh0TWV0cmljc1c9Ci1PU19HZXRUZXh0TWV0cmljc1dfMD1jYXN0PShIREMpCi1PU19HZXRUZXh0TWV0cmljc1dfMT1mbGFncz1ub19pbgotCi1PU19HZXRUaWNrQ291bnQ9Ci0KLU9TX0dldFVwZGF0ZVJlY3Q9Ci1PU19HZXRVcGRhdGVSZWN0XzA9Y2FzdD0oSFdORCkKLU9TX0dldFVwZGF0ZVJlY3RfMT1jYXN0PShMUFJFQ1QpCi1PU19HZXRVcGRhdGVSZWN0XzI9Y2FzdD0oQk9PTCkKLQotT1NfR2V0VXBkYXRlUmduPQotT1NfR2V0VXBkYXRlUmduXzA9Y2FzdD0oSFdORCkKLU9TX0dldFVwZGF0ZVJnbl8xPWNhc3Q9KEhSR04pCi1PU19HZXRVcGRhdGVSZ25fMj0KLQotT1NfR2V0VmVyc2lvbkV4QT0KLU9TX0dldFZlcnNpb25FeEFfMD0KLQotT1NfR2V0VmVyc2lvbkV4Vz0KLU9TX0dldFZlcnNpb25FeFdfMD0KLQotT1NfR2V0V2luZG93PQotT1NfR2V0V2luZG93XzA9Y2FzdD0oSFdORCkKLU9TX0dldFdpbmRvd18xPQotCi1PU19HZXRXaW5kb3dEQz0KLU9TX0dldFdpbmRvd0RDXzA9Y2FzdD1IV05ECi0KLU9TX0dldFdpbmRvd0xvbmdBPQotT1NfR2V0V2luZG93TG9uZ0FfMD1jYXN0PShIV05EKQotT1NfR2V0V2luZG93TG9uZ0FfMT0KLQotT1NfR2V0V2luZG93TG9uZ1c9Ci1PU19HZXRXaW5kb3dMb25nV18wPWNhc3Q9KEhXTkQpCi1PU19HZXRXaW5kb3dMb25nV18xPQotCi1PU19HZXRXaW5kb3dPcmdFeD0KLU9TX0dldFdpbmRvd09yZ0V4XzA9Y2FzdD1IREMKLU9TX0dldFdpbmRvd09yZ0V4XzE9Ci0KLU9TX0dldFdpbmRvd1BsYWNlbWVudD0KLU9TX0dldFdpbmRvd1BsYWNlbWVudF8wPWNhc3Q9KEhXTkQpCi1PU19HZXRXaW5kb3dQbGFjZW1lbnRfMT0KLQotT1NfR2V0V2luZG93UmVjdD0KLU9TX0dldFdpbmRvd1JlY3RfMD1jYXN0PShIV05EKQotT1NfR2V0V2luZG93UmVjdF8xPQotCi1PU19HZXRXaW5kb3dSZ249Ci1PU19HZXRXaW5kb3dSZ25fMD1jYXN0PShIV05EKQotT1NfR2V0V2luZG93UmduXzE9Y2FzdD0oSFJHTikKLQotT1NfR2V0V2luZG93VGV4dEE9Ci1PU19HZXRXaW5kb3dUZXh0QV8wPWNhc3Q9KEhXTkQpCi1PU19HZXRXaW5kb3dUZXh0QV8xPWNhc3Q9KExQU1RSKQotT1NfR2V0V2luZG93VGV4dEFfMj0KLQotT1NfR2V0V2luZG93VGV4dExlbmd0aEE9Ci1PU19HZXRXaW5kb3dUZXh0TGVuZ3RoQV8wPWNhc3Q9KEhXTkQpCi0KLU9TX0dldFdpbmRvd1RleHRMZW5ndGhXPQotT1NfR2V0V2luZG93VGV4dExlbmd0aFdfMD1jYXN0PShIV05EKQotCi1PU19HZXRXaW5kb3dUZXh0Vz0KLU9TX0dldFdpbmRvd1RleHRXXzA9Y2FzdD0oSFdORCkKLU9TX0dldFdpbmRvd1RleHRXXzE9Y2FzdD0oTFBXU1RSKQotT1NfR2V0V2luZG93VGV4dFdfMj0KLQotT1NfR2V0V2luZG93VGhyZWFkUHJvY2Vzc0lkPQotT1NfR2V0V2luZG93VGhyZWFkUHJvY2Vzc0lkXzA9Y2FzdD0oSFdORCkKLU9TX0dldFdpbmRvd1RocmVhZFByb2Nlc3NJZF8xPWNhc3Q9KExQRFdPUkQpCi0KLU9TX0dldFdvcmxkVHJhbnNmb3JtPQotT1NfR2V0V29ybGRUcmFuc2Zvcm1fMD1jYXN0PUhEQwotT1NfR2V0V29ybGRUcmFuc2Zvcm1fMT1jYXN0PUxQWEZPUk0KLQotT1NfR2xvYmFsQWRkQXRvbUE9Ci1PU19HbG9iYWxBZGRBdG9tQV8wPWNhc3Q9TFBDVFNUUgotCi1PU19HbG9iYWxBZGRBdG9tVz0KLU9TX0dsb2JhbEFkZEF0b21XXzA9Y2FzdD0oTFBDV1NUUikKLQotT1NfR2xvYmFsQWxsb2M9Ci1PU19HbG9iYWxBbGxvY18wPQotT1NfR2xvYmFsQWxsb2NfMT0KLQotT1NfR2xvYmFsRnJlZT0KLU9TX0dsb2JhbEZyZWVfMD1jYXN0PShIQU5ETEUpCi0KLU9TX0dsb2JhbExvY2s9Ci1PU19HbG9iYWxMb2NrXzA9Y2FzdD0oSEFORExFKQotCi1PU19HbG9iYWxTaXplPQotT1NfR2xvYmFsU2l6ZV8wPWNhc3Q9KEhBTkRMRSkKLQotT1NfR2xvYmFsVW5sb2NrPQotT1NfR2xvYmFsVW5sb2NrXzA9Y2FzdD0oSEFORExFKQotCi1PU19HcmFkaWVudEZpbGw9ZmxhZ3M9ZHluYW1pYwotT1NfR3JhZGllbnRGaWxsXzA9Y2FzdD0oSERDKQotT1NfR3JhZGllbnRGaWxsXzE9Y2FzdD0oUFRSSVZFUlRFWCkKLU9TX0dyYWRpZW50RmlsbF8yPWNhc3Q9KFVMT05HKQotT1NfR3JhZGllbnRGaWxsXzM9Y2FzdD0oUFZPSUQpCi1PU19HcmFkaWVudEZpbGxfND1jYXN0PShVTE9ORykKLU9TX0dyYWRpZW50RmlsbF81PWNhc3Q9KFVMT05HKQotCi1PU19IZWFwQWxsb2M9Ci1PU19IZWFwQWxsb2NfMD1jYXN0PShIQU5ETEUpCi1PU19IZWFwQWxsb2NfMT0KLU9TX0hlYXBBbGxvY18yPQotCi1PU19IZWFwRnJlZT0KLU9TX0hlYXBGcmVlXzA9Y2FzdD0oSEFORExFKQotT1NfSGVhcEZyZWVfMT0KLU9TX0hlYXBGcmVlXzI9Y2FzdD0oTFBWT0lEKQotCi1PU19IaWRlQ2FyZXQ9Ci1PU19IaWRlQ2FyZXRfMD1jYXN0PShIV05EKQotCi1PU19JSURGcm9tU3RyaW5nPQotT1NfSUlERnJvbVN0cmluZ18wPWNhc3Q9TFBPTEVTVFIKLU9TX0lJREZyb21TdHJpbmdfMT1jYXN0PUxQSUlECi0KLU9TX0ltYWdlTGlzdF9BZGQ9Ci1PU19JbWFnZUxpc3RfQWRkXzA9Y2FzdD0oSElNQUdFTElTVCkKLU9TX0ltYWdlTGlzdF9BZGRfMT1jYXN0PShIQklUTUFQKQotT1NfSW1hZ2VMaXN0X0FkZF8yPWNhc3Q9KEhCSVRNQVApCi0KLU9TX0ltYWdlTGlzdF9BZGRNYXNrZWQ9Ci1PU19JbWFnZUxpc3RfQWRkTWFza2VkXzA9Y2FzdD0oSElNQUdFTElTVCkKLU9TX0ltYWdlTGlzdF9BZGRNYXNrZWRfMT1jYXN0PShIQklUTUFQKQotT1NfSW1hZ2VMaXN0X0FkZE1hc2tlZF8yPWNhc3Q9KENPTE9SUkVGKQotCi1PU19JbWFnZUxpc3RfQ3JlYXRlPQotT1NfSW1hZ2VMaXN0X0NyZWF0ZV8wPQotT1NfSW1hZ2VMaXN0X0NyZWF0ZV8xPQotT1NfSW1hZ2VMaXN0X0NyZWF0ZV8yPQotT1NfSW1hZ2VMaXN0X0NyZWF0ZV8zPQotT1NfSW1hZ2VMaXN0X0NyZWF0ZV80PQotCi1PU19JbWFnZUxpc3RfRGVzdHJveT0KLU9TX0ltYWdlTGlzdF9EZXN0cm95XzA9Y2FzdD0oSElNQUdFTElTVCkKLQotT1NfSW1hZ2VMaXN0X0dldEljb249Ci1PU19JbWFnZUxpc3RfR2V0SWNvbl8wPWNhc3Q9KEhJTUFHRUxJU1QpCi1PU19JbWFnZUxpc3RfR2V0SWNvbl8xPQotT1NfSW1hZ2VMaXN0X0dldEljb25fMj0KLQotT1NfSW1hZ2VMaXN0X0dldEljb25TaXplPQotT1NfSW1hZ2VMaXN0X0dldEljb25TaXplXzA9Y2FzdD0oSElNQUdFTElTVCkKLU9TX0ltYWdlTGlzdF9HZXRJY29uU2l6ZV8xPQotT1NfSW1hZ2VMaXN0X0dldEljb25TaXplXzI9Ci0KLU9TX0ltYWdlTGlzdF9HZXRJbWFnZUNvdW50PQotT1NfSW1hZ2VMaXN0X0dldEltYWdlQ291bnRfMD1jYXN0PShISU1BR0VMSVNUKQotCi1PU19JbWFnZUxpc3RfUmVtb3ZlPQotT1NfSW1hZ2VMaXN0X1JlbW92ZV8wPWNhc3Q9KEhJTUFHRUxJU1QpCi1PU19JbWFnZUxpc3RfUmVtb3ZlXzE9Ci0KLU9TX0ltYWdlTGlzdF9SZXBsYWNlPQotT1NfSW1hZ2VMaXN0X1JlcGxhY2VfMD1jYXN0PShISU1BR0VMSVNUKQotT1NfSW1hZ2VMaXN0X1JlcGxhY2VfMT0KLU9TX0ltYWdlTGlzdF9SZXBsYWNlXzI9Y2FzdD0oSEJJVE1BUCkKLU9TX0ltYWdlTGlzdF9SZXBsYWNlXzM9Y2FzdD0oSEJJVE1BUCkKLQotT1NfSW1hZ2VMaXN0X1JlcGxhY2VJY29uPQotT1NfSW1hZ2VMaXN0X1JlcGxhY2VJY29uXzA9Y2FzdD0oSElNQUdFTElTVCkKLU9TX0ltYWdlTGlzdF9SZXBsYWNlSWNvbl8xPQotT1NfSW1hZ2VMaXN0X1JlcGxhY2VJY29uXzI9Y2FzdD0oSElDT04pCi0KLU9TX0ltYWdlTGlzdF9TZXRJY29uU2l6ZT0KLU9TX0ltYWdlTGlzdF9TZXRJY29uU2l6ZV8wPWNhc3Q9KEhJTUFHRUxJU1QpCi1PU19JbWFnZUxpc3RfU2V0SWNvblNpemVfMT0KLU9TX0ltYWdlTGlzdF9TZXRJY29uU2l6ZV8yPQotCi1PU19JbW1Bc3NvY2lhdGVDb250ZXh0PQotT1NfSW1tQXNzb2NpYXRlQ29udGV4dF8wPWNhc3Q9KEhXTkQpCi1PU19JbW1Bc3NvY2lhdGVDb250ZXh0XzE9Y2FzdD0oSElNQykKLQotT1NfSW1tQ3JlYXRlQ29udGV4dD0KLQotT1NfSW1tRGVzdHJveUNvbnRleHQ9Ci1PU19JbW1EZXN0cm95Q29udGV4dF8wPWNhc3Q9KEhJTUMpCi0KLU9TX0ltbURpc2FibGVUZXh0RnJhbWVTZXJ2aWNlPWZsYWdzPWR5bmFtaWMKLU9TX0ltbURpc2FibGVUZXh0RnJhbWVTZXJ2aWNlXzA9Ci0KLU9TX0ltbUdldENvbXBvc2l0aW9uRm9udEE9Ci1PU19JbW1HZXRDb21wb3NpdGlvbkZvbnRBXzA9Y2FzdD0oSElNQykKLU9TX0ltbUdldENvbXBvc2l0aW9uRm9udEFfMT0KLQotT1NfSW1tR2V0Q29tcG9zaXRpb25Gb250Vz0KLU9TX0ltbUdldENvbXBvc2l0aW9uRm9udFdfMD1jYXN0PShISU1DKQotT1NfSW1tR2V0Q29tcG9zaXRpb25Gb250V18xPQotCi1PU19JbW1HZXRDb21wb3NpdGlvblN0cmluZ0E9Ci1PU19JbW1HZXRDb21wb3NpdGlvblN0cmluZ0FfMD1jYXN0PShISU1DKQotT1NfSW1tR2V0Q29tcG9zaXRpb25TdHJpbmdBXzE9Ci1PU19JbW1HZXRDb21wb3NpdGlvblN0cmluZ0FfMj1jYXN0PShMUFNUUikKLU9TX0ltbUdldENvbXBvc2l0aW9uU3RyaW5nQV8zPQotCi1PU19JbW1HZXRDb21wb3NpdGlvblN0cmluZ1c9Ci1PU19JbW1HZXRDb21wb3NpdGlvblN0cmluZ1dfMD1jYXN0PShISU1DKQotT1NfSW1tR2V0Q29tcG9zaXRpb25TdHJpbmdXXzE9Ci1PU19JbW1HZXRDb21wb3NpdGlvblN0cmluZ1dfMj1jYXN0PShMUFdTVFIpCi1PU19JbW1HZXRDb21wb3NpdGlvblN0cmluZ1dfMz0KLQotT1NfSW1tR2V0Q29udGV4dD0KLU9TX0ltbUdldENvbnRleHRfMD1jYXN0PShIV05EKQotCi1PU19JbW1HZXRDb252ZXJzaW9uU3RhdHVzPQotT1NfSW1tR2V0Q29udmVyc2lvblN0YXR1c18wPWNhc3Q9KEhJTUMpCi1PU19JbW1HZXRDb252ZXJzaW9uU3RhdHVzXzE9Ci1PU19JbW1HZXRDb252ZXJzaW9uU3RhdHVzXzI9Ci0KLU9TX0ltbUdldERlZmF1bHRJTUVXbmQ9Ci1PU19JbW1HZXREZWZhdWx0SU1FV25kXzA9Y2FzdD0oSFdORCkKLQotT1NfSW1tR2V0T3BlblN0YXR1cz0KLU9TX0ltbUdldE9wZW5TdGF0dXNfMD1jYXN0PShISU1DKQotCi1PU19JbW1SZWxlYXNlQ29udGV4dD0KLU9TX0ltbVJlbGVhc2VDb250ZXh0XzA9Y2FzdD0oSFdORCkKLU9TX0ltbVJlbGVhc2VDb250ZXh0XzE9Y2FzdD0oSElNQykKLQotT1NfSW1tU2V0Q29tcG9zaXRpb25Gb250QT0KLU9TX0ltbVNldENvbXBvc2l0aW9uRm9udEFfMD1jYXN0PShISU1DKQotT1NfSW1tU2V0Q29tcG9zaXRpb25Gb250QV8xPQotCi1PU19JbW1TZXRDb21wb3NpdGlvbkZvbnRXPQotT1NfSW1tU2V0Q29tcG9zaXRpb25Gb250V18wPWNhc3Q9KEhJTUMpCi1PU19JbW1TZXRDb21wb3NpdGlvbkZvbnRXXzE9Ci0KLU9TX0ltbVNldENvbXBvc2l0aW9uV2luZG93PQotT1NfSW1tU2V0Q29tcG9zaXRpb25XaW5kb3dfMD1jYXN0PShISU1DKQotT1NfSW1tU2V0Q29tcG9zaXRpb25XaW5kb3dfMT0KLQotT1NfSW1tU2V0Q29udmVyc2lvblN0YXR1cz0KLU9TX0ltbVNldENvbnZlcnNpb25TdGF0dXNfMD1jYXN0PShISU1DKQotT1NfSW1tU2V0Q29udmVyc2lvblN0YXR1c18xPQotT1NfSW1tU2V0Q29udmVyc2lvblN0YXR1c18yPQotCi1PU19JbW1TZXRPcGVuU3RhdHVzPQotT1NfSW1tU2V0T3BlblN0YXR1c18wPWNhc3Q9KEhJTUMpCi1PU19JbW1TZXRPcGVuU3RhdHVzXzE9Ci0KLU9TX0luaXRDb21tb25Db250cm9scz0KLQotT1NfSW5pdENvbW1vbkNvbnRyb2xzRXg9Ci1PU19Jbml0Q29tbW9uQ29udHJvbHNFeF8wPQotCi1PU19JbnNlcnRNZW51QT0KLU9TX0luc2VydE1lbnVBXzA9Y2FzdD0oSE1FTlUpCi1PU19JbnNlcnRNZW51QV8xPQotT1NfSW5zZXJ0TWVudUFfMj0KLU9TX0luc2VydE1lbnVBXzM9Ci1PU19JbnNlcnRNZW51QV80PQotCi1PU19JbnNlcnRNZW51SXRlbUE9Ci1PU19JbnNlcnRNZW51SXRlbUFfMD1jYXN0PShITUVOVSkKLU9TX0luc2VydE1lbnVJdGVtQV8xPQotT1NfSW5zZXJ0TWVudUl0ZW1BXzI9Ci1PU19JbnNlcnRNZW51SXRlbUFfMz0KLQotT1NfSW5zZXJ0TWVudUl0ZW1XPQotT1NfSW5zZXJ0TWVudUl0ZW1XXzA9Y2FzdD0oSE1FTlUpCi1PU19JbnNlcnRNZW51SXRlbVdfMT0KLU9TX0luc2VydE1lbnVJdGVtV18yPQotT1NfSW5zZXJ0TWVudUl0ZW1XXzM9Y2FzdD0oTFBNRU5VSVRFTUlORk9XKQotCi1PU19JbnNlcnRNZW51Vz0KLU9TX0luc2VydE1lbnVXXzA9Y2FzdD0oSE1FTlUpCi1PU19JbnNlcnRNZW51V18xPQotT1NfSW5zZXJ0TWVudVdfMj0KLU9TX0luc2VydE1lbnVXXzM9Ci1PU19JbnNlcnRNZW51V180PQotCi1PU19JbnRlcm5ldFNldE9wdGlvbj0KLU9TX0ludGVybmV0U2V0T3B0aW9uXzA9Y2FzdD0oSElOVEVSTkVUKQotT1NfSW50ZXJuZXRTZXRPcHRpb25fMT0KLU9TX0ludGVybmV0U2V0T3B0aW9uXzI9Y2FzdD0oTFBWT0lEKQotT1NfSW50ZXJuZXRTZXRPcHRpb25fMz0KLQotT1NfSW50ZXJzZWN0Q2xpcFJlY3Q9Ci1PU19JbnRlcnNlY3RDbGlwUmVjdF8wPWNhc3Q9SERDCi1PU19JbnRlcnNlY3RDbGlwUmVjdF8xPQotT1NfSW50ZXJzZWN0Q2xpcFJlY3RfMj0KLU9TX0ludGVyc2VjdENsaXBSZWN0XzM9Ci1PU19JbnRlcnNlY3RDbGlwUmVjdF80PQotCi1PU19JbnRlcnNlY3RSZWN0PQotT1NfSW50ZXJzZWN0UmVjdF8wPWZsYWdzPW5vX2luCi1PU19JbnRlcnNlY3RSZWN0XzE9ZmxhZ3M9bm9fb3V0Ci1PU19JbnRlcnNlY3RSZWN0XzI9ZmxhZ3M9bm9fb3V0Ci0KLU9TX0ludmFsaWRhdGVSZWN0PQotT1NfSW52YWxpZGF0ZVJlY3RfMD1jYXN0PShIV05EKQotT1NfSW52YWxpZGF0ZVJlY3RfMT0KLU9TX0ludmFsaWRhdGVSZWN0XzI9Ci0KLU9TX0ludmFsaWRhdGVSZ249Ci1PU19JbnZhbGlkYXRlUmduXzA9Y2FzdD0oSFdORCkKLU9TX0ludmFsaWRhdGVSZ25fMT1jYXN0PShIUkdOKQotT1NfSW52YWxpZGF0ZVJnbl8yPQotCi1PU19Jc0FwcFRoZW1lZD1mbGFncz1keW5hbWljCi0KLU9TX0lzREJDU0xlYWRCeXRlPQotT1NfSXNEQkNTTGVhZEJ5dGVfMD0KLQotT1NfSXNIdW5nQXBwV2luZG93PWZsYWdzPWR5bmFtaWMKLU9TX0lzSHVuZ0FwcFdpbmRvd18wPWNhc3Q9SFdORAotCi1PU19Jc0ljb25pYz0KLU9TX0lzSWNvbmljXzA9Y2FzdD0oSFdORCkKLQotT1NfSXNQUEM9ZmxhZ3M9bm9fZ2VuCi0KLU9TX0lzU1A9ZmxhZ3M9bm9fZ2VuCi0KLU9TX0lzV2luZG93RW5hYmxlZD0KLU9TX0lzV2luZG93RW5hYmxlZF8wPWNhc3Q9KEhXTkQpCi0KLU9TX0lzV2luZG93VmlzaWJsZT0KLU9TX0lzV2luZG93VmlzaWJsZV8wPWNhc3Q9KEhXTkQpCi0KLU9TX0lzWm9vbWVkPQotT1NfSXNab29tZWRfMD1jYXN0PShIV05EKQotCi1PU19LaWxsVGltZXI9Ci1PU19LaWxsVGltZXJfMD1jYXN0PShIV05EKQotT1NfS2lsbFRpbWVyXzE9Ci0KLU9TX0xpbmVUbz0KLU9TX0xpbmVUb18wPWNhc3Q9KEhEQykKLU9TX0xpbmVUb18xPQotT1NfTGluZVRvXzI9Ci0KLU9TX0xvYWRCaXRtYXBBPQotT1NfTG9hZEJpdG1hcEFfMD1jYXN0PShISU5TVEFOQ0UpCi1PU19Mb2FkQml0bWFwQV8xPWNhc3Q9KExQU1RSKQotCi1PU19Mb2FkQml0bWFwVz0KLU9TX0xvYWRCaXRtYXBXXzA9Y2FzdD0oSElOU1RBTkNFKQotT1NfTG9hZEJpdG1hcFdfMT1jYXN0PShMUFdTVFIpCi0KLU9TX0xvYWRDdXJzb3JBPQotT1NfTG9hZEN1cnNvckFfMD1jYXN0PShISU5TVEFOQ0UpCi1PU19Mb2FkQ3Vyc29yQV8xPWNhc3Q9KExQU1RSKQotCi1PU19Mb2FkQ3Vyc29yVz0KLU9TX0xvYWRDdXJzb3JXXzA9Y2FzdD0oSElOU1RBTkNFKQotT1NfTG9hZEN1cnNvcldfMT1jYXN0PShMUFdTVFIpCi0KLU9TX0xvYWRJY29uQT0KLU9TX0xvYWRJY29uQV8wPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0xvYWRJY29uQV8xPWNhc3Q9KExQU1RSKQotCi1PU19Mb2FkSWNvblc9Ci1PU19Mb2FkSWNvbldfMD1jYXN0PShISU5TVEFOQ0UpCi1PU19Mb2FkSWNvbldfMT1jYXN0PShMUFdTVFIpCi0KLU9TX0xvYWRJbWFnZUFfX0lJSUlJST0KLU9TX0xvYWRJbWFnZUFfX0lJSUlJSV8wPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0xvYWRJbWFnZUFfX0lJSUlJSV8xPWNhc3Q9KExQU1RSKQotT1NfTG9hZEltYWdlQV9fSUlJSUlJXzI9Ci1PU19Mb2FkSW1hZ2VBX19JSUlJSUlfMz0KLU9TX0xvYWRJbWFnZUFfX0lJSUlJSV80PQotT1NfTG9hZEltYWdlQV9fSUlJSUlJXzU9Ci0KLU9TX0xvYWRJbWFnZUFfX0lfM0JJSUlJPQotT1NfTG9hZEltYWdlQV9fSV8zQklJSUlfMD1jYXN0PShISU5TVEFOQ0UpCi1PU19Mb2FkSW1hZ2VBX19JXzNCSUlJSV8xPWNhc3Q9KExQU1RSKQotT1NfTG9hZEltYWdlQV9fSV8zQklJSUlfMj0KLU9TX0xvYWRJbWFnZUFfX0lfM0JJSUlJXzM9Ci1PU19Mb2FkSW1hZ2VBX19JXzNCSUlJSV80PQotT1NfTG9hZEltYWdlQV9fSV8zQklJSUlfNT0KLQotT1NfTG9hZEltYWdlV19fSUlJSUlJPQotT1NfTG9hZEltYWdlV19fSUlJSUlJXzA9Y2FzdD0oSElOU1RBTkNFKQotT1NfTG9hZEltYWdlV19fSUlJSUlJXzE9Y2FzdD0oTFBXU1RSKQotT1NfTG9hZEltYWdlV19fSUlJSUlJXzI9Ci1PU19Mb2FkSW1hZ2VXX19JSUlJSUlfMz0KLU9TX0xvYWRJbWFnZVdfX0lJSUlJSV80PQotT1NfTG9hZEltYWdlV19fSUlJSUlJXzU9Ci0KLU9TX0xvYWRJbWFnZVdfX0lfM0NJSUlJPQotT1NfTG9hZEltYWdlV19fSV8zQ0lJSUlfMD1jYXN0PShISU5TVEFOQ0UpCi1PU19Mb2FkSW1hZ2VXX19JXzNDSUlJSV8xPWNhc3Q9KExQV1NUUikKLU9TX0xvYWRJbWFnZVdfX0lfM0NJSUlJXzI9Ci1PU19Mb2FkSW1hZ2VXX19JXzNDSUlJSV8zPQotT1NfTG9hZEltYWdlV19fSV8zQ0lJSUlfND0KLU9TX0xvYWRJbWFnZVdfX0lfM0NJSUlJXzU9Ci0KLU9TX0xvYWRMaWJyYXJ5QT0KLU9TX0xvYWRMaWJyYXJ5QV8wPWNhc3Q9KExQU1RSKQotCi1PU19Mb2FkTGlicmFyeVc9Ci1PU19Mb2FkTGlicmFyeVdfMD1jYXN0PShMUFdTVFIpCi0KLU9TX0xvYWRTdHJpbmdBPQotT1NfTG9hZFN0cmluZ0FfMD1jYXN0PUhJTlNUQU5DRQotT1NfTG9hZFN0cmluZ0FfMT0KLU9TX0xvYWRTdHJpbmdBXzI9Y2FzdD1MUFNUUgotT1NfTG9hZFN0cmluZ0FfMz0KLQotT1NfTG9hZFN0cmluZ1c9Ci1PU19Mb2FkU3RyaW5nV18wPWNhc3Q9SElOU1RBTkNFCi1PU19Mb2FkU3RyaW5nV18xPQotT1NfTG9hZFN0cmluZ1dfMj1jYXN0PUxQV1NUUgotT1NfTG9hZFN0cmluZ1dfMz0KLQotT1NfTG9jYWxGcmVlPQotT1NfTG9jYWxGcmVlXzA9Y2FzdD1ITE9DQUwKLQotT1NfTUNJV25kUmVnaXN0ZXJDbGFzcz0KLU9TX01DSVduZFJlZ2lzdGVyQ2xhc3NfMD1jYXN0PShISU5TVEFOQ0UpCi0KLU9TX01hcFZpcnR1YWxLZXlBPQotT1NfTWFwVmlydHVhbEtleUFfMD0KLU9TX01hcFZpcnR1YWxLZXlBXzE9Ci0KLU9TX01hcFZpcnR1YWxLZXlXPQotT1NfTWFwVmlydHVhbEtleVdfMD0KLU9TX01hcFZpcnR1YWxLZXlXXzE9Ci0KLU9TX01hcFdpbmRvd1BvaW50c19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UXzJJPQotT1NfTWFwV2luZG93UG9pbnRzX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUE9JTlRfMklfMD1jYXN0PShIV05EKQotT1NfTWFwV2luZG93UG9pbnRzX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUE9JTlRfMklfMT1jYXN0PShIV05EKQotT1NfTWFwV2luZG93UG9pbnRzX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUE9JTlRfMklfMj1jYXN0PShMUFBPSU5UKQotT1NfTWFwV2luZG93UG9pbnRzX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUE9JTlRfMklfMz0KLQotT1NfTWFwV2luZG93UG9pbnRzX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yST0KLU9TX01hcFdpbmRvd1BvaW50c19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMD1jYXN0PShIV05EKQotT1NfTWFwV2luZG93UG9pbnRzX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySV8xPWNhc3Q9KEhXTkQpCi1PU19NYXBXaW5kb3dQb2ludHNfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJXzI9Y2FzdD0oTFBQT0lOVCkKLU9TX01hcFdpbmRvd1BvaW50c19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMz0KLQotT1NfTWVzc2FnZUJlZXA9Ci1PU19NZXNzYWdlQmVlcF8wPQotCi1PU19NZXNzYWdlQm94QT0KLU9TX01lc3NhZ2VCb3hBXzA9Y2FzdD0oSFdORCkKLU9TX01lc3NhZ2VCb3hBXzE9Y2FzdD0oTFBTVFIpCi1PU19NZXNzYWdlQm94QV8yPWNhc3Q9KExQU1RSKQotT1NfTWVzc2FnZUJveEFfMz0KLQotT1NfTWVzc2FnZUJveFc9Ci1PU19NZXNzYWdlQm94V18wPWNhc3Q9KEhXTkQpCi1PU19NZXNzYWdlQm94V18xPWNhc3Q9KExQV1NUUikKLU9TX01lc3NhZ2VCb3hXXzI9Y2FzdD0oTFBXU1RSKQotT1NfTWVzc2FnZUJveFdfMz0KLQotT1NfTW9uaXRvckZyb21XaW5kb3c9ZmxhZ3M9ZHluYW1pYwotT1NfTW9uaXRvckZyb21XaW5kb3dfMD0KLU9TX01vbml0b3JGcm9tV2luZG93XzE9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RST1BGSUxFU18yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RST1BGSUxFU18ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRFJPUEZJTEVTXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RST1BGSUxFU18ySV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9HUkFESUVOVF8xUkVDVF8yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0dSQURJRU5UXzFSRUNUXzJJXzA9Y2FzdD0oUFZPSUQpCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9HUkFESUVOVF8xUkVDVF8ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9HUkFESUVOVF8xUkVDVF8ySV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9LRVlCRElOUFVUXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfS0VZQkRJTlBVVF8ySV8wPWNhc3Q9UFZPSUQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0tFWUJESU5QVVRfMklfMT1jYXN0PUNPTlNUIFZPSUQgKixmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0tFWUJESU5QVVRfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEFfMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UQV8ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEFfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEFfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFdfMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UV18ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFdfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFdfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUVBU1VSRUlURU1TVFJVQ1RfMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NRUFTVVJFSVRFTVNUUlVDVF8ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUVBU1VSRUlURU1TVFJVQ1RfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUVBU1VSRUlURU1TVFJVQ1RfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUlOTUFYSU5GT18yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01JTk1BWElORk9fMklfMD1jYXN0PVBWT0lECi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NSU5NQVhJTkZPXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01JTk1BWElORk9fMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTU9VU0VJTlBVVF8yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01PVVNFSU5QVVRfMklfMD1jYXN0PVBWT0lECi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NT1VTRUlOUFVUXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01PVVNFSU5QVVRfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJXzA9Y2FzdD0oUFZPSUQpCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZDVVNUT01EUkFXXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkNVU1RPTURSQVdfMklfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZDVVNUT01EUkFXXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZDVVNUT01EUkFXXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZESVNQSU5GT18yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZESVNQSU5GT18ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkRJU1BJTkZPXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZESVNQSU5GT18ySV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9BXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPQV8ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPQV8ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9BXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFRESVNQSU5GT1dfMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9XXzJJXzA9Y2FzdD0oUFZPSUQpCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9XXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFRESVNQSU5GT1dfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkNVU1RPTURSQVdfMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRWQ1VTVE9NRFJBV18ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkNVU1RPTURSQVdfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkNVU1RPTURSQVdfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkRJU1BJTkZPXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkRJU1BJTkZPXzJJXzA9Y2FzdD1QVk9JRAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkRJU1BJTkZPXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkRJU1BJTkZPXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJXzA9Y2FzdD0oUFZPSUQpCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFJJVkVSVEVYXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFJJVkVSVEVYXzJJXzA9Y2FzdD0oUFZPSUQpCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UUklWRVJURVhfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFJJVkVSVEVYXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzJJXzA9Y2FzdD0oUFZPSUQpCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfV0lORE9XUE9TXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfV0lORE9XUE9TXzJJXzA9Y2FzdD0oUFZPSUQpCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9XSU5ET1dQT1NfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfV0lORE9XUE9TXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lfM0JJPQotT1NfTW92ZU1lbW9yeV9fSV8zQklfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lfM0JJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX01vdmVNZW1vcnlfX0lfM0JJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lfM0NJPQotT1NfTW92ZU1lbW9yeV9fSV8zQ0lfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lfM0NJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX01vdmVNZW1vcnlfX0lfM0NJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lfM0RJPQotT1NfTW92ZU1lbW9yeV9fSV8zRElfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lfM0RJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX01vdmVNZW1vcnlfX0lfM0RJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lfM0ZJPQotT1NfTW92ZU1lbW9yeV9fSV8zRklfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lfM0ZJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX01vdmVNZW1vcnlfX0lfM0ZJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lfM0lJPQotT1NfTW92ZU1lbW9yeV9fSV8zSUlfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lfM0lJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX01vdmVNZW1vcnlfX0lfM0lJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lfM1NJPQotT1NfTW92ZU1lbW9yeV9fSV8zU0lfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lfM1NJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX01vdmVNZW1vcnlfX0lfM1NJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQSU5GT0hFQURFUl8yXzNCST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQSU5GT0hFQURFUl8yXzNCSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CSVRNQVBJTkZPSEVBREVSXzJfM0JJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQSU5GT0hFQURFUl8yXzNCSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RSQVdJVEVNU1RSVUNUXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRFJBV0lURU1TVFJVQ1RfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RSQVdJVEVNU1RSVUNUXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRFJBV0lURU1TVFJVQ1RfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRVhUTE9HUEVOXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRVhUTE9HUEVOXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9FWFRMT0dQRU5fMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9FWFRMT0dQRU5fMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERJVEVNXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERJVEVNXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRElURU1fMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRElURU1fMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSEVMUElORk9fMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRUxQSU5GT18ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSEVMUElORk9fMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRUxQSU5GT18ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UQV8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRBXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UQV8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRBXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRXXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFdfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRXXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFdfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUVBU1VSRUlURU1TVFJVQ1RfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NRUFTVVJFSVRFTVNUUlVDVF8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUVBU1VSRUlURU1TVFJVQ1RfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NRUFTVVJFSVRFTVNUUlVDVF8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NSU5NQVhJTkZPXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUlOTUFYSU5GT18ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUlOTUFYSU5GT18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01JTk1BWElORk9fMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1DVVNUT01EUkFXXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1DVVNUT01EUkFXXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUNVU1RPTURSQVdfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUNVU1RPTURSQVdfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1IRFJfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUhEUl8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1IRFJfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUhEUl8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUhFQURFUl8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NSEVBREVSXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUhFQURFUl8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NSEVBREVSXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTElOS18ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTElOS18ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MSU5LXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MSU5LXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTElTVFZJRVdfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxJU1RWSUVXXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxJU1RWSUVXXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MSVNUVklFV18ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWQ1VTVE9NRFJBV18ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZDVVNUT01EUkFXXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWQ1VTVE9NRFJBV18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZDVVNUT01EUkFXXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZESVNQSU5GT18ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZESVNQSU5GT18ySUlfMD1jYXN0PShQVk9JRCxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWRElTUElORk9fMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZESVNQSU5GT18ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWRklORElURU1fMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWRklORElURU1fMklJXzA9Y2FzdD1QVk9JRCxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWRklORElURU1fMklJXzE9Y2FzdD1DT05TVCBWT0lEICoKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkZJTkRJVEVNXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NUkVCQVJDSEVWUk9OXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1SRUJBUkNIRVZST05fMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NUkVCQVJDSEVWUk9OXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1SRUJBUkNIRVZST05fMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1SRUJBUkNISUxEU0laRV8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NUkVCQVJDSElMRFNJWkVfMklJXzA9Y2FzdD1QVk9JRCxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVJFQkFSQ0hJTERTSVpFXzJJSV8xPWNhc3Q9Q09OU1QgVk9JRCAqCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NUkVCQVJDSElMRFNJWkVfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1SR0lORk9fMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVJHSU5GT18ySUlfMD1jYXN0PVBWT0lELGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NUkdJTkZPXzJJSV8xPWNhc3Q9Q09OU1QgVk9JRCAqCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NUkdJTkZPXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVEJIT1RJVEVNXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UQkhPVElURU1fMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVEJIT1RJVEVNXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UQkhPVElURU1fMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UT09MQkFSXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UT09MQkFSXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRPT0xCQVJfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRPT0xCQVJfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPQV8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFRESVNQSU5GT0FfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFRESVNQSU5GT0FfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9BXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFRESVNQSU5GT1dfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9XXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9XXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPV18ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRWQ1VTVE9NRFJBV18ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZDVVNUT01EUkFXXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRWQ1VTVE9NRFJBV18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZDVVNUT01EUkFXXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZESVNQSU5GT18ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZESVNQSU5GT18ySUlfMD1jYXN0PVBWT0lELGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZESVNQSU5GT18ySUlfMT1jYXN0PUNPTlNUIFZPSUQgKgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRWRElTUElORk9fMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1VUERPV05fMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVVQRE9XTl8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1VUERPV05fMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVVQRE9XTl8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9QT0lOVF8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UXzJJSV8wPWNhc3Q9UFZPSUQsZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUE9JTlRfMklJXzE9Y2FzdD1DT05TVCBWT0lEICoKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUE9JTlRfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFJVEVNXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFJVEVNXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMUlURU1fMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMUlURU1fMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFMT0dBVFRSXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFMT0dBVFRSXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMUxPR0FUVFJfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMUxPR0FUVFJfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFQUk9QRVJUSUVTXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFQUk9QRVJUSUVTXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMVBST1BFUlRJRVNfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMVBST1BFUlRJRVNfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEVYVE1FVFJJQ0FfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9URVhUTUVUUklDQV8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEVYVE1FVFJJQ0FfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9URVhUTUVUUklDQV8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9URVhUTUVUUklDV18ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUNXXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9URVhUTUVUUklDV18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUNXXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSVRFTV8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSVRFTV8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJVEVNXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJVEVNXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVURBQ0NFTF8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9XSU5ET1dQT1NfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9XSU5ET1dQT1NfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1dJTkRPV1BPU18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1dJTkRPV1BPU18ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fXzNCSUk9Ci1PU19Nb3ZlTWVtb3J5X19fM0JJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fXzNCSUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19fM0JJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19fM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0FDQ0VMXzJJPQotT1NfTW92ZU1lbW9yeV9fXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9BQ0NFTF8ySV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9BQ0NFTF8ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19fM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0FDQ0VMXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX18zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQSU5GT0hFQURFUl8yST0KLU9TX01vdmVNZW1vcnlfX18zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQSU5GT0hFQURFUl8ySV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CSVRNQVBJTkZPSEVBREVSXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX18zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQSU5GT0hFQURFUl8ySV8yPQotCi1PU19Nb3ZlTWVtb3J5X19fM0NJST0KLU9TX01vdmVNZW1vcnlfX18zQ0lJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1PU19Nb3ZlTWVtb3J5X19fM0NJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX18zQ0lJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX18zRElJPQotT1NfTW92ZU1lbW9yeV9fXzNESUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4gY3JpdGljYWwKLU9TX01vdmVNZW1vcnlfX18zRElJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fXzNESUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fXzNGSUk9Ci1PU19Nb3ZlTWVtb3J5X19fM0ZJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fXzNGSUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19fM0ZJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19fM0lJST0KLU9TX01vdmVNZW1vcnlfX18zSUlJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1PU19Nb3ZlTWVtb3J5X19fM0lJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX18zSUlJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX18zU0lJPQotT1NfTW92ZU1lbW9yeV9fXzNTSUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4gY3JpdGljYWwKLU9TX01vdmVNZW1vcnlfX18zU0lJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fXzNTSUlfMj0KLQotT1NfTW92ZVRvRXg9Ci1PU19Nb3ZlVG9FeF8wPWNhc3Q9KEhEQykKLU9TX01vdmVUb0V4XzE9Ci1PU19Nb3ZlVG9FeF8yPQotT1NfTW92ZVRvRXhfMz1jYXN0PShMUFBPSU5UKQotCi1PU19Nc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzRXg9Ci1PU19Nc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzRXhfMD1jYXN0PShEV09SRCkKLU9TX01zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHNFeF8xPWNhc3Q9KExQSEFORExFKQotT1NfTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4XzI9Y2FzdD0oRFdPUkQpCi1PU19Nc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzRXhfMz1jYXN0PShEV09SRCkKLU9TX01zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHNFeF80PWNhc3Q9KERXT1JEKQotCi1PU19NdWx0aUJ5dGVUb1dpZGVDaGFyX19JSUlJXzNDST0KLU9TX011bHRpQnl0ZVRvV2lkZUNoYXJfX0lJSUlfM0NJXzA9Ci1PU19NdWx0aUJ5dGVUb1dpZGVDaGFyX19JSUlJXzNDSV8xPQotT1NfTXVsdGlCeXRlVG9XaWRlQ2hhcl9fSUlJSV8zQ0lfMj1jYXN0PShMUENTVFIpCi1PU19NdWx0aUJ5dGVUb1dpZGVDaGFyX19JSUlJXzNDSV8zPQotT1NfTXVsdGlCeXRlVG9XaWRlQ2hhcl9fSUlJSV8zQ0lfND1jYXN0PShMUFdTVFIpLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1PU19NdWx0aUJ5dGVUb1dpZGVDaGFyX19JSUlJXzNDSV81PQotCi1PU19NdWx0aUJ5dGVUb1dpZGVDaGFyX19JSV8zQklfM0NJPQotT1NfTXVsdGlCeXRlVG9XaWRlQ2hhcl9fSUlfM0JJXzNDSV8wPQotT1NfTXVsdGlCeXRlVG9XaWRlQ2hhcl9fSUlfM0JJXzNDSV8xPQotT1NfTXVsdGlCeXRlVG9XaWRlQ2hhcl9fSUlfM0JJXzNDSV8yPWNhc3Q9KExQQ1NUUiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19NdWx0aUJ5dGVUb1dpZGVDaGFyX19JSV8zQklfM0NJXzM9Ci1PU19NdWx0aUJ5dGVUb1dpZGVDaGFyX19JSV8zQklfM0NJXzQ9Y2FzdD0oTFBXU1RSKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfTXVsdGlCeXRlVG9XaWRlQ2hhcl9fSUlfM0JJXzNDSV81PQotCi1PU19Ob3RpZnlXaW5FdmVudD1mbGFncz1keW5hbWljCi1PU19Ob3RpZnlXaW5FdmVudF8wPWNhc3Q9RFdPUkQKLU9TX05vdGlmeVdpbkV2ZW50XzE9Y2FzdD1IV05ECi1PU19Ob3RpZnlXaW5FdmVudF8yPWNhc3Q9TE9ORwotT1NfTm90aWZ5V2luRXZlbnRfMz1jYXN0PUxPTkcKLQotT1NfT2Zmc2V0UmVjdD0KLU9TX09mZnNldFJlY3RfMD0KLU9TX09mZnNldFJlY3RfMT0KLU9TX09mZnNldFJlY3RfMj0KLQotT1NfT2Zmc2V0UmduPQotT1NfT2Zmc2V0UmduXzA9Y2FzdD1IUkdOCi1PU19PZmZzZXRSZ25fMT0KLU9TX09mZnNldFJnbl8yPQotCi1PU19PbGVJbml0aWFsaXplPQotT1NfT2xlSW5pdGlhbGl6ZV8wPWNhc3Q9KExQVk9JRCkKLQotT1NfT2xlVW5pbml0aWFsaXplPQotCi1PU19PcGVuQ2xpcGJvYXJkPQotT1NfT3BlbkNsaXBib2FyZF8wPWNhc3Q9KEhXTkQpCi0KLU9TX09wZW5UaGVtZURhdGE9ZmxhZ3M9ZHluYW1pYwotT1NfT3BlblRoZW1lRGF0YV8wPWNhc3Q9SFdORAotT1NfT3BlblRoZW1lRGF0YV8xPWNhc3Q9TFBDV1NUUgotCi1PU19QUklNQVJZTEFOR0lEPQotT1NfUFJJTUFSWUxBTkdJRF8wPQotCi1PU19QYXRCbHQ9Ci1PU19QYXRCbHRfMD1jYXN0PShIREMpCi1PU19QYXRCbHRfMT0KLU9TX1BhdEJsdF8yPQotT1NfUGF0Qmx0XzM9Ci1PU19QYXRCbHRfND0KLU9TX1BhdEJsdF81PQotCi1PU19QZWVrTWVzc2FnZUE9Ci1PU19QZWVrTWVzc2FnZUFfMD0KLU9TX1BlZWtNZXNzYWdlQV8xPWNhc3Q9KEhXTkQpCi1PU19QZWVrTWVzc2FnZUFfMj0KLU9TX1BlZWtNZXNzYWdlQV8zPQotT1NfUGVla01lc3NhZ2VBXzQ9Ci0KLU9TX1BlZWtNZXNzYWdlVz0KLU9TX1BlZWtNZXNzYWdlV18wPQotT1NfUGVla01lc3NhZ2VXXzE9Y2FzdD0oSFdORCkKLU9TX1BlZWtNZXNzYWdlV18yPQotT1NfUGVla01lc3NhZ2VXXzM9Ci1PU19QZWVrTWVzc2FnZVdfND0KLQotT1NfUGllPQotT1NfUGllXzA9Y2FzdD0oSERDKQotT1NfUGllXzE9Ci1PU19QaWVfMj0KLU9TX1BpZV8zPQotT1NfUGllXzQ9Ci1PU19QaWVfNT0KLU9TX1BpZV82PQotT1NfUGllXzc9Ci1PU19QaWVfOD0KLQotT1NfUG9seWdvbj0KLU9TX1BvbHlnb25fMD1jYXN0PShIREMpCi1PU19Qb2x5Z29uXzE9Y2FzdD0oQ09OU1QgUE9JTlQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19Qb2x5Z29uXzI9Ci0KLU9TX1BvbHlsaW5lPQotT1NfUG9seWxpbmVfMD1jYXN0PShIREMpCi1PU19Qb2x5bGluZV8xPWNhc3Q9KENPTlNUIFBPSU5UICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfUG9seWxpbmVfMj0KLQotT1NfUG9zdE1lc3NhZ2VBPQotT1NfUG9zdE1lc3NhZ2VBXzA9Y2FzdD0oSFdORCkKLU9TX1Bvc3RNZXNzYWdlQV8xPQotT1NfUG9zdE1lc3NhZ2VBXzI9Y2FzdD0oV1BBUkFNKQotT1NfUG9zdE1lc3NhZ2VBXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19Qb3N0TWVzc2FnZVc9Ci1PU19Qb3N0TWVzc2FnZVdfMD1jYXN0PShIV05EKQotT1NfUG9zdE1lc3NhZ2VXXzE9Ci1PU19Qb3N0TWVzc2FnZVdfMj1jYXN0PShXUEFSQU0pCi1PU19Qb3N0TWVzc2FnZVdfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1Bvc3RUaHJlYWRNZXNzYWdlQT0KLU9TX1Bvc3RUaHJlYWRNZXNzYWdlQV8wPQotT1NfUG9zdFRocmVhZE1lc3NhZ2VBXzE9Ci1PU19Qb3N0VGhyZWFkTWVzc2FnZUFfMj1jYXN0PShXUEFSQU0pCi1PU19Qb3N0VGhyZWFkTWVzc2FnZUFfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1Bvc3RUaHJlYWRNZXNzYWdlVz0KLU9TX1Bvc3RUaHJlYWRNZXNzYWdlV18wPQotT1NfUG9zdFRocmVhZE1lc3NhZ2VXXzE9Ci1PU19Qb3N0VGhyZWFkTWVzc2FnZVdfMj1jYXN0PShXUEFSQU0pCi1PU19Qb3N0VGhyZWFkTWVzc2FnZVdfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1ByaW50RGxnQT0KLU9TX1ByaW50RGxnQV8wPQotCi1PU19QcmludERsZ1c9Ci1PU19QcmludERsZ1dfMD1jYXN0PShMUFBSSU5URExHVykKLQotT1NfUHRJblJlY3Q9Ci1PU19QdEluUmVjdF8wPWZsYWdzPW5vX291dAotT1NfUHRJblJlY3RfMT1mbGFncz1ub19vdXQgc3RydWN0Ci0KLU9TX1B0SW5SZWdpb249Ci1PU19QdEluUmVnaW9uXzA9Y2FzdD0oSFJHTikKLU9TX1B0SW5SZWdpb25fMT0KLU9TX1B0SW5SZWdpb25fMj0KLQotT1NfUmVhbGl6ZVBhbGV0dGU9Ci1PU19SZWFsaXplUGFsZXR0ZV8wPWNhc3Q9KEhEQykKLQotT1NfUmVjdEluUmVnaW9uPQotT1NfUmVjdEluUmVnaW9uXzA9Y2FzdD0oSFJHTikKLU9TX1JlY3RJblJlZ2lvbl8xPWZsYWdzPW5vX291dAotCi1PU19SZWN0YW5nbGU9Ci1PU19SZWN0YW5nbGVfMD1jYXN0PShIREMpCi1PU19SZWN0YW5nbGVfMT0KLU9TX1JlY3RhbmdsZV8yPQotT1NfUmVjdGFuZ2xlXzM9Ci1PU19SZWN0YW5nbGVfND0KLQotT1NfUmVkcmF3V2luZG93PQotT1NfUmVkcmF3V2luZG93XzA9Y2FzdD0oSFdORCkKLU9TX1JlZHJhd1dpbmRvd18xPQotT1NfUmVkcmF3V2luZG93XzI9Y2FzdD0oSFJHTikKLU9TX1JlZHJhd1dpbmRvd18zPQotCi1PU19SZWdDbG9zZUtleT0KLU9TX1JlZ0Nsb3NlS2V5XzA9Y2FzdD0oSEtFWSkKLQotT1NfUmVnRW51bUtleUV4QT0KLU9TX1JlZ0VudW1LZXlFeEFfMD1jYXN0PShIS0VZKQotT1NfUmVnRW51bUtleUV4QV8xPQotT1NfUmVnRW51bUtleUV4QV8yPWNhc3Q9KExQU1RSKQotT1NfUmVnRW51bUtleUV4QV8zPQotT1NfUmVnRW51bUtleUV4QV80PQotT1NfUmVnRW51bUtleUV4QV81PWNhc3Q9KExQU1RSKQotT1NfUmVnRW51bUtleUV4QV82PQotT1NfUmVnRW51bUtleUV4QV83PQotCi1PU19SZWdFbnVtS2V5RXhXPQotT1NfUmVnRW51bUtleUV4V18wPWNhc3Q9KEhLRVkpCi1PU19SZWdFbnVtS2V5RXhXXzE9Ci1PU19SZWdFbnVtS2V5RXhXXzI9Y2FzdD0oTFBXU1RSKQotT1NfUmVnRW51bUtleUV4V18zPQotT1NfUmVnRW51bUtleUV4V180PQotT1NfUmVnRW51bUtleUV4V181PWNhc3Q9KExQV1NUUikKLU9TX1JlZ0VudW1LZXlFeFdfNj0KLU9TX1JlZ0VudW1LZXlFeFdfNz0KLQotT1NfUmVnT3BlbktleUV4QT0KLU9TX1JlZ09wZW5LZXlFeEFfMD1jYXN0PShIS0VZKQotT1NfUmVnT3BlbktleUV4QV8xPWNhc3Q9KExQU1RSKQotT1NfUmVnT3BlbktleUV4QV8yPQotT1NfUmVnT3BlbktleUV4QV8zPQotT1NfUmVnT3BlbktleUV4QV80PWNhc3Q9KFBIS0VZKQotCi1PU19SZWdPcGVuS2V5RXhXPQotT1NfUmVnT3BlbktleUV4V18wPWNhc3Q9KEhLRVkpCi1PU19SZWdPcGVuS2V5RXhXXzE9Y2FzdD0oTFBXU1RSKQotT1NfUmVnT3BlbktleUV4V18yPQotT1NfUmVnT3BlbktleUV4V18zPQotT1NfUmVnT3BlbktleUV4V180PWNhc3Q9KFBIS0VZKQotCi1PU19SZWdRdWVyeUluZm9LZXlBPQotT1NfUmVnUXVlcnlJbmZvS2V5QV8wPWNhc3Q9KEhLRVkpCi1PU19SZWdRdWVyeUluZm9LZXlBXzE9Y2FzdD0oTFBTVFIpCi1PU19SZWdRdWVyeUluZm9LZXlBXzI9Ci1PU19SZWdRdWVyeUluZm9LZXlBXzM9Y2FzdD0oTFBEV09SRCkKLU9TX1JlZ1F1ZXJ5SW5mb0tleUFfND0KLU9TX1JlZ1F1ZXJ5SW5mb0tleUFfNT0KLU9TX1JlZ1F1ZXJ5SW5mb0tleUFfNj0KLU9TX1JlZ1F1ZXJ5SW5mb0tleUFfNz0KLU9TX1JlZ1F1ZXJ5SW5mb0tleUFfOD0KLU9TX1JlZ1F1ZXJ5SW5mb0tleUFfOT0KLU9TX1JlZ1F1ZXJ5SW5mb0tleUFfMTA9Ci1PU19SZWdRdWVyeUluZm9LZXlBXzExPWNhc3Q9KFBGSUxFVElNRSkKLQotT1NfUmVnUXVlcnlJbmZvS2V5Vz0KLU9TX1JlZ1F1ZXJ5SW5mb0tleVdfMD1jYXN0PShIS0VZKQotT1NfUmVnUXVlcnlJbmZvS2V5V18xPWNhc3Q9KExQV1NUUikKLU9TX1JlZ1F1ZXJ5SW5mb0tleVdfMj0KLU9TX1JlZ1F1ZXJ5SW5mb0tleVdfMz1jYXN0PShMUERXT1JEKQotT1NfUmVnUXVlcnlJbmZvS2V5V180PQotT1NfUmVnUXVlcnlJbmZvS2V5V181PQotT1NfUmVnUXVlcnlJbmZvS2V5V182PQotT1NfUmVnUXVlcnlJbmZvS2V5V183PQotT1NfUmVnUXVlcnlJbmZvS2V5V184PQotT1NfUmVnUXVlcnlJbmZvS2V5V185PQotT1NfUmVnUXVlcnlJbmZvS2V5V18xMD0KLU9TX1JlZ1F1ZXJ5SW5mb0tleVdfMTE9Y2FzdD0oUEZJTEVUSU1FKQotCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zQl8zST0KLU9TX1JlZ1F1ZXJ5VmFsdWVFeEFfX0lfM0JJXzNJXzNCXzNJXzA9Y2FzdD0oSEtFWSkKLU9TX1JlZ1F1ZXJ5VmFsdWVFeEFfX0lfM0JJXzNJXzNCXzNJXzE9Y2FzdD0oTFBTVFIpCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zQl8zSV8yPWNhc3Q9KExQRFdPUkQpCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zQl8zSV8zPQotT1NfUmVnUXVlcnlWYWx1ZUV4QV9fSV8zQklfM0lfM0JfM0lfND1jYXN0PShMUEJZVEUpCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zQl8zSV81PQotCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zSV8zST0KLU9TX1JlZ1F1ZXJ5VmFsdWVFeEFfX0lfM0JJXzNJXzNJXzNJXzA9Y2FzdD0oSEtFWSkKLU9TX1JlZ1F1ZXJ5VmFsdWVFeEFfX0lfM0JJXzNJXzNJXzNJXzE9Y2FzdD0oTFBTVFIpCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zSV8zSV8yPWNhc3Q9KExQRFdPUkQpCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zSV8zSV8zPQotT1NfUmVnUXVlcnlWYWx1ZUV4QV9fSV8zQklfM0lfM0lfM0lfND1jYXN0PShMUEJZVEUpCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zSV8zSV81PQotCi1PU19SZWdRdWVyeVZhbHVlRXhXX19JXzNDSV8zSV8zQ18zST0KLU9TX1JlZ1F1ZXJ5VmFsdWVFeFdfX0lfM0NJXzNJXzNDXzNJXzA9Y2FzdD0oSEtFWSkKLU9TX1JlZ1F1ZXJ5VmFsdWVFeFdfX0lfM0NJXzNJXzNDXzNJXzE9Y2FzdD0oTFBXU1RSKQotT1NfUmVnUXVlcnlWYWx1ZUV4V19fSV8zQ0lfM0lfM0NfM0lfMj1jYXN0PShMUERXT1JEKQotT1NfUmVnUXVlcnlWYWx1ZUV4V19fSV8zQ0lfM0lfM0NfM0lfMz0KLU9TX1JlZ1F1ZXJ5VmFsdWVFeFdfX0lfM0NJXzNJXzNDXzNJXzQ9Y2FzdD0oTFBCWVRFKQotT1NfUmVnUXVlcnlWYWx1ZUV4V19fSV8zQ0lfM0lfM0NfM0lfNT0KLQotT1NfUmVnUXVlcnlWYWx1ZUV4V19fSV8zQ0lfM0lfM0lfM0k9Ci1PU19SZWdRdWVyeVZhbHVlRXhXX19JXzNDSV8zSV8zSV8zSV8wPWNhc3Q9KEhLRVkpCi1PU19SZWdRdWVyeVZhbHVlRXhXX19JXzNDSV8zSV8zSV8zSV8xPWNhc3Q9KExQV1NUUikKLU9TX1JlZ1F1ZXJ5VmFsdWVFeFdfX0lfM0NJXzNJXzNJXzNJXzI9Y2FzdD0oTFBEV09SRCkKLU9TX1JlZ1F1ZXJ5VmFsdWVFeFdfX0lfM0NJXzNJXzNJXzNJXzM9Ci1PU19SZWdRdWVyeVZhbHVlRXhXX19JXzNDSV8zSV8zSV8zSV80PWNhc3Q9KExQQllURSkKLU9TX1JlZ1F1ZXJ5VmFsdWVFeFdfX0lfM0NJXzNJXzNJXzNJXzU9Ci0KLU9TX1JlZ2lzdGVyQ2xhc3NBPQotT1NfUmVnaXN0ZXJDbGFzc0FfMD0KLQotT1NfUmVnaXN0ZXJDbGFzc1c9Ci1PU19SZWdpc3RlckNsYXNzV18wPWNhc3Q9KExQV05EQ0xBU1NXKQotCi1PU19SZWdpc3RlckNsaXBib2FyZEZvcm1hdEE9Ci1PU19SZWdpc3RlckNsaXBib2FyZEZvcm1hdEFfMD1jYXN0PShMUFRTVFIpCi0KLU9TX1JlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0Vz0KLU9TX1JlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0V18wPWNhc3Q9KExQV1NUUikKLQotT1NfUmVnaXN0ZXJXaW5kb3dNZXNzYWdlQT0KLU9TX1JlZ2lzdGVyV2luZG93TWVzc2FnZUFfMD1jYXN0PShMUFRTVFIpCi0KLU9TX1JlZ2lzdGVyV2luZG93TWVzc2FnZVc9Ci1PU19SZWdpc3RlcldpbmRvd01lc3NhZ2VXXzA9Y2FzdD0oTFBXU1RSKQotCi1PU19SZWxlYXNlQ2FwdHVyZT0KLQotT1NfUmVsZWFzZURDPQotT1NfUmVsZWFzZURDXzA9Y2FzdD0oSFdORCkKLU9TX1JlbGVhc2VEQ18xPWNhc3Q9KEhEQykKLQotT1NfUmVtb3ZlTWVudT0KLU9TX1JlbW92ZU1lbnVfMD1jYXN0PShITUVOVSkKLU9TX1JlbW92ZU1lbnVfMT0KLU9TX1JlbW92ZU1lbnVfMj0KLQotT1NfUmVtb3ZlUHJvcEE9Ci1PU19SZW1vdmVQcm9wQV8wPWNhc3Q9SFdORAotT1NfUmVtb3ZlUHJvcEFfMT1jYXN0PUxQQ1RTVFIKLQotT1NfUmVtb3ZlUHJvcFc9Ci1PU19SZW1vdmVQcm9wV18wPWNhc3Q9SFdORAotT1NfUmVtb3ZlUHJvcFdfMT1jYXN0PShMUENXU1RSKQotCi1PU19SZXN0b3JlREM9Ci1PU19SZXN0b3JlRENfMD1jYXN0PShIREMpCi1PU19SZXN0b3JlRENfMT1jYXN0PShpbnQpCi0KLU9TX1JvdW5kUmVjdD0KLU9TX1JvdW5kUmVjdF8wPWNhc3Q9KEhEQykKLU9TX1JvdW5kUmVjdF8xPQotT1NfUm91bmRSZWN0XzI9Ci1PU19Sb3VuZFJlY3RfMz0KLU9TX1JvdW5kUmVjdF80PQotT1NfUm91bmRSZWN0XzU9Ci1PU19Sb3VuZFJlY3RfNj0KLQotT1NfU0hCcm93c2VGb3JGb2xkZXJBPQotT1NfU0hCcm93c2VGb3JGb2xkZXJBXzA9Ci0KLU9TX1NIQnJvd3NlRm9yRm9sZGVyVz0KLU9TX1NIQnJvd3NlRm9yRm9sZGVyV18wPWNhc3Q9KExQQlJPV1NFSU5GT1cpCi0KLU9TX1NIQ3JlYXRlTWVudUJhcj0KLU9TX1NIQ3JlYXRlTWVudUJhcl8wPWNhc3Q9KFBTSE1FTlVCQVJJTkZPKQotCi1PU19TSEdldE1hbGxvYz0KLU9TX1NIR2V0TWFsbG9jXzA9Y2FzdD0oTFBNQUxMT0MgKikKLQotT1NfU0hHZXRQYXRoRnJvbUlETGlzdEE9Ci1PU19TSEdldFBhdGhGcm9tSURMaXN0QV8wPWNhc3Q9KExQQ0lURU1JRExJU1QpCi1PU19TSEdldFBhdGhGcm9tSURMaXN0QV8xPWNhc3Q9KExQU1RSKQotCi1PU19TSEdldFBhdGhGcm9tSURMaXN0Vz0KLU9TX1NIR2V0UGF0aEZyb21JRExpc3RXXzA9Y2FzdD0oTFBDSVRFTUlETElTVCkKLU9TX1NIR2V0UGF0aEZyb21JRExpc3RXXzE9Y2FzdD0oTFBXU1RSKQotCi1PU19TSEhhbmRsZVdNU2V0dGluZ0NoYW5nZT0KLU9TX1NISGFuZGxlV01TZXR0aW5nQ2hhbmdlXzA9Y2FzdD0oSFdORCkKLU9TX1NISGFuZGxlV01TZXR0aW5nQ2hhbmdlXzE9Ci1PU19TSEhhbmRsZVdNU2V0dGluZ0NoYW5nZV8yPQotT1NfU0hIYW5kbGVXTVNldHRpbmdDaGFuZ2VfMz0KLQotT1NfU0hSZWNvZ25pemVHZXN0dXJlPQotT1NfU0hSZWNvZ25pemVHZXN0dXJlXzA9Ci0KLU9TX1NIU2VuZEJhY2tUb0ZvY3VzV2luZG93PQotT1NfU0hTZW5kQmFja1RvRm9jdXNXaW5kb3dfMD0KLU9TX1NIU2VuZEJhY2tUb0ZvY3VzV2luZG93XzE9Ci1PU19TSFNlbmRCYWNrVG9Gb2N1c1dpbmRvd18yPQotCi1PU19TSFNldEFwcEtleVduZEFzc29jPQotT1NfU0hTZXRBcHBLZXlXbmRBc3NvY18wPWNhc3Q9KEJZVEUpCi1PU19TSFNldEFwcEtleVduZEFzc29jXzE9Y2FzdD0oSFdORCkKLQotT1NfU0hTaXBQcmVmZXJlbmNlPQotT1NfU0hTaXBQcmVmZXJlbmNlXzA9Y2FzdD0oSFdORCkKLU9TX1NIU2lwUHJlZmVyZW5jZV8xPQotCi1PU19TYXZlREM9Ci1PU19TYXZlRENfMD1jYXN0PShIREMpCi0KLU9TX1NjcmVlblRvQ2xpZW50PQotT1NfU2NyZWVuVG9DbGllbnRfMD1jYXN0PShIV05EKQotT1NfU2NyZWVuVG9DbGllbnRfMT0KLQotT1NfU2NyaXB0QnJlYWs9Ci1PU19TY3JpcHRCcmVha18wPWNhc3Q9Y29uc3QgV0NIQVIgKgotT1NfU2NyaXB0QnJlYWtfMT0KLU9TX1NjcmlwdEJyZWFrXzI9Y2FzdD1jb25zdCBTQ1JJUFRfQU5BTFlTSVMgKgotT1NfU2NyaXB0QnJlYWtfMz1jYXN0PVNDUklQVF9MT0dBVFRSICoKLQotT1NfU2NyaXB0Q1B0b1g9Ci1PU19TY3JpcHRDUHRvWF8wPQotT1NfU2NyaXB0Q1B0b1hfMT0KLU9TX1NjcmlwdENQdG9YXzI9Ci1PU19TY3JpcHRDUHRvWF8zPQotT1NfU2NyaXB0Q1B0b1hfND1jYXN0PWNvbnN0IFdPUkQgKgotT1NfU2NyaXB0Q1B0b1hfNT1jYXN0PWNvbnN0IFNDUklQVF9WSVNBVFRSICoKLU9TX1NjcmlwdENQdG9YXzY9Y2FzdD1jb25zdCBpbnQgKgotT1NfU2NyaXB0Q1B0b1hfNz1jYXN0PWNvbnN0IFNDUklQVF9BTkFMWVNJUyAqCi1PU19TY3JpcHRDUHRvWF84PWNhc3Q9aW50ICoKLQotT1NfU2NyaXB0Q2FjaGVHZXRIZWlnaHQ9Ci1PU19TY3JpcHRDYWNoZUdldEhlaWdodF8wPWNhc3Q9SERDCi1PU19TY3JpcHRDYWNoZUdldEhlaWdodF8xPWNhc3Q9KFNDUklQVF9DQUNIRSAqKQotT1NfU2NyaXB0Q2FjaGVHZXRIZWlnaHRfMj1jYXN0PWxvbmcgKgotCi1PU19TY3JpcHRGcmVlQ2FjaGU9Ci1PU19TY3JpcHRGcmVlQ2FjaGVfMD1jYXN0PShTQ1JJUFRfQ0FDSEUgKikKLQotT1NfU2NyaXB0R2V0Rm9udFByb3BlcnRpZXM9Ci1PU19TY3JpcHRHZXRGb250UHJvcGVydGllc18wPWNhc3Q9SERDCi1PU19TY3JpcHRHZXRGb250UHJvcGVydGllc18xPWNhc3Q9U0NSSVBUX0NBQ0hFICoKLU9TX1NjcmlwdEdldEZvbnRQcm9wZXJ0aWVzXzI9Y2FzdD1TQ1JJUFRfRk9OVFBST1BFUlRJRVMgKgotCi1PU19TY3JpcHRHZXRMb2dpY2FsV2lkdGhzPQotT1NfU2NyaXB0R2V0TG9naWNhbFdpZHRoc18wPWNhc3Q9Y29uc3QgU0NSSVBUX0FOQUxZU0lTICoKLU9TX1NjcmlwdEdldExvZ2ljYWxXaWR0aHNfMT0KLU9TX1NjcmlwdEdldExvZ2ljYWxXaWR0aHNfMj0KLU9TX1NjcmlwdEdldExvZ2ljYWxXaWR0aHNfMz1jYXN0PWNvbnN0IGludCAqCi1PU19TY3JpcHRHZXRMb2dpY2FsV2lkdGhzXzQ9Y2FzdD1jb25zdCBXT1JEICoKLU9TX1NjcmlwdEdldExvZ2ljYWxXaWR0aHNfNT1jYXN0PShjb25zdCBTQ1JJUFRfVklTQVRUUiAqKQotT1NfU2NyaXB0R2V0TG9naWNhbFdpZHRoc182PWNhc3Q9KGludCAqKQotCi1PU19TY3JpcHRHZXRQcm9wZXJ0aWVzPQotT1NfU2NyaXB0R2V0UHJvcGVydGllc18wPWNhc3Q9Y29uc3QgU0NSSVBUX1BST1BFUlRJRVMgKioqCi1PU19TY3JpcHRHZXRQcm9wZXJ0aWVzXzE9Y2FzdD1pbnQgKgotCi1PU19TY3JpcHRJdGVtaXplPQotT1NfU2NyaXB0SXRlbWl6ZV8wPWNhc3Q9Y29uc3QgV0NIQVIgKgotT1NfU2NyaXB0SXRlbWl6ZV8xPQotT1NfU2NyaXB0SXRlbWl6ZV8yPQotT1NfU2NyaXB0SXRlbWl6ZV8zPWNhc3Q9Y29uc3QgU0NSSVBUX0NPTlRST0wgKgotT1NfU2NyaXB0SXRlbWl6ZV80PWNhc3Q9Y29uc3QgU0NSSVBUX1NUQVRFICoKLU9TX1NjcmlwdEl0ZW1pemVfNT1jYXN0PVNDUklQVF9JVEVNICoKLU9TX1NjcmlwdEl0ZW1pemVfNj1jYXN0PWludCAqCi0KLU9TX1NjcmlwdEp1c3RpZnk9Ci1PU19TY3JpcHRKdXN0aWZ5XzA9Y2FzdD0oU0NSSVBUX1ZJU0FUVFIgKikKLU9TX1NjcmlwdEp1c3RpZnlfMT1jYXN0PWNvbnN0IGludCAqCi1PU19TY3JpcHRKdXN0aWZ5XzI9Ci1PU19TY3JpcHRKdXN0aWZ5XzM9Ci1PU19TY3JpcHRKdXN0aWZ5XzQ9Ci1PU19TY3JpcHRKdXN0aWZ5XzU9Y2FzdD1pbnQgKgotCi1PU19TY3JpcHRMYXlvdXQ9Ci1PU19TY3JpcHRMYXlvdXRfMD0KLU9TX1NjcmlwdExheW91dF8xPWNhc3Q9Y29uc3QgQllURSAqCi1PU19TY3JpcHRMYXlvdXRfMj1jYXN0PWludCAqCi1PU19TY3JpcHRMYXlvdXRfMz1jYXN0PWludCAqCi0KLU9TX1NjcmlwdFBsYWNlPQotT1NfU2NyaXB0UGxhY2VfMD1jYXN0PUhEQwotT1NfU2NyaXB0UGxhY2VfMT1jYXN0PVNDUklQVF9DQUNIRSAqCi1PU19TY3JpcHRQbGFjZV8yPWNhc3Q9Y29uc3QgV09SRCAqCi1PU19TY3JpcHRQbGFjZV8zPQotT1NfU2NyaXB0UGxhY2VfND1jYXN0PWNvbnN0IFNDUklQVF9WSVNBVFRSICoKLU9TX1NjcmlwdFBsYWNlXzU9Y2FzdD1TQ1JJUFRfQU5BTFlTSVMgKgotT1NfU2NyaXB0UGxhY2VfNj1jYXN0PWludCAqCi1PU19TY3JpcHRQbGFjZV83PWNhc3Q9R09GRlNFVCAqCi1PU19TY3JpcHRQbGFjZV84PWNhc3Q9QUJDICoKLQotT1NfU2NyaXB0U2hhcGU9Ci1PU19TY3JpcHRTaGFwZV8wPWNhc3Q9SERDCi1PU19TY3JpcHRTaGFwZV8xPWNhc3Q9U0NSSVBUX0NBQ0hFICoKLU9TX1NjcmlwdFNoYXBlXzI9Y2FzdD1jb25zdCBXQ0hBUiAqCi1PU19TY3JpcHRTaGFwZV8zPQotT1NfU2NyaXB0U2hhcGVfND0KLU9TX1NjcmlwdFNoYXBlXzU9Y2FzdD0oU0NSSVBUX0FOQUxZU0lTICopCi1PU19TY3JpcHRTaGFwZV82PWNhc3Q9V09SRCAqCi1PU19TY3JpcHRTaGFwZV83PWNhc3Q9V09SRCAqCi1PU19TY3JpcHRTaGFwZV84PWNhc3Q9U0NSSVBUX1ZJU0FUVFIgKgotT1NfU2NyaXB0U2hhcGVfOT1jYXN0PWludCAqCi0KLU9TX1NjcmlwdFRleHRPdXQ9Ci1PU19TY3JpcHRUZXh0T3V0XzA9Y2FzdD1jb25zdCBIREMKLU9TX1NjcmlwdFRleHRPdXRfMT1jYXN0PVNDUklQVF9DQUNIRSAqCi1PU19TY3JpcHRUZXh0T3V0XzI9Ci1PU19TY3JpcHRUZXh0T3V0XzM9Ci1PU19TY3JpcHRUZXh0T3V0XzQ9Ci1PU19TY3JpcHRUZXh0T3V0XzU9Y2FzdD1jb25zdCBSRUNUICoKLU9TX1NjcmlwdFRleHRPdXRfNj1jYXN0PWNvbnN0IFNDUklQVF9BTkFMWVNJUyAqCi1PU19TY3JpcHRUZXh0T3V0Xzc9Y2FzdD1jb25zdCBXQ0hBUiAqCi1PU19TY3JpcHRUZXh0T3V0Xzg9Ci1PU19TY3JpcHRUZXh0T3V0Xzk9Y2FzdD1jb25zdCBXT1JEICoKLU9TX1NjcmlwdFRleHRPdXRfMTA9Ci1PU19TY3JpcHRUZXh0T3V0XzExPWNhc3Q9Y29uc3QgaW50ICoKLU9TX1NjcmlwdFRleHRPdXRfMTI9Y2FzdD1jb25zdCBpbnQgKgotT1NfU2NyaXB0VGV4dE91dF8xMz1jYXN0PWNvbnN0IEdPRkZTRVQgKgotCi1PU19TY3JpcHRYdG9DUD0KLU9TX1NjcmlwdFh0b0NQXzA9Ci1PU19TY3JpcHRYdG9DUF8xPQotT1NfU2NyaXB0WHRvQ1BfMj0KLU9TX1NjcmlwdFh0b0NQXzM9Y2FzdD0oY29uc3QgV09SRCAqKQotT1NfU2NyaXB0WHRvQ1BfND1jYXN0PWNvbnN0IFNDUklQVF9WSVNBVFRSICoKLU9TX1NjcmlwdFh0b0NQXzU9Y2FzdD1jb25zdCBpbnQgKgotT1NfU2NyaXB0WHRvQ1BfNj1jYXN0PWNvbnN0IFNDUklQVF9BTkFMWVNJUyAqCi1PU19TY3JpcHRYdG9DUF83PWNhc3Q9aW50ICoKLU9TX1NjcmlwdFh0b0NQXzg9Y2FzdD1pbnQgKgotCi1PU19TY3JvbGxXaW5kb3dFeD0KLU9TX1Njcm9sbFdpbmRvd0V4XzA9Y2FzdD0oSFdORCkKLU9TX1Njcm9sbFdpbmRvd0V4XzE9Ci1PU19TY3JvbGxXaW5kb3dFeF8yPQotT1NfU2Nyb2xsV2luZG93RXhfMz0KLU9TX1Njcm9sbFdpbmRvd0V4XzQ9Ci1PU19TY3JvbGxXaW5kb3dFeF81PWNhc3Q9KEhSR04pCi1PU19TY3JvbGxXaW5kb3dFeF82PQotT1NfU2Nyb2xsV2luZG93RXhfNz0KLQotT1NfU2VsZWN0Q2xpcFJnbj0KLU9TX1NlbGVjdENsaXBSZ25fMD1jYXN0PShIREMpCi1PU19TZWxlY3RDbGlwUmduXzE9Y2FzdD0oSFJHTikKLQotT1NfU2VsZWN0T2JqZWN0PQotT1NfU2VsZWN0T2JqZWN0XzA9Y2FzdD0oSERDKQotT1NfU2VsZWN0T2JqZWN0XzE9Y2FzdD0oSEdESU9CSikKLQotT1NfU2VsZWN0UGFsZXR0ZT0KLU9TX1NlbGVjdFBhbGV0dGVfMD1jYXN0PShIREMpCi1PU19TZWxlY3RQYWxldHRlXzE9Y2FzdD0oSFBBTEVUVEUpCi1PU19TZWxlY3RQYWxldHRlXzI9Ci0KLU9TX1NlbmRJbnB1dD0KLU9TX1NlbmRJbnB1dF8wPQotT1NfU2VuZElucHV0XzE9Y2FzdD1MUElOUFVUCi1PU19TZW5kSW5wdXRfMj0KLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlJPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlJXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJSV8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlJXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlJXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQlVUVE9OXzFJTUFHRUxJU1RfMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CVVRUT05fMUlNQUdFTElTVF8yXzA9Y2FzdD1IV05ECi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQlVUVE9OXzFJTUFHRUxJU1RfMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JVVFRPTl8xSU1BR0VMSVNUXzJfMj1jYXN0PVdQQVJBTQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JVVFRPTl8xSU1BR0VMSVNUXzJfMz1jYXN0PUxQQVJBTQotCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERJVEVNXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERJVEVNXzJfMD1jYXN0PUhXTkQKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRElURU1fMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hESVRFTV8yXzI9Y2FzdD1XUEFSQU0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRElURU1fMl8zPWNhc3Q9TFBBUkFNCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRExBWU9VVF8yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hETEFZT1VUXzJfMD1jYXN0PUhXTkQKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRExBWU9VVF8yXzE9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERMQVlPVVRfMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRExBWU9VVF8yXzM9Y2FzdD1MUEFSQU0KLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xJVEVNXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTElURU1fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTElURU1fMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xJVEVNXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTElURU1fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWQ09MVU1OXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZDT0xVTU5fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZDT0xVTU5fMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWQ09MVU1OXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZDT0xVTU5fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSElUVEVTVElORk9fMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVkhJVFRFU1RJTkZPXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSElUVEVTVElORk9fMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSElUVEVTVElORk9fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVkhJVFRFU1RJTkZPXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU1fMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU1fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZJVEVNXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU1fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU1fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01BUkdJTlNfMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NQVJHSU5TXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01BUkdJTlNfMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01BUkdJTlNfMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NQVJHSU5TXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUJBUkJBTkRJTkZPXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVCQVJCQU5ESU5GT18yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUJBUkJBTkRJTkZPXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUJBUkJBTkRJTkZPXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVCQVJCQU5ESU5GT18yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzE9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMD1jYXN0PUhXTkQKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMj1jYXN0PVdQQVJBTQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMl8zPWNhc3Q9TFBBUkFNCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTklORk9fMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTklORk9fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05JTkZPXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTklORk9fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTklORk9fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05fMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RDSVRFTV8yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RDSVRFTV8yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQ0lURU1fMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RDSVRFTV8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RDSVRFTV8yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVE9PTElORk9fMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UT09MSU5GT18yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UT09MSU5GT18yXzE9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVE9PTElORk9fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UT09MSU5GT18yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZISVRURVNUSU5GT18yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSElUVEVTVElORk9fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZISVRURVNUSU5GT18yXzE9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZISVRURVNUSU5GT18yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSElUVEVTVElORk9fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSU5TRVJUU1RSVUNUXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJTlNFUlRTVFJVQ1RfMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJTlNFUlRTVFJVQ1RfMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSU5TRVJUU1RSVUNUXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJTlNFUlRTVFJVQ1RfMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSVRFTV8yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSVRFTV8yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1fMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSVRFTV8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSVRFTV8yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVURBQ0NFTF8yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVURBQ0NFTF8yXzE9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVURBQ0NFTF8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM0I9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSV8zQl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSV8zQl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM0JfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSV8zQl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM0k9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSV8zSV8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSV8zSV8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM0lfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSV8zSV8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM1M9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSV8zU18wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSV8zU18xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM1NfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSV8zU18zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSV8zSUk9Ci1PU19TZW5kTWVzc2FnZUFfX0lJXzNJSV8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJXzNJSV8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSV8zSUlfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJXzNJSV8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSV8zSV8zST0KLU9TX1NlbmRNZXNzYWdlQV9fSUlfM0lfM0lfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSV8zSV8zSV8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSV8zSV8zSV8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlfM0lfM0lfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJST0KLU9TX1NlbmRNZXNzYWdlV19fSUlJSV8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUlfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJSV8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJSV8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JVVFRPTl8xSU1BR0VMSVNUXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQlVUVE9OXzFJTUFHRUxJU1RfMl8wPWNhc3Q9SFdORAotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JVVFRPTl8xSU1BR0VMSVNUXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CVVRUT05fMUlNQUdFTElTVF8yXzI9Y2FzdD1XUEFSQU0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CVVRUT05fMUlNQUdFTElTVF8yXzM9Y2FzdD1MUEFSQU0KLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hESVRFTV8yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hESVRFTV8yXzA9Y2FzdD1IV05ECi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERJVEVNXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRElURU1fMl8yPWNhc3Q9V1BBUkFNCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERJVEVNXzJfMz1jYXN0PUxQQVJBTQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERMQVlPVVRfMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRExBWU9VVF8yXzA9Y2FzdD1IV05ECi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERMQVlPVVRfMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hETEFZT1VUXzJfMj1jYXN0PVdQQVJBTQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hETEFZT1VUXzJfMz1jYXN0PUxQQVJBTQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTElURU1fMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MSVRFTV8yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MSVRFTV8yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTElURU1fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MSVRFTV8yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZDT0xVTU5fMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVkNPTFVNTl8yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVkNPTFVNTl8yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZDT0xVTU5fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVkNPTFVNTl8yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZISVRURVNUSU5GT18yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSElUVEVTVElORk9fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZISVRURVNUSU5GT18yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZISVRURVNUSU5GT18yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSElUVEVTVElORk9fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSVRFTV8yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSVRFTV8yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU1fMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSVRFTV8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSVRFTV8yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUFSR0lOU18yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01BUkdJTlNfMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUFSR0lOU18yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUFSR0lOU18yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01BUkdJTlNfMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQkFSQkFORElORk9fMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUJBUkJBTkRJTkZPXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQkFSQkFORElORk9fMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQkFSQkFORElORk9fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUJBUkJBTkRJTkZPXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0laRV8yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMl8wPWNhc3Q9SFdORAotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMl8yPWNhc3Q9V1BBUkFNCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0laRV8yXzM9Y2FzdD1MUEFSQU0KLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OSU5GT18yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OSU5GT18yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTklORk9fMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OSU5GT18yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OSU5GT18yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05fMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTl8yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTl8yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTl8yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVENJVEVNXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVENJVEVNXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RDSVRFTV8yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVENJVEVNXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVENJVEVNXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UT09MSU5GT18yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RPT0xJTkZPXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RPT0xJTkZPXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UT09MSU5GT18yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RPT0xJTkZPXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVkhJVFRFU1RJTkZPXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZISVRURVNUSU5GT18yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVkhJVFRFU1RJTkZPXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVkhJVFRFU1RJTkZPXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZISVRURVNUSU5GT18yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJTlNFUlRTVFJVQ1RfMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklOU0VSVFNUUlVDVF8yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklOU0VSVFNUUlVDVF8yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJTlNFUlRTVFJVQ1RfMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklOU0VSVFNUUlVDVF8yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJVEVNXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJVEVNXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSVRFTV8yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJVEVNXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJVEVNXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVURBQ0NFTF8yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVURBQ0NFTF8yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSV8zQz0KLU9TX1NlbmRNZXNzYWdlV19fSUlJXzNDXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJXzNDXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSV8zQ18yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJXzNDXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSV8zST0KLU9TX1NlbmRNZXNzYWdlV19fSUlJXzNJXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJXzNJXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSV8zSV8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJXzNJXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSV8zUz0KLU9TX1NlbmRNZXNzYWdlV19fSUlJXzNTXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJXzNTXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSV8zU18yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJXzNTXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJXzNJST0KLU9TX1NlbmRNZXNzYWdlV19fSUlfM0lJXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlfM0lJXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJXzNJSV8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlfM0lJXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJXzNJXzNJPWZsYWdzPW5vX2dlbgotT1NfU2VuZE1lc3NhZ2VXX19JSV8zSV8zSV8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJXzNJXzNJXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJXzNJXzNJXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSV8zSV8zSV8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2V0QWN0aXZlV2luZG93PQotT1NfU2V0QWN0aXZlV2luZG93XzA9Y2FzdD0oSFdORCkKLQotT1NfU2V0QmtDb2xvcj0KLU9TX1NldEJrQ29sb3JfMD1jYXN0PShIREMpCi1PU19TZXRCa0NvbG9yXzE9Y2FzdD0oQ09MT1JSRUYpCi0KLU9TX1NldEJrTW9kZT0KLU9TX1NldEJrTW9kZV8wPWNhc3Q9KEhEQykKLU9TX1NldEJrTW9kZV8xPQotCi1PU19TZXRCcnVzaE9yZ0V4PQotT1NfU2V0QnJ1c2hPcmdFeF8wPWNhc3Q9SERDCi1PU19TZXRCcnVzaE9yZ0V4XzE9Ci1PU19TZXRCcnVzaE9yZ0V4XzI9Ci1PU19TZXRCcnVzaE9yZ0V4XzM9Y2FzdD0oTFBQT0lOVCkKLQotT1NfU2V0Q2FwdHVyZT0KLU9TX1NldENhcHR1cmVfMD1jYXN0PShIV05EKQotCi1PU19TZXRDYXJldFBvcz0KLU9TX1NldENhcmV0UG9zXzA9Ci1PU19TZXRDYXJldFBvc18xPQotCi1PU19TZXRDbGlwYm9hcmREYXRhPQotT1NfU2V0Q2xpcGJvYXJkRGF0YV8wPQotT1NfU2V0Q2xpcGJvYXJkRGF0YV8xPWNhc3Q9KEhBTkRMRSkKLQotT1NfU2V0Q3Vyc29yPQotT1NfU2V0Q3Vyc29yXzA9Y2FzdD0oSENVUlNPUikKLQotT1NfU2V0Q3Vyc29yUG9zPQotT1NfU2V0Q3Vyc29yUG9zXzA9Ci1PU19TZXRDdXJzb3JQb3NfMT0KLQotT1NfU2V0RElCQ29sb3JUYWJsZT0KLU9TX1NldERJQkNvbG9yVGFibGVfMD1jYXN0PShIREMpCi1PU19TZXRESUJDb2xvclRhYmxlXzE9Ci1PU19TZXRESUJDb2xvclRhYmxlXzI9Ci1PU19TZXRESUJDb2xvclRhYmxlXzM9Y2FzdD0oUkdCUVVBRCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLQotT1NfU2V0RXJyb3JNb2RlPQotT1NfU2V0RXJyb3JNb2RlXzA9Ci0KLU9TX1NldEZvY3VzPQotT1NfU2V0Rm9jdXNfMD1jYXN0PShIV05EKQotCi1PU19TZXRGb3JlZ3JvdW5kV2luZG93PQotT1NfU2V0Rm9yZWdyb3VuZFdpbmRvd18wPWNhc3Q9KEhXTkQpCi0KLU9TX1NldEdyYXBoaWNzTW9kZT0KLU9TX1NldEdyYXBoaWNzTW9kZV8wPWNhc3Q9SERDCi1PU19TZXRHcmFwaGljc01vZGVfMT0KLQotT1NfU2V0TGF5b3V0PWZsYWdzPWR5bmFtaWMKLU9TX1NldExheW91dF8wPWNhc3Q9KEhEQykKLU9TX1NldExheW91dF8xPWNhc3Q9KERXT1JEKQotCi1PU19TZXRNZW51PQotT1NfU2V0TWVudV8wPWNhc3Q9KEhXTkQpCi1PU19TZXRNZW51XzE9Y2FzdD0oSE1FTlUpCi0KLU9TX1NldE1lbnVEZWZhdWx0SXRlbT0KLU9TX1NldE1lbnVEZWZhdWx0SXRlbV8wPWNhc3Q9KEhNRU5VKQotT1NfU2V0TWVudURlZmF1bHRJdGVtXzE9Ci1PU19TZXRNZW51RGVmYXVsdEl0ZW1fMj0KLQotT1NfU2V0TWVudUluZm89ZmxhZ3M9ZHluYW1pYwotT1NfU2V0TWVudUluZm9fMD1jYXN0PShITUVOVSkKLU9TX1NldE1lbnVJbmZvXzE9Ci0KLU9TX1NldE1lbnVJdGVtSW5mb0E9Ci1PU19TZXRNZW51SXRlbUluZm9BXzA9Y2FzdD0oSE1FTlUpCi1PU19TZXRNZW51SXRlbUluZm9BXzE9Ci1PU19TZXRNZW51SXRlbUluZm9BXzI9Ci1PU19TZXRNZW51SXRlbUluZm9BXzM9Ci0KLU9TX1NldE1lbnVJdGVtSW5mb1c9Ci1PU19TZXRNZW51SXRlbUluZm9XXzA9Y2FzdD0oSE1FTlUpCi1PU19TZXRNZW51SXRlbUluZm9XXzE9Ci1PU19TZXRNZW51SXRlbUluZm9XXzI9Ci1PU19TZXRNZW51SXRlbUluZm9XXzM9Y2FzdD0oTFBNRU5VSVRFTUlORk9XKQotCi1PU19TZXRNZXRhUmduPQotT1NfU2V0TWV0YVJnbl8wPWNhc3Q9SERDCi0KLU9TX1NldFBhbGV0dGVFbnRyaWVzPQotT1NfU2V0UGFsZXR0ZUVudHJpZXNfMD1jYXN0PShIUEFMRVRURSkKLU9TX1NldFBhbGV0dGVFbnRyaWVzXzE9Ci1PU19TZXRQYWxldHRlRW50cmllc18yPQotT1NfU2V0UGFsZXR0ZUVudHJpZXNfMz1jYXN0PShQQUxFVFRFRU5UUlkgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi0KLU9TX1NldFBhcmVudD0KLU9TX1NldFBhcmVudF8wPWNhc3Q9KEhXTkQpCi1PU19TZXRQYXJlbnRfMT1jYXN0PShIV05EKQotCi1PU19TZXRQaXhlbD0KLU9TX1NldFBpeGVsXzA9Y2FzdD0oSERDKQotT1NfU2V0UGl4ZWxfMT0KLU9TX1NldFBpeGVsXzI9Ci1PU19TZXRQaXhlbF8zPQotCi1PU19TZXRQb2x5RmlsbE1vZGU9Ci1PU19TZXRQb2x5RmlsbE1vZGVfMD1jYXN0PUhEQwotT1NfU2V0UG9seUZpbGxNb2RlXzE9Ci0KLU9TX1NldFByb3BBPQotT1NfU2V0UHJvcEFfMD1jYXN0PUhXTkQKLU9TX1NldFByb3BBXzE9Y2FzdD1MUENUU1RSCi1PU19TZXRQcm9wQV8yPWNhc3Q9KEhBTkRMRSkKLQotT1NfU2V0UHJvcFc9Ci1PU19TZXRQcm9wV18wPWNhc3Q9SFdORAotT1NfU2V0UHJvcFdfMT1jYXN0PShMUENXU1RSKQotT1NfU2V0UHJvcFdfMj1jYXN0PUhBTkRMRQotCi1PU19TZXRST1AyPQotT1NfU2V0Uk9QMl8wPWNhc3Q9KEhEQykKLU9TX1NldFJPUDJfMT0KLQotT1NfU2V0UmVjdD0KLU9TX1NldFJlY3RfMD1mbGFncz1ub19pbgotT1NfU2V0UmVjdF8xPQotT1NfU2V0UmVjdF8yPQotT1NfU2V0UmVjdF8zPQotT1NfU2V0UmVjdF80PQotCi1PU19TZXRSZWN0UmduPQotT1NfU2V0UmVjdFJnbl8wPWNhc3Q9KEhSR04pCi1PU19TZXRSZWN0UmduXzE9Ci1PU19TZXRSZWN0UmduXzI9Ci1PU19TZXRSZWN0UmduXzM9Ci1PU19TZXRSZWN0UmduXzQ9Ci0KLU9TX1NldFNjcm9sbEluZm89Ci1PU19TZXRTY3JvbGxJbmZvXzA9Y2FzdD0oSFdORCkKLU9TX1NldFNjcm9sbEluZm9fMT0KLU9TX1NldFNjcm9sbEluZm9fMj0KLU9TX1NldFNjcm9sbEluZm9fMz0KLQotT1NfU2V0U3RyZXRjaEJsdE1vZGU9Ci1PU19TZXRTdHJldGNoQmx0TW9kZV8wPWNhc3Q9KEhEQykKLU9TX1NldFN0cmV0Y2hCbHRNb2RlXzE9Ci0KLU9TX1NldFRleHRBbGlnbj0KLU9TX1NldFRleHRBbGlnbl8wPWNhc3Q9KEhEQykKLU9TX1NldFRleHRBbGlnbl8xPQotCi1PU19TZXRUZXh0Q29sb3I9Ci1PU19TZXRUZXh0Q29sb3JfMD1jYXN0PShIREMpCi1PU19TZXRUZXh0Q29sb3JfMT1jYXN0PShDT0xPUlJFRikKLQotT1NfU2V0VGltZXI9Ci1PU19TZXRUaW1lcl8wPWNhc3Q9KEhXTkQpCi1PU19TZXRUaW1lcl8xPQotT1NfU2V0VGltZXJfMj0KLU9TX1NldFRpbWVyXzM9Y2FzdD0oVElNRVJQUk9DKQotCi1PU19TZXRXaW5kb3dMb25nQT0KLU9TX1NldFdpbmRvd0xvbmdBXzA9Y2FzdD0oSFdORCkKLU9TX1NldFdpbmRvd0xvbmdBXzE9Ci1PU19TZXRXaW5kb3dMb25nQV8yPQotCi1PU19TZXRXaW5kb3dMb25nVz0KLU9TX1NldFdpbmRvd0xvbmdXXzA9Y2FzdD0oSFdORCkKLU9TX1NldFdpbmRvd0xvbmdXXzE9Ci1PU19TZXRXaW5kb3dMb25nV18yPQotCi1PU19TZXRXaW5kb3dPcmdFeD0KLU9TX1NldFdpbmRvd09yZ0V4XzA9Y2FzdD1IREMKLU9TX1NldFdpbmRvd09yZ0V4XzE9Ci1PU19TZXRXaW5kb3dPcmdFeF8yPQotT1NfU2V0V2luZG93T3JnRXhfMz0KLQotT1NfU2V0V2luZG93UGxhY2VtZW50PQotT1NfU2V0V2luZG93UGxhY2VtZW50XzA9Y2FzdD0oSFdORCkKLU9TX1NldFdpbmRvd1BsYWNlbWVudF8xPQotCi1PU19TZXRXaW5kb3dQb3M9Ci1PU19TZXRXaW5kb3dQb3NfMD1jYXN0PShIV05EKQotT1NfU2V0V2luZG93UG9zXzE9Y2FzdD0oSFdORCkKLU9TX1NldFdpbmRvd1Bvc18yPQotT1NfU2V0V2luZG93UG9zXzM9Ci1PU19TZXRXaW5kb3dQb3NfND0KLU9TX1NldFdpbmRvd1Bvc181PQotT1NfU2V0V2luZG93UG9zXzY9Ci0KLU9TX1NldFdpbmRvd1Jnbj0KLU9TX1NldFdpbmRvd1Jnbl8wPWNhc3Q9SFdORAotT1NfU2V0V2luZG93UmduXzE9Y2FzdD1IUkdOCi1PU19TZXRXaW5kb3dSZ25fMj0KLQotT1NfU2V0V2luZG93VGV4dEE9Ci1PU19TZXRXaW5kb3dUZXh0QV8wPWNhc3Q9KEhXTkQpCi1PU19TZXRXaW5kb3dUZXh0QV8xPWNhc3Q9KExQU1RSKQotCi1PU19TZXRXaW5kb3dUZXh0Vz0KLU9TX1NldFdpbmRvd1RleHRXXzA9Y2FzdD0oSFdORCkKLU9TX1NldFdpbmRvd1RleHRXXzE9Y2FzdD0oTFBXU1RSKQotCi1PU19TZXRXaW5kb3dzSG9va0V4QT0KLU9TX1NldFdpbmRvd3NIb29rRXhBXzA9Ci1PU19TZXRXaW5kb3dzSG9va0V4QV8xPWNhc3Q9KEhPT0tQUk9DKQotT1NfU2V0V2luZG93c0hvb2tFeEFfMj1jYXN0PShISU5TVEFOQ0UpCi1PU19TZXRXaW5kb3dzSG9va0V4QV8zPQotCi1PU19TZXRXaW5kb3dzSG9va0V4Vz0KLU9TX1NldFdpbmRvd3NIb29rRXhXXzA9Ci1PU19TZXRXaW5kb3dzSG9va0V4V18xPWNhc3Q9KEhPT0tQUk9DKQotT1NfU2V0V2luZG93c0hvb2tFeFdfMj1jYXN0PShISU5TVEFOQ0UpCi1PU19TZXRXaW5kb3dzSG9va0V4V18zPQotCi1PU19TZXRXb3JsZFRyYW5zZm9ybT0KLU9TX1NldFdvcmxkVHJhbnNmb3JtXzA9Y2FzdD1IREMKLU9TX1NldFdvcmxkVHJhbnNmb3JtXzE9Y2FzdD1YRk9STSAqCi0KLU9TX1NoZWxsRXhlY3V0ZUV4QT0KLU9TX1NoZWxsRXhlY3V0ZUV4QV8wPQotCi1PU19TaGVsbEV4ZWN1dGVFeFc9Ci1PU19TaGVsbEV4ZWN1dGVFeFdfMD1jYXN0PShMUFNIRUxMRVhFQ1VURUlORk9XKQotCi1PU19TaGVsbF9Ob3RpZnlJY29uQT0KLU9TX1NoZWxsX05vdGlmeUljb25BXzA9Ci1PU19TaGVsbF9Ob3RpZnlJY29uQV8xPQotCi1PU19TaGVsbF9Ob3RpZnlJY29uVz0KLU9TX1NoZWxsX05vdGlmeUljb25XXzA9Ci1PU19TaGVsbF9Ob3RpZnlJY29uV18xPQotCi1PU19TaG93Q2FyZXQ9Ci1PU19TaG93Q2FyZXRfMD1jYXN0PShIV05EKQotCi1PU19TaG93T3duZWRQb3B1cHM9Ci1PU19TaG93T3duZWRQb3B1cHNfMD1jYXN0PShIV05EKQotT1NfU2hvd093bmVkUG9wdXBzXzE9Ci0KLU9TX1Nob3dTY3JvbGxCYXI9Ci1PU19TaG93U2Nyb2xsQmFyXzA9Y2FzdD0oSFdORCkKLU9TX1Nob3dTY3JvbGxCYXJfMT0KLU9TX1Nob3dTY3JvbGxCYXJfMj0KLQotT1NfU2hvd1dpbmRvdz0KLU9TX1Nob3dXaW5kb3dfMD1jYXN0PShIV05EKQotT1NfU2hvd1dpbmRvd18xPQotCi1PU19TaXBHZXRJbmZvPQotT1NfU2lwR2V0SW5mb18wPQotCi1PU19TdGFydERvY0E9Ci1PU19TdGFydERvY0FfMD1jYXN0PShIREMpCi1PU19TdGFydERvY0FfMT0KLQotT1NfU3RhcnREb2NXPQotT1NfU3RhcnREb2NXXzA9Y2FzdD0oSERDKQotT1NfU3RhcnREb2NXXzE9Y2FzdD0oTFBET0NJTkZPVykKLQotT1NfU3RhcnRQYWdlPQotT1NfU3RhcnRQYWdlXzA9Y2FzdD0oSERDKQotCi1PU19TdHJldGNoQmx0PQotT1NfU3RyZXRjaEJsdF8wPWNhc3Q9KEhEQykKLU9TX1N0cmV0Y2hCbHRfMT0KLU9TX1N0cmV0Y2hCbHRfMj0KLU9TX1N0cmV0Y2hCbHRfMz0KLU9TX1N0cmV0Y2hCbHRfND0KLU9TX1N0cmV0Y2hCbHRfNT1jYXN0PShIREMpCi1PU19TdHJldGNoQmx0XzY9Ci1PU19TdHJldGNoQmx0Xzc9Ci1PU19TdHJldGNoQmx0Xzg9Ci1PU19TdHJldGNoQmx0Xzk9Ci1PU19TdHJldGNoQmx0XzEwPQotCi1PU19TdHJva2VQYXRoPQotT1NfU3Ryb2tlUGF0aF8wPWNhc3Q9KEhEQykKLQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9BX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSElHSENPTlRSQVNUXzJJPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9BX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSElHSENPTlRSQVNUXzJJXzA9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ISUdIQ09OVFJBU1RfMklfMT0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hJR0hDT05UUkFTVF8ySV8yPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9BX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSElHSENPTlRSQVNUXzJJXzM9Ci0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05PTkNMSUVOVE1FVFJJQ1NBXzJJPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9BX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk9OQ0xJRU5UTUVUUklDU0FfMklfMD0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05PTkNMSUVOVE1FVFJJQ1NBXzJJXzE9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OT05DTElFTlRNRVRSSUNTQV8ySV8yPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9BX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk9OQ0xJRU5UTUVUUklDU0FfMklfMz0KLQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9BX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yST0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMD0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMT0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMj0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMz0KLQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9BX19JSV8zSUk9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJXzNJSV8wPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9BX19JSV8zSUlfMT0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlfM0lJXzI9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJXzNJSV8zPQotCi1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb1dfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ISUdIQ09OVFJBU1RfMkk9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb1dfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ISUdIQ09OVFJBU1RfMklfMD0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hJR0hDT05UUkFTVF8ySV8xPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSElHSENPTlRSQVNUXzJJXzI9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb1dfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ISUdIQ09OVFJBU1RfMklfMz0KLQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk9OQ0xJRU5UTUVUUklDU1dfMkk9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb1dfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OT05DTElFTlRNRVRSSUNTV18ySV8wPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk9OQ0xJRU5UTUVUUklDU1dfMklfMT0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05PTkNMSUVOVE1FVFJJQ1NXXzJJXzI9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb1dfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OT05DTElFTlRNRVRSSUNTV18ySV8zPQotCi1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb1dfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySV8wPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySV8xPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySV8yPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySV8zPQotCi1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb1dfX0lJXzNJST0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlfM0lJXzA9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb1dfX0lJXzNJSV8xPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSV8zSUlfMj0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlfM0lJXzM9Ci0KLU9TX1RvQXNjaWk9Ci1PU19Ub0FzY2lpXzA9Ci1PU19Ub0FzY2lpXzE9Ci1PU19Ub0FzY2lpXzI9Y2FzdD0oUEJZVEUpCi1PU19Ub0FzY2lpXzM9Y2FzdD0oTFBXT1JEKQotT1NfVG9Bc2NpaV80PQotCi1PU19Ub1VuaWNvZGU9Ci1PU19Ub1VuaWNvZGVfMD0KLU9TX1RvVW5pY29kZV8xPQotT1NfVG9Vbmljb2RlXzI9Y2FzdD0oUEJZVEUpCi1PU19Ub1VuaWNvZGVfMz1jYXN0PShMUFdTVFIpCi1PU19Ub1VuaWNvZGVfND0KLU9TX1RvVW5pY29kZV81PQotCi1PU19UcmFja01vdXNlRXZlbnQ9Ci1PU19UcmFja01vdXNlRXZlbnRfMD0KLQotT1NfVHJhY2tQb3B1cE1lbnU9Ci1PU19UcmFja1BvcHVwTWVudV8wPWNhc3Q9KEhNRU5VKQotT1NfVHJhY2tQb3B1cE1lbnVfMT0KLU9TX1RyYWNrUG9wdXBNZW51XzI9Ci1PU19UcmFja1BvcHVwTWVudV8zPQotT1NfVHJhY2tQb3B1cE1lbnVfND0KLU9TX1RyYWNrUG9wdXBNZW51XzU9Y2FzdD0oSFdORCkKLU9TX1RyYWNrUG9wdXBNZW51XzY9Ci0KLU9TX1RyYW5zbGF0ZUFjY2VsZXJhdG9yQT0KLU9TX1RyYW5zbGF0ZUFjY2VsZXJhdG9yQV8wPWNhc3Q9KEhXTkQpCi1PU19UcmFuc2xhdGVBY2NlbGVyYXRvckFfMT1jYXN0PShIQUNDRUwpCi1PU19UcmFuc2xhdGVBY2NlbGVyYXRvckFfMj0KLQotT1NfVHJhbnNsYXRlQWNjZWxlcmF0b3JXPQotT1NfVHJhbnNsYXRlQWNjZWxlcmF0b3JXXzA9Y2FzdD0oSFdORCkKLU9TX1RyYW5zbGF0ZUFjY2VsZXJhdG9yV18xPWNhc3Q9KEhBQ0NFTCkKLU9TX1RyYW5zbGF0ZUFjY2VsZXJhdG9yV18yPQotCi1PU19UcmFuc2xhdGVDaGFyc2V0SW5mbz0KLU9TX1RyYW5zbGF0ZUNoYXJzZXRJbmZvXzA9Y2FzdD0oRFdPUkQgKikKLU9TX1RyYW5zbGF0ZUNoYXJzZXRJbmZvXzE9Y2FzdD0oTFBDSEFSU0VUSU5GTykKLU9TX1RyYW5zbGF0ZUNoYXJzZXRJbmZvXzI9Ci0KLU9TX1RyYW5zbGF0ZU1ESVN5c0FjY2VsPQotT1NfVHJhbnNsYXRlTURJU3lzQWNjZWxfMD1jYXN0PShIV05EKQotT1NfVHJhbnNsYXRlTURJU3lzQWNjZWxfMT1jYXN0PShMUE1TRykKLQotT1NfVHJhbnNsYXRlTWVzc2FnZT0KLU9TX1RyYW5zbGF0ZU1lc3NhZ2VfMD0KLQotT1NfVHJhbnNwYXJlbnRCbHQ9ZmxhZ3M9ZHluYW1pYwotT1NfVHJhbnNwYXJlbnRCbHRfMD0KLU9TX1RyYW5zcGFyZW50Qmx0XzE9Ci1PU19UcmFuc3BhcmVudEJsdF8yPQotT1NfVHJhbnNwYXJlbnRCbHRfMz0KLU9TX1RyYW5zcGFyZW50Qmx0XzQ9Ci1PU19UcmFuc3BhcmVudEJsdF81PQotT1NfVHJhbnNwYXJlbnRCbHRfNj0KLU9TX1RyYW5zcGFyZW50Qmx0Xzc9Ci1PU19UcmFuc3BhcmVudEJsdF84PQotT1NfVHJhbnNwYXJlbnRCbHRfOT0KLU9TX1RyYW5zcGFyZW50Qmx0XzEwPQotCi1PU19UcmFuc3BhcmVudEltYWdlPQotT1NfVHJhbnNwYXJlbnRJbWFnZV8wPWNhc3Q9KEhEQykKLU9TX1RyYW5zcGFyZW50SW1hZ2VfMT0KLU9TX1RyYW5zcGFyZW50SW1hZ2VfMj0KLU9TX1RyYW5zcGFyZW50SW1hZ2VfMz0KLU9TX1RyYW5zcGFyZW50SW1hZ2VfND0KLU9TX1RyYW5zcGFyZW50SW1hZ2VfNT1jYXN0PShIQU5ETEUpCi1PU19UcmFuc3BhcmVudEltYWdlXzY9Ci1PU19UcmFuc3BhcmVudEltYWdlXzc9Ci1PU19UcmFuc3BhcmVudEltYWdlXzg9Ci1PU19UcmFuc3BhcmVudEltYWdlXzk9Ci1PU19UcmFuc3BhcmVudEltYWdlXzEwPWNhc3Q9KENPTE9SUkVGKQotCi1PU19Vbmhvb2tXaW5kb3dzSG9va0V4PQotT1NfVW5ob29rV2luZG93c0hvb2tFeF8wPWNhc3Q9KEhIT09LKQotCi1PU19VbnJlZ2lzdGVyQ2xhc3NBPQotT1NfVW5yZWdpc3RlckNsYXNzQV8wPWNhc3Q9KExQU1RSKQotT1NfVW5yZWdpc3RlckNsYXNzQV8xPWNhc3Q9KEhJTlNUQU5DRSkKLQotT1NfVW5yZWdpc3RlckNsYXNzVz0KLU9TX1VucmVnaXN0ZXJDbGFzc1dfMD1jYXN0PShMUFdTVFIpCi1PU19VbnJlZ2lzdGVyQ2xhc3NXXzE9Y2FzdD0oSElOU1RBTkNFKQotCi1PU19VcGRhdGVXaW5kb3c9Ci1PU19VcGRhdGVXaW5kb3dfMD1jYXN0PShIV05EKQotCi1PU19WYWxpZGF0ZVJlY3Q9Ci1PU19WYWxpZGF0ZVJlY3RfMD1jYXN0PShIV05EKQotT1NfVmFsaWRhdGVSZWN0XzE9Ci0KLU9TX1ZrS2V5U2NhbkE9Ci1PU19Wa0tleVNjYW5BXzA9Y2FzdD0oVENIQVIpCi0KLU9TX1ZrS2V5U2Nhblc9Ci1PU19Wa0tleVNjYW5XXzA9Y2FzdD0oV0NIQVIpCi0KLU9TX1Z0YmxDYWxsX19JST0KLU9TX1Z0YmxDYWxsX19JSV8wPQotT1NfVnRibENhbGxfX0lJXzE9Ci0KLU9TX1Z0YmxDYWxsX19JSUk9Ci1PU19WdGJsQ2FsbF9fSUlJXzA9Ci1PU19WdGJsQ2FsbF9fSUlJXzE9Ci1PU19WdGJsQ2FsbF9fSUlJXzI9Ci0KLU9TX1Z0YmxDYWxsX19JSUlJSV8zST0KLU9TX1Z0YmxDYWxsX19JSUlJSV8zSV8wPQotT1NfVnRibENhbGxfX0lJSUlJXzNJXzE9Ci1PU19WdGJsQ2FsbF9fSUlJSUlfM0lfMj0KLU9TX1Z0YmxDYWxsX19JSUlJSV8zSV8zPQotT1NfVnRibENhbGxfX0lJSUlJXzNJXzQ9Ci1PU19WdGJsQ2FsbF9fSUlJSUlfM0lfNT0KLQotT1NfVnRibENhbGxfX0lJXzNDSUlfM0lfM0k9Ci1PU19WdGJsQ2FsbF9fSUlfM0NJSV8zSV8zSV8wPQotT1NfVnRibENhbGxfX0lJXzNDSUlfM0lfM0lfMT0KLU9TX1Z0YmxDYWxsX19JSV8zQ0lJXzNJXzNJXzI9Ci1PU19WdGJsQ2FsbF9fSUlfM0NJSV8zSV8zSV8zPQotT1NfVnRibENhbGxfX0lJXzNDSUlfM0lfM0lfND0KLU9TX1Z0YmxDYWxsX19JSV8zQ0lJXzNJXzNJXzU9Ci1PU19WdGJsQ2FsbF9fSUlfM0NJSV8zSV8zSV82PQotCi1PU19XYWl0TWVzc2FnZT0KLQotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJSUlfM0JfM1o9Ci1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lJSV8zQl8zWl8wPQotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJSUlfM0JfM1pfMT0KLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSUlJXzNCXzNaXzI9Y2FzdD0oTFBDV1NUUiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lJSV8zQl8zWl8zPQotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJSUlfM0JfM1pfND1jYXN0PShMUFNUUikKLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSUlJXzNCXzNaXzU9Ci1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lJSV8zQl8zWl82PWNhc3Q9KExQQ1NUUikKLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSUlJXzNCXzNaXzc9Y2FzdD0oTFBCT09MKQotCi1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lfM0JJXzNCXzNaPQotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJXzNCSV8zQl8zWl8wPQotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJXzNCSV8zQl8zWl8xPQotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJXzNCSV8zQl8zWl8yPWNhc3Q9KExQQ1dTVFIpLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJXzNCSV8zQl8zWl8zPQotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJXzNCSV8zQl8zWl80PWNhc3Q9KExQU1RSKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJXzNCSV8zQl8zWl81PQotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJXzNCSV8zQl8zWl82PWNhc3Q9KExQQ1NUUikKLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSV8zQklfM0JfM1pfNz1jYXN0PShMUEJPT0wpCi0KLU9TX1dpbmRvd0Zyb21EQz0KLU9TX1dpbmRvd0Zyb21EQ18wPWNhc3Q9KEhEQykKLQotT1NfV2luZG93RnJvbVBvaW50PQotT1NfV2luZG93RnJvbVBvaW50XzA9ZmxhZ3M9c3RydWN0Ci0KLU9TX3N0cmxlbj0KLU9TX3N0cmxlbl8wPWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotT1Nfd2NzbGVuPQotT1Nfd2NzbGVuXzA9Y2FzdD0oY29uc3Qgd2NoYXJfdCAqKQotCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9PU1ZFUlNJT05JTkZPPQotT1NWRVJTSU9OSU5GT19kd09TVmVyc2lvbkluZm9TaXplPQotT1NWRVJTSU9OSU5GT19kd01ham9yVmVyc2lvbj0KLU9TVkVSU0lPTklORk9fZHdNaW5vclZlcnNpb249Ci1PU1ZFUlNJT05JTkZPX2R3QnVpbGROdW1iZXI9Ci1PU1ZFUlNJT05JTkZPX2R3UGxhdGZvcm1JZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09TVkVSU0lPTklORk9BPQotT1NWRVJTSU9OSU5GT0Ffc3pDU0RWZXJzaW9uPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfT1NWRVJTSU9OSU5GT1c9Ci1PU1ZFUlNJT05JTkZPV19zekNTRFZlcnNpb249Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9QQUlOVFNUUlVDVD0KLVBBSU5UU1RSVUNUX2hkYz1jYXN0PShIREMpCi1QQUlOVFNUUlVDVF9mRXJhc2U9Ci1QQUlOVFNUUlVDVF9sZWZ0PWFjY2Vzc29yPXJjUGFpbnQubGVmdAotUEFJTlRTVFJVQ1RfdG9wPWFjY2Vzc29yPXJjUGFpbnQudG9wCi1QQUlOVFNUUlVDVF9yaWdodD1hY2Nlc3Nvcj1yY1BhaW50LnJpZ2h0Ci1QQUlOVFNUUlVDVF9ib3R0b209YWNjZXNzb3I9cmNQYWludC5ib3R0b20KLVBBSU5UU1RSVUNUX2ZSZXN0b3JlPQotUEFJTlRTVFJVQ1RfZkluY1VwZGF0ZT0KLVBBSU5UU1RSVUNUX3JnYlJlc2VydmVkPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUE9JTlQ9Ci1QT0lOVF94PQotUE9JTlRfeT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BSSU5URExHPQotUFJJTlRETEdfbFN0cnVjdFNpemU9Ci1QUklOVERMR19od25kT3duZXI9Y2FzdD0oSFdORCkKLVBSSU5URExHX2hEZXZNb2RlPWNhc3Q9KEhHTE9CQUwpCi1QUklOVERMR19oRGV2TmFtZXM9Y2FzdD0oSEdMT0JBTCkKLVBSSU5URExHX2hEQz1jYXN0PShIREMpCi1QUklOVERMR19GbGFncz0KLVBSSU5URExHX25Gcm9tUGFnZT0KLVBSSU5URExHX25Ub1BhZ2U9Ci1QUklOVERMR19uTWluUGFnZT0KLVBSSU5URExHX25NYXhQYWdlPQotUFJJTlRETEdfbkNvcGllcz0KLVBSSU5URExHX2hJbnN0YW5jZT1jYXN0PShISU5TVEFOQ0UpCi1QUklOVERMR19sQ3VzdERhdGE9Ci1QUklOVERMR19scGZuUHJpbnRIb29rPWNhc3Q9KExQUFJJTlRIT09LUFJPQykKLVBSSU5URExHX2xwZm5TZXR1cEhvb2s9Y2FzdD0oTFBQUklOVEhPT0tQUk9DKQotUFJJTlRETEdfbHBQcmludFRlbXBsYXRlTmFtZT1jYXN0PShMUENUU1RSKQotUFJJTlRETEdfbHBTZXR1cFRlbXBsYXRlTmFtZT1jYXN0PShMUENUU1RSKQotUFJJTlRETEdfaFByaW50VGVtcGxhdGU9Y2FzdD0oSEdMT0JBTCkKLVBSSU5URExHX2hTZXR1cFRlbXBsYXRlPWNhc3Q9KEhHTE9CQUwpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUJBUkJBTkRJTkZPPQotUkVCQVJCQU5ESU5GT19jYlNpemU9Ci1SRUJBUkJBTkRJTkZPX2ZNYXNrPQotUkVCQVJCQU5ESU5GT19mU3R5bGU9Ci1SRUJBUkJBTkRJTkZPX2NsckZvcmU9Ci1SRUJBUkJBTkRJTkZPX2NsckJhY2s9Ci1SRUJBUkJBTkRJTkZPX2xwVGV4dD1jYXN0PShMUFRTVFIpCi1SRUJBUkJBTkRJTkZPX2NjaD0KLVJFQkFSQkFORElORk9faUltYWdlPQotUkVCQVJCQU5ESU5GT19od25kQ2hpbGQ9Y2FzdD0oSFdORCkKLVJFQkFSQkFORElORk9fY3hNaW5DaGlsZD0KLVJFQkFSQkFORElORk9fY3lNaW5DaGlsZD0KLVJFQkFSQkFORElORk9fY3g9Ci1SRUJBUkJBTkRJTkZPX2hibUJhY2s9Y2FzdD0oSEJJVE1BUCkKLVJFQkFSQkFORElORk9fd0lEPQotUkVCQVJCQU5ESU5GT19jeUNoaWxkPQotUkVCQVJCQU5ESU5GT19jeU1heENoaWxkPQotUkVCQVJCQU5ESU5GT19jeUludGVncmFsPQotUkVCQVJCQU5ESU5GT19jeElkZWFsPQotUkVCQVJCQU5ESU5GT19sUGFyYW09Ci1SRUJBUkJBTkRJTkZPX2N4SGVhZGVyPWZsYWdzPW5vX3dpbmNlCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUPQotUkVDVF9sZWZ0PQotUkVDVF90b3A9Ci1SRUNUX3JpZ2h0PQotUkVDVF9ib3R0b209Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMUFOQUxZU0lTPQotU0NSSVBUX0FOQUxZU0lTX2VTY3JpcHQ9Ci1TQ1JJUFRfQU5BTFlTSVNfZlJUTD0KLVNDUklQVF9BTkFMWVNJU19mTGF5b3V0UlRMPQotU0NSSVBUX0FOQUxZU0lTX2ZMaW5rQmVmb3JlPQotU0NSSVBUX0FOQUxZU0lTX2ZMaW5rQWZ0ZXI9Ci1TQ1JJUFRfQU5BTFlTSVNfZkxvZ2ljYWxPcmRlcj0KLVNDUklQVF9BTkFMWVNJU19mTm9HbHlwaEluZGV4PQotU0NSSVBUX0FOQUxZU0lTX3M9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMUNPTlRST0w9Ci1TQ1JJUFRfQ09OVFJPTF91RGVmYXVsdExhbmd1YWdlPQotU0NSSVBUX0NPTlRST0xfZkNvbnRleHREaWdpdHM9Ci1TQ1JJUFRfQ09OVFJPTF9mSW52ZXJ0UHJlQm91bmREaXI9Ci1TQ1JJUFRfQ09OVFJPTF9mSW52ZXJ0UG9zdEJvdW5kRGlyPQotU0NSSVBUX0NPTlRST0xfZkxpbmtTdHJpbmdCZWZvcmU9Ci1TQ1JJUFRfQ09OVFJPTF9mTGlua1N0cmluZ0FmdGVyPQotU0NSSVBUX0NPTlRST0xfZk5ldXRyYWxPdmVycmlkZT0KLVNDUklQVF9DT05UUk9MX2ZOdW1lcmljT3ZlcnJpZGU9Ci1TQ1JJUFRfQ09OVFJPTF9mTGVnYWN5QmlkaUNsYXNzPQotU0NSSVBUX0NPTlRST0xfZlJlc2VydmVkPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFGT05UUFJPUEVSVElFUz0KLVNDUklQVF9GT05UUFJPUEVSVElFU19jQnl0ZXM9Ci1TQ1JJUFRfRk9OVFBST1BFUlRJRVNfd2dCbGFuaz0KLVNDUklQVF9GT05UUFJPUEVSVElFU193Z0RlZmF1bHQ9Ci1TQ1JJUFRfRk9OVFBST1BFUlRJRVNfd2dJbnZhbGlkPQotU0NSSVBUX0ZPTlRQUk9QRVJUSUVTX3dnS2FzaGlkYT0KLVNDUklQVF9GT05UUFJPUEVSVElFU19pS2FzaGlkYVdpZHRoPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFJVEVNPQotU0NSSVBUX0lURU1faUNoYXJQb3M9Ci1TQ1JJUFRfSVRFTV9hPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFMT0dBVFRSPQotU0NSSVBUX0xPR0FUVFJfZlNvZnRCcmVhaz0KLVNDUklQVF9MT0dBVFRSX2ZXaGl0ZVNwYWNlPQotU0NSSVBUX0xPR0FUVFJfZkNoYXJTdG9wPQotU0NSSVBUX0xPR0FUVFJfZldvcmRTdG9wPQotU0NSSVBUX0xPR0FUVFJfZkludmFsaWQ9Ci1TQ1JJUFRfTE9HQVRUUl9mUmVzZXJ2ZWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMVBST1BFUlRJRVM9Ci1TQ1JJUFRfUFJPUEVSVElFU19sYW5naWQ9Ci1TQ1JJUFRfUFJPUEVSVElFU19mTnVtZXJpYz0KLVNDUklQVF9QUk9QRVJUSUVTX2ZDb21wbGV4PQotU0NSSVBUX1BST1BFUlRJRVNfZk5lZWRzV29yZEJyZWFraW5nPQotU0NSSVBUX1BST1BFUlRJRVNfZk5lZWRzQ2FyZXRJbmZvPQotU0NSSVBUX1BST1BFUlRJRVNfYkNoYXJTZXQ9Ci1TQ1JJUFRfUFJPUEVSVElFU19mQ29udHJvbD0KLVNDUklQVF9QUk9QRVJUSUVTX2ZQcml2YXRlVXNlQXJlYT0KLVNDUklQVF9QUk9QRVJUSUVTX2ZOZWVkc0NoYXJhY3Rlckp1c3RpZnk9Ci1TQ1JJUFRfUFJPUEVSVElFU19mSW52YWxpZEdseXBoPQotU0NSSVBUX1BST1BFUlRJRVNfZkludmFsaWRMb2dBdHRyPQotU0NSSVBUX1BST1BFUlRJRVNfZkNETT0KLVNDUklQVF9QUk9QRVJUSUVTX2ZBbWJpZ3VvdXNDaGFyU2V0PQotU0NSSVBUX1BST1BFUlRJRVNfZkNsdXN0ZXJTaXplVmFyaWVzPQotU0NSSVBUX1BST1BFUlRJRVNfZlJlamVjdEludmFsaWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMVNUQVRFPQotU0NSSVBUX1NUQVRFX3VCaWRpTGV2ZWw9Ci1TQ1JJUFRfU1RBVEVfZk92ZXJyaWRlRGlyZWN0aW9uPQotU0NSSVBUX1NUQVRFX2ZJbmhpYml0U3ltU3dhcD0KLVNDUklQVF9TVEFURV9mQ2hhclNoYXBlPQotU0NSSVBUX1NUQVRFX2ZEaWdpdFN1YnN0aXR1dGU9Ci1TQ1JJUFRfU1RBVEVfZkluaGliaXRMaWdhdGU9Ci1TQ1JJUFRfU1RBVEVfZkRpc3BsYXlaV0c9Ci1TQ1JJUFRfU1RBVEVfZkFyYWJpY051bUNvbnRleHQ9Ci1TQ1JJUFRfU1RBVEVfZkdjcENsdXN0ZXJzPQotU0NSSVBUX1NUQVRFX2ZSZXNlcnZlZD0KLVNDUklQVF9TVEFURV9mRW5naW5lUmVzZXJ2ZWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JPTExJTkZPPQotU0NST0xMSU5GT19jYlNpemU9Ci1TQ1JPTExJTkZPX2ZNYXNrPQotU0NST0xMSU5GT19uTWluPQotU0NST0xMSU5GT19uTWF4PQotU0NST0xMSU5GT19uUGFnZT0KLVNDUk9MTElORk9fblBvcz0KLVNDUk9MTElORk9fblRyYWNrUG9zPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0hBQ1RJVkFURUlORk89Ci1TSEFDVElWQVRFSU5GT19jYlNpemU9Ci1TSEFDVElWQVRFSU5GT19od25kTGFzdEZvY3VzPWNhc3Q9KEhXTkQpCi1TSEFDVElWQVRFSU5GT19mU2lwVXA9Ci1TSEFDVElWQVRFSU5GT19mU2lwT25EZWFjdGl2YXRpb249Ci1TSEFDVElWQVRFSU5GT19mQWN0aXZlPQotU0hBQ1RJVkFURUlORk9fZlJlc2VydmVkPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0hFTExFWEVDVVRFSU5GTz0KLVNIRUxMRVhFQ1VURUlORk9fY2JTaXplPQotU0hFTExFWEVDVVRFSU5GT19mTWFzaz0KLVNIRUxMRVhFQ1VURUlORk9faHduZD1jYXN0PShIV05EKQotU0hFTExFWEVDVVRFSU5GT19scFZlcmI9Y2FzdD0oTFBDVFNUUikKLVNIRUxMRVhFQ1VURUlORk9fbHBGaWxlPWNhc3Q9KExQQ1RTVFIpCi1TSEVMTEVYRUNVVEVJTkZPX2xwUGFyYW1ldGVycz1jYXN0PShMUENUU1RSKQotU0hFTExFWEVDVVRFSU5GT19scERpcmVjdG9yeT1jYXN0PShMUENUU1RSKQotU0hFTExFWEVDVVRFSU5GT19uU2hvdz0KLVNIRUxMRVhFQ1VURUlORk9faEluc3RBcHA9Y2FzdD0oSElOU1RBTkNFKQotU0hFTExFWEVDVVRFSU5GT19scElETGlzdD1jYXN0PShMUFZPSUQpCi1TSEVMTEVYRUNVVEVJTkZPX2xwQ2xhc3M9Y2FzdD0oTFBDVFNUUikKLVNIRUxMRVhFQ1VURUlORk9faGtleUNsYXNzPWNhc3Q9KEhLRVkpCi1TSEVMTEVYRUNVVEVJTkZPX2R3SG90S2V5PQotU0hFTExFWEVDVVRFSU5GT19oSWNvbj1jYXN0PShIQU5ETEUpCi1TSEVMTEVYRUNVVEVJTkZPX2hQcm9jZXNzPWNhc3Q9KEhBTkRMRSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NITUVOVUJBUklORk89Ci1TSE1FTlVCQVJJTkZPX2NiU2l6ZT0KLVNITUVOVUJBUklORk9faHduZFBhcmVudD1jYXN0PShIV05EKQotU0hNRU5VQkFSSU5GT19kd0ZsYWdzPQotU0hNRU5VQkFSSU5GT19uVG9vbEJhcklkPQotU0hNRU5VQkFSSU5GT19oSW5zdFJlcz1jYXN0PShISU5TVEFOQ0UpCi1TSE1FTlVCQVJJTkZPX25CbXBJZD0KLVNITUVOVUJBUklORk9fY0JtcEltYWdlcz0KLVNITUVOVUJBUklORk9faHduZE1CPWNhc3Q9KEhXTkQpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSFJHSU5GTz0KLVNIUkdJTkZPX2NiU2l6ZT0KLVNIUkdJTkZPX2h3bmRDbGllbnQ9Y2FzdD0oSFdORCkKLVNIUkdJTkZPX3B0RG93bl94PWFjY2Vzc29yPXB0RG93bi54Ci1TSFJHSU5GT19wdERvd25feT1hY2Nlc3Nvcj1wdERvd24ueQotU0hSR0lORk9fZHdGbGFncz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJUElORk89Ci1TSVBJTkZPX2NiU2l6ZT0KLVNJUElORk9fZmR3RmxhZ3M9Ci1TSVBJTkZPX3JjVmlzaWJsZURlc2t0b3BfbGVmdD1hY2Nlc3Nvcj1yY1Zpc2libGVEZXNrdG9wLmxlZnQKLVNJUElORk9fcmNWaXNpYmxlRGVza3RvcF90b3A9YWNjZXNzb3I9cmNWaXNpYmxlRGVza3RvcC50b3AKLVNJUElORk9fcmNWaXNpYmxlRGVza3RvcF9yaWdodD1hY2Nlc3Nvcj1yY1Zpc2libGVEZXNrdG9wLnJpZ2h0Ci1TSVBJTkZPX3JjVmlzaWJsZURlc2t0b3BfYm90dG9tPWFjY2Vzc29yPXJjVmlzaWJsZURlc2t0b3AuYm90dG9tCi1TSVBJTkZPX3JjU2lwUmVjdF9sZWZ0PWFjY2Vzc29yPXJjU2lwUmVjdC5sZWZ0Ci1TSVBJTkZPX3JjU2lwUmVjdF90b3A9YWNjZXNzb3I9cmNTaXBSZWN0LnRvcAotU0lQSU5GT19yY1NpcFJlY3RfcmlnaHQ9YWNjZXNzb3I9cmNTaXBSZWN0LnJpZ2h0Ci1TSVBJTkZPX3JjU2lwUmVjdF9ib3R0b209YWNjZXNzb3I9cmNTaXBSZWN0LmJvdHRvbQotU0lQSU5GT19kd0ltRGF0YVNpemU9Ci1TSVBJTkZPX3B2SW1EYXRhPWNhc3Q9KHZvaWQgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkU9Ci1TSVpFX2N4PQotU0laRV9jeT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OPQotVEJCVVRUT05faUJpdG1hcD0KLVRCQlVUVE9OX2lkQ29tbWFuZD0KLVRCQlVUVE9OX2ZzU3RhdGU9Ci1UQkJVVFRPTl9mc1N0eWxlPQotVEJCVVRUT05fZHdEYXRhPQotVEJCVVRUT05faVN0cmluZz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OSU5GTz0KLVRCQlVUVE9OSU5GT19jYlNpemU9Ci1UQkJVVFRPTklORk9fZHdNYXNrPQotVEJCVVRUT05JTkZPX2lkQ29tbWFuZD0KLVRCQlVUVE9OSU5GT19pSW1hZ2U9Ci1UQkJVVFRPTklORk9fZnNTdGF0ZT0KLVRCQlVUVE9OSU5GT19mc1N0eWxlPQotVEJCVVRUT05JTkZPX2N4PQotVEJCVVRUT05JTkZPX2xQYXJhbT0KLVRCQlVUVE9OSU5GT19wc3pUZXh0PWNhc3Q9KExQVFNUUikKLVRCQlVUVE9OSU5GT19jY2hUZXh0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVENIQVI9ZmxhZ3M9bm9fZ2VuCi1UQ0hBUl9jaGFycz0KLVRDSEFSX2J5dGVzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVENJVEVNPQotVENJVEVNX21hc2s9Ci1UQ0lURU1fZHdTdGF0ZT0KLVRDSVRFTV9kd1N0YXRlTWFzaz0KLVRDSVRFTV9wc3pUZXh0PWNhc3Q9KExQVFNUUikKLVRDSVRFTV9jY2hUZXh0TWF4PQotVENJVEVNX2lJbWFnZT0KLVRDSVRFTV9sUGFyYW09Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9URVhUTUVUUklDPQotVEVYVE1FVFJJQ190bUhlaWdodD0KLVRFWFRNRVRSSUNfdG1Bc2NlbnQ9Ci1URVhUTUVUUklDX3RtRGVzY2VudD0KLVRFWFRNRVRSSUNfdG1JbnRlcm5hbExlYWRpbmc9Ci1URVhUTUVUUklDX3RtRXh0ZXJuYWxMZWFkaW5nPQotVEVYVE1FVFJJQ190bUF2ZUNoYXJXaWR0aD0KLVRFWFRNRVRSSUNfdG1NYXhDaGFyV2lkdGg9Ci1URVhUTUVUUklDX3RtV2VpZ2h0PQotVEVYVE1FVFJJQ190bU92ZXJoYW5nPQotVEVYVE1FVFJJQ190bURpZ2l0aXplZEFzcGVjdFg9Ci1URVhUTUVUUklDX3RtRGlnaXRpemVkQXNwZWN0WT0KLVRFWFRNRVRSSUNfdG1JdGFsaWM9Ci1URVhUTUVUUklDX3RtVW5kZXJsaW5lZD0KLVRFWFRNRVRSSUNfdG1TdHJ1Y2tPdXQ9Ci1URVhUTUVUUklDX3RtUGl0Y2hBbmRGYW1pbHk9Ci1URVhUTUVUUklDX3RtQ2hhclNldD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUNBPQotVEVYVE1FVFJJQ0FfdG1GaXJzdENoYXI9Ci1URVhUTUVUUklDQV90bUxhc3RDaGFyPQotVEVYVE1FVFJJQ0FfdG1EZWZhdWx0Q2hhcj0KLVRFWFRNRVRSSUNBX3RtQnJlYWtDaGFyPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEVYVE1FVFJJQ1c9Ci1URVhUTUVUUklDV190bUZpcnN0Q2hhcj0KLVRFWFRNRVRSSUNXX3RtTGFzdENoYXI9Ci1URVhUTUVUUklDV190bURlZmF1bHRDaGFyPQotVEVYVE1FVFJJQ1dfdG1CcmVha0NoYXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UT09MSU5GTz0KLVRPT0xJTkZPX2NiU2l6ZT0KLVRPT0xJTkZPX3VGbGFncz0KLVRPT0xJTkZPX2h3bmQ9Y2FzdD0oSFdORCkKLVRPT0xJTkZPX3VJZD0KLVRPT0xJTkZPX2xlZnQ9YWNjZXNzb3I9cmVjdC5sZWZ0Ci1UT09MSU5GT190b3A9YWNjZXNzb3I9cmVjdC50b3AKLVRPT0xJTkZPX3JpZ2h0PWFjY2Vzc29yPXJlY3QucmlnaHQKLVRPT0xJTkZPX2JvdHRvbT1hY2Nlc3Nvcj1yZWN0LmJvdHRvbQotVE9PTElORk9faGluc3Q9Y2FzdD0oSElOU1RBTkNFKQotVE9PTElORk9fbHBzelRleHQ9Y2FzdD0oTFBUU1RSKQotVE9PTElORk9fbFBhcmFtPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFJBQ0tNT1VTRUVWRU5UPQotVFJBQ0tNT1VTRUVWRU5UX2NiU2l6ZT0KLVRSQUNLTU9VU0VFVkVOVF9kd0ZsYWdzPQotVFJBQ0tNT1VTRUVWRU5UX2h3bmRUcmFjaz1jYXN0PShIV05EKQotVFJBQ0tNT1VTRUVWRU5UX2R3SG92ZXJUaW1lPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFJJVkVSVEVYPQotVFJJVkVSVEVYX3g9Ci1UUklWRVJURVhfeT0KLVRSSVZFUlRFWF9SZWQ9Ci1UUklWRVJURVhfR3JlZW49Ci1UUklWRVJURVhfQmx1ZT0KLVRSSVZFUlRFWF9BbHBoYT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSElUVEVTVElORk89Ci1UVkhJVFRFU1RJTkZPX3g9YWNjZXNzb3I9cHQueAotVFZISVRURVNUSU5GT195PWFjY2Vzc29yPXB0LnkKLVRWSElUVEVTVElORk9fZmxhZ3M9Ci1UVkhJVFRFU1RJTkZPX2hJdGVtPWNhc3Q9KEhUUkVFSVRFTSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSU5TRVJUU1RSVUNUPQotVFZJTlNFUlRTVFJVQ1RfaFBhcmVudD1jYXN0PShIVFJFRUlURU0pCi1UVklOU0VSVFNUUlVDVF9oSW5zZXJ0QWZ0ZXI9Y2FzdD0oSFRSRUVJVEVNKQotVFZJTlNFUlRTVFJVQ1RfbWFzaz1hY2Nlc3Nvcj1pdGVtLm1hc2sKLVRWSU5TRVJUU1RSVUNUX2hJdGVtPWFjY2Vzc29yPWl0ZW0uaEl0ZW0sY2FzdD0oSFRSRUVJVEVNKQotVFZJTlNFUlRTVFJVQ1Rfc3RhdGU9YWNjZXNzb3I9aXRlbS5zdGF0ZQotVFZJTlNFUlRTVFJVQ1Rfc3RhdGVNYXNrPWFjY2Vzc29yPWl0ZW0uc3RhdGVNYXNrCi1UVklOU0VSVFNUUlVDVF9wc3pUZXh0PWFjY2Vzc29yPWl0ZW0ucHN6VGV4dCxjYXN0PShMUFRTVFIpCi1UVklOU0VSVFNUUlVDVF9jY2hUZXh0TWF4PWFjY2Vzc29yPWl0ZW0uY2NoVGV4dE1heAotVFZJTlNFUlRTVFJVQ1RfaUltYWdlPWFjY2Vzc29yPWl0ZW0uaUltYWdlCi1UVklOU0VSVFNUUlVDVF9pU2VsZWN0ZWRJbWFnZT1hY2Nlc3Nvcj1pdGVtLmlTZWxlY3RlZEltYWdlCi1UVklOU0VSVFNUUlVDVF9jQ2hpbGRyZW49YWNjZXNzb3I9aXRlbS5jQ2hpbGRyZW4KLVRWSU5TRVJUU1RSVUNUX2xQYXJhbT1hY2Nlc3Nvcj1pdGVtLmxQYXJhbQotVFZJTlNFUlRTVFJVQ1RfaUludGVncmFsPWFjY2Vzc29yPWl0ZW1leC5pSW50ZWdyYWwsZmxhZ3M9bm9fd2luY2UKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSVRFTT0KLVRWSVRFTV9tYXNrPQotVFZJVEVNX2hJdGVtPWNhc3Q9KEhUUkVFSVRFTSkKLVRWSVRFTV9zdGF0ZT0KLVRWSVRFTV9zdGF0ZU1hc2s9Ci1UVklURU1fcHN6VGV4dD1jYXN0PShMUFRTVFIpCi1UVklURU1fY2NoVGV4dE1heD0KLVRWSVRFTV9pSW1hZ2U9Ci1UVklURU1faVNlbGVjdGVkSW1hZ2U9Ci1UVklURU1fY0NoaWxkcmVuPQotVFZJVEVNX2xQYXJhbT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSVRFTUVYPQotVFZJVEVNRVhfaUludGVncmFsPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVURBQ0NFTD0KLVVEQUNDRUxfblNlYz0KLVVEQUNDRUxfbkluYz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1dJTkRPV1BMQUNFTUVOVD0KLVdJTkRPV1BMQUNFTUVOVF9sZW5ndGg9Ci1XSU5ET1dQTEFDRU1FTlRfZmxhZ3M9Ci1XSU5ET1dQTEFDRU1FTlRfc2hvd0NtZD0KLVdJTkRPV1BMQUNFTUVOVF9wdE1pblBvc2l0aW9uX3g9YWNjZXNzb3I9cHRNaW5Qb3NpdGlvbi54Ci1XSU5ET1dQTEFDRU1FTlRfcHRNaW5Qb3NpdGlvbl95PWFjY2Vzc29yPXB0TWluUG9zaXRpb24ueQotV0lORE9XUExBQ0VNRU5UX3B0TWF4UG9zaXRpb25feD1hY2Nlc3Nvcj1wdE1heFBvc2l0aW9uLngKLVdJTkRPV1BMQUNFTUVOVF9wdE1heFBvc2l0aW9uX3k9YWNjZXNzb3I9cHRNYXhQb3NpdGlvbi55Ci1XSU5ET1dQTEFDRU1FTlRfbGVmdD1hY2Nlc3Nvcj1yY05vcm1hbFBvc2l0aW9uLmxlZnQKLVdJTkRPV1BMQUNFTUVOVF90b3A9YWNjZXNzb3I9cmNOb3JtYWxQb3NpdGlvbi50b3AKLVdJTkRPV1BMQUNFTUVOVF9yaWdodD1hY2Nlc3Nvcj1yY05vcm1hbFBvc2l0aW9uLnJpZ2h0Ci1XSU5ET1dQTEFDRU1FTlRfYm90dG9tPWFjY2Vzc29yPXJjTm9ybWFsUG9zaXRpb24uYm90dG9tCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9XSU5ET1dQT1M9Ci1XSU5ET1dQT1NfaHduZD1jYXN0PShIV05EKQotV0lORE9XUE9TX2h3bmRJbnNlcnRBZnRlcj1jYXN0PShIV05EKQotV0lORE9XUE9TX3g9Ci1XSU5ET1dQT1NfeT0KLVdJTkRPV1BPU19jeD0KLVdJTkRPV1BPU19jeT0KLVdJTkRPV1BPU19mbGFncz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1dORENMQVNTPQotV05EQ0xBU1Nfc3R5bGU9Ci1XTkRDTEFTU19scGZuV25kUHJvYz1jYXN0PShXTkRQUk9DKQotV05EQ0xBU1NfY2JDbHNFeHRyYT0KLVdORENMQVNTX2NiV25kRXh0cmE9Ci1XTkRDTEFTU19oSW5zdGFuY2U9Y2FzdD0oSElOU1RBTkNFKQotV05EQ0xBU1NfaEljb249Y2FzdD0oSElDT04pCi1XTkRDTEFTU19oQ3Vyc29yPWNhc3Q9KEhDVVJTT1IpCi1XTkRDTEFTU19oYnJCYWNrZ3JvdW5kPWNhc3Q9KEhCUlVTSCkKLVdORENMQVNTX2xwc3pNZW51TmFtZT1jYXN0PShMUENUU1RSKQotV05EQ0xBU1NfbHBzekNsYXNzTmFtZT1jYXN0PShMUENUU1RSKQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuR0wucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlMjdiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX0dMPQotR0xfZ2xBY2N1bT0KLUdMX2dsQWNjdW1fMD0KLUdMX2dsQWNjdW1fMT0KLQotR0xfZ2xBbHBoYUZ1bmM9Ci1HTF9nbEFscGhhRnVuY18wPQotR0xfZ2xBbHBoYUZ1bmNfMT0KLQotR0xfZ2xBcmVUZXh0dXJlc1Jlc2lkZW50PQotR0xfZ2xBcmVUZXh0dXJlc1Jlc2lkZW50XzA9Ci1HTF9nbEFyZVRleHR1cmVzUmVzaWRlbnRfMT1jYXN0PShjb25zdCBHTHVpbnQgKiksZmxhZ3M9Y3JpdGljYWwKLUdMX2dsQXJlVGV4dHVyZXNSZXNpZGVudF8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQXJyYXlFbGVtZW50PQotR0xfZ2xBcnJheUVsZW1lbnRfMD0KLQotR0xfZ2xCZWdpbj0KLUdMX2dsQmVnaW5fMD0KLQotR0xfZ2xCaW5kVGV4dHVyZT0KLUdMX2dsQmluZFRleHR1cmVfMD0KLUdMX2dsQmluZFRleHR1cmVfMT0KLQotR0xfZ2xCaXRtYXA9Ci1HTF9nbEJpdG1hcF8wPQotR0xfZ2xCaXRtYXBfMT0KLUdMX2dsQml0bWFwXzI9Ci1HTF9nbEJpdG1hcF8zPQotR0xfZ2xCaXRtYXBfND0KLUdMX2dsQml0bWFwXzU9Ci1HTF9nbEJpdG1hcF82PWNhc3Q9KGNvbnN0IEdMdWJ5dGUgKiksZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xCbGVuZEZ1bmM9Ci1HTF9nbEJsZW5kRnVuY18wPQotR0xfZ2xCbGVuZEZ1bmNfMT0KLQotR0xfZ2xDYWxsTGlzdD0KLUdMX2dsQ2FsbExpc3RfMD0KLQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNCPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNCXzA9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0JfMT0KLUdMX2dsQ2FsbExpc3RzX19JSV8zQl8yPQotCi1HTF9nbENhbGxMaXN0c19fSUlfM0M9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0NfMD0KLUdMX2dsQ2FsbExpc3RzX19JSV8zQ18xPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNDXzI9Ci0KLUdMX2dsQ2FsbExpc3RzX19JSV8zST0KLUdMX2dsQ2FsbExpc3RzX19JSV8zSV8wPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNJXzE9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0lfMj0KLQotR0xfZ2xDbGVhcj0KLUdMX2dsQ2xlYXJfMD0KLQotR0xfZ2xDbGVhckFjY3VtPQotR0xfZ2xDbGVhckFjY3VtXzA9Ci1HTF9nbENsZWFyQWNjdW1fMT0KLUdMX2dsQ2xlYXJBY2N1bV8yPQotR0xfZ2xDbGVhckFjY3VtXzM9Ci0KLUdMX2dsQ2xlYXJDb2xvcj0KLUdMX2dsQ2xlYXJDb2xvcl8wPQotR0xfZ2xDbGVhckNvbG9yXzE9Ci1HTF9nbENsZWFyQ29sb3JfMj0KLUdMX2dsQ2xlYXJDb2xvcl8zPQotCi1HTF9nbENsZWFyRGVwdGg9Ci1HTF9nbENsZWFyRGVwdGhfMD0KLQotR0xfZ2xDbGVhckluZGV4PQotR0xfZ2xDbGVhckluZGV4XzA9Ci0KLUdMX2dsQ2xlYXJTdGVuY2lsPQotR0xfZ2xDbGVhclN0ZW5jaWxfMD0KLQotR0xfZ2xDbGlwUGxhbmU9Ci1HTF9nbENsaXBQbGFuZV8wPQotR0xfZ2xDbGlwUGxhbmVfMT1mbGFncz1jcml0aWNhbAotCi1HTF9nbENvbG9yM2I9Ci1HTF9nbENvbG9yM2JfMD0KLUdMX2dsQ29sb3IzYl8xPQotR0xfZ2xDb2xvcjNiXzI9Ci0KLUdMX2dsQ29sb3IzYnY9Ci1HTF9nbENvbG9yM2J2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xDb2xvcjNkPQotR0xfZ2xDb2xvcjNkXzA9Ci1HTF9nbENvbG9yM2RfMT0KLUdMX2dsQ29sb3IzZF8yPQotCi1HTF9nbENvbG9yM2R2PQotR0xfZ2xDb2xvcjNkdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQ29sb3IzZj0KLUdMX2dsQ29sb3IzZl8wPQotR0xfZ2xDb2xvcjNmXzE9Ci1HTF9nbENvbG9yM2ZfMj0KLQotR0xfZ2xDb2xvcjNmdj0KLUdMX2dsQ29sb3IzZnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbENvbG9yM2k9Ci1HTF9nbENvbG9yM2lfMD0KLUdMX2dsQ29sb3IzaV8xPQotR0xfZ2xDb2xvcjNpXzI9Ci0KLUdMX2dsQ29sb3IzaXY9Ci1HTF9nbENvbG9yM2l2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xDb2xvcjNzPQotR0xfZ2xDb2xvcjNzXzA9Ci1HTF9nbENvbG9yM3NfMT0KLUdMX2dsQ29sb3Izc18yPQotCi1HTF9nbENvbG9yM3N2PQotR0xfZ2xDb2xvcjNzdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQ29sb3IzdWI9Ci1HTF9nbENvbG9yM3ViXzA9Ci1HTF9nbENvbG9yM3ViXzE9Ci1HTF9nbENvbG9yM3ViXzI9Ci0KLUdMX2dsQ29sb3IzdWJ2PQotR0xfZ2xDb2xvcjN1YnZfMD1jYXN0PShjb25zdCBHTHVieXRlICopLGZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQ29sb3IzdWk9Ci1HTF9nbENvbG9yM3VpXzA9Ci1HTF9nbENvbG9yM3VpXzE9Ci1HTF9nbENvbG9yM3VpXzI9Ci0KLUdMX2dsQ29sb3IzdWl2PQotR0xfZ2xDb2xvcjN1aXZfMD1jYXN0PShjb25zdCBHTHVpbnQgKiksZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xDb2xvcjN1cz0KLUdMX2dsQ29sb3IzdXNfMD0KLUdMX2dsQ29sb3IzdXNfMT0KLUdMX2dsQ29sb3IzdXNfMj0KLQotR0xfZ2xDb2xvcjN1c3Y9Ci1HTF9nbENvbG9yM3Vzdl8wPWNhc3Q9KGNvbnN0IEdMdXNob3J0ICopLGZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQ29sb3I0Yj0KLUdMX2dsQ29sb3I0Yl8wPQotR0xfZ2xDb2xvcjRiXzE9Ci1HTF9nbENvbG9yNGJfMj0KLUdMX2dsQ29sb3I0Yl8zPQotCi1HTF9nbENvbG9yNGJ2PQotR0xfZ2xDb2xvcjRidl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQ29sb3I0ZD0KLUdMX2dsQ29sb3I0ZF8wPQotR0xfZ2xDb2xvcjRkXzE9Ci1HTF9nbENvbG9yNGRfMj0KLUdMX2dsQ29sb3I0ZF8zPQotCi1HTF9nbENvbG9yNGR2PQotR0xfZ2xDb2xvcjRkdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQ29sb3I0Zj0KLUdMX2dsQ29sb3I0Zl8wPQotR0xfZ2xDb2xvcjRmXzE9Ci1HTF9nbENvbG9yNGZfMj0KLUdMX2dsQ29sb3I0Zl8zPQotCi1HTF9nbENvbG9yNGZ2PQotR0xfZ2xDb2xvcjRmdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQ29sb3I0aT0KLUdMX2dsQ29sb3I0aV8wPQotR0xfZ2xDb2xvcjRpXzE9Ci1HTF9nbENvbG9yNGlfMj0KLUdMX2dsQ29sb3I0aV8zPQotCi1HTF9nbENvbG9yNGl2PQotR0xfZ2xDb2xvcjRpdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQ29sb3I0cz0KLUdMX2dsQ29sb3I0c18wPQotR0xfZ2xDb2xvcjRzXzE9Ci1HTF9nbENvbG9yNHNfMj0KLUdMX2dsQ29sb3I0c18zPQotCi1HTF9nbENvbG9yNHViPQotR0xfZ2xDb2xvcjR1Yl8wPQotR0xfZ2xDb2xvcjR1Yl8xPQotR0xfZ2xDb2xvcjR1Yl8yPQotR0xfZ2xDb2xvcjR1Yl8zPQotCi1HTF9nbENvbG9yNHVidj0KLUdMX2dsQ29sb3I0dWJ2XzA9Ci0KLUdMX2dsQ29sb3I0dWk9Ci1HTF9nbENvbG9yNHVpXzA9Ci1HTF9nbENvbG9yNHVpXzE9Ci1HTF9nbENvbG9yNHVpXzI9Ci1HTF9nbENvbG9yNHVpXzM9Ci0KLUdMX2dsQ29sb3I0dWl2PQotR0xfZ2xDb2xvcjR1aXZfMD1jYXN0PShjb25zdCBHTHVpbnQgKiksZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xDb2xvcjR1cz0KLUdMX2dsQ29sb3I0dXNfMD0KLUdMX2dsQ29sb3I0dXNfMT0KLUdMX2dsQ29sb3I0dXNfMj0KLUdMX2dsQ29sb3I0dXNfMz0KLQotR0xfZ2xDb2xvcjR1c3Y9Ci1HTF9nbENvbG9yNHVzdl8wPWNhc3Q9KGNvbnN0IEdMdXNob3J0ICopLGZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQ29sb3JNYXNrPQotR0xfZ2xDb2xvck1hc2tfMD0KLUdMX2dsQ29sb3JNYXNrXzE9Ci1HTF9nbENvbG9yTWFza18yPQotR0xfZ2xDb2xvck1hc2tfMz0KLQotR0xfZ2xDb2xvck1hdGVyaWFsPQotR0xfZ2xDb2xvck1hdGVyaWFsXzA9Ci1HTF9nbENvbG9yTWF0ZXJpYWxfMT0KLQotR0xfZ2xDb2xvclBvaW50ZXI9Ci1HTF9nbENvbG9yUG9pbnRlcl8wPQotR0xfZ2xDb2xvclBvaW50ZXJfMT0KLUdMX2dsQ29sb3JQb2ludGVyXzI9Ci1HTF9nbENvbG9yUG9pbnRlcl8zPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQ29weVBpeGVscz0KLUdMX2dsQ29weVBpeGVsc18wPQotR0xfZ2xDb3B5UGl4ZWxzXzE9Ci1HTF9nbENvcHlQaXhlbHNfMj0KLUdMX2dsQ29weVBpeGVsc18zPQotR0xfZ2xDb3B5UGl4ZWxzXzQ9Ci0KLUdMX2dsQ29weVRleEltYWdlMUQ9Ci1HTF9nbENvcHlUZXhJbWFnZTFEXzA9Ci1HTF9nbENvcHlUZXhJbWFnZTFEXzE9Ci1HTF9nbENvcHlUZXhJbWFnZTFEXzI9Ci1HTF9nbENvcHlUZXhJbWFnZTFEXzM9Ci1HTF9nbENvcHlUZXhJbWFnZTFEXzQ9Ci1HTF9nbENvcHlUZXhJbWFnZTFEXzU9Ci1HTF9nbENvcHlUZXhJbWFnZTFEXzY9Ci0KLUdMX2dsQ29weVRleEltYWdlMkQ9Ci1HTF9nbENvcHlUZXhJbWFnZTJEXzA9Ci1HTF9nbENvcHlUZXhJbWFnZTJEXzE9Ci1HTF9nbENvcHlUZXhJbWFnZTJEXzI9Ci1HTF9nbENvcHlUZXhJbWFnZTJEXzM9Ci1HTF9nbENvcHlUZXhJbWFnZTJEXzQ9Ci1HTF9nbENvcHlUZXhJbWFnZTJEXzU9Ci1HTF9nbENvcHlUZXhJbWFnZTJEXzY9Ci1HTF9nbENvcHlUZXhJbWFnZTJEXzc9Ci0KLUdMX2dsQ29weVRleFN1YkltYWdlMUQ9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTFEXzA9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTFEXzE9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTFEXzI9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTFEXzM9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTFEXzQ9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTFEXzU9Ci0KLUdMX2dsQ29weVRleFN1YkltYWdlMkQ9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTJEXzA9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTJEXzE9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTJEXzI9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTJEXzM9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTJEXzQ9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTJEXzU9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTJEXzY9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTJEXzc9Ci0KLUdMX2dsQ3VsbEZhY2U9Ci1HTF9nbEN1bGxGYWNlXzA9Ci0KLUdMX2dsRGVsZXRlTGlzdHM9Ci1HTF9nbERlbGV0ZUxpc3RzXzA9Ci1HTF9nbERlbGV0ZUxpc3RzXzE9Ci0KLUdMX2dsRGVsZXRlVGV4dHVyZXM9Ci1HTF9nbERlbGV0ZVRleHR1cmVzXzA9Ci1HTF9nbERlbGV0ZVRleHR1cmVzXzE9Y2FzdD0oY29uc3QgR0x1aW50ICopLGZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsRGVwdGhGdW5jPQotR0xfZ2xEZXB0aEZ1bmNfMD0KLQotR0xfZ2xEZXB0aE1hc2s9Ci1HTF9nbERlcHRoTWFza18wPQotCi1HTF9nbERlcHRoUmFuZ2U9Ci1HTF9nbERlcHRoUmFuZ2VfMD0KLUdMX2dsRGVwdGhSYW5nZV8xPQotCi1HTF9nbERpc2FibGU9Ci1HTF9nbERpc2FibGVfMD0KLQotR0xfZ2xEaXNhYmxlQ2xpZW50U3RhdGU9Ci1HTF9nbERpc2FibGVDbGllbnRTdGF0ZV8wPQotCi1HTF9nbERyYXdBcnJheXM9Ci1HTF9nbERyYXdBcnJheXNfMD0KLUdMX2dsRHJhd0FycmF5c18xPQotR0xfZ2xEcmF3QXJyYXlzXzI9Ci0KLUdMX2dsRHJhd0J1ZmZlcj0KLUdMX2dsRHJhd0J1ZmZlcl8wPQotCi1HTF9nbERyYXdFbGVtZW50cz0KLUdMX2dsRHJhd0VsZW1lbnRzXzA9Ci1HTF9nbERyYXdFbGVtZW50c18xPQotR0xfZ2xEcmF3RWxlbWVudHNfMj0KLUdMX2dsRHJhd0VsZW1lbnRzXzM9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xEcmF3UGl4ZWxzPQotR0xfZ2xEcmF3UGl4ZWxzXzA9Ci1HTF9nbERyYXdQaXhlbHNfMT0KLUdMX2dsRHJhd1BpeGVsc18yPQotR0xfZ2xEcmF3UGl4ZWxzXzM9Ci1HTF9nbERyYXdQaXhlbHNfND1mbGFncz1jcml0aWNhbAotCi1HTF9nbEVkZ2VGbGFnPQotR0xfZ2xFZGdlRmxhZ18wPQotCi1HTF9nbEVkZ2VGbGFnUG9pbnRlcj0KLUdMX2dsRWRnZUZsYWdQb2ludGVyXzA9Ci1HTF9nbEVkZ2VGbGFnUG9pbnRlcl8xPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsRWRnZUZsYWd2PQotR0xfZ2xFZGdlRmxhZ3ZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbEVuYWJsZT0KLUdMX2dsRW5hYmxlXzA9Ci0KLUdMX2dsRW5hYmxlQ2xpZW50U3RhdGU9Ci1HTF9nbEVuYWJsZUNsaWVudFN0YXRlXzA9Ci0KLUdMX2dsRW5kPQotCi1HTF9nbEVuZExpc3Q9Ci0KLUdMX2dsRXZhbENvb3JkMWQ9Ci1HTF9nbEV2YWxDb29yZDFkXzA9Ci0KLUdMX2dsRXZhbENvb3JkMWR2PQotR0xfZ2xFdmFsQ29vcmQxZHZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbEV2YWxDb29yZDFmPQotR0xfZ2xFdmFsQ29vcmQxZl8wPQotCi1HTF9nbEV2YWxDb29yZDFmdj0KLUdMX2dsRXZhbENvb3JkMWZ2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xFdmFsQ29vcmQyZD0KLUdMX2dsRXZhbENvb3JkMmRfMD0KLUdMX2dsRXZhbENvb3JkMmRfMT0KLQotR0xfZ2xFdmFsQ29vcmQyZHY9Ci1HTF9nbEV2YWxDb29yZDJkdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsRXZhbENvb3JkMmY9Ci1HTF9nbEV2YWxDb29yZDJmXzA9Ci1HTF9nbEV2YWxDb29yZDJmXzE9Ci0KLUdMX2dsRXZhbENvb3JkMmZ2PQotR0xfZ2xFdmFsQ29vcmQyZnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbEV2YWxNZXNoMT0KLUdMX2dsRXZhbE1lc2gxXzA9Ci1HTF9nbEV2YWxNZXNoMV8xPQotR0xfZ2xFdmFsTWVzaDFfMj0KLQotR0xfZ2xFdmFsTWVzaDI9Ci1HTF9nbEV2YWxNZXNoMl8wPQotR0xfZ2xFdmFsTWVzaDJfMT0KLUdMX2dsRXZhbE1lc2gyXzI9Ci1HTF9nbEV2YWxNZXNoMl8zPQotR0xfZ2xFdmFsTWVzaDJfND0KLQotR0xfZ2xFdmFsUG9pbnQxPQotR0xfZ2xFdmFsUG9pbnQxXzA9Ci0KLUdMX2dsRXZhbFBvaW50Mj0KLUdMX2dsRXZhbFBvaW50Ml8wPQotR0xfZ2xFdmFsUG9pbnQyXzE9Ci0KLUdMX2dsRmVlZGJhY2tCdWZmZXI9Ci1HTF9nbEZlZWRiYWNrQnVmZmVyXzA9Ci1HTF9nbEZlZWRiYWNrQnVmZmVyXzE9Ci1HTF9nbEZlZWRiYWNrQnVmZmVyXzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xGaW5pc2g9Ci0KLUdMX2dsRmx1c2g9Ci0KLUdMX2dsRm9nZj0KLUdMX2dsRm9nZl8wPQotR0xfZ2xGb2dmXzE9Ci0KLUdMX2dsRm9nZnY9Ci1HTF9nbEZvZ2Z2XzA9Ci1HTF9nbEZvZ2Z2XzE9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xGb2dpPQotR0xfZ2xGb2dpXzA9Ci1HTF9nbEZvZ2lfMT0KLQotR0xfZ2xGb2dpdj0KLUdMX2dsRm9naXZfMD0KLUdMX2dsRm9naXZfMT1mbGFncz1jcml0aWNhbAotCi1HTF9nbEZyb250RmFjZT0KLUdMX2dsRnJvbnRGYWNlXzA9Ci0KLUdMX2dsRnJ1c3R1bT0KLUdMX2dsRnJ1c3R1bV8wPQotR0xfZ2xGcnVzdHVtXzE9Ci1HTF9nbEZydXN0dW1fMj0KLUdMX2dsRnJ1c3R1bV8zPQotR0xfZ2xGcnVzdHVtXzQ9Ci1HTF9nbEZydXN0dW1fNT0KLQotR0xfZ2xHZW5MaXN0cz0KLUdMX2dsR2VuTGlzdHNfMD0KLQotR0xfZ2xHZW5UZXh0dXJlcz0KLUdMX2dsR2VuVGV4dHVyZXNfMD0KLUdMX2dsR2VuVGV4dHVyZXNfMT1jYXN0PShHTHVpbnQgKiksZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRCb29sZWFudj0KLUdMX2dsR2V0Qm9vbGVhbnZfMD0KLUdMX2dsR2V0Qm9vbGVhbnZfMT1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldENsaXBQbGFuZT0KLUdMX2dsR2V0Q2xpcFBsYW5lXzA9Ci1HTF9nbEdldENsaXBQbGFuZV8xPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0RG91Ymxldj0KLUdMX2dsR2V0RG91Ymxldl8wPQotR0xfZ2xHZXREb3VibGV2XzE9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRFcnJvcj0KLQotR0xfZ2xHZXRGbG9hdHY9Ci1HTF9nbEdldEZsb2F0dl8wPQotR0xfZ2xHZXRGbG9hdHZfMT1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldEludGVnZXJ2PQotR0xfZ2xHZXRJbnRlZ2Vydl8wPQotR0xfZ2xHZXRJbnRlZ2Vydl8xPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0TGlnaHRmdj0KLUdMX2dsR2V0TGlnaHRmdl8wPQotR0xfZ2xHZXRMaWdodGZ2XzE9Ci1HTF9nbEdldExpZ2h0ZnZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldExpZ2h0aXY9Ci1HTF9nbEdldExpZ2h0aXZfMD0KLUdMX2dsR2V0TGlnaHRpdl8xPQotR0xfZ2xHZXRMaWdodGl2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRNYXBkdj0KLUdMX2dsR2V0TWFwZHZfMD0KLUdMX2dsR2V0TWFwZHZfMT0KLUdMX2dsR2V0TWFwZHZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldE1hcGZ2PQotR0xfZ2xHZXRNYXBmdl8wPQotR0xfZ2xHZXRNYXBmdl8xPQotR0xfZ2xHZXRNYXBmdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0TWFwaXY9Ci1HTF9nbEdldE1hcGl2XzA9Ci1HTF9nbEdldE1hcGl2XzE9Ci1HTF9nbEdldE1hcGl2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRNYXRlcmlhbGZ2PQotR0xfZ2xHZXRNYXRlcmlhbGZ2XzA9Ci1HTF9nbEdldE1hdGVyaWFsZnZfMT0KLUdMX2dsR2V0TWF0ZXJpYWxmdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0TWF0ZXJpYWxpdj0KLUdMX2dsR2V0TWF0ZXJpYWxpdl8wPQotR0xfZ2xHZXRNYXRlcmlhbGl2XzE9Ci1HTF9nbEdldE1hdGVyaWFsaXZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldFBpeGVsTWFwZnY9Ci1HTF9nbEdldFBpeGVsTWFwZnZfMD0KLUdMX2dsR2V0UGl4ZWxNYXBmdl8xPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0UGl4ZWxNYXB1aXY9Ci1HTF9nbEdldFBpeGVsTWFwdWl2XzA9Ci1HTF9nbEdldFBpeGVsTWFwdWl2XzE9Y2FzdD0oR0x1aW50ICopLGZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0UGl4ZWxNYXB1c3Y9Ci1HTF9nbEdldFBpeGVsTWFwdXN2XzA9Ci1HTF9nbEdldFBpeGVsTWFwdXN2XzE9Y2FzdD0oR0x1c2hvcnQgKiksZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRQb2ludGVydj0KLUdMX2dsR2V0UG9pbnRlcnZfMD0KLUdMX2dsR2V0UG9pbnRlcnZfMT1jYXN0PShHTHZvaWQgKiopCi0KLUdMX2dsR2V0UG9seWdvblN0aXBwbGU9Ci1HTF9nbEdldFBvbHlnb25TdGlwcGxlXzA9Y2FzdD0oR0x1Ynl0ZSAqKSxmbGFncz1jcml0aWNhbAotCi1HTF9nbEdldFN0cmluZz0KLUdMX2dsR2V0U3RyaW5nXzA9Ci0KLUdMX2dsR2V0VGV4RW52ZnY9Ci1HTF9nbEdldFRleEVudmZ2XzA9Ci1HTF9nbEdldFRleEVudmZ2XzE9Ci1HTF9nbEdldFRleEVudmZ2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRUZXhFbnZpdj0KLUdMX2dsR2V0VGV4RW52aXZfMD0KLUdMX2dsR2V0VGV4RW52aXZfMT0KLUdMX2dsR2V0VGV4RW52aXZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldFRleEdlbmR2PQotR0xfZ2xHZXRUZXhHZW5kdl8wPQotR0xfZ2xHZXRUZXhHZW5kdl8xPQotR0xfZ2xHZXRUZXhHZW5kdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0VGV4R2VuZnY9Ci1HTF9nbEdldFRleEdlbmZ2XzA9Ci1HTF9nbEdldFRleEdlbmZ2XzE9Ci1HTF9nbEdldFRleEdlbmZ2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRUZXhHZW5pdj0KLUdMX2dsR2V0VGV4R2VuaXZfMD0KLUdMX2dsR2V0VGV4R2VuaXZfMT0KLUdMX2dsR2V0VGV4R2VuaXZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldFRleEltYWdlPQotR0xfZ2xHZXRUZXhJbWFnZV8wPQotR0xfZ2xHZXRUZXhJbWFnZV8xPQotR0xfZ2xHZXRUZXhJbWFnZV8yPQotR0xfZ2xHZXRUZXhJbWFnZV8zPQotR0xfZ2xHZXRUZXhJbWFnZV80PWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdj0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl8wPQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcmZ2XzE9Ci1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyZnZfMj0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl8zPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdj0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdl8wPQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2XzE9Ci1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyaXZfMj0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdl8zPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0VGV4UGFyYW1ldGVyZnY9Ci1HTF9nbEdldFRleFBhcmFtZXRlcmZ2XzA9Ci1HTF9nbEdldFRleFBhcmFtZXRlcmZ2XzE9Ci1HTF9nbEdldFRleFBhcmFtZXRlcmZ2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRUZXhQYXJhbWV0ZXJpdj0KLUdMX2dsR2V0VGV4UGFyYW1ldGVyaXZfMD0KLUdMX2dsR2V0VGV4UGFyYW1ldGVyaXZfMT0KLUdMX2dsR2V0VGV4UGFyYW1ldGVyaXZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbEhpbnQ9Ci1HTF9nbEhpbnRfMD0KLUdMX2dsSGludF8xPQotCi1HTF9nbEluZGV4TWFzaz0KLUdMX2dsSW5kZXhNYXNrXzA9Ci0KLUdMX2dsSW5kZXhQb2ludGVyPQotR0xfZ2xJbmRleFBvaW50ZXJfMD0KLUdMX2dsSW5kZXhQb2ludGVyXzE9Ci1HTF9nbEluZGV4UG9pbnRlcl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsSW5kZXhkPQotR0xfZ2xJbmRleGRfMD0KLQotR0xfZ2xJbmRleGR2PQotR0xfZ2xJbmRleGR2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xJbmRleGY9Ci1HTF9nbEluZGV4Zl8wPQotCi1HTF9nbEluZGV4ZnY9Ci1HTF9nbEluZGV4ZnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbEluZGV4aT0KLUdMX2dsSW5kZXhpXzA9Ci0KLUdMX2dsSW5kZXhpdj0KLUdMX2dsSW5kZXhpdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsSW5kZXhzPQotR0xfZ2xJbmRleHNfMD0KLQotR0xfZ2xJbmRleHN2PQotR0xfZ2xJbmRleHN2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xJbml0TmFtZXM9Ci0KLUdMX2dsSW50ZXJsZWF2ZWRBcnJheXM9Ci1HTF9nbEludGVybGVhdmVkQXJyYXlzXzA9Ci1HTF9nbEludGVybGVhdmVkQXJyYXlzXzE9Ci1HTF9nbEludGVybGVhdmVkQXJyYXlzXzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xJc0VuYWJsZWQ9Ci1HTF9nbElzRW5hYmxlZF8wPQotCi1HTF9nbElzTGlzdD0KLUdMX2dsSXNMaXN0XzA9Ci0KLUdMX2dsSXNUZXh0dXJlPQotR0xfZ2xJc1RleHR1cmVfMD0KLQotR0xfZ2xMaWdodE1vZGVsZj0KLUdMX2dsTGlnaHRNb2RlbGZfMD0KLUdMX2dsTGlnaHRNb2RlbGZfMT0KLQotR0xfZ2xMaWdodE1vZGVsZnY9Ci1HTF9nbExpZ2h0TW9kZWxmdl8wPQotR0xfZ2xMaWdodE1vZGVsZnZfMT1mbGFncz1jcml0aWNhbAotCi1HTF9nbExpZ2h0TW9kZWxpPQotR0xfZ2xMaWdodE1vZGVsaV8wPQotR0xfZ2xMaWdodE1vZGVsaV8xPQotCi1HTF9nbExpZ2h0TW9kZWxpdj0KLUdMX2dsTGlnaHRNb2RlbGl2XzA9Ci1HTF9nbExpZ2h0TW9kZWxpdl8xPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTGlnaHRmPQotR0xfZ2xMaWdodGZfMD0KLUdMX2dsTGlnaHRmXzE9Ci1HTF9nbExpZ2h0Zl8yPQotCi1HTF9nbExpZ2h0ZnY9Ci1HTF9nbExpZ2h0ZnZfMD0KLUdMX2dsTGlnaHRmdl8xPQotR0xfZ2xMaWdodGZ2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xMaWdodGk9Ci1HTF9nbExpZ2h0aV8wPQotR0xfZ2xMaWdodGlfMT0KLUdMX2dsTGlnaHRpXzI9Ci0KLUdMX2dsTGlnaHRpdj0KLUdMX2dsTGlnaHRpdl8wPQotR0xfZ2xMaWdodGl2XzE9Ci1HTF9nbExpZ2h0aXZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbExpbmVTdGlwcGxlPQotR0xfZ2xMaW5lU3RpcHBsZV8wPQotR0xfZ2xMaW5lU3RpcHBsZV8xPQotCi1HTF9nbExpbmVXaWR0aD0KLUdMX2dsTGluZVdpZHRoXzA9Ci0KLUdMX2dsTGlzdEJhc2U9Ci1HTF9nbExpc3RCYXNlXzA9Ci0KLUdMX2dsTG9hZElkZW50aXR5PQotCi1HTF9nbExvYWRNYXRyaXhkPQotR0xfZ2xMb2FkTWF0cml4ZF8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTG9hZE1hdHJpeGY9Ci1HTF9nbExvYWRNYXRyaXhmXzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xMb2FkTmFtZT0KLUdMX2dsTG9hZE5hbWVfMD0KLQotR0xfZ2xMb2dpY09wPQotR0xfZ2xMb2dpY09wXzA9Ci0KLUdMX2dsTWFwMWQ9Ci1HTF9nbE1hcDFkXzA9Ci1HTF9nbE1hcDFkXzE9Ci1HTF9nbE1hcDFkXzI9Ci1HTF9nbE1hcDFkXzM9Ci1HTF9nbE1hcDFkXzQ9Ci1HTF9nbE1hcDFkXzU9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xNYXAxZj0KLUdMX2dsTWFwMWZfMD0KLUdMX2dsTWFwMWZfMT0KLUdMX2dsTWFwMWZfMj0KLUdMX2dsTWFwMWZfMz0KLUdMX2dsTWFwMWZfND0KLUdMX2dsTWFwMWZfNT1mbGFncz1jcml0aWNhbAotCi1HTF9nbE1hcDJkPQotR0xfZ2xNYXAyZF8wPQotR0xfZ2xNYXAyZF8xPQotR0xfZ2xNYXAyZF8yPQotR0xfZ2xNYXAyZF8zPQotR0xfZ2xNYXAyZF80PQotR0xfZ2xNYXAyZF81PQotR0xfZ2xNYXAyZF82PQotR0xfZ2xNYXAyZF83PQotR0xfZ2xNYXAyZF84PQotR0xfZ2xNYXAyZF85PWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTWFwMmY9Ci1HTF9nbE1hcDJmXzA9Ci1HTF9nbE1hcDJmXzE9Ci1HTF9nbE1hcDJmXzI9Ci1HTF9nbE1hcDJmXzM9Ci1HTF9nbE1hcDJmXzQ9Ci1HTF9nbE1hcDJmXzU9Ci1HTF9nbE1hcDJmXzY9Ci1HTF9nbE1hcDJmXzc9Ci1HTF9nbE1hcDJmXzg9Ci1HTF9nbE1hcDJmXzk9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xNYXBHcmlkMWQ9Ci1HTF9nbE1hcEdyaWQxZF8wPQotR0xfZ2xNYXBHcmlkMWRfMT0KLUdMX2dsTWFwR3JpZDFkXzI9Ci0KLUdMX2dsTWFwR3JpZDFmPQotR0xfZ2xNYXBHcmlkMWZfMD0KLUdMX2dsTWFwR3JpZDFmXzE9Ci1HTF9nbE1hcEdyaWQxZl8yPQotCi1HTF9nbE1hcEdyaWQyZD0KLUdMX2dsTWFwR3JpZDJkXzA9Ci1HTF9nbE1hcEdyaWQyZF8xPQotR0xfZ2xNYXBHcmlkMmRfMj0KLUdMX2dsTWFwR3JpZDJkXzM9Ci1HTF9nbE1hcEdyaWQyZF80PQotR0xfZ2xNYXBHcmlkMmRfNT0KLQotR0xfZ2xNYXBHcmlkMmY9Ci1HTF9nbE1hcEdyaWQyZl8wPQotR0xfZ2xNYXBHcmlkMmZfMT0KLUdMX2dsTWFwR3JpZDJmXzI9Ci1HTF9nbE1hcEdyaWQyZl8zPQotR0xfZ2xNYXBHcmlkMmZfND0KLUdMX2dsTWFwR3JpZDJmXzU9Ci0KLUdMX2dsTWF0ZXJpYWxmPQotR0xfZ2xNYXRlcmlhbGZfMD0KLUdMX2dsTWF0ZXJpYWxmXzE9Ci1HTF9nbE1hdGVyaWFsZl8yPQotCi1HTF9nbE1hdGVyaWFsZnY9Ci1HTF9nbE1hdGVyaWFsZnZfMD0KLUdMX2dsTWF0ZXJpYWxmdl8xPQotR0xfZ2xNYXRlcmlhbGZ2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xNYXRlcmlhbGk9Ci1HTF9nbE1hdGVyaWFsaV8wPQotR0xfZ2xNYXRlcmlhbGlfMT0KLUdMX2dsTWF0ZXJpYWxpXzI9Ci0KLUdMX2dsTWF0ZXJpYWxpdj0KLUdMX2dsTWF0ZXJpYWxpdl8wPQotR0xfZ2xNYXRlcmlhbGl2XzE9Ci1HTF9nbE1hdGVyaWFsaXZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbE1hdHJpeE1vZGU9Ci1HTF9nbE1hdHJpeE1vZGVfMD0KLQotR0xfZ2xNdWx0TWF0cml4ZD0KLUdMX2dsTXVsdE1hdHJpeGRfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbE11bHRNYXRyaXhmPQotR0xfZ2xNdWx0TWF0cml4Zl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTmV3TGlzdD0KLUdMX2dsTmV3TGlzdF8wPQotR0xfZ2xOZXdMaXN0XzE9Ci0KLUdMX2dsTm9ybWFsM2I9Ci1HTF9nbE5vcm1hbDNiXzA9Ci1HTF9nbE5vcm1hbDNiXzE9Ci1HTF9nbE5vcm1hbDNiXzI9Ci0KLUdMX2dsTm9ybWFsM2J2PQotR0xfZ2xOb3JtYWwzYnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbE5vcm1hbDNkPQotR0xfZ2xOb3JtYWwzZF8wPQotR0xfZ2xOb3JtYWwzZF8xPQotR0xfZ2xOb3JtYWwzZF8yPQotCi1HTF9nbE5vcm1hbDNkdj0KLUdMX2dsTm9ybWFsM2R2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xOb3JtYWwzZj0KLUdMX2dsTm9ybWFsM2ZfMD0KLUdMX2dsTm9ybWFsM2ZfMT0KLUdMX2dsTm9ybWFsM2ZfMj0KLQotR0xfZ2xOb3JtYWwzZnY9Ci1HTF9nbE5vcm1hbDNmdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTm9ybWFsM2k9Ci1HTF9nbE5vcm1hbDNpXzA9Ci1HTF9nbE5vcm1hbDNpXzE9Ci1HTF9nbE5vcm1hbDNpXzI9Ci0KLUdMX2dsTm9ybWFsM2l2PQotR0xfZ2xOb3JtYWwzaXZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbE5vcm1hbDNzPQotR0xfZ2xOb3JtYWwzc18wPQotR0xfZ2xOb3JtYWwzc18xPQotR0xfZ2xOb3JtYWwzc18yPQotCi1HTF9nbE5vcm1hbDNzdj0KLUdMX2dsTm9ybWFsM3N2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xOb3JtYWxQb2ludGVyPQotR0xfZ2xOb3JtYWxQb2ludGVyXzA9Ci1HTF9nbE5vcm1hbFBvaW50ZXJfMT0KLUdMX2dsTm9ybWFsUG9pbnRlcl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsT3J0aG89Ci1HTF9nbE9ydGhvXzA9Ci1HTF9nbE9ydGhvXzE9Ci1HTF9nbE9ydGhvXzI9Ci1HTF9nbE9ydGhvXzM9Ci1HTF9nbE9ydGhvXzQ9Ci1HTF9nbE9ydGhvXzU9Ci0KLUdMX2dsUGFzc1Rocm91Z2g9Ci1HTF9nbFBhc3NUaHJvdWdoXzA9Ci0KLUdMX2dsUGl4ZWxNYXBmdj0KLUdMX2dsUGl4ZWxNYXBmdl8wPQotR0xfZ2xQaXhlbE1hcGZ2XzE9Ci1HTF9nbFBpeGVsTWFwZnZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbFBpeGVsTWFwdWl2PQotR0xfZ2xQaXhlbE1hcHVpdl8wPQotR0xfZ2xQaXhlbE1hcHVpdl8xPQotR0xfZ2xQaXhlbE1hcHVpdl8yPWNhc3Q9KGNvbnN0IEdMdWludCAqKSxmbGFncz1jcml0aWNhbAotCi1HTF9nbFBpeGVsTWFwdXN2PQotR0xfZ2xQaXhlbE1hcHVzdl8wPQotR0xfZ2xQaXhlbE1hcHVzdl8xPQotR0xfZ2xQaXhlbE1hcHVzdl8yPWNhc3Q9KGNvbnN0IEdMdXNob3J0ICopLGZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUGl4ZWxTdG9yZWY9Ci1HTF9nbFBpeGVsU3RvcmVmXzA9Ci1HTF9nbFBpeGVsU3RvcmVmXzE9Ci0KLUdMX2dsUGl4ZWxTdG9yZWk9Ci1HTF9nbFBpeGVsU3RvcmVpXzA9Ci1HTF9nbFBpeGVsU3RvcmVpXzE9Ci0KLUdMX2dsUGl4ZWxUcmFuc2ZlcmY9Ci1HTF9nbFBpeGVsVHJhbnNmZXJmXzA9Ci1HTF9nbFBpeGVsVHJhbnNmZXJmXzE9Ci0KLUdMX2dsUGl4ZWxUcmFuc2Zlcmk9Ci1HTF9nbFBpeGVsVHJhbnNmZXJpXzA9Ci1HTF9nbFBpeGVsVHJhbnNmZXJpXzE9Ci0KLUdMX2dsUGl4ZWxab29tPQotR0xfZ2xQaXhlbFpvb21fMD0KLUdMX2dsUGl4ZWxab29tXzE9Ci0KLUdMX2dsUG9pbnRTaXplPQotR0xfZ2xQb2ludFNpemVfMD0KLQotR0xfZ2xQb2x5Z29uTW9kZT0KLUdMX2dsUG9seWdvbk1vZGVfMD0KLUdMX2dsUG9seWdvbk1vZGVfMT0KLQotR0xfZ2xQb2x5Z29uT2Zmc2V0PQotR0xfZ2xQb2x5Z29uT2Zmc2V0XzA9Ci1HTF9nbFBvbHlnb25PZmZzZXRfMT0KLQotR0xfZ2xQb2x5Z29uU3RpcHBsZT0KLUdMX2dsUG9seWdvblN0aXBwbGVfMD1jYXN0PShHTHVieXRlICopLGZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUG9wQXR0cmliPQotCi1HTF9nbFBvcENsaWVudEF0dHJpYj0KLQotR0xfZ2xQb3BNYXRyaXg9Ci0KLUdMX2dsUG9wTmFtZT0KLQotR0xfZ2xQcmlvcml0aXplVGV4dHVyZXM9Ci1HTF9nbFByaW9yaXRpemVUZXh0dXJlc18wPQotR0xfZ2xQcmlvcml0aXplVGV4dHVyZXNfMT1jYXN0PShjb25zdCBHTHVpbnQgKiksZmxhZ3M9Y3JpdGljYWwKLUdMX2dsUHJpb3JpdGl6ZVRleHR1cmVzXzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xQdXNoQXR0cmliPQotR0xfZ2xQdXNoQXR0cmliXzA9Ci0KLUdMX2dsUHVzaENsaWVudEF0dHJpYj0KLUdMX2dsUHVzaENsaWVudEF0dHJpYl8wPQotCi1HTF9nbFB1c2hNYXRyaXg9Ci0KLUdMX2dsUHVzaE5hbWU9Ci1HTF9nbFB1c2hOYW1lXzA9Ci0KLUdMX2dsUmFzdGVyUG9zMmQ9Ci1HTF9nbFJhc3RlclBvczJkXzA9Ci1HTF9nbFJhc3RlclBvczJkXzE9Ci0KLUdMX2dsUmFzdGVyUG9zMmR2PQotR0xfZ2xSYXN0ZXJQb3MyZHZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFJhc3RlclBvczJmPQotR0xfZ2xSYXN0ZXJQb3MyZl8wPQotR0xfZ2xSYXN0ZXJQb3MyZl8xPQotCi1HTF9nbFJhc3RlclBvczJmdj0KLUdMX2dsUmFzdGVyUG9zMmZ2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xSYXN0ZXJQb3MyaT0KLUdMX2dsUmFzdGVyUG9zMmlfMD0KLUdMX2dsUmFzdGVyUG9zMmlfMT0KLQotR0xfZ2xSYXN0ZXJQb3MyaXY9Ci1HTF9nbFJhc3RlclBvczJpdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUmFzdGVyUG9zMnM9Ci1HTF9nbFJhc3RlclBvczJzXzA9Ci1HTF9nbFJhc3RlclBvczJzXzE9Ci0KLUdMX2dsUmFzdGVyUG9zMnN2PQotR0xfZ2xSYXN0ZXJQb3Myc3ZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFJhc3RlclBvczNkPQotR0xfZ2xSYXN0ZXJQb3MzZF8wPQotR0xfZ2xSYXN0ZXJQb3MzZF8xPQotR0xfZ2xSYXN0ZXJQb3MzZF8yPQotCi1HTF9nbFJhc3RlclBvczNkdj0KLUdMX2dsUmFzdGVyUG9zM2R2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xSYXN0ZXJQb3MzZj0KLUdMX2dsUmFzdGVyUG9zM2ZfMD0KLUdMX2dsUmFzdGVyUG9zM2ZfMT0KLUdMX2dsUmFzdGVyUG9zM2ZfMj0KLQotR0xfZ2xSYXN0ZXJQb3MzZnY9Ci1HTF9nbFJhc3RlclBvczNmdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUmFzdGVyUG9zM2k9Ci1HTF9nbFJhc3RlclBvczNpXzA9Ci1HTF9nbFJhc3RlclBvczNpXzE9Ci1HTF9nbFJhc3RlclBvczNpXzI9Ci0KLUdMX2dsUmFzdGVyUG9zM2l2PQotR0xfZ2xSYXN0ZXJQb3MzaXZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFJhc3RlclBvczNzPQotR0xfZ2xSYXN0ZXJQb3Mzc18wPQotR0xfZ2xSYXN0ZXJQb3Mzc18xPQotR0xfZ2xSYXN0ZXJQb3Mzc18yPQotCi1HTF9nbFJhc3RlclBvczNzdj0KLUdMX2dsUmFzdGVyUG9zM3N2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xSYXN0ZXJQb3M0ZD0KLUdMX2dsUmFzdGVyUG9zNGRfMD0KLUdMX2dsUmFzdGVyUG9zNGRfMT0KLUdMX2dsUmFzdGVyUG9zNGRfMj0KLUdMX2dsUmFzdGVyUG9zNGRfMz0KLQotR0xfZ2xSYXN0ZXJQb3M0ZHY9Ci1HTF9nbFJhc3RlclBvczRkdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUmFzdGVyUG9zNGY9Ci1HTF9nbFJhc3RlclBvczRmXzA9Ci1HTF9nbFJhc3RlclBvczRmXzE9Ci1HTF9nbFJhc3RlclBvczRmXzI9Ci1HTF9nbFJhc3RlclBvczRmXzM9Ci0KLUdMX2dsUmFzdGVyUG9zNGZ2PQotR0xfZ2xSYXN0ZXJQb3M0ZnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFJhc3RlclBvczRpPQotR0xfZ2xSYXN0ZXJQb3M0aV8wPQotR0xfZ2xSYXN0ZXJQb3M0aV8xPQotR0xfZ2xSYXN0ZXJQb3M0aV8yPQotR0xfZ2xSYXN0ZXJQb3M0aV8zPQotCi1HTF9nbFJhc3RlclBvczRpdj0KLUdMX2dsUmFzdGVyUG9zNGl2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xSYXN0ZXJQb3M0cz0KLUdMX2dsUmFzdGVyUG9zNHNfMD0KLUdMX2dsUmFzdGVyUG9zNHNfMT0KLUdMX2dsUmFzdGVyUG9zNHNfMj0KLUdMX2dsUmFzdGVyUG9zNHNfMz0KLQotR0xfZ2xSYXN0ZXJQb3M0c3Y9Ci1HTF9nbFJhc3RlclBvczRzdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUmVhZEJ1ZmZlcj0KLUdMX2dsUmVhZEJ1ZmZlcl8wPQotCi1HTF9nbFJlYWRQaXhlbHM9Ci1HTF9nbFJlYWRQaXhlbHNfMD0KLUdMX2dsUmVhZFBpeGVsc18xPQotR0xfZ2xSZWFkUGl4ZWxzXzI9Ci1HTF9nbFJlYWRQaXhlbHNfMz0KLUdMX2dsUmVhZFBpeGVsc180PQotR0xfZ2xSZWFkUGl4ZWxzXzU9Ci1HTF9nbFJlYWRQaXhlbHNfNj1mbGFncz1jcml0aWNhbAotCi1HTF9nbFJlY3RkPQotR0xfZ2xSZWN0ZF8wPQotR0xfZ2xSZWN0ZF8xPQotR0xfZ2xSZWN0ZF8yPQotR0xfZ2xSZWN0ZF8zPQotCi1HTF9nbFJlY3Rkdj0KLUdMX2dsUmVjdGR2XzA9ZmxhZ3M9Y3JpdGljYWwKLUdMX2dsUmVjdGR2XzE9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xSZWN0Zj0KLUdMX2dsUmVjdGZfMD0KLUdMX2dsUmVjdGZfMT0KLUdMX2dsUmVjdGZfMj0KLUdMX2dsUmVjdGZfMz0KLQotR0xfZ2xSZWN0ZnY9Ci1HTF9nbFJlY3Rmdl8wPWZsYWdzPWNyaXRpY2FsCi1HTF9nbFJlY3Rmdl8xPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUmVjdGk9Ci1HTF9nbFJlY3RpXzA9Ci1HTF9nbFJlY3RpXzE9Ci1HTF9nbFJlY3RpXzI9Ci1HTF9nbFJlY3RpXzM9Ci0KLUdMX2dsUmVjdGl2PQotR0xfZ2xSZWN0aXZfMD1mbGFncz1jcml0aWNhbAotR0xfZ2xSZWN0aXZfMT1mbGFncz1jcml0aWNhbAotCi1HTF9nbFJlY3RzPQotR0xfZ2xSZWN0c18wPQotR0xfZ2xSZWN0c18xPQotR0xfZ2xSZWN0c18yPQotR0xfZ2xSZWN0c18zPQotCi1HTF9nbFJlY3Rzdj0KLUdMX2dsUmVjdHN2XzA9ZmxhZ3M9Y3JpdGljYWwKLUdMX2dsUmVjdHN2XzE9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xSZW5kZXJNb2RlPQotR0xfZ2xSZW5kZXJNb2RlXzA9Ci0KLUdMX2dsUm90YXRlZD0KLUdMX2dsUm90YXRlZF8wPQotR0xfZ2xSb3RhdGVkXzE9Ci1HTF9nbFJvdGF0ZWRfMj0KLUdMX2dsUm90YXRlZF8zPQotCi1HTF9nbFJvdGF0ZWY9Ci1HTF9nbFJvdGF0ZWZfMD0KLUdMX2dsUm90YXRlZl8xPQotR0xfZ2xSb3RhdGVmXzI9Ci1HTF9nbFJvdGF0ZWZfMz0KLQotR0xfZ2xTY2FsZWQ9Ci1HTF9nbFNjYWxlZF8wPQotR0xfZ2xTY2FsZWRfMT0KLUdMX2dsU2NhbGVkXzI9Ci0KLUdMX2dsU2NhbGVmPQotR0xfZ2xTY2FsZWZfMD0KLUdMX2dsU2NhbGVmXzE9Ci1HTF9nbFNjYWxlZl8yPQotCi1HTF9nbFNjaXNzb3I9Ci1HTF9nbFNjaXNzb3JfMD0KLUdMX2dsU2Npc3Nvcl8xPQotR0xfZ2xTY2lzc29yXzI9Ci1HTF9nbFNjaXNzb3JfMz0KLQotR0xfZ2xTZWxlY3RCdWZmZXI9Ci1HTF9nbFNlbGVjdEJ1ZmZlcl8wPQotR0xfZ2xTZWxlY3RCdWZmZXJfMT1jYXN0PShHTHVpbnQgKikKLQotR0xfZ2xTaGFkZU1vZGVsPQotR0xfZ2xTaGFkZU1vZGVsXzA9Ci0KLUdMX2dsU3RlbmNpbEZ1bmM9Ci1HTF9nbFN0ZW5jaWxGdW5jXzA9Ci1HTF9nbFN0ZW5jaWxGdW5jXzE9Ci1HTF9nbFN0ZW5jaWxGdW5jXzI9Ci0KLUdMX2dsU3RlbmNpbE1hc2s9Ci1HTF9nbFN0ZW5jaWxNYXNrXzA9Ci0KLUdMX2dsU3RlbmNpbE9wPQotR0xfZ2xTdGVuY2lsT3BfMD0KLUdMX2dsU3RlbmNpbE9wXzE9Ci1HTF9nbFN0ZW5jaWxPcF8yPQotCi1HTF9nbFRleENvb3JkMWQ9Ci1HTF9nbFRleENvb3JkMWRfMD0KLQotR0xfZ2xUZXhDb29yZDFkdj0KLUdMX2dsVGV4Q29vcmQxZHZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleENvb3JkMWY9Ci1HTF9nbFRleENvb3JkMWZfMD0KLQotR0xfZ2xUZXhDb29yZDFmdj0KLUdMX2dsVGV4Q29vcmQxZnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleENvb3JkMWk9Ci1HTF9nbFRleENvb3JkMWlfMD0KLQotR0xfZ2xUZXhDb29yZDFpdj0KLUdMX2dsVGV4Q29vcmQxaXZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleENvb3JkMXM9Ci1HTF9nbFRleENvb3JkMXNfMD0KLQotR0xfZ2xUZXhDb29yZDFzdj0KLUdMX2dsVGV4Q29vcmQxc3ZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleENvb3JkMmQ9Ci1HTF9nbFRleENvb3JkMmRfMD0KLUdMX2dsVGV4Q29vcmQyZF8xPQotCi1HTF9nbFRleENvb3JkMmR2PQotR0xfZ2xUZXhDb29yZDJkdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4Q29vcmQyZj0KLUdMX2dsVGV4Q29vcmQyZl8wPQotR0xfZ2xUZXhDb29yZDJmXzE9Ci0KLUdMX2dsVGV4Q29vcmQyZnY9Ci1HTF9nbFRleENvb3JkMmZ2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhDb29yZDJpPQotR0xfZ2xUZXhDb29yZDJpXzA9Ci1HTF9nbFRleENvb3JkMmlfMT0KLQotR0xfZ2xUZXhDb29yZDJpdj0KLUdMX2dsVGV4Q29vcmQyaXZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleENvb3JkMnM9Ci1HTF9nbFRleENvb3JkMnNfMD0KLUdMX2dsVGV4Q29vcmQyc18xPQotCi1HTF9nbFRleENvb3JkMnN2PQotR0xfZ2xUZXhDb29yZDJzdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4Q29vcmQzZD0KLUdMX2dsVGV4Q29vcmQzZF8wPQotR0xfZ2xUZXhDb29yZDNkXzE9Ci1HTF9nbFRleENvb3JkM2RfMj0KLQotR0xfZ2xUZXhDb29yZDNkdj0KLUdMX2dsVGV4Q29vcmQzZHZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleENvb3JkM2Y9Ci1HTF9nbFRleENvb3JkM2ZfMD0KLUdMX2dsVGV4Q29vcmQzZl8xPQotR0xfZ2xUZXhDb29yZDNmXzI9Ci0KLUdMX2dsVGV4Q29vcmQzZnY9Ci1HTF9nbFRleENvb3JkM2Z2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhDb29yZDNpPQotR0xfZ2xUZXhDb29yZDNpXzA9Ci1HTF9nbFRleENvb3JkM2lfMT0KLUdMX2dsVGV4Q29vcmQzaV8yPQotCi1HTF9nbFRleENvb3JkM2l2PQotR0xfZ2xUZXhDb29yZDNpdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4Q29vcmQzcz0KLUdMX2dsVGV4Q29vcmQzc18wPQotR0xfZ2xUZXhDb29yZDNzXzE9Ci1HTF9nbFRleENvb3JkM3NfMj0KLQotR0xfZ2xUZXhDb29yZDNzdj0KLUdMX2dsVGV4Q29vcmQzc3ZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleENvb3JkNGQ9Ci1HTF9nbFRleENvb3JkNGRfMD0KLUdMX2dsVGV4Q29vcmQ0ZF8xPQotR0xfZ2xUZXhDb29yZDRkXzI9Ci1HTF9nbFRleENvb3JkNGRfMz0KLQotR0xfZ2xUZXhDb29yZDRkdj0KLUdMX2dsVGV4Q29vcmQ0ZHZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleENvb3JkNGY9Ci1HTF9nbFRleENvb3JkNGZfMD0KLUdMX2dsVGV4Q29vcmQ0Zl8xPQotR0xfZ2xUZXhDb29yZDRmXzI9Ci1HTF9nbFRleENvb3JkNGZfMz0KLQotR0xfZ2xUZXhDb29yZDRmdj0KLUdMX2dsVGV4Q29vcmQ0ZnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleENvb3JkNGk9Ci1HTF9nbFRleENvb3JkNGlfMD0KLUdMX2dsVGV4Q29vcmQ0aV8xPQotR0xfZ2xUZXhDb29yZDRpXzI9Ci1HTF9nbFRleENvb3JkNGlfMz0KLQotR0xfZ2xUZXhDb29yZDRpdj0KLUdMX2dsVGV4Q29vcmQ0aXZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleENvb3JkNHM9Ci1HTF9nbFRleENvb3JkNHNfMD0KLUdMX2dsVGV4Q29vcmQ0c18xPQotR0xfZ2xUZXhDb29yZDRzXzI9Ci1HTF9nbFRleENvb3JkNHNfMz0KLQotR0xfZ2xUZXhDb29yZDRzdj0KLUdMX2dsVGV4Q29vcmQ0c3ZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleENvb3JkUG9pbnRlcj0KLUdMX2dsVGV4Q29vcmRQb2ludGVyXzA9Ci1HTF9nbFRleENvb3JkUG9pbnRlcl8xPQotR0xfZ2xUZXhDb29yZFBvaW50ZXJfMj0KLUdMX2dsVGV4Q29vcmRQb2ludGVyXzM9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhFbnZmPQotR0xfZ2xUZXhFbnZmXzA9Ci1HTF9nbFRleEVudmZfMT0KLUdMX2dsVGV4RW52Zl8yPQotCi1HTF9nbFRleEVudmZ2PQotR0xfZ2xUZXhFbnZmdl8wPQotR0xfZ2xUZXhFbnZmdl8xPQotR0xfZ2xUZXhFbnZmdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4RW52aT0KLUdMX2dsVGV4RW52aV8wPQotR0xfZ2xUZXhFbnZpXzE9Ci1HTF9nbFRleEVudmlfMj0KLQotR0xfZ2xUZXhFbnZpdj0KLUdMX2dsVGV4RW52aXZfMD0KLUdMX2dsVGV4RW52aXZfMT0KLUdMX2dsVGV4RW52aXZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleEdlbmQ9Ci1HTF9nbFRleEdlbmRfMD0KLUdMX2dsVGV4R2VuZF8xPQotR0xfZ2xUZXhHZW5kXzI9Ci0KLUdMX2dsVGV4R2VuZHY9Ci1HTF9nbFRleEdlbmR2XzA9Ci1HTF9nbFRleEdlbmR2XzE9Ci1HTF9nbFRleEdlbmR2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhHZW5mPQotR0xfZ2xUZXhHZW5mXzA9Ci1HTF9nbFRleEdlbmZfMT0KLUdMX2dsVGV4R2VuZl8yPQotCi1HTF9nbFRleEdlbmZ2PQotR0xfZ2xUZXhHZW5mdl8wPQotR0xfZ2xUZXhHZW5mdl8xPQotR0xfZ2xUZXhHZW5mdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4R2VuaT0KLUdMX2dsVGV4R2VuaV8wPQotR0xfZ2xUZXhHZW5pXzE9Ci1HTF9nbFRleEdlbmlfMj0KLQotR0xfZ2xUZXhHZW5pdj0KLUdMX2dsVGV4R2VuaXZfMD0KLUdMX2dsVGV4R2VuaXZfMT0KLUdMX2dsVGV4R2VuaXZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleEltYWdlMUQ9Ci1HTF9nbFRleEltYWdlMURfMD0KLUdMX2dsVGV4SW1hZ2UxRF8xPQotR0xfZ2xUZXhJbWFnZTFEXzI9Ci1HTF9nbFRleEltYWdlMURfMz0KLUdMX2dsVGV4SW1hZ2UxRF80PQotR0xfZ2xUZXhJbWFnZTFEXzU9Ci1HTF9nbFRleEltYWdlMURfNj0KLUdMX2dsVGV4SW1hZ2UxRF83PWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4SW1hZ2UyRD0KLUdMX2dsVGV4SW1hZ2UyRF8wPQotR0xfZ2xUZXhJbWFnZTJEXzE9Ci1HTF9nbFRleEltYWdlMkRfMj0KLUdMX2dsVGV4SW1hZ2UyRF8zPQotR0xfZ2xUZXhJbWFnZTJEXzQ9Ci1HTF9nbFRleEltYWdlMkRfNT0KLUdMX2dsVGV4SW1hZ2UyRF82PQotR0xfZ2xUZXhJbWFnZTJEXzc9Ci1HTF9nbFRleEltYWdlMkRfOD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleFBhcmFtZXRlcmY9Ci1HTF9nbFRleFBhcmFtZXRlcmZfMD0KLUdMX2dsVGV4UGFyYW1ldGVyZl8xPQotR0xfZ2xUZXhQYXJhbWV0ZXJmXzI9Ci0KLUdMX2dsVGV4UGFyYW1ldGVyZnY9Ci1HTF9nbFRleFBhcmFtZXRlcmZ2XzA9Ci1HTF9nbFRleFBhcmFtZXRlcmZ2XzE9Ci1HTF9nbFRleFBhcmFtZXRlcmZ2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhQYXJhbWV0ZXJpPQotR0xfZ2xUZXhQYXJhbWV0ZXJpXzA9Ci1HTF9nbFRleFBhcmFtZXRlcmlfMT0KLUdMX2dsVGV4UGFyYW1ldGVyaV8yPQotCi1HTF9nbFRleFBhcmFtZXRlcml2PQotR0xfZ2xUZXhQYXJhbWV0ZXJpdl8wPQotR0xfZ2xUZXhQYXJhbWV0ZXJpdl8xPQotR0xfZ2xUZXhQYXJhbWV0ZXJpdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4U3ViSW1hZ2UxRD0KLUdMX2dsVGV4U3ViSW1hZ2UxRF8wPQotR0xfZ2xUZXhTdWJJbWFnZTFEXzE9Ci1HTF9nbFRleFN1YkltYWdlMURfMj0KLUdMX2dsVGV4U3ViSW1hZ2UxRF8zPQotR0xfZ2xUZXhTdWJJbWFnZTFEXzQ9Ci1HTF9nbFRleFN1YkltYWdlMURfNT0KLUdMX2dsVGV4U3ViSW1hZ2UxRF82PWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4U3ViSW1hZ2UyRD0KLUdMX2dsVGV4U3ViSW1hZ2UyRF8wPQotR0xfZ2xUZXhTdWJJbWFnZTJEXzE9Ci1HTF9nbFRleFN1YkltYWdlMkRfMj0KLUdMX2dsVGV4U3ViSW1hZ2UyRF8zPQotR0xfZ2xUZXhTdWJJbWFnZTJEXzQ9Ci1HTF9nbFRleFN1YkltYWdlMkRfNT0KLUdMX2dsVGV4U3ViSW1hZ2UyRF82PQotR0xfZ2xUZXhTdWJJbWFnZTJEXzc9Ci1HTF9nbFRleFN1YkltYWdlMkRfOD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRyYW5zbGF0ZWQ9Ci1HTF9nbFRyYW5zbGF0ZWRfMD0KLUdMX2dsVHJhbnNsYXRlZF8xPQotR0xfZ2xUcmFuc2xhdGVkXzI9Ci0KLUdMX2dsVHJhbnNsYXRlZj0KLUdMX2dsVHJhbnNsYXRlZl8wPQotR0xfZ2xUcmFuc2xhdGVmXzE9Ci1HTF9nbFRyYW5zbGF0ZWZfMj0KLQotR0xfZ2xWZXJ0ZXgyZD0KLUdMX2dsVmVydGV4MmRfMD0KLUdMX2dsVmVydGV4MmRfMT0KLQotR0xfZ2xWZXJ0ZXgyZHY9Ci1HTF9nbFZlcnRleDJkdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVmVydGV4MmY9Ci1HTF9nbFZlcnRleDJmXzA9Ci1HTF9nbFZlcnRleDJmXzE9Ci0KLUdMX2dsVmVydGV4MmZ2PQotR0xfZ2xWZXJ0ZXgyZnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFZlcnRleDJpPQotR0xfZ2xWZXJ0ZXgyaV8wPQotR0xfZ2xWZXJ0ZXgyaV8xPQotCi1HTF9nbFZlcnRleDJpdj0KLUdMX2dsVmVydGV4Mml2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xWZXJ0ZXgycz0KLUdMX2dsVmVydGV4MnNfMD0KLUdMX2dsVmVydGV4MnNfMT0KLQotR0xfZ2xWZXJ0ZXgyc3Y9Ci1HTF9nbFZlcnRleDJzdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVmVydGV4M2Q9Ci1HTF9nbFZlcnRleDNkXzA9Ci1HTF9nbFZlcnRleDNkXzE9Ci1HTF9nbFZlcnRleDNkXzI9Ci0KLUdMX2dsVmVydGV4M2R2X19JPQotR0xfZ2xWZXJ0ZXgzZHZfX0lfMD1jYXN0PShjb25zdCBHTGRvdWJsZSAqKQotCi1HTF9nbFZlcnRleDNkdl9fXzNEPQotR0xfZ2xWZXJ0ZXgzZHZfX18zRF8wPQotCi1HTF9nbFZlcnRleDNmPQotR0xfZ2xWZXJ0ZXgzZl8wPQotR0xfZ2xWZXJ0ZXgzZl8xPQotR0xfZ2xWZXJ0ZXgzZl8yPQotCi1HTF9nbFZlcnRleDNmdj0KLUdMX2dsVmVydGV4M2Z2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xWZXJ0ZXgzaT0KLUdMX2dsVmVydGV4M2lfMD0KLUdMX2dsVmVydGV4M2lfMT0KLUdMX2dsVmVydGV4M2lfMj0KLQotR0xfZ2xWZXJ0ZXgzaXY9Ci1HTF9nbFZlcnRleDNpdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVmVydGV4M3M9Ci1HTF9nbFZlcnRleDNzXzA9Ci1HTF9nbFZlcnRleDNzXzE9Ci1HTF9nbFZlcnRleDNzXzI9Ci0KLUdMX2dsVmVydGV4M3N2PQotR0xfZ2xWZXJ0ZXgzc3ZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFZlcnRleDRkPQotR0xfZ2xWZXJ0ZXg0ZF8wPQotR0xfZ2xWZXJ0ZXg0ZF8xPQotR0xfZ2xWZXJ0ZXg0ZF8yPQotR0xfZ2xWZXJ0ZXg0ZF8zPQotCi1HTF9nbFZlcnRleDRkdj0KLUdMX2dsVmVydGV4NGR2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xWZXJ0ZXg0Zj0KLUdMX2dsVmVydGV4NGZfMD0KLUdMX2dsVmVydGV4NGZfMT0KLUdMX2dsVmVydGV4NGZfMj0KLUdMX2dsVmVydGV4NGZfMz0KLQotR0xfZ2xWZXJ0ZXg0ZnY9Ci1HTF9nbFZlcnRleDRmdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVmVydGV4NGk9Ci1HTF9nbFZlcnRleDRpXzA9Ci1HTF9nbFZlcnRleDRpXzE9Ci1HTF9nbFZlcnRleDRpXzI9Ci1HTF9nbFZlcnRleDRpXzM9Ci0KLUdMX2dsVmVydGV4NGl2PQotR0xfZ2xWZXJ0ZXg0aXZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFZlcnRleDRzPQotR0xfZ2xWZXJ0ZXg0c18wPQotR0xfZ2xWZXJ0ZXg0c18xPQotR0xfZ2xWZXJ0ZXg0c18yPQotR0xfZ2xWZXJ0ZXg0c18zPQotCi1HTF9nbFZlcnRleDRzdj0KLUdMX2dsVmVydGV4NHN2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xWZXJ0ZXhQb2ludGVyPQotR0xfZ2xWZXJ0ZXhQb2ludGVyXzA9Ci1HTF9nbFZlcnRleFBvaW50ZXJfMT0KLUdMX2dsVmVydGV4UG9pbnRlcl8yPQotR0xfZ2xWZXJ0ZXhQb2ludGVyXzM9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xWaWV3cG9ydD0KLUdMX2dsVmlld3BvcnRfMD0KLUdMX2dsVmlld3BvcnRfMT0KLUdMX2dsVmlld3BvcnRfMj0KLUdMX2dsVmlld3BvcnRfMz0KLQotCi1vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX0dMQ29udGV4dD1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9HTERhdGE9ZmxhZ3M9bm9fZ2VuCi1HTERhdGFfZGV2aWNlPQotR0xEYXRhX3N0eWxlPQotR0xEYXRhX2ltYWdlPQotR0xEYXRhX2Rpc3BsYXk9Ci1HTERhdGFfZHJhd2FibGU9Ci1HTERhdGFfZm9yZWdyb3VuZD0KLUdMRGF0YV9iYWNrZ3JvdW5kPQotR0xEYXRhX2ZvbnQ9Ci1HTERhdGFfY29sb3JtYXA9Ci1HTERhdGFfY2xpcFJnbj0KLUdMRGF0YV9saW5lU3R5bGU9Ci1HTERhdGFfcmVuZGVyVGFibGU9Ci1HTERhdGFfc3RyaW5nPQotR0xEYXRhX3N0cmluZ1dpZHRoPQotR0xEYXRhX3N0cmluZ0hlaWdodD0KLUdMRGF0YV94bVN0cmluZz0KLUdMRGF0YV90ZXh0PQotR0xEYXRhX3RleHRXaWR0aD0KLUdMRGF0YV90ZXh0SGVpZ2h0PQotR0xEYXRhX3htVGV4dD0KLUdMRGF0YV94bU1uZW1vbmljPQotR0xEYXRhX2RyYXdGbGFncz0KLQotb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9HTERyYXdhYmxlPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX0dMTGlzdGVuZXI9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfR0xVPWZsYWdzPW5vX2dlbgotR0xVX2dsdUJlZ2luQ3VydmU9Ci1HTFVfZ2x1QmVnaW5DdXJ2ZV8wPQotCi1HTFVfZ2x1QmVnaW5Qb2x5Z29uPQotR0xVX2dsdUJlZ2luUG9seWdvbl8wPQotCi1HTFVfZ2x1QmVnaW5TdXJmYWNlPQotR0xVX2dsdUJlZ2luU3VyZmFjZV8wPQotCi1HTFVfZ2x1QmVnaW5UcmltPQotR0xVX2dsdUJlZ2luVHJpbV8wPQotCi1HTFVfZ2x1QnVpbGQxRE1pcG1hcHM9Ci1HTFVfZ2x1QnVpbGQxRE1pcG1hcHNfMD0KLUdMVV9nbHVCdWlsZDFETWlwbWFwc18xPQotR0xVX2dsdUJ1aWxkMURNaXBtYXBzXzI9Ci1HTFVfZ2x1QnVpbGQxRE1pcG1hcHNfMz0KLUdMVV9nbHVCdWlsZDFETWlwbWFwc180PQotR0xVX2dsdUJ1aWxkMURNaXBtYXBzXzU9Ci0KLUdMVV9nbHVCdWlsZDJETWlwbWFwcz0KLUdMVV9nbHVCdWlsZDJETWlwbWFwc18wPQotR0xVX2dsdUJ1aWxkMkRNaXBtYXBzXzE9Ci1HTFVfZ2x1QnVpbGQyRE1pcG1hcHNfMj0KLUdMVV9nbHVCdWlsZDJETWlwbWFwc18zPQotR0xVX2dsdUJ1aWxkMkRNaXBtYXBzXzQ9Ci1HTFVfZ2x1QnVpbGQyRE1pcG1hcHNfNT0KLUdMVV9nbHVCdWlsZDJETWlwbWFwc182PQotCi1HTFVfZ2x1Q3lsaW5kZXI9Ci1HTFVfZ2x1Q3lsaW5kZXJfMD0KLUdMVV9nbHVDeWxpbmRlcl8xPQotR0xVX2dsdUN5bGluZGVyXzI9Ci1HTFVfZ2x1Q3lsaW5kZXJfMz0KLUdMVV9nbHVDeWxpbmRlcl80PQotR0xVX2dsdUN5bGluZGVyXzU9Ci0KLUdMVV9nbHVEZWxldGVOdXJic1JlbmRlcmVyPQotR0xVX2dsdURlbGV0ZU51cmJzUmVuZGVyZXJfMD0KLQotR0xVX2dsdURlbGV0ZVF1YWRyaWM9Ci1HTFVfZ2x1RGVsZXRlUXVhZHJpY18wPQotCi1HTFVfZ2x1RGVsZXRlVGVzcz0KLUdMVV9nbHVEZWxldGVUZXNzXzA9Ci0KLUdMVV9nbHVEaXNrPQotR0xVX2dsdURpc2tfMD0KLUdMVV9nbHVEaXNrXzE9Ci1HTFVfZ2x1RGlza18yPQotR0xVX2dsdURpc2tfMz0KLUdMVV9nbHVEaXNrXzQ9Ci0KLUdMVV9nbHVFbmRDdXJ2ZT0KLUdMVV9nbHVFbmRDdXJ2ZV8wPQotCi1HTFVfZ2x1RW5kUG9seWdvbj0KLUdMVV9nbHVFbmRQb2x5Z29uXzA9Ci0KLUdMVV9nbHVFbmRTdXJmYWNlPQotR0xVX2dsdUVuZFN1cmZhY2VfMD0KLQotR0xVX2dsdUVuZFRyaW09Ci1HTFVfZ2x1RW5kVHJpbV8wPQotCi1HTFVfZ2x1RXJyb3JTdHJpbmc9Ci1HTFVfZ2x1RXJyb3JTdHJpbmdfMD0KLQotR0xVX2dsdUdldE51cmJzUHJvcGVydHk9Ci1HTFVfZ2x1R2V0TnVyYnNQcm9wZXJ0eV8wPQotR0xVX2dsdUdldE51cmJzUHJvcGVydHlfMT0KLUdMVV9nbHVHZXROdXJic1Byb3BlcnR5XzI9Ci0KLUdMVV9nbHVHZXRTdHJpbmc9Ci1HTFVfZ2x1R2V0U3RyaW5nXzA9Ci0KLUdMVV9nbHVHZXRUZXNzUHJvcGVydHk9Ci1HTFVfZ2x1R2V0VGVzc1Byb3BlcnR5XzA9Ci1HTFVfZ2x1R2V0VGVzc1Byb3BlcnR5XzE9Ci1HTFVfZ2x1R2V0VGVzc1Byb3BlcnR5XzI9Ci0KLUdMVV9nbHVMb2FkU2FtcGxpbmdNYXRyaWNlcz0KLUdMVV9nbHVMb2FkU2FtcGxpbmdNYXRyaWNlc18wPQotR0xVX2dsdUxvYWRTYW1wbGluZ01hdHJpY2VzXzE9Ci1HTFVfZ2x1TG9hZFNhbXBsaW5nTWF0cmljZXNfMj0KLUdMVV9nbHVMb2FkU2FtcGxpbmdNYXRyaWNlc18zPQotCi1HTFVfZ2x1TG9va0F0PQotR0xVX2dsdUxvb2tBdF8wPQotR0xVX2dsdUxvb2tBdF8xPQotR0xVX2dsdUxvb2tBdF8yPQotR0xVX2dsdUxvb2tBdF8zPQotR0xVX2dsdUxvb2tBdF80PQotR0xVX2dsdUxvb2tBdF81PQotR0xVX2dsdUxvb2tBdF82PQotR0xVX2dsdUxvb2tBdF83PQotR0xVX2dsdUxvb2tBdF84PQotCi1HTFVfZ2x1TmV3TnVyYnNSZW5kZXJlcj0KLQotR0xVX2dsdU5ld1F1YWRyaWM9Ci0KLUdMVV9nbHVOZXdUZXNzPQotCi1HTFVfZ2x1TmV4dENvbnRvdXI9Ci1HTFVfZ2x1TmV4dENvbnRvdXJfMD0KLUdMVV9nbHVOZXh0Q29udG91cl8xPQotCi1HTFVfZ2x1TnVyYnNDYWxsYmFjaz0KLUdMVV9nbHVOdXJic0NhbGxiYWNrXzA9Ci1HTFVfZ2x1TnVyYnNDYWxsYmFja18xPQotR0xVX2dsdU51cmJzQ2FsbGJhY2tfMj0KLQotR0xVX2dsdU51cmJzQ3VydmU9Ci1HTFVfZ2x1TnVyYnNDdXJ2ZV8wPQotR0xVX2dsdU51cmJzQ3VydmVfMT0KLUdMVV9nbHVOdXJic0N1cnZlXzI9Ci1HTFVfZ2x1TnVyYnNDdXJ2ZV8zPQotR0xVX2dsdU51cmJzQ3VydmVfND0KLUdMVV9nbHVOdXJic0N1cnZlXzU9Ci1HTFVfZ2x1TnVyYnNDdXJ2ZV82PQotCi1HTFVfZ2x1TnVyYnNQcm9wZXJ0eT0KLUdMVV9nbHVOdXJic1Byb3BlcnR5XzA9Ci1HTFVfZ2x1TnVyYnNQcm9wZXJ0eV8xPQotR0xVX2dsdU51cmJzUHJvcGVydHlfMj0KLQotR0xVX2dsdU51cmJzU3VyZmFjZT0KLUdMVV9nbHVOdXJic1N1cmZhY2VfMD0KLUdMVV9nbHVOdXJic1N1cmZhY2VfMT0KLUdMVV9nbHVOdXJic1N1cmZhY2VfMj0KLUdMVV9nbHVOdXJic1N1cmZhY2VfMz0KLUdMVV9nbHVOdXJic1N1cmZhY2VfND0KLUdMVV9nbHVOdXJic1N1cmZhY2VfNT0KLUdMVV9nbHVOdXJic1N1cmZhY2VfNj0KLUdMVV9nbHVOdXJic1N1cmZhY2VfNz0KLUdMVV9nbHVOdXJic1N1cmZhY2VfOD0KLUdMVV9nbHVOdXJic1N1cmZhY2VfOT0KLUdMVV9nbHVOdXJic1N1cmZhY2VfMTA9Ci0KLUdMVV9nbHVPcnRobzJEPQotR0xVX2dsdU9ydGhvMkRfMD0KLUdMVV9nbHVPcnRobzJEXzE9Ci1HTFVfZ2x1T3J0aG8yRF8yPQotR0xVX2dsdU9ydGhvMkRfMz0KLQotR0xVX2dsdVBhcnRpYWxEaXNrPQotR0xVX2dsdVBhcnRpYWxEaXNrXzA9Ci1HTFVfZ2x1UGFydGlhbERpc2tfMT0KLUdMVV9nbHVQYXJ0aWFsRGlza18yPQotR0xVX2dsdVBhcnRpYWxEaXNrXzM9Ci1HTFVfZ2x1UGFydGlhbERpc2tfND0KLUdMVV9nbHVQYXJ0aWFsRGlza181PQotR0xVX2dsdVBhcnRpYWxEaXNrXzY9Ci0KLUdMVV9nbHVQZXJzcGVjdGl2ZT0KLUdMVV9nbHVQZXJzcGVjdGl2ZV8wPQotR0xVX2dsdVBlcnNwZWN0aXZlXzE9Ci1HTFVfZ2x1UGVyc3BlY3RpdmVfMj0KLUdMVV9nbHVQZXJzcGVjdGl2ZV8zPQotCi1HTFVfZ2x1UGlja01hdHJpeD0KLUdMVV9nbHVQaWNrTWF0cml4XzA9Ci1HTFVfZ2x1UGlja01hdHJpeF8xPQotR0xVX2dsdVBpY2tNYXRyaXhfMj0KLUdMVV9nbHVQaWNrTWF0cml4XzM9Ci1HTFVfZ2x1UGlja01hdHJpeF80PQotCi1HTFVfZ2x1UHJvamVjdD0KLUdMVV9nbHVQcm9qZWN0XzA9Ci1HTFVfZ2x1UHJvamVjdF8xPQotR0xVX2dsdVByb2plY3RfMj0KLUdMVV9nbHVQcm9qZWN0XzM9Ci1HTFVfZ2x1UHJvamVjdF80PQotR0xVX2dsdVByb2plY3RfNT0KLUdMVV9nbHVQcm9qZWN0XzY9Ci1HTFVfZ2x1UHJvamVjdF83PQotR0xVX2dsdVByb2plY3RfOD0KLQotR0xVX2dsdVB3bEN1cnZlPQotR0xVX2dsdVB3bEN1cnZlXzA9Ci1HTFVfZ2x1UHdsQ3VydmVfMT0KLUdMVV9nbHVQd2xDdXJ2ZV8yPQotR0xVX2dsdVB3bEN1cnZlXzM9Ci1HTFVfZ2x1UHdsQ3VydmVfND0KLQotR0xVX2dsdVF1YWRyaWNDYWxsYmFjaz0KLUdMVV9nbHVRdWFkcmljQ2FsbGJhY2tfMD0KLUdMVV9nbHVRdWFkcmljQ2FsbGJhY2tfMT0KLUdMVV9nbHVRdWFkcmljQ2FsbGJhY2tfMj0KLQotR0xVX2dsdVF1YWRyaWNEcmF3U3R5bGU9Ci1HTFVfZ2x1UXVhZHJpY0RyYXdTdHlsZV8wPQotR0xVX2dsdVF1YWRyaWNEcmF3U3R5bGVfMT0KLQotR0xVX2dsdVF1YWRyaWNOb3JtYWxzPQotR0xVX2dsdVF1YWRyaWNOb3JtYWxzXzA9Ci1HTFVfZ2x1UXVhZHJpY05vcm1hbHNfMT0KLQotR0xVX2dsdVF1YWRyaWNPcmllbnRhdGlvbj0KLUdMVV9nbHVRdWFkcmljT3JpZW50YXRpb25fMD0KLUdMVV9nbHVRdWFkcmljT3JpZW50YXRpb25fMT0KLQotR0xVX2dsdVF1YWRyaWNUZXh0dXJlPQotR0xVX2dsdVF1YWRyaWNUZXh0dXJlXzA9Ci1HTFVfZ2x1UXVhZHJpY1RleHR1cmVfMT0KLQotR0xVX2dsdVNjYWxlSW1hZ2U9Ci1HTFVfZ2x1U2NhbGVJbWFnZV8wPQotR0xVX2dsdVNjYWxlSW1hZ2VfMT0KLUdMVV9nbHVTY2FsZUltYWdlXzI9Ci1HTFVfZ2x1U2NhbGVJbWFnZV8zPQotR0xVX2dsdVNjYWxlSW1hZ2VfND0KLUdMVV9nbHVTY2FsZUltYWdlXzU9Ci1HTFVfZ2x1U2NhbGVJbWFnZV82PQotR0xVX2dsdVNjYWxlSW1hZ2VfNz0KLUdMVV9nbHVTY2FsZUltYWdlXzg9Ci0KLUdMVV9nbHVTcGhlcmU9Ci1HTFVfZ2x1U3BoZXJlXzA9Ci1HTFVfZ2x1U3BoZXJlXzE9Ci1HTFVfZ2x1U3BoZXJlXzI9Ci1HTFVfZ2x1U3BoZXJlXzM9Ci0KLUdMVV9nbHVUZXNzQmVnaW5Db250b3VyPQotR0xVX2dsdVRlc3NCZWdpbkNvbnRvdXJfMD0KLQotR0xVX2dsdVRlc3NCZWdpblBvbHlnb249Ci1HTFVfZ2x1VGVzc0JlZ2luUG9seWdvbl8wPQotR0xVX2dsdVRlc3NCZWdpblBvbHlnb25fMT0KLQotR0xVX2dsdVRlc3NDYWxsYmFjaz0KLUdMVV9nbHVUZXNzQ2FsbGJhY2tfMD0KLUdMVV9nbHVUZXNzQ2FsbGJhY2tfMT0KLUdMVV9nbHVUZXNzQ2FsbGJhY2tfMj0KLQotR0xVX2dsdVRlc3NFbmRDb250b3VyPQotR0xVX2dsdVRlc3NFbmRDb250b3VyXzA9Ci0KLUdMVV9nbHVUZXNzRW5kUG9seWdvbj0KLUdMVV9nbHVUZXNzRW5kUG9seWdvbl8wPQotCi1HTFVfZ2x1VGVzc05vcm1hbD0KLUdMVV9nbHVUZXNzTm9ybWFsXzA9Ci1HTFVfZ2x1VGVzc05vcm1hbF8xPQotR0xVX2dsdVRlc3NOb3JtYWxfMj0KLUdMVV9nbHVUZXNzTm9ybWFsXzM9Ci0KLUdMVV9nbHVUZXNzUHJvcGVydHk9Ci1HTFVfZ2x1VGVzc1Byb3BlcnR5XzA9Ci1HTFVfZ2x1VGVzc1Byb3BlcnR5XzE9Ci1HTFVfZ2x1VGVzc1Byb3BlcnR5XzI9Ci0KLUdMVV9nbHVUZXNzVmVydGV4PQotR0xVX2dsdVRlc3NWZXJ0ZXhfMD0KLUdMVV9nbHVUZXNzVmVydGV4XzE9Ci1HTFVfZ2x1VGVzc1ZlcnRleF8yPQotCi1HTFVfZ2x1VW5Qcm9qZWN0PQotR0xVX2dsdVVuUHJvamVjdF8wPQotR0xVX2dsdVVuUHJvamVjdF8xPQotR0xVX2dsdVVuUHJvamVjdF8yPQotR0xVX2dsdVVuUHJvamVjdF8zPQotR0xVX2dsdVVuUHJvamVjdF80PQotR0xVX2dsdVVuUHJvamVjdF81PQotR0xVX2dsdVVuUHJvamVjdF82PQotR0xVX2dsdVVuUHJvamVjdF83PQotR0xVX2dsdVVuUHJvamVjdF84PQotCi0KLW9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfTGlicmFyeT1mbGFncz1ub19nZW4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuR0xVLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTFUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MDcwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTFUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3NzkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9HTD1mbGFncz1ub19nZW4KLUdMX2dsQWNjdW09Ci1HTF9nbEFjY3VtXzA9Ci1HTF9nbEFjY3VtXzE9Ci0KLUdMX2dsQWxwaGFGdW5jPQotR0xfZ2xBbHBoYUZ1bmNfMD0KLUdMX2dsQWxwaGFGdW5jXzE9Ci0KLUdMX2dsQXJlVGV4dHVyZXNSZXNpZGVudD0KLUdMX2dsQXJlVGV4dHVyZXNSZXNpZGVudF8wPQotR0xfZ2xBcmVUZXh0dXJlc1Jlc2lkZW50XzE9Ci1HTF9nbEFyZVRleHR1cmVzUmVzaWRlbnRfMj0KLQotR0xfZ2xBcnJheUVsZW1lbnQ9Ci1HTF9nbEFycmF5RWxlbWVudF8wPQotCi1HTF9nbEJlZ2luPQotR0xfZ2xCZWdpbl8wPQotCi1HTF9nbEJpbmRUZXh0dXJlPQotR0xfZ2xCaW5kVGV4dHVyZV8wPQotR0xfZ2xCaW5kVGV4dHVyZV8xPQotCi1HTF9nbEJpdG1hcD0KLUdMX2dsQml0bWFwXzA9Ci1HTF9nbEJpdG1hcF8xPQotR0xfZ2xCaXRtYXBfMj0KLUdMX2dsQml0bWFwXzM9Ci1HTF9nbEJpdG1hcF80PQotR0xfZ2xCaXRtYXBfNT0KLUdMX2dsQml0bWFwXzY9Ci0KLUdMX2dsQmxlbmRGdW5jPQotR0xfZ2xCbGVuZEZ1bmNfMD0KLUdMX2dsQmxlbmRGdW5jXzE9Ci0KLUdMX2dsQ2FsbExpc3Q9Ci1HTF9nbENhbGxMaXN0XzA9Ci0KLUdMX2dsQ2FsbExpc3RzX19JSV8zQj0KLUdMX2dsQ2FsbExpc3RzX19JSV8zQl8wPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNCXzE9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0JfMj0KLQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNDPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNDXzA9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0NfMT0KLUdMX2dsQ2FsbExpc3RzX19JSV8zQ18yPQotCi1HTF9nbENhbGxMaXN0c19fSUlfM0k9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0lfMD0KLUdMX2dsQ2FsbExpc3RzX19JSV8zSV8xPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNJXzI9Ci0KLUdMX2dsQ2xlYXI9Ci1HTF9nbENsZWFyXzA9Ci0KLUdMX2dsQ2xlYXJBY2N1bT0KLUdMX2dsQ2xlYXJBY2N1bV8wPQotR0xfZ2xDbGVhckFjY3VtXzE9Ci1HTF9nbENsZWFyQWNjdW1fMj0KLUdMX2dsQ2xlYXJBY2N1bV8zPQotCi1HTF9nbENsZWFyQ29sb3I9Ci1HTF9nbENsZWFyQ29sb3JfMD0KLUdMX2dsQ2xlYXJDb2xvcl8xPQotR0xfZ2xDbGVhckNvbG9yXzI9Ci1HTF9nbENsZWFyQ29sb3JfMz0KLQotR0xfZ2xDbGVhckRlcHRoPQotR0xfZ2xDbGVhckRlcHRoXzA9Ci0KLUdMX2dsQ2xlYXJJbmRleD0KLUdMX2dsQ2xlYXJJbmRleF8wPQotCi1HTF9nbENsZWFyU3RlbmNpbD0KLUdMX2dsQ2xlYXJTdGVuY2lsXzA9Ci0KLUdMX2dsQ2xpcFBsYW5lPQotR0xfZ2xDbGlwUGxhbmVfMD0KLUdMX2dsQ2xpcFBsYW5lXzE9Ci0KLUdMX2dsQ29sb3IzYj0KLUdMX2dsQ29sb3IzYl8wPQotR0xfZ2xDb2xvcjNiXzE9Ci1HTF9nbENvbG9yM2JfMj0KLQotR0xfZ2xDb2xvcjNidj0KLUdMX2dsQ29sb3IzYnZfMD0KLQotR0xfZ2xDb2xvcjNkPQotR0xfZ2xDb2xvcjNkXzA9Ci1HTF9nbENvbG9yM2RfMT0KLUdMX2dsQ29sb3IzZF8yPQotCi1HTF9nbENvbG9yM2R2PQotR0xfZ2xDb2xvcjNkdl8wPQotCi1HTF9nbENvbG9yM2Y9Ci1HTF9nbENvbG9yM2ZfMD0KLUdMX2dsQ29sb3IzZl8xPQotR0xfZ2xDb2xvcjNmXzI9Ci0KLUdMX2dsQ29sb3IzZnY9Ci1HTF9nbENvbG9yM2Z2XzA9Ci0KLUdMX2dsQ29sb3IzaT0KLUdMX2dsQ29sb3IzaV8wPQotR0xfZ2xDb2xvcjNpXzE9Ci1HTF9nbENvbG9yM2lfMj0KLQotR0xfZ2xDb2xvcjNpdj0KLUdMX2dsQ29sb3IzaXZfMD0KLQotR0xfZ2xDb2xvcjNzPQotR0xfZ2xDb2xvcjNzXzA9Ci1HTF9nbENvbG9yM3NfMT0KLUdMX2dsQ29sb3Izc18yPQotCi1HTF9nbENvbG9yM3N2PQotR0xfZ2xDb2xvcjNzdl8wPQotCi1HTF9nbENvbG9yM3ViPQotR0xfZ2xDb2xvcjN1Yl8wPQotR0xfZ2xDb2xvcjN1Yl8xPQotR0xfZ2xDb2xvcjN1Yl8yPQotCi1HTF9nbENvbG9yM3Vidj0KLUdMX2dsQ29sb3IzdWJ2XzA9Ci0KLUdMX2dsQ29sb3IzdWk9Ci1HTF9nbENvbG9yM3VpXzA9Ci1HTF9nbENvbG9yM3VpXzE9Ci1HTF9nbENvbG9yM3VpXzI9Ci0KLUdMX2dsQ29sb3IzdWl2PQotR0xfZ2xDb2xvcjN1aXZfMD0KLQotR0xfZ2xDb2xvcjN1cz0KLUdMX2dsQ29sb3IzdXNfMD0KLUdMX2dsQ29sb3IzdXNfMT0KLUdMX2dsQ29sb3IzdXNfMj0KLQotR0xfZ2xDb2xvcjN1c3Y9Ci1HTF9nbENvbG9yM3Vzdl8wPQotCi1HTF9nbENvbG9yNGI9Ci1HTF9nbENvbG9yNGJfMD0KLUdMX2dsQ29sb3I0Yl8xPQotR0xfZ2xDb2xvcjRiXzI9Ci1HTF9nbENvbG9yNGJfMz0KLQotR0xfZ2xDb2xvcjRidj0KLUdMX2dsQ29sb3I0YnZfMD0KLQotR0xfZ2xDb2xvcjRkPQotR0xfZ2xDb2xvcjRkXzA9Ci1HTF9nbENvbG9yNGRfMT0KLUdMX2dsQ29sb3I0ZF8yPQotR0xfZ2xDb2xvcjRkXzM9Ci0KLUdMX2dsQ29sb3I0ZHY9Ci1HTF9nbENvbG9yNGR2XzA9Ci0KLUdMX2dsQ29sb3I0Zj0KLUdMX2dsQ29sb3I0Zl8wPQotR0xfZ2xDb2xvcjRmXzE9Ci1HTF9nbENvbG9yNGZfMj0KLUdMX2dsQ29sb3I0Zl8zPQotCi1HTF9nbENvbG9yNGZ2PQotR0xfZ2xDb2xvcjRmdl8wPQotCi1HTF9nbENvbG9yNGk9Ci1HTF9nbENvbG9yNGlfMD0KLUdMX2dsQ29sb3I0aV8xPQotR0xfZ2xDb2xvcjRpXzI9Ci1HTF9nbENvbG9yNGlfMz0KLQotR0xfZ2xDb2xvcjRpdj0KLUdMX2dsQ29sb3I0aXZfMD0KLQotR0xfZ2xDb2xvcjRzPQotR0xfZ2xDb2xvcjRzXzA9Ci1HTF9nbENvbG9yNHNfMT0KLUdMX2dsQ29sb3I0c18yPQotR0xfZ2xDb2xvcjRzXzM9Ci0KLUdMX2dsQ29sb3I0dWI9Ci1HTF9nbENvbG9yNHViXzA9Ci1HTF9nbENvbG9yNHViXzE9Ci1HTF9nbENvbG9yNHViXzI9Ci1HTF9nbENvbG9yNHViXzM9Ci0KLUdMX2dsQ29sb3I0dWJ2X19fM0I9Ci1HTF9nbENvbG9yNHVidl9fXzNCXzA9Ci0KLUdMX2dsQ29sb3I0dWJ2X19fM1M9Ci1HTF9nbENvbG9yNHVidl9fXzNTXzA9Ci0KLUdMX2dsQ29sb3I0dWk9Ci1HTF9nbENvbG9yNHVpXzA9Ci1HTF9nbENvbG9yNHVpXzE9Ci1HTF9nbENvbG9yNHVpXzI9Ci1HTF9nbENvbG9yNHVpXzM9Ci0KLUdMX2dsQ29sb3I0dWl2PQotR0xfZ2xDb2xvcjR1aXZfMD0KLQotR0xfZ2xDb2xvcjR1cz0KLUdMX2dsQ29sb3I0dXNfMD0KLUdMX2dsQ29sb3I0dXNfMT0KLUdMX2dsQ29sb3I0dXNfMj0KLUdMX2dsQ29sb3I0dXNfMz0KLQotR0xfZ2xDb2xvcjR1c3Y9Ci1HTF9nbENvbG9yNHVzdl8wPQotCi1HTF9nbENvbG9yTWFzaz0KLUdMX2dsQ29sb3JNYXNrXzA9Ci1HTF9nbENvbG9yTWFza18xPQotR0xfZ2xDb2xvck1hc2tfMj0KLUdMX2dsQ29sb3JNYXNrXzM9Ci0KLUdMX2dsQ29sb3JNYXRlcmlhbD0KLUdMX2dsQ29sb3JNYXRlcmlhbF8wPQotR0xfZ2xDb2xvck1hdGVyaWFsXzE9Ci0KLUdMX2dsQ29sb3JQb2ludGVyPQotR0xfZ2xDb2xvclBvaW50ZXJfMD0KLUdMX2dsQ29sb3JQb2ludGVyXzE9Ci1HTF9nbENvbG9yUG9pbnRlcl8yPQotR0xfZ2xDb2xvclBvaW50ZXJfMz0KLQotR0xfZ2xDb3B5UGl4ZWxzPQotR0xfZ2xDb3B5UGl4ZWxzXzA9Ci1HTF9nbENvcHlQaXhlbHNfMT0KLUdMX2dsQ29weVBpeGVsc18yPQotR0xfZ2xDb3B5UGl4ZWxzXzM9Ci1HTF9nbENvcHlQaXhlbHNfND0KLQotR0xfZ2xDb3B5VGV4SW1hZ2UxRD0KLUdMX2dsQ29weVRleEltYWdlMURfMD0KLUdMX2dsQ29weVRleEltYWdlMURfMT0KLUdMX2dsQ29weVRleEltYWdlMURfMj0KLUdMX2dsQ29weVRleEltYWdlMURfMz0KLUdMX2dsQ29weVRleEltYWdlMURfND0KLUdMX2dsQ29weVRleEltYWdlMURfNT0KLUdMX2dsQ29weVRleEltYWdlMURfNj0KLQotR0xfZ2xDb3B5VGV4SW1hZ2UyRD0KLUdMX2dsQ29weVRleEltYWdlMkRfMD0KLUdMX2dsQ29weVRleEltYWdlMkRfMT0KLUdMX2dsQ29weVRleEltYWdlMkRfMj0KLUdMX2dsQ29weVRleEltYWdlMkRfMz0KLUdMX2dsQ29weVRleEltYWdlMkRfND0KLUdMX2dsQ29weVRleEltYWdlMkRfNT0KLUdMX2dsQ29weVRleEltYWdlMkRfNj0KLUdMX2dsQ29weVRleEltYWdlMkRfNz0KLQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UxRD0KLUdMX2dsQ29weVRleFN1YkltYWdlMURfMD0KLUdMX2dsQ29weVRleFN1YkltYWdlMURfMT0KLUdMX2dsQ29weVRleFN1YkltYWdlMURfMj0KLUdMX2dsQ29weVRleFN1YkltYWdlMURfMz0KLUdMX2dsQ29weVRleFN1YkltYWdlMURfND0KLUdMX2dsQ29weVRleFN1YkltYWdlMURfNT0KLQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRD0KLUdMX2dsQ29weVRleFN1YkltYWdlMkRfMD0KLUdMX2dsQ29weVRleFN1YkltYWdlMkRfMT0KLUdMX2dsQ29weVRleFN1YkltYWdlMkRfMj0KLUdMX2dsQ29weVRleFN1YkltYWdlMkRfMz0KLUdMX2dsQ29weVRleFN1YkltYWdlMkRfND0KLUdMX2dsQ29weVRleFN1YkltYWdlMkRfNT0KLUdMX2dsQ29weVRleFN1YkltYWdlMkRfNj0KLUdMX2dsQ29weVRleFN1YkltYWdlMkRfNz0KLQotR0xfZ2xDdWxsRmFjZT0KLUdMX2dsQ3VsbEZhY2VfMD0KLQotR0xfZ2xEZWxldGVMaXN0cz0KLUdMX2dsRGVsZXRlTGlzdHNfMD0KLUdMX2dsRGVsZXRlTGlzdHNfMT0KLQotR0xfZ2xEZWxldGVUZXh0dXJlcz0KLUdMX2dsRGVsZXRlVGV4dHVyZXNfMD0KLUdMX2dsRGVsZXRlVGV4dHVyZXNfMT0KLQotR0xfZ2xEZXB0aEZ1bmM9Ci1HTF9nbERlcHRoRnVuY18wPQotCi1HTF9nbERlcHRoTWFzaz0KLUdMX2dsRGVwdGhNYXNrXzA9Ci0KLUdMX2dsRGVwdGhSYW5nZT0KLUdMX2dsRGVwdGhSYW5nZV8wPQotR0xfZ2xEZXB0aFJhbmdlXzE9Ci0KLUdMX2dsRGlzYWJsZT0KLUdMX2dsRGlzYWJsZV8wPQotCi1HTF9nbERpc2FibGVDbGllbnRTdGF0ZT0KLUdMX2dsRGlzYWJsZUNsaWVudFN0YXRlXzA9Ci0KLUdMX2dsRHJhd0FycmF5cz0KLUdMX2dsRHJhd0FycmF5c18wPQotR0xfZ2xEcmF3QXJyYXlzXzE9Ci1HTF9nbERyYXdBcnJheXNfMj0KLQotR0xfZ2xEcmF3QnVmZmVyPQotR0xfZ2xEcmF3QnVmZmVyXzA9Ci0KLUdMX2dsRHJhd0VsZW1lbnRzPQotR0xfZ2xEcmF3RWxlbWVudHNfMD0KLUdMX2dsRHJhd0VsZW1lbnRzXzE9Ci1HTF9nbERyYXdFbGVtZW50c18yPQotR0xfZ2xEcmF3RWxlbWVudHNfMz0KLQotR0xfZ2xEcmF3UGl4ZWxzPQotR0xfZ2xEcmF3UGl4ZWxzXzA9Ci1HTF9nbERyYXdQaXhlbHNfMT0KLUdMX2dsRHJhd1BpeGVsc18yPQotR0xfZ2xEcmF3UGl4ZWxzXzM9Ci1HTF9nbERyYXdQaXhlbHNfND0KLQotR0xfZ2xFZGdlRmxhZz0KLUdMX2dsRWRnZUZsYWdfMD0KLQotR0xfZ2xFZGdlRmxhZ1BvaW50ZXI9Ci1HTF9nbEVkZ2VGbGFnUG9pbnRlcl8wPQotR0xfZ2xFZGdlRmxhZ1BvaW50ZXJfMT0KLQotR0xfZ2xFZGdlRmxhZ3Y9Ci1HTF9nbEVkZ2VGbGFndl8wPQotCi1HTF9nbEVuYWJsZT0KLUdMX2dsRW5hYmxlXzA9Ci0KLUdMX2dsRW5hYmxlQ2xpZW50U3RhdGU9Ci1HTF9nbEVuYWJsZUNsaWVudFN0YXRlXzA9Ci0KLUdMX2dsRW5kPQotCi1HTF9nbEVuZExpc3Q9Ci0KLUdMX2dsRXZhbENvb3JkMWQ9Ci1HTF9nbEV2YWxDb29yZDFkXzA9Ci0KLUdMX2dsRXZhbENvb3JkMWR2PQotR0xfZ2xFdmFsQ29vcmQxZHZfMD0KLQotR0xfZ2xFdmFsQ29vcmQxZj0KLUdMX2dsRXZhbENvb3JkMWZfMD0KLQotR0xfZ2xFdmFsQ29vcmQxZnY9Ci1HTF9nbEV2YWxDb29yZDFmdl8wPQotCi1HTF9nbEV2YWxDb29yZDJkPQotR0xfZ2xFdmFsQ29vcmQyZF8wPQotR0xfZ2xFdmFsQ29vcmQyZF8xPQotCi1HTF9nbEV2YWxDb29yZDJkdj0KLUdMX2dsRXZhbENvb3JkMmR2XzA9Ci0KLUdMX2dsRXZhbENvb3JkMmY9Ci1HTF9nbEV2YWxDb29yZDJmXzA9Ci1HTF9nbEV2YWxDb29yZDJmXzE9Ci0KLUdMX2dsRXZhbENvb3JkMmZ2PQotR0xfZ2xFdmFsQ29vcmQyZnZfMD0KLQotR0xfZ2xFdmFsTWVzaDE9Ci1HTF9nbEV2YWxNZXNoMV8wPQotR0xfZ2xFdmFsTWVzaDFfMT0KLUdMX2dsRXZhbE1lc2gxXzI9Ci0KLUdMX2dsRXZhbE1lc2gyPQotR0xfZ2xFdmFsTWVzaDJfMD0KLUdMX2dsRXZhbE1lc2gyXzE9Ci1HTF9nbEV2YWxNZXNoMl8yPQotR0xfZ2xFdmFsTWVzaDJfMz0KLUdMX2dsRXZhbE1lc2gyXzQ9Ci0KLUdMX2dsRXZhbFBvaW50MT0KLUdMX2dsRXZhbFBvaW50MV8wPQotCi1HTF9nbEV2YWxQb2ludDI9Ci1HTF9nbEV2YWxQb2ludDJfMD0KLUdMX2dsRXZhbFBvaW50Ml8xPQotCi1HTF9nbEZlZWRiYWNrQnVmZmVyPQotR0xfZ2xGZWVkYmFja0J1ZmZlcl8wPQotR0xfZ2xGZWVkYmFja0J1ZmZlcl8xPQotR0xfZ2xGZWVkYmFja0J1ZmZlcl8yPQotCi1HTF9nbEZpbmlzaD0KLQotR0xfZ2xGbHVzaD0KLQotR0xfZ2xGb2dmPQotR0xfZ2xGb2dmXzA9Ci1HTF9nbEZvZ2ZfMT0KLQotR0xfZ2xGb2dmdj0KLUdMX2dsRm9nZnZfMD0KLUdMX2dsRm9nZnZfMT0KLQotR0xfZ2xGb2dpPQotR0xfZ2xGb2dpXzA9Ci1HTF9nbEZvZ2lfMT0KLQotR0xfZ2xGb2dpdj0KLUdMX2dsRm9naXZfMD0KLUdMX2dsRm9naXZfMT0KLQotR0xfZ2xGcm9udEZhY2U9Ci1HTF9nbEZyb250RmFjZV8wPQotCi1HTF9nbEZydXN0dW09Ci1HTF9nbEZydXN0dW1fMD0KLUdMX2dsRnJ1c3R1bV8xPQotR0xfZ2xGcnVzdHVtXzI9Ci1HTF9nbEZydXN0dW1fMz0KLUdMX2dsRnJ1c3R1bV80PQotR0xfZ2xGcnVzdHVtXzU9Ci0KLUdMX2dsR2VuTGlzdHM9Ci1HTF9nbEdlbkxpc3RzXzA9Ci0KLUdMX2dsR2VuVGV4dHVyZXM9Ci1HTF9nbEdlblRleHR1cmVzXzA9Ci1HTF9nbEdlblRleHR1cmVzXzE9Ci0KLUdMX2dsR2V0Qm9vbGVhbnY9Ci1HTF9nbEdldEJvb2xlYW52XzA9Ci1HTF9nbEdldEJvb2xlYW52XzE9Ci0KLUdMX2dsR2V0Q2xpcFBsYW5lPQotR0xfZ2xHZXRDbGlwUGxhbmVfMD0KLUdMX2dsR2V0Q2xpcFBsYW5lXzE9Ci0KLUdMX2dsR2V0RG91Ymxldj0KLUdMX2dsR2V0RG91Ymxldl8wPQotR0xfZ2xHZXREb3VibGV2XzE9Ci0KLUdMX2dsR2V0RXJyb3I9Ci0KLUdMX2dsR2V0RmxvYXR2PQotR0xfZ2xHZXRGbG9hdHZfMD0KLUdMX2dsR2V0RmxvYXR2XzE9Ci0KLUdMX2dsR2V0SW50ZWdlcnY9Ci1HTF9nbEdldEludGVnZXJ2XzA9Ci1HTF9nbEdldEludGVnZXJ2XzE9Ci0KLUdMX2dsR2V0TGlnaHRmdj0KLUdMX2dsR2V0TGlnaHRmdl8wPQotR0xfZ2xHZXRMaWdodGZ2XzE9Ci1HTF9nbEdldExpZ2h0ZnZfMj0KLQotR0xfZ2xHZXRMaWdodGl2PQotR0xfZ2xHZXRMaWdodGl2XzA9Ci1HTF9nbEdldExpZ2h0aXZfMT0KLUdMX2dsR2V0TGlnaHRpdl8yPQotCi1HTF9nbEdldE1hcGR2PQotR0xfZ2xHZXRNYXBkdl8wPQotR0xfZ2xHZXRNYXBkdl8xPQotR0xfZ2xHZXRNYXBkdl8yPQotCi1HTF9nbEdldE1hcGZ2PQotR0xfZ2xHZXRNYXBmdl8wPQotR0xfZ2xHZXRNYXBmdl8xPQotR0xfZ2xHZXRNYXBmdl8yPQotCi1HTF9nbEdldE1hcGl2PQotR0xfZ2xHZXRNYXBpdl8wPQotR0xfZ2xHZXRNYXBpdl8xPQotR0xfZ2xHZXRNYXBpdl8yPQotCi1HTF9nbEdldE1hdGVyaWFsZnY9Ci1HTF9nbEdldE1hdGVyaWFsZnZfMD0KLUdMX2dsR2V0TWF0ZXJpYWxmdl8xPQotR0xfZ2xHZXRNYXRlcmlhbGZ2XzI9Ci0KLUdMX2dsR2V0TWF0ZXJpYWxpdj0KLUdMX2dsR2V0TWF0ZXJpYWxpdl8wPQotR0xfZ2xHZXRNYXRlcmlhbGl2XzE9Ci1HTF9nbEdldE1hdGVyaWFsaXZfMj0KLQotR0xfZ2xHZXRQaXhlbE1hcGZ2PQotR0xfZ2xHZXRQaXhlbE1hcGZ2XzA9Ci1HTF9nbEdldFBpeGVsTWFwZnZfMT0KLQotR0xfZ2xHZXRQaXhlbE1hcHVpdj0KLUdMX2dsR2V0UGl4ZWxNYXB1aXZfMD0KLUdMX2dsR2V0UGl4ZWxNYXB1aXZfMT0KLQotR0xfZ2xHZXRQaXhlbE1hcHVzdj0KLUdMX2dsR2V0UGl4ZWxNYXB1c3ZfMD0KLUdMX2dsR2V0UGl4ZWxNYXB1c3ZfMT0KLQotR0xfZ2xHZXRQb2ludGVydj0KLUdMX2dsR2V0UG9pbnRlcnZfMD0KLUdMX2dsR2V0UG9pbnRlcnZfMT0KLQotR0xfZ2xHZXRQb2x5Z29uU3RpcHBsZT0KLUdMX2dsR2V0UG9seWdvblN0aXBwbGVfMD0KLQotR0xfZ2xHZXRTdHJpbmc9Ci1HTF9nbEdldFN0cmluZ18wPQotCi1HTF9nbEdldFRleEVudmZ2PQotR0xfZ2xHZXRUZXhFbnZmdl8wPQotR0xfZ2xHZXRUZXhFbnZmdl8xPQotR0xfZ2xHZXRUZXhFbnZmdl8yPQotCi1HTF9nbEdldFRleEVudml2PQotR0xfZ2xHZXRUZXhFbnZpdl8wPQotR0xfZ2xHZXRUZXhFbnZpdl8xPQotR0xfZ2xHZXRUZXhFbnZpdl8yPQotCi1HTF9nbEdldFRleEdlbmR2PQotR0xfZ2xHZXRUZXhHZW5kdl8wPQotR0xfZ2xHZXRUZXhHZW5kdl8xPQotR0xfZ2xHZXRUZXhHZW5kdl8yPQotCi1HTF9nbEdldFRleEdlbmZ2PQotR0xfZ2xHZXRUZXhHZW5mdl8wPQotR0xfZ2xHZXRUZXhHZW5mdl8xPQotR0xfZ2xHZXRUZXhHZW5mdl8yPQotCi1HTF9nbEdldFRleEdlbml2PQotR0xfZ2xHZXRUZXhHZW5pdl8wPQotR0xfZ2xHZXRUZXhHZW5pdl8xPQotR0xfZ2xHZXRUZXhHZW5pdl8yPQotCi1HTF9nbEdldFRleEltYWdlPQotR0xfZ2xHZXRUZXhJbWFnZV8wPQotR0xfZ2xHZXRUZXhJbWFnZV8xPQotR0xfZ2xHZXRUZXhJbWFnZV8yPQotR0xfZ2xHZXRUZXhJbWFnZV8zPQotR0xfZ2xHZXRUZXhJbWFnZV80PQotCi1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyZnY9Ci1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyZnZfMD0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl8xPQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcmZ2XzI9Ci1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyZnZfMz0KLQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2PQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2XzA9Ci1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyaXZfMT0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdl8yPQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2XzM9Ci0KLUdMX2dsR2V0VGV4UGFyYW1ldGVyZnY9Ci1HTF9nbEdldFRleFBhcmFtZXRlcmZ2XzA9Ci1HTF9nbEdldFRleFBhcmFtZXRlcmZ2XzE9Ci1HTF9nbEdldFRleFBhcmFtZXRlcmZ2XzI9Ci0KLUdMX2dsR2V0VGV4UGFyYW1ldGVyaXY9Ci1HTF9nbEdldFRleFBhcmFtZXRlcml2XzA9Ci1HTF9nbEdldFRleFBhcmFtZXRlcml2XzE9Ci1HTF9nbEdldFRleFBhcmFtZXRlcml2XzI9Ci0KLUdMX2dsSGludD0KLUdMX2dsSGludF8wPQotR0xfZ2xIaW50XzE9Ci0KLUdMX2dsSW5kZXhNYXNrPQotR0xfZ2xJbmRleE1hc2tfMD0KLQotR0xfZ2xJbmRleFBvaW50ZXI9Ci1HTF9nbEluZGV4UG9pbnRlcl8wPQotR0xfZ2xJbmRleFBvaW50ZXJfMT0KLUdMX2dsSW5kZXhQb2ludGVyXzI9Ci0KLUdMX2dsSW5kZXhkPQotR0xfZ2xJbmRleGRfMD0KLQotR0xfZ2xJbmRleGR2PQotR0xfZ2xJbmRleGR2XzA9Ci0KLUdMX2dsSW5kZXhmPQotR0xfZ2xJbmRleGZfMD0KLQotR0xfZ2xJbmRleGZ2PQotR0xfZ2xJbmRleGZ2XzA9Ci0KLUdMX2dsSW5kZXhpPQotR0xfZ2xJbmRleGlfMD0KLQotR0xfZ2xJbmRleGl2PQotR0xfZ2xJbmRleGl2XzA9Ci0KLUdMX2dsSW5kZXhzPQotR0xfZ2xJbmRleHNfMD0KLQotR0xfZ2xJbmRleHN2PQotR0xfZ2xJbmRleHN2XzA9Ci0KLUdMX2dsSW5pdE5hbWVzPQotCi1HTF9nbEludGVybGVhdmVkQXJyYXlzPQotR0xfZ2xJbnRlcmxlYXZlZEFycmF5c18wPQotR0xfZ2xJbnRlcmxlYXZlZEFycmF5c18xPQotR0xfZ2xJbnRlcmxlYXZlZEFycmF5c18yPQotCi1HTF9nbElzRW5hYmxlZD0KLUdMX2dsSXNFbmFibGVkXzA9Ci0KLUdMX2dsSXNMaXN0PQotR0xfZ2xJc0xpc3RfMD0KLQotR0xfZ2xJc1RleHR1cmU9Ci1HTF9nbElzVGV4dHVyZV8wPQotCi1HTF9nbExpZ2h0TW9kZWxmPQotR0xfZ2xMaWdodE1vZGVsZl8wPQotR0xfZ2xMaWdodE1vZGVsZl8xPQotCi1HTF9nbExpZ2h0TW9kZWxmdj0KLUdMX2dsTGlnaHRNb2RlbGZ2XzA9Ci1HTF9nbExpZ2h0TW9kZWxmdl8xPQotCi1HTF9nbExpZ2h0TW9kZWxpPQotR0xfZ2xMaWdodE1vZGVsaV8wPQotR0xfZ2xMaWdodE1vZGVsaV8xPQotCi1HTF9nbExpZ2h0TW9kZWxpdj0KLUdMX2dsTGlnaHRNb2RlbGl2XzA9Ci1HTF9nbExpZ2h0TW9kZWxpdl8xPQotCi1HTF9nbExpZ2h0Zj0KLUdMX2dsTGlnaHRmXzA9Ci1HTF9nbExpZ2h0Zl8xPQotR0xfZ2xMaWdodGZfMj0KLQotR0xfZ2xMaWdodGZ2PQotR0xfZ2xMaWdodGZ2XzA9Ci1HTF9nbExpZ2h0ZnZfMT0KLUdMX2dsTGlnaHRmdl8yPQotCi1HTF9nbExpZ2h0aT0KLUdMX2dsTGlnaHRpXzA9Ci1HTF9nbExpZ2h0aV8xPQotR0xfZ2xMaWdodGlfMj0KLQotR0xfZ2xMaWdodGl2PQotR0xfZ2xMaWdodGl2XzA9Ci1HTF9nbExpZ2h0aXZfMT0KLUdMX2dsTGlnaHRpdl8yPQotCi1HTF9nbExpbmVTdGlwcGxlPQotR0xfZ2xMaW5lU3RpcHBsZV8wPQotR0xfZ2xMaW5lU3RpcHBsZV8xPQotCi1HTF9nbExpbmVXaWR0aD0KLUdMX2dsTGluZVdpZHRoXzA9Ci0KLUdMX2dsTGlzdEJhc2U9Ci1HTF9nbExpc3RCYXNlXzA9Ci0KLUdMX2dsTG9hZElkZW50aXR5PQotCi1HTF9nbExvYWRNYXRyaXhkPQotR0xfZ2xMb2FkTWF0cml4ZF8wPQotCi1HTF9nbExvYWRNYXRyaXhmPQotR0xfZ2xMb2FkTWF0cml4Zl8wPQotCi1HTF9nbExvYWROYW1lPQotR0xfZ2xMb2FkTmFtZV8wPQotCi1HTF9nbExvZ2ljT3A9Ci1HTF9nbExvZ2ljT3BfMD0KLQotR0xfZ2xNYXAxZD0KLUdMX2dsTWFwMWRfMD0KLUdMX2dsTWFwMWRfMT0KLUdMX2dsTWFwMWRfMj0KLUdMX2dsTWFwMWRfMz0KLUdMX2dsTWFwMWRfND0KLUdMX2dsTWFwMWRfNT0KLQotR0xfZ2xNYXAxZj0KLUdMX2dsTWFwMWZfMD0KLUdMX2dsTWFwMWZfMT0KLUdMX2dsTWFwMWZfMj0KLUdMX2dsTWFwMWZfMz0KLUdMX2dsTWFwMWZfND0KLUdMX2dsTWFwMWZfNT0KLQotR0xfZ2xNYXAyZD0KLUdMX2dsTWFwMmRfMD0KLUdMX2dsTWFwMmRfMT0KLUdMX2dsTWFwMmRfMj0KLUdMX2dsTWFwMmRfMz0KLUdMX2dsTWFwMmRfND0KLUdMX2dsTWFwMmRfNT0KLUdMX2dsTWFwMmRfNj0KLUdMX2dsTWFwMmRfNz0KLUdMX2dsTWFwMmRfOD0KLUdMX2dsTWFwMmRfOT0KLQotR0xfZ2xNYXAyZj0KLUdMX2dsTWFwMmZfMD0KLUdMX2dsTWFwMmZfMT0KLUdMX2dsTWFwMmZfMj0KLUdMX2dsTWFwMmZfMz0KLUdMX2dsTWFwMmZfND0KLUdMX2dsTWFwMmZfNT0KLUdMX2dsTWFwMmZfNj0KLUdMX2dsTWFwMmZfNz0KLUdMX2dsTWFwMmZfOD0KLUdMX2dsTWFwMmZfOT0KLQotR0xfZ2xNYXBHcmlkMWQ9Ci1HTF9nbE1hcEdyaWQxZF8wPQotR0xfZ2xNYXBHcmlkMWRfMT0KLUdMX2dsTWFwR3JpZDFkXzI9Ci0KLUdMX2dsTWFwR3JpZDFmPQotR0xfZ2xNYXBHcmlkMWZfMD0KLUdMX2dsTWFwR3JpZDFmXzE9Ci1HTF9nbE1hcEdyaWQxZl8yPQotCi1HTF9nbE1hcEdyaWQyZD0KLUdMX2dsTWFwR3JpZDJkXzA9Ci1HTF9nbE1hcEdyaWQyZF8xPQotR0xfZ2xNYXBHcmlkMmRfMj0KLUdMX2dsTWFwR3JpZDJkXzM9Ci1HTF9nbE1hcEdyaWQyZF80PQotR0xfZ2xNYXBHcmlkMmRfNT0KLQotR0xfZ2xNYXBHcmlkMmY9Ci1HTF9nbE1hcEdyaWQyZl8wPQotR0xfZ2xNYXBHcmlkMmZfMT0KLUdMX2dsTWFwR3JpZDJmXzI9Ci1HTF9nbE1hcEdyaWQyZl8zPQotR0xfZ2xNYXBHcmlkMmZfND0KLUdMX2dsTWFwR3JpZDJmXzU9Ci0KLUdMX2dsTWF0ZXJpYWxmPQotR0xfZ2xNYXRlcmlhbGZfMD0KLUdMX2dsTWF0ZXJpYWxmXzE9Ci1HTF9nbE1hdGVyaWFsZl8yPQotCi1HTF9nbE1hdGVyaWFsZnY9Ci1HTF9nbE1hdGVyaWFsZnZfMD0KLUdMX2dsTWF0ZXJpYWxmdl8xPQotR0xfZ2xNYXRlcmlhbGZ2XzI9Ci0KLUdMX2dsTWF0ZXJpYWxpPQotR0xfZ2xNYXRlcmlhbGlfMD0KLUdMX2dsTWF0ZXJpYWxpXzE9Ci1HTF9nbE1hdGVyaWFsaV8yPQotCi1HTF9nbE1hdGVyaWFsaXY9Ci1HTF9nbE1hdGVyaWFsaXZfMD0KLUdMX2dsTWF0ZXJpYWxpdl8xPQotR0xfZ2xNYXRlcmlhbGl2XzI9Ci0KLUdMX2dsTWF0cml4TW9kZT0KLUdMX2dsTWF0cml4TW9kZV8wPQotCi1HTF9nbE11bHRNYXRyaXhkPQotR0xfZ2xNdWx0TWF0cml4ZF8wPQotCi1HTF9nbE11bHRNYXRyaXhmPQotR0xfZ2xNdWx0TWF0cml4Zl8wPQotCi1HTF9nbE5ld0xpc3Q9Ci1HTF9nbE5ld0xpc3RfMD0KLUdMX2dsTmV3TGlzdF8xPQotCi1HTF9nbE5vcm1hbDNiPQotR0xfZ2xOb3JtYWwzYl8wPQotR0xfZ2xOb3JtYWwzYl8xPQotR0xfZ2xOb3JtYWwzYl8yPQotCi1HTF9nbE5vcm1hbDNidj0KLUdMX2dsTm9ybWFsM2J2XzA9Ci0KLUdMX2dsTm9ybWFsM2Q9Ci1HTF9nbE5vcm1hbDNkXzA9Ci1HTF9nbE5vcm1hbDNkXzE9Ci1HTF9nbE5vcm1hbDNkXzI9Ci0KLUdMX2dsTm9ybWFsM2R2PQotR0xfZ2xOb3JtYWwzZHZfMD0KLQotR0xfZ2xOb3JtYWwzZj0KLUdMX2dsTm9ybWFsM2ZfMD0KLUdMX2dsTm9ybWFsM2ZfMT0KLUdMX2dsTm9ybWFsM2ZfMj0KLQotR0xfZ2xOb3JtYWwzZnY9Ci1HTF9nbE5vcm1hbDNmdl8wPQotCi1HTF9nbE5vcm1hbDNpPQotR0xfZ2xOb3JtYWwzaV8wPQotR0xfZ2xOb3JtYWwzaV8xPQotR0xfZ2xOb3JtYWwzaV8yPQotCi1HTF9nbE5vcm1hbDNpdj0KLUdMX2dsTm9ybWFsM2l2XzA9Ci0KLUdMX2dsTm9ybWFsM3M9Ci1HTF9nbE5vcm1hbDNzXzA9Ci1HTF9nbE5vcm1hbDNzXzE9Ci1HTF9nbE5vcm1hbDNzXzI9Ci0KLUdMX2dsTm9ybWFsM3N2PQotR0xfZ2xOb3JtYWwzc3ZfMD0KLQotR0xfZ2xOb3JtYWxQb2ludGVyPQotR0xfZ2xOb3JtYWxQb2ludGVyXzA9Ci1HTF9nbE5vcm1hbFBvaW50ZXJfMT0KLUdMX2dsTm9ybWFsUG9pbnRlcl8yPQotCi1HTF9nbE9ydGhvPQotR0xfZ2xPcnRob18wPQotR0xfZ2xPcnRob18xPQotR0xfZ2xPcnRob18yPQotR0xfZ2xPcnRob18zPQotR0xfZ2xPcnRob180PQotR0xfZ2xPcnRob181PQotCi1HTF9nbFBhc3NUaHJvdWdoPQotR0xfZ2xQYXNzVGhyb3VnaF8wPQotCi1HTF9nbFBpeGVsTWFwZnY9Ci1HTF9nbFBpeGVsTWFwZnZfMD0KLUdMX2dsUGl4ZWxNYXBmdl8xPQotR0xfZ2xQaXhlbE1hcGZ2XzI9Ci0KLUdMX2dsUGl4ZWxNYXB1aXY9Ci1HTF9nbFBpeGVsTWFwdWl2XzA9Ci1HTF9nbFBpeGVsTWFwdWl2XzE9Ci1HTF9nbFBpeGVsTWFwdWl2XzI9Ci0KLUdMX2dsUGl4ZWxNYXB1c3Y9Ci1HTF9nbFBpeGVsTWFwdXN2XzA9Ci1HTF9nbFBpeGVsTWFwdXN2XzE9Ci1HTF9nbFBpeGVsTWFwdXN2XzI9Ci0KLUdMX2dsUGl4ZWxTdG9yZWY9Ci1HTF9nbFBpeGVsU3RvcmVmXzA9Ci1HTF9nbFBpeGVsU3RvcmVmXzE9Ci0KLUdMX2dsUGl4ZWxTdG9yZWk9Ci1HTF9nbFBpeGVsU3RvcmVpXzA9Ci1HTF9nbFBpeGVsU3RvcmVpXzE9Ci0KLUdMX2dsUGl4ZWxUcmFuc2ZlcmY9Ci1HTF9nbFBpeGVsVHJhbnNmZXJmXzA9Ci1HTF9nbFBpeGVsVHJhbnNmZXJmXzE9Ci0KLUdMX2dsUGl4ZWxUcmFuc2Zlcmk9Ci1HTF9nbFBpeGVsVHJhbnNmZXJpXzA9Ci1HTF9nbFBpeGVsVHJhbnNmZXJpXzE9Ci0KLUdMX2dsUGl4ZWxab29tPQotR0xfZ2xQaXhlbFpvb21fMD0KLUdMX2dsUGl4ZWxab29tXzE9Ci0KLUdMX2dsUG9pbnRTaXplPQotR0xfZ2xQb2ludFNpemVfMD0KLQotR0xfZ2xQb2x5Z29uTW9kZT0KLUdMX2dsUG9seWdvbk1vZGVfMD0KLUdMX2dsUG9seWdvbk1vZGVfMT0KLQotR0xfZ2xQb2x5Z29uT2Zmc2V0PQotR0xfZ2xQb2x5Z29uT2Zmc2V0XzA9Ci1HTF9nbFBvbHlnb25PZmZzZXRfMT0KLQotR0xfZ2xQb2x5Z29uU3RpcHBsZT0KLUdMX2dsUG9seWdvblN0aXBwbGVfMD0KLQotR0xfZ2xQb3BBdHRyaWI9Ci0KLUdMX2dsUG9wQ2xpZW50QXR0cmliPQotCi1HTF9nbFBvcE1hdHJpeD0KLQotR0xfZ2xQb3BOYW1lPQotCi1HTF9nbFByaW9yaXRpemVUZXh0dXJlcz0KLUdMX2dsUHJpb3JpdGl6ZVRleHR1cmVzXzA9Ci1HTF9nbFByaW9yaXRpemVUZXh0dXJlc18xPQotR0xfZ2xQcmlvcml0aXplVGV4dHVyZXNfMj0KLQotR0xfZ2xQdXNoQXR0cmliPQotR0xfZ2xQdXNoQXR0cmliXzA9Ci0KLUdMX2dsUHVzaENsaWVudEF0dHJpYj0KLUdMX2dsUHVzaENsaWVudEF0dHJpYl8wPQotCi1HTF9nbFB1c2hNYXRyaXg9Ci0KLUdMX2dsUHVzaE5hbWU9Ci1HTF9nbFB1c2hOYW1lXzA9Ci0KLUdMX2dsUmFzdGVyUG9zMmQ9Ci1HTF9nbFJhc3RlclBvczJkXzA9Ci1HTF9nbFJhc3RlclBvczJkXzE9Ci0KLUdMX2dsUmFzdGVyUG9zMmR2PQotR0xfZ2xSYXN0ZXJQb3MyZHZfMD0KLQotR0xfZ2xSYXN0ZXJQb3MyZj0KLUdMX2dsUmFzdGVyUG9zMmZfMD0KLUdMX2dsUmFzdGVyUG9zMmZfMT0KLQotR0xfZ2xSYXN0ZXJQb3MyZnY9Ci1HTF9nbFJhc3RlclBvczJmdl8wPQotCi1HTF9nbFJhc3RlclBvczJpPQotR0xfZ2xSYXN0ZXJQb3MyaV8wPQotR0xfZ2xSYXN0ZXJQb3MyaV8xPQotCi1HTF9nbFJhc3RlclBvczJpdj0KLUdMX2dsUmFzdGVyUG9zMml2XzA9Ci0KLUdMX2dsUmFzdGVyUG9zMnM9Ci1HTF9nbFJhc3RlclBvczJzXzA9Ci1HTF9nbFJhc3RlclBvczJzXzE9Ci0KLUdMX2dsUmFzdGVyUG9zMnN2PQotR0xfZ2xSYXN0ZXJQb3Myc3ZfMD0KLQotR0xfZ2xSYXN0ZXJQb3MzZD0KLUdMX2dsUmFzdGVyUG9zM2RfMD0KLUdMX2dsUmFzdGVyUG9zM2RfMT0KLUdMX2dsUmFzdGVyUG9zM2RfMj0KLQotR0xfZ2xSYXN0ZXJQb3MzZHY9Ci1HTF9nbFJhc3RlclBvczNkdl8wPQotCi1HTF9nbFJhc3RlclBvczNmPQotR0xfZ2xSYXN0ZXJQb3MzZl8wPQotR0xfZ2xSYXN0ZXJQb3MzZl8xPQotR0xfZ2xSYXN0ZXJQb3MzZl8yPQotCi1HTF9nbFJhc3RlclBvczNmdj0KLUdMX2dsUmFzdGVyUG9zM2Z2XzA9Ci0KLUdMX2dsUmFzdGVyUG9zM2k9Ci1HTF9nbFJhc3RlclBvczNpXzA9Ci1HTF9nbFJhc3RlclBvczNpXzE9Ci1HTF9nbFJhc3RlclBvczNpXzI9Ci0KLUdMX2dsUmFzdGVyUG9zM2l2PQotR0xfZ2xSYXN0ZXJQb3MzaXZfMD0KLQotR0xfZ2xSYXN0ZXJQb3Mzcz0KLUdMX2dsUmFzdGVyUG9zM3NfMD0KLUdMX2dsUmFzdGVyUG9zM3NfMT0KLUdMX2dsUmFzdGVyUG9zM3NfMj0KLQotR0xfZ2xSYXN0ZXJQb3Mzc3Y9Ci1HTF9nbFJhc3RlclBvczNzdl8wPQotCi1HTF9nbFJhc3RlclBvczRkPQotR0xfZ2xSYXN0ZXJQb3M0ZF8wPQotR0xfZ2xSYXN0ZXJQb3M0ZF8xPQotR0xfZ2xSYXN0ZXJQb3M0ZF8yPQotR0xfZ2xSYXN0ZXJQb3M0ZF8zPQotCi1HTF9nbFJhc3RlclBvczRkdj0KLUdMX2dsUmFzdGVyUG9zNGR2XzA9Ci0KLUdMX2dsUmFzdGVyUG9zNGY9Ci1HTF9nbFJhc3RlclBvczRmXzA9Ci1HTF9nbFJhc3RlclBvczRmXzE9Ci1HTF9nbFJhc3RlclBvczRmXzI9Ci1HTF9nbFJhc3RlclBvczRmXzM9Ci0KLUdMX2dsUmFzdGVyUG9zNGZ2PQotR0xfZ2xSYXN0ZXJQb3M0ZnZfMD0KLQotR0xfZ2xSYXN0ZXJQb3M0aT0KLUdMX2dsUmFzdGVyUG9zNGlfMD0KLUdMX2dsUmFzdGVyUG9zNGlfMT0KLUdMX2dsUmFzdGVyUG9zNGlfMj0KLUdMX2dsUmFzdGVyUG9zNGlfMz0KLQotR0xfZ2xSYXN0ZXJQb3M0aXY9Ci1HTF9nbFJhc3RlclBvczRpdl8wPQotCi1HTF9nbFJhc3RlclBvczRzPQotR0xfZ2xSYXN0ZXJQb3M0c18wPQotR0xfZ2xSYXN0ZXJQb3M0c18xPQotR0xfZ2xSYXN0ZXJQb3M0c18yPQotR0xfZ2xSYXN0ZXJQb3M0c18zPQotCi1HTF9nbFJhc3RlclBvczRzdj0KLUdMX2dsUmFzdGVyUG9zNHN2XzA9Ci0KLUdMX2dsUmVhZEJ1ZmZlcj0KLUdMX2dsUmVhZEJ1ZmZlcl8wPQotCi1HTF9nbFJlYWRQaXhlbHM9Ci1HTF9nbFJlYWRQaXhlbHNfMD0KLUdMX2dsUmVhZFBpeGVsc18xPQotR0xfZ2xSZWFkUGl4ZWxzXzI9Ci1HTF9nbFJlYWRQaXhlbHNfMz0KLUdMX2dsUmVhZFBpeGVsc180PQotR0xfZ2xSZWFkUGl4ZWxzXzU9Ci1HTF9nbFJlYWRQaXhlbHNfNj0KLQotR0xfZ2xSZWN0ZD0KLUdMX2dsUmVjdGRfMD0KLUdMX2dsUmVjdGRfMT0KLUdMX2dsUmVjdGRfMj0KLUdMX2dsUmVjdGRfMz0KLQotR0xfZ2xSZWN0ZHY9Ci1HTF9nbFJlY3Rkdl8wPQotR0xfZ2xSZWN0ZHZfMT0KLQotR0xfZ2xSZWN0Zj0KLUdMX2dsUmVjdGZfMD0KLUdMX2dsUmVjdGZfMT0KLUdMX2dsUmVjdGZfMj0KLUdMX2dsUmVjdGZfMz0KLQotR0xfZ2xSZWN0ZnY9Ci1HTF9nbFJlY3Rmdl8wPQotR0xfZ2xSZWN0ZnZfMT0KLQotR0xfZ2xSZWN0aT0KLUdMX2dsUmVjdGlfMD0KLUdMX2dsUmVjdGlfMT0KLUdMX2dsUmVjdGlfMj0KLUdMX2dsUmVjdGlfMz0KLQotR0xfZ2xSZWN0aXY9Ci1HTF9nbFJlY3Rpdl8wPQotR0xfZ2xSZWN0aXZfMT0KLQotR0xfZ2xSZWN0cz0KLUdMX2dsUmVjdHNfMD0KLUdMX2dsUmVjdHNfMT0KLUdMX2dsUmVjdHNfMj0KLUdMX2dsUmVjdHNfMz0KLQotR0xfZ2xSZWN0c3Y9Ci1HTF9nbFJlY3Rzdl8wPQotR0xfZ2xSZWN0c3ZfMT0KLQotR0xfZ2xSZW5kZXJNb2RlPQotR0xfZ2xSZW5kZXJNb2RlXzA9Ci0KLUdMX2dsUm90YXRlZD0KLUdMX2dsUm90YXRlZF8wPQotR0xfZ2xSb3RhdGVkXzE9Ci1HTF9nbFJvdGF0ZWRfMj0KLUdMX2dsUm90YXRlZF8zPQotCi1HTF9nbFJvdGF0ZWY9Ci1HTF9nbFJvdGF0ZWZfMD0KLUdMX2dsUm90YXRlZl8xPQotR0xfZ2xSb3RhdGVmXzI9Ci1HTF9nbFJvdGF0ZWZfMz0KLQotR0xfZ2xTY2FsZWQ9Ci1HTF9nbFNjYWxlZF8wPQotR0xfZ2xTY2FsZWRfMT0KLUdMX2dsU2NhbGVkXzI9Ci0KLUdMX2dsU2NhbGVmPQotR0xfZ2xTY2FsZWZfMD0KLUdMX2dsU2NhbGVmXzE9Ci1HTF9nbFNjYWxlZl8yPQotCi1HTF9nbFNjaXNzb3I9Ci1HTF9nbFNjaXNzb3JfMD0KLUdMX2dsU2Npc3Nvcl8xPQotR0xfZ2xTY2lzc29yXzI9Ci1HTF9nbFNjaXNzb3JfMz0KLQotR0xfZ2xTZWxlY3RCdWZmZXI9Ci1HTF9nbFNlbGVjdEJ1ZmZlcl8wPQotR0xfZ2xTZWxlY3RCdWZmZXJfMT0KLQotR0xfZ2xTaGFkZU1vZGVsPQotR0xfZ2xTaGFkZU1vZGVsXzA9Ci0KLUdMX2dsU3RlbmNpbEZ1bmM9Ci1HTF9nbFN0ZW5jaWxGdW5jXzA9Ci1HTF9nbFN0ZW5jaWxGdW5jXzE9Ci1HTF9nbFN0ZW5jaWxGdW5jXzI9Ci0KLUdMX2dsU3RlbmNpbE1hc2s9Ci1HTF9nbFN0ZW5jaWxNYXNrXzA9Ci0KLUdMX2dsU3RlbmNpbE9wPQotR0xfZ2xTdGVuY2lsT3BfMD0KLUdMX2dsU3RlbmNpbE9wXzE9Ci1HTF9nbFN0ZW5jaWxPcF8yPQotCi1HTF9nbFRleENvb3JkMWQ9Ci1HTF9nbFRleENvb3JkMWRfMD0KLQotR0xfZ2xUZXhDb29yZDFkdj0KLUdMX2dsVGV4Q29vcmQxZHZfMD0KLQotR0xfZ2xUZXhDb29yZDFmPQotR0xfZ2xUZXhDb29yZDFmXzA9Ci0KLUdMX2dsVGV4Q29vcmQxZnY9Ci1HTF9nbFRleENvb3JkMWZ2XzA9Ci0KLUdMX2dsVGV4Q29vcmQxaT0KLUdMX2dsVGV4Q29vcmQxaV8wPQotCi1HTF9nbFRleENvb3JkMWl2PQotR0xfZ2xUZXhDb29yZDFpdl8wPQotCi1HTF9nbFRleENvb3JkMXM9Ci1HTF9nbFRleENvb3JkMXNfMD0KLQotR0xfZ2xUZXhDb29yZDFzdj0KLUdMX2dsVGV4Q29vcmQxc3ZfMD0KLQotR0xfZ2xUZXhDb29yZDJkPQotR0xfZ2xUZXhDb29yZDJkXzA9Ci1HTF9nbFRleENvb3JkMmRfMT0KLQotR0xfZ2xUZXhDb29yZDJkdj0KLUdMX2dsVGV4Q29vcmQyZHZfMD0KLQotR0xfZ2xUZXhDb29yZDJmPQotR0xfZ2xUZXhDb29yZDJmXzA9Ci1HTF9nbFRleENvb3JkMmZfMT0KLQotR0xfZ2xUZXhDb29yZDJmdj0KLUdMX2dsVGV4Q29vcmQyZnZfMD0KLQotR0xfZ2xUZXhDb29yZDJpPQotR0xfZ2xUZXhDb29yZDJpXzA9Ci1HTF9nbFRleENvb3JkMmlfMT0KLQotR0xfZ2xUZXhDb29yZDJpdj0KLUdMX2dsVGV4Q29vcmQyaXZfMD0KLQotR0xfZ2xUZXhDb29yZDJzPQotR0xfZ2xUZXhDb29yZDJzXzA9Ci1HTF9nbFRleENvb3JkMnNfMT0KLQotR0xfZ2xUZXhDb29yZDJzdj0KLUdMX2dsVGV4Q29vcmQyc3ZfMD0KLQotR0xfZ2xUZXhDb29yZDNkPQotR0xfZ2xUZXhDb29yZDNkXzA9Ci1HTF9nbFRleENvb3JkM2RfMT0KLUdMX2dsVGV4Q29vcmQzZF8yPQotCi1HTF9nbFRleENvb3JkM2R2PQotR0xfZ2xUZXhDb29yZDNkdl8wPQotCi1HTF9nbFRleENvb3JkM2Y9Ci1HTF9nbFRleENvb3JkM2ZfMD0KLUdMX2dsVGV4Q29vcmQzZl8xPQotR0xfZ2xUZXhDb29yZDNmXzI9Ci0KLUdMX2dsVGV4Q29vcmQzZnY9Ci1HTF9nbFRleENvb3JkM2Z2XzA9Ci0KLUdMX2dsVGV4Q29vcmQzaT0KLUdMX2dsVGV4Q29vcmQzaV8wPQotR0xfZ2xUZXhDb29yZDNpXzE9Ci1HTF9nbFRleENvb3JkM2lfMj0KLQotR0xfZ2xUZXhDb29yZDNpdj0KLUdMX2dsVGV4Q29vcmQzaXZfMD0KLQotR0xfZ2xUZXhDb29yZDNzPQotR0xfZ2xUZXhDb29yZDNzXzA9Ci1HTF9nbFRleENvb3JkM3NfMT0KLUdMX2dsVGV4Q29vcmQzc18yPQotCi1HTF9nbFRleENvb3JkM3N2PQotR0xfZ2xUZXhDb29yZDNzdl8wPQotCi1HTF9nbFRleENvb3JkNGQ9Ci1HTF9nbFRleENvb3JkNGRfMD0KLUdMX2dsVGV4Q29vcmQ0ZF8xPQotR0xfZ2xUZXhDb29yZDRkXzI9Ci1HTF9nbFRleENvb3JkNGRfMz0KLQotR0xfZ2xUZXhDb29yZDRkdj0KLUdMX2dsVGV4Q29vcmQ0ZHZfMD0KLQotR0xfZ2xUZXhDb29yZDRmPQotR0xfZ2xUZXhDb29yZDRmXzA9Ci1HTF9nbFRleENvb3JkNGZfMT0KLUdMX2dsVGV4Q29vcmQ0Zl8yPQotR0xfZ2xUZXhDb29yZDRmXzM9Ci0KLUdMX2dsVGV4Q29vcmQ0ZnY9Ci1HTF9nbFRleENvb3JkNGZ2XzA9Ci0KLUdMX2dsVGV4Q29vcmQ0aT0KLUdMX2dsVGV4Q29vcmQ0aV8wPQotR0xfZ2xUZXhDb29yZDRpXzE9Ci1HTF9nbFRleENvb3JkNGlfMj0KLUdMX2dsVGV4Q29vcmQ0aV8zPQotCi1HTF9nbFRleENvb3JkNGl2PQotR0xfZ2xUZXhDb29yZDRpdl8wPQotCi1HTF9nbFRleENvb3JkNHM9Ci1HTF9nbFRleENvb3JkNHNfMD0KLUdMX2dsVGV4Q29vcmQ0c18xPQotR0xfZ2xUZXhDb29yZDRzXzI9Ci1HTF9nbFRleENvb3JkNHNfMz0KLQotR0xfZ2xUZXhDb29yZDRzdj0KLUdMX2dsVGV4Q29vcmQ0c3ZfMD0KLQotR0xfZ2xUZXhDb29yZFBvaW50ZXI9Ci1HTF9nbFRleENvb3JkUG9pbnRlcl8wPQotR0xfZ2xUZXhDb29yZFBvaW50ZXJfMT0KLUdMX2dsVGV4Q29vcmRQb2ludGVyXzI9Ci1HTF9nbFRleENvb3JkUG9pbnRlcl8zPQotCi1HTF9nbFRleEVudmY9Ci1HTF9nbFRleEVudmZfMD0KLUdMX2dsVGV4RW52Zl8xPQotR0xfZ2xUZXhFbnZmXzI9Ci0KLUdMX2dsVGV4RW52ZnY9Ci1HTF9nbFRleEVudmZ2XzA9Ci1HTF9nbFRleEVudmZ2XzE9Ci1HTF9nbFRleEVudmZ2XzI9Ci0KLUdMX2dsVGV4RW52aT0KLUdMX2dsVGV4RW52aV8wPQotR0xfZ2xUZXhFbnZpXzE9Ci1HTF9nbFRleEVudmlfMj0KLQotR0xfZ2xUZXhFbnZpdj0KLUdMX2dsVGV4RW52aXZfMD0KLUdMX2dsVGV4RW52aXZfMT0KLUdMX2dsVGV4RW52aXZfMj0KLQotR0xfZ2xUZXhHZW5kPQotR0xfZ2xUZXhHZW5kXzA9Ci1HTF9nbFRleEdlbmRfMT0KLUdMX2dsVGV4R2VuZF8yPQotCi1HTF9nbFRleEdlbmR2PQotR0xfZ2xUZXhHZW5kdl8wPQotR0xfZ2xUZXhHZW5kdl8xPQotR0xfZ2xUZXhHZW5kdl8yPQotCi1HTF9nbFRleEdlbmY9Ci1HTF9nbFRleEdlbmZfMD0KLUdMX2dsVGV4R2VuZl8xPQotR0xfZ2xUZXhHZW5mXzI9Ci0KLUdMX2dsVGV4R2VuZnY9Ci1HTF9nbFRleEdlbmZ2XzA9Ci1HTF9nbFRleEdlbmZ2XzE9Ci1HTF9nbFRleEdlbmZ2XzI9Ci0KLUdMX2dsVGV4R2VuaT0KLUdMX2dsVGV4R2VuaV8wPQotR0xfZ2xUZXhHZW5pXzE9Ci1HTF9nbFRleEdlbmlfMj0KLQotR0xfZ2xUZXhHZW5pdj0KLUdMX2dsVGV4R2VuaXZfMD0KLUdMX2dsVGV4R2VuaXZfMT0KLUdMX2dsVGV4R2VuaXZfMj0KLQotR0xfZ2xUZXhJbWFnZTFEPQotR0xfZ2xUZXhJbWFnZTFEXzA9Ci1HTF9nbFRleEltYWdlMURfMT0KLUdMX2dsVGV4SW1hZ2UxRF8yPQotR0xfZ2xUZXhJbWFnZTFEXzM9Ci1HTF9nbFRleEltYWdlMURfND0KLUdMX2dsVGV4SW1hZ2UxRF81PQotR0xfZ2xUZXhJbWFnZTFEXzY9Ci1HTF9nbFRleEltYWdlMURfNz0KLQotR0xfZ2xUZXhJbWFnZTJEPQotR0xfZ2xUZXhJbWFnZTJEXzA9Ci1HTF9nbFRleEltYWdlMkRfMT0KLUdMX2dsVGV4SW1hZ2UyRF8yPQotR0xfZ2xUZXhJbWFnZTJEXzM9Ci1HTF9nbFRleEltYWdlMkRfND0KLUdMX2dsVGV4SW1hZ2UyRF81PQotR0xfZ2xUZXhJbWFnZTJEXzY9Ci1HTF9nbFRleEltYWdlMkRfNz0KLUdMX2dsVGV4SW1hZ2UyRF84PQotCi1HTF9nbFRleFBhcmFtZXRlcmY9Ci1HTF9nbFRleFBhcmFtZXRlcmZfMD0KLUdMX2dsVGV4UGFyYW1ldGVyZl8xPQotR0xfZ2xUZXhQYXJhbWV0ZXJmXzI9Ci0KLUdMX2dsVGV4UGFyYW1ldGVyZnY9Ci1HTF9nbFRleFBhcmFtZXRlcmZ2XzA9Ci1HTF9nbFRleFBhcmFtZXRlcmZ2XzE9Ci1HTF9nbFRleFBhcmFtZXRlcmZ2XzI9Ci0KLUdMX2dsVGV4UGFyYW1ldGVyaT0KLUdMX2dsVGV4UGFyYW1ldGVyaV8wPQotR0xfZ2xUZXhQYXJhbWV0ZXJpXzE9Ci1HTF9nbFRleFBhcmFtZXRlcmlfMj0KLQotR0xfZ2xUZXhQYXJhbWV0ZXJpdj0KLUdMX2dsVGV4UGFyYW1ldGVyaXZfMD0KLUdMX2dsVGV4UGFyYW1ldGVyaXZfMT0KLUdMX2dsVGV4UGFyYW1ldGVyaXZfMj0KLQotR0xfZ2xUZXhTdWJJbWFnZTFEPQotR0xfZ2xUZXhTdWJJbWFnZTFEXzA9Ci1HTF9nbFRleFN1YkltYWdlMURfMT0KLUdMX2dsVGV4U3ViSW1hZ2UxRF8yPQotR0xfZ2xUZXhTdWJJbWFnZTFEXzM9Ci1HTF9nbFRleFN1YkltYWdlMURfND0KLUdMX2dsVGV4U3ViSW1hZ2UxRF81PQotR0xfZ2xUZXhTdWJJbWFnZTFEXzY9Ci0KLUdMX2dsVGV4U3ViSW1hZ2UyRD0KLUdMX2dsVGV4U3ViSW1hZ2UyRF8wPQotR0xfZ2xUZXhTdWJJbWFnZTJEXzE9Ci1HTF9nbFRleFN1YkltYWdlMkRfMj0KLUdMX2dsVGV4U3ViSW1hZ2UyRF8zPQotR0xfZ2xUZXhTdWJJbWFnZTJEXzQ9Ci1HTF9nbFRleFN1YkltYWdlMkRfNT0KLUdMX2dsVGV4U3ViSW1hZ2UyRF82PQotR0xfZ2xUZXhTdWJJbWFnZTJEXzc9Ci1HTF9nbFRleFN1YkltYWdlMkRfOD0KLQotR0xfZ2xUcmFuc2xhdGVkPQotR0xfZ2xUcmFuc2xhdGVkXzA9Ci1HTF9nbFRyYW5zbGF0ZWRfMT0KLUdMX2dsVHJhbnNsYXRlZF8yPQotCi1HTF9nbFRyYW5zbGF0ZWY9Ci1HTF9nbFRyYW5zbGF0ZWZfMD0KLUdMX2dsVHJhbnNsYXRlZl8xPQotR0xfZ2xUcmFuc2xhdGVmXzI9Ci0KLUdMX2dsVmVydGV4MmQ9Ci1HTF9nbFZlcnRleDJkXzA9Ci1HTF9nbFZlcnRleDJkXzE9Ci0KLUdMX2dsVmVydGV4MmR2PQotR0xfZ2xWZXJ0ZXgyZHZfMD0KLQotR0xfZ2xWZXJ0ZXgyZj0KLUdMX2dsVmVydGV4MmZfMD0KLUdMX2dsVmVydGV4MmZfMT0KLQotR0xfZ2xWZXJ0ZXgyZnY9Ci1HTF9nbFZlcnRleDJmdl8wPQotCi1HTF9nbFZlcnRleDJpPQotR0xfZ2xWZXJ0ZXgyaV8wPQotR0xfZ2xWZXJ0ZXgyaV8xPQotCi1HTF9nbFZlcnRleDJpdj0KLUdMX2dsVmVydGV4Mml2XzA9Ci0KLUdMX2dsVmVydGV4MnM9Ci1HTF9nbFZlcnRleDJzXzA9Ci1HTF9nbFZlcnRleDJzXzE9Ci0KLUdMX2dsVmVydGV4MnN2PQotR0xfZ2xWZXJ0ZXgyc3ZfMD0KLQotR0xfZ2xWZXJ0ZXgzZD0KLUdMX2dsVmVydGV4M2RfMD0KLUdMX2dsVmVydGV4M2RfMT0KLUdMX2dsVmVydGV4M2RfMj0KLQotR0xfZ2xWZXJ0ZXgzZHZfX0k9Ci1HTF9nbFZlcnRleDNkdl9fSV8wPQotCi1HTF9nbFZlcnRleDNkdl9fXzNEPQotR0xfZ2xWZXJ0ZXgzZHZfX18zRF8wPQotCi1HTF9nbFZlcnRleDNmPQotR0xfZ2xWZXJ0ZXgzZl8wPQotR0xfZ2xWZXJ0ZXgzZl8xPQotR0xfZ2xWZXJ0ZXgzZl8yPQotCi1HTF9nbFZlcnRleDNmdj0KLUdMX2dsVmVydGV4M2Z2XzA9Ci0KLUdMX2dsVmVydGV4M2k9Ci1HTF9nbFZlcnRleDNpXzA9Ci1HTF9nbFZlcnRleDNpXzE9Ci1HTF9nbFZlcnRleDNpXzI9Ci0KLUdMX2dsVmVydGV4M2l2PQotR0xfZ2xWZXJ0ZXgzaXZfMD0KLQotR0xfZ2xWZXJ0ZXgzcz0KLUdMX2dsVmVydGV4M3NfMD0KLUdMX2dsVmVydGV4M3NfMT0KLUdMX2dsVmVydGV4M3NfMj0KLQotR0xfZ2xWZXJ0ZXgzc3Y9Ci1HTF9nbFZlcnRleDNzdl8wPQotCi1HTF9nbFZlcnRleDRkPQotR0xfZ2xWZXJ0ZXg0ZF8wPQotR0xfZ2xWZXJ0ZXg0ZF8xPQotR0xfZ2xWZXJ0ZXg0ZF8yPQotR0xfZ2xWZXJ0ZXg0ZF8zPQotCi1HTF9nbFZlcnRleDRkdj0KLUdMX2dsVmVydGV4NGR2XzA9Ci0KLUdMX2dsVmVydGV4NGY9Ci1HTF9nbFZlcnRleDRmXzA9Ci1HTF9nbFZlcnRleDRmXzE9Ci1HTF9nbFZlcnRleDRmXzI9Ci1HTF9nbFZlcnRleDRmXzM9Ci0KLUdMX2dsVmVydGV4NGZ2PQotR0xfZ2xWZXJ0ZXg0ZnZfMD0KLQotR0xfZ2xWZXJ0ZXg0aT0KLUdMX2dsVmVydGV4NGlfMD0KLUdMX2dsVmVydGV4NGlfMT0KLUdMX2dsVmVydGV4NGlfMj0KLUdMX2dsVmVydGV4NGlfMz0KLQotR0xfZ2xWZXJ0ZXg0aXY9Ci1HTF9nbFZlcnRleDRpdl8wPQotCi1HTF9nbFZlcnRleDRzPQotR0xfZ2xWZXJ0ZXg0c18wPQotR0xfZ2xWZXJ0ZXg0c18xPQotR0xfZ2xWZXJ0ZXg0c18yPQotR0xfZ2xWZXJ0ZXg0c18zPQotCi1HTF9nbFZlcnRleDRzdj0KLUdMX2dsVmVydGV4NHN2XzA9Ci0KLUdMX2dsVmVydGV4UG9pbnRlcj0KLUdMX2dsVmVydGV4UG9pbnRlcl8wPQotR0xfZ2xWZXJ0ZXhQb2ludGVyXzE9Ci1HTF9nbFZlcnRleFBvaW50ZXJfMj0KLUdMX2dsVmVydGV4UG9pbnRlcl8zPQotCi1HTF9nbFZpZXdwb3J0PQotR0xfZ2xWaWV3cG9ydF8wPQotR0xfZ2xWaWV3cG9ydF8xPQotR0xfZ2xWaWV3cG9ydF8yPQotR0xfZ2xWaWV3cG9ydF8zPQotCi0KLW9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfR0xDb250ZXh0PWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX0dMRGF0YT1mbGFncz1ub19nZW4KLUdMRGF0YV9kZXZpY2U9Ci1HTERhdGFfc3R5bGU9Ci1HTERhdGFfaW1hZ2U9Ci1HTERhdGFfZGlzcGxheT0KLUdMRGF0YV9kcmF3YWJsZT0KLUdMRGF0YV9mb3JlZ3JvdW5kPQotR0xEYXRhX2JhY2tncm91bmQ9Ci1HTERhdGFfZm9udD0KLUdMRGF0YV9jb2xvcm1hcD0KLUdMRGF0YV9jbGlwUmduPQotR0xEYXRhX2xpbmVTdHlsZT0KLUdMRGF0YV9yZW5kZXJUYWJsZT0KLUdMRGF0YV9zdHJpbmc9Ci1HTERhdGFfc3RyaW5nV2lkdGg9Ci1HTERhdGFfc3RyaW5nSGVpZ2h0PQotR0xEYXRhX3htU3RyaW5nPQotR0xEYXRhX3RleHQ9Ci1HTERhdGFfdGV4dFdpZHRoPQotR0xEYXRhX3RleHRIZWlnaHQ9Ci1HTERhdGFfeG1UZXh0PQotR0xEYXRhX3htTW5lbW9uaWM9Ci1HTERhdGFfZHJhd0ZsYWdzPQotCi1vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX0dMRHJhd2FibGU9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfR0xMaXN0ZW5lcj1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9HTFU9Ci1HTFVfZ2x1QmVnaW5DdXJ2ZT0KLUdMVV9nbHVCZWdpbkN1cnZlXzA9Y2FzdD0oR0xVbnVyYnMgKikKLQotR0xVX2dsdUJlZ2luUG9seWdvbj0KLUdMVV9nbHVCZWdpblBvbHlnb25fMD1jYXN0PShHTFV0ZXNzZWxhdG9yKikKLQotR0xVX2dsdUJlZ2luU3VyZmFjZT0KLUdMVV9nbHVCZWdpblN1cmZhY2VfMD1jYXN0PShHTFVudXJicyAqKQotCi1HTFVfZ2x1QmVnaW5UcmltPQotR0xVX2dsdUJlZ2luVHJpbV8wPWNhc3Q9KEdMVW51cmJzICopCi0KLUdMVV9nbHVCdWlsZDFETWlwbWFwcz0KLUdMVV9nbHVCdWlsZDFETWlwbWFwc18wPQotR0xVX2dsdUJ1aWxkMURNaXBtYXBzXzE9Ci1HTFVfZ2x1QnVpbGQxRE1pcG1hcHNfMj0KLUdMVV9nbHVCdWlsZDFETWlwbWFwc18zPQotR0xVX2dsdUJ1aWxkMURNaXBtYXBzXzQ9Ci1HTFVfZ2x1QnVpbGQxRE1pcG1hcHNfNT1jYXN0PShjb25zdCB2b2lkICopCi0KLUdMVV9nbHVCdWlsZDJETWlwbWFwcz0KLUdMVV9nbHVCdWlsZDJETWlwbWFwc18wPQotR0xVX2dsdUJ1aWxkMkRNaXBtYXBzXzE9Ci1HTFVfZ2x1QnVpbGQyRE1pcG1hcHNfMj0KLUdMVV9nbHVCdWlsZDJETWlwbWFwc18zPQotR0xVX2dsdUJ1aWxkMkRNaXBtYXBzXzQ9Ci1HTFVfZ2x1QnVpbGQyRE1pcG1hcHNfNT0KLUdMVV9nbHVCdWlsZDJETWlwbWFwc182PWZsYWdzPWNyaXRpY2FsCi0KLUdMVV9nbHVDeWxpbmRlcj0KLUdMVV9nbHVDeWxpbmRlcl8wPWNhc3Q9KEdMVXF1YWRyaWMgKikKLUdMVV9nbHVDeWxpbmRlcl8xPQotR0xVX2dsdUN5bGluZGVyXzI9Ci1HTFVfZ2x1Q3lsaW5kZXJfMz0KLUdMVV9nbHVDeWxpbmRlcl80PQotR0xVX2dsdUN5bGluZGVyXzU9Ci0KLUdMVV9nbHVEZWxldGVOdXJic1JlbmRlcmVyPQotR0xVX2dsdURlbGV0ZU51cmJzUmVuZGVyZXJfMD1jYXN0PShHTFVudXJicyAqKQotCi1HTFVfZ2x1RGVsZXRlUXVhZHJpYz0KLUdMVV9nbHVEZWxldGVRdWFkcmljXzA9Y2FzdD0oR0xVcXVhZHJpYyAqKQotCi1HTFVfZ2x1RGVsZXRlVGVzcz0KLUdMVV9nbHVEZWxldGVUZXNzXzA9Y2FzdD0oR0xVdGVzc2VsYXRvciAqKQotCi1HTFVfZ2x1RGlzaz0KLUdMVV9nbHVEaXNrXzA9Y2FzdD0oR0xVcXVhZHJpY09iaiAqKQotR0xVX2dsdURpc2tfMT0KLUdMVV9nbHVEaXNrXzI9Ci1HTFVfZ2x1RGlza18zPQotR0xVX2dsdURpc2tfND0KLQotR0xVX2dsdUVuZEN1cnZlPQotR0xVX2dsdUVuZEN1cnZlXzA9Y2FzdD0oR0xVbnVyYnNPYmogKikKLQotR0xVX2dsdUVuZFBvbHlnb249Ci1HTFVfZ2x1RW5kUG9seWdvbl8wPWNhc3Q9KEdMVXRyaWFuZ3VsYXRvck9iaiAqKQotCi1HTFVfZ2x1RW5kU3VyZmFjZT0KLUdMVV9nbHVFbmRTdXJmYWNlXzA9Y2FzdD0oR0xVbnVyYnNPYmogKikKLQotR0xVX2dsdUVuZFRyaW09Ci1HTFVfZ2x1RW5kVHJpbV8wPWNhc3Q9KEdMVW51cmJzT2JqICopCi0KLUdMVV9nbHVFcnJvclN0cmluZz0KLUdMVV9nbHVFcnJvclN0cmluZ18wPQotCi1HTFVfZ2x1R2V0TnVyYnNQcm9wZXJ0eT0KLUdMVV9nbHVHZXROdXJic1Byb3BlcnR5XzA9Y2FzdD0oR0xVbnVyYnMgKikKLUdMVV9nbHVHZXROdXJic1Byb3BlcnR5XzE9Ci1HTFVfZ2x1R2V0TnVyYnNQcm9wZXJ0eV8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMVV9nbHVHZXRTdHJpbmc9Ci1HTFVfZ2x1R2V0U3RyaW5nXzA9Ci0KLUdMVV9nbHVHZXRUZXNzUHJvcGVydHk9Ci1HTFVfZ2x1R2V0VGVzc1Byb3BlcnR5XzA9Y2FzdD0oR0xVdGVzc2VsYXRvciAqKQotR0xVX2dsdUdldFRlc3NQcm9wZXJ0eV8xPQotR0xVX2dsdUdldFRlc3NQcm9wZXJ0eV8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMVV9nbHVMb2FkU2FtcGxpbmdNYXRyaWNlcz0KLUdMVV9nbHVMb2FkU2FtcGxpbmdNYXRyaWNlc18wPWNhc3Q9KEdMVW51cmJzICopCi1HTFVfZ2x1TG9hZFNhbXBsaW5nTWF0cmljZXNfMT1mbGFncz1jcml0aWNhbAotR0xVX2dsdUxvYWRTYW1wbGluZ01hdHJpY2VzXzI9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVMb2FkU2FtcGxpbmdNYXRyaWNlc18zPWZsYWdzPWNyaXRpY2FsCi0KLUdMVV9nbHVMb29rQXQ9Ci1HTFVfZ2x1TG9va0F0XzA9Ci1HTFVfZ2x1TG9va0F0XzE9Ci1HTFVfZ2x1TG9va0F0XzI9Ci1HTFVfZ2x1TG9va0F0XzM9Ci1HTFVfZ2x1TG9va0F0XzQ9Ci1HTFVfZ2x1TG9va0F0XzU9Ci1HTFVfZ2x1TG9va0F0XzY9Ci1HTFVfZ2x1TG9va0F0Xzc9Ci1HTFVfZ2x1TG9va0F0Xzg9Ci0KLUdMVV9nbHVOZXdOdXJic1JlbmRlcmVyPQotCi1HTFVfZ2x1TmV3UXVhZHJpYz0KLQotR0xVX2dsdU5ld1Rlc3M9Ci0KLUdMVV9nbHVOZXh0Q29udG91cj0KLUdMVV9nbHVOZXh0Q29udG91cl8wPWNhc3Q9KEdMVXRlc3NlbGF0b3IgKikKLUdMVV9nbHVOZXh0Q29udG91cl8xPQotCi1HTFVfZ2x1TnVyYnNDYWxsYmFjaz0KLUdMVV9nbHVOdXJic0NhbGxiYWNrXzA9Y2FzdD0oR0xVbnVyYnMgKikKLUdMVV9nbHVOdXJic0NhbGxiYWNrXzE9Ci1HTFVfZ2x1TnVyYnNDYWxsYmFja18yPWNhc3Q9KEdMdm9pZCgqKSkKLQotR0xVX2dsdU51cmJzQ3VydmU9Ci1HTFVfZ2x1TnVyYnNDdXJ2ZV8wPWNhc3Q9KEdMVW51cmJzICopCi1HTFVfZ2x1TnVyYnNDdXJ2ZV8xPQotR0xVX2dsdU51cmJzQ3VydmVfMj1mbGFncz1jcml0aWNhbAotR0xVX2dsdU51cmJzQ3VydmVfMz0KLUdMVV9nbHVOdXJic0N1cnZlXzQ9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVOdXJic0N1cnZlXzU9Ci1HTFVfZ2x1TnVyYnNDdXJ2ZV82PQotCi1HTFVfZ2x1TnVyYnNQcm9wZXJ0eT0KLUdMVV9nbHVOdXJic1Byb3BlcnR5XzA9Y2FzdD0oR0xVbnVyYnMgKikKLUdMVV9nbHVOdXJic1Byb3BlcnR5XzE9Ci1HTFVfZ2x1TnVyYnNQcm9wZXJ0eV8yPQotCi1HTFVfZ2x1TnVyYnNTdXJmYWNlPQotR0xVX2dsdU51cmJzU3VyZmFjZV8wPWNhc3Q9KEdMVW51cmJzT2JqICopCi1HTFVfZ2x1TnVyYnNTdXJmYWNlXzE9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzI9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVOdXJic1N1cmZhY2VfMz0KLUdMVV9nbHVOdXJic1N1cmZhY2VfND1mbGFncz1jcml0aWNhbAotR0xVX2dsdU51cmJzU3VyZmFjZV81PQotR0xVX2dsdU51cmJzU3VyZmFjZV82PQotR0xVX2dsdU51cmJzU3VyZmFjZV83PWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1TnVyYnNTdXJmYWNlXzg9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzk9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzEwPQotCi1HTFVfZ2x1T3J0aG8yRD0KLUdMVV9nbHVPcnRobzJEXzA9Ci1HTFVfZ2x1T3J0aG8yRF8xPQotR0xVX2dsdU9ydGhvMkRfMj0KLUdMVV9nbHVPcnRobzJEXzM9Ci0KLUdMVV9nbHVQYXJ0aWFsRGlzaz0KLUdMVV9nbHVQYXJ0aWFsRGlza18wPWNhc3Q9KEdMVXF1YWRyaWMgKikKLUdMVV9nbHVQYXJ0aWFsRGlza18xPQotR0xVX2dsdVBhcnRpYWxEaXNrXzI9Ci1HTFVfZ2x1UGFydGlhbERpc2tfMz0KLUdMVV9nbHVQYXJ0aWFsRGlza180PQotR0xVX2dsdVBhcnRpYWxEaXNrXzU9Ci1HTFVfZ2x1UGFydGlhbERpc2tfNj0KLQotR0xVX2dsdVBlcnNwZWN0aXZlPQotR0xVX2dsdVBlcnNwZWN0aXZlXzA9Ci1HTFVfZ2x1UGVyc3BlY3RpdmVfMT0KLUdMVV9nbHVQZXJzcGVjdGl2ZV8yPQotR0xVX2dsdVBlcnNwZWN0aXZlXzM9Ci0KLUdMVV9nbHVQaWNrTWF0cml4PQotR0xVX2dsdVBpY2tNYXRyaXhfMD0KLUdMVV9nbHVQaWNrTWF0cml4XzE9Ci1HTFVfZ2x1UGlja01hdHJpeF8yPQotR0xVX2dsdVBpY2tNYXRyaXhfMz0KLUdMVV9nbHVQaWNrTWF0cml4XzQ9ZmxhZ3M9Y3JpdGljYWwKLQotR0xVX2dsdVByb2plY3Q9Ci1HTFVfZ2x1UHJvamVjdF8wPQotR0xVX2dsdVByb2plY3RfMT0KLUdMVV9nbHVQcm9qZWN0XzI9Ci1HTFVfZ2x1UHJvamVjdF8zPWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1UHJvamVjdF80PWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1UHJvamVjdF81PWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1UHJvamVjdF82PWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1UHJvamVjdF83PWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1UHJvamVjdF84PWZsYWdzPWNyaXRpY2FsCi0KLUdMVV9nbHVQd2xDdXJ2ZT0KLUdMVV9nbHVQd2xDdXJ2ZV8wPWNhc3Q9KEdMVW51cmJzICopCi1HTFVfZ2x1UHdsQ3VydmVfMT0KLUdMVV9nbHVQd2xDdXJ2ZV8yPWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1UHdsQ3VydmVfMz0KLUdMVV9nbHVQd2xDdXJ2ZV80PQotCi1HTFVfZ2x1UXVhZHJpY0NhbGxiYWNrPQotR0xVX2dsdVF1YWRyaWNDYWxsYmFja18wPWNhc3Q9KEdMVXF1YWRyaWNPYmogKikKLUdMVV9nbHVRdWFkcmljQ2FsbGJhY2tfMT0KLUdMVV9nbHVRdWFkcmljQ2FsbGJhY2tfMj1jYXN0PShHTHZvaWQoKikpCi0KLUdMVV9nbHVRdWFkcmljRHJhd1N0eWxlPQotR0xVX2dsdVF1YWRyaWNEcmF3U3R5bGVfMD1jYXN0PShHTFVxdWFkcmljT2JqICopCi1HTFVfZ2x1UXVhZHJpY0RyYXdTdHlsZV8xPQotCi1HTFVfZ2x1UXVhZHJpY05vcm1hbHM9Ci1HTFVfZ2x1UXVhZHJpY05vcm1hbHNfMD1jYXN0PShHTFVxdWFkcmljT2JqICopCi1HTFVfZ2x1UXVhZHJpY05vcm1hbHNfMT0KLQotR0xVX2dsdVF1YWRyaWNPcmllbnRhdGlvbj0KLUdMVV9nbHVRdWFkcmljT3JpZW50YXRpb25fMD1jYXN0PShHTFVxdWFkcmljICopCi1HTFVfZ2x1UXVhZHJpY09yaWVudGF0aW9uXzE9Ci0KLUdMVV9nbHVRdWFkcmljVGV4dHVyZT0KLUdMVV9nbHVRdWFkcmljVGV4dHVyZV8wPWNhc3Q9KEdMVXF1YWRyaWMgKikKLUdMVV9nbHVRdWFkcmljVGV4dHVyZV8xPQotCi1HTFVfZ2x1U2NhbGVJbWFnZT0KLUdMVV9nbHVTY2FsZUltYWdlXzA9Ci1HTFVfZ2x1U2NhbGVJbWFnZV8xPQotR0xVX2dsdVNjYWxlSW1hZ2VfMj0KLUdMVV9nbHVTY2FsZUltYWdlXzM9Ci1HTFVfZ2x1U2NhbGVJbWFnZV80PWNhc3Q9KGNvbnN0IHZvaWQgKikKLUdMVV9nbHVTY2FsZUltYWdlXzU9Ci1HTFVfZ2x1U2NhbGVJbWFnZV82PQotR0xVX2dsdVNjYWxlSW1hZ2VfNz0KLUdMVV9nbHVTY2FsZUltYWdlXzg9Y2FzdD0odm9pZCAqKQotCi1HTFVfZ2x1U3BoZXJlPQotR0xVX2dsdVNwaGVyZV8wPWNhc3Q9KEdMVXF1YWRyaWMgKikKLUdMVV9nbHVTcGhlcmVfMT0KLUdMVV9nbHVTcGhlcmVfMj0KLUdMVV9nbHVTcGhlcmVfMz0KLQotR0xVX2dsdVRlc3NCZWdpbkNvbnRvdXI9Ci1HTFVfZ2x1VGVzc0JlZ2luQ29udG91cl8wPWNhc3Q9KEdMVXRlc3NlbGF0b3IgKikKLQotR0xVX2dsdVRlc3NCZWdpblBvbHlnb249Ci1HTFVfZ2x1VGVzc0JlZ2luUG9seWdvbl8wPWNhc3Q9KEdMVXRlc3NlbGF0b3IgKikKLUdMVV9nbHVUZXNzQmVnaW5Qb2x5Z29uXzE9Y2FzdD0oR0x2b2lkICopCi0KLUdMVV9nbHVUZXNzQ2FsbGJhY2s9Ci1HTFVfZ2x1VGVzc0NhbGxiYWNrXzA9Y2FzdD0oR0xVdGVzc2VsYXRvciAqKQotR0xVX2dsdVRlc3NDYWxsYmFja18xPQotR0xVX2dsdVRlc3NDYWxsYmFja18yPWNhc3Q9KEdMdm9pZCgqKSkKLQotR0xVX2dsdVRlc3NFbmRDb250b3VyPQotR0xVX2dsdVRlc3NFbmRDb250b3VyXzA9Y2FzdD0oR0xVdGVzc2VsYXRvciAqKQotCi1HTFVfZ2x1VGVzc0VuZFBvbHlnb249Ci1HTFVfZ2x1VGVzc0VuZFBvbHlnb25fMD1jYXN0PShHTFV0ZXNzZWxhdG9yICopCi0KLUdMVV9nbHVUZXNzTm9ybWFsPQotR0xVX2dsdVRlc3NOb3JtYWxfMD1jYXN0PShHTFV0ZXNzZWxhdG9yICopCi1HTFVfZ2x1VGVzc05vcm1hbF8xPQotR0xVX2dsdVRlc3NOb3JtYWxfMj0KLUdMVV9nbHVUZXNzTm9ybWFsXzM9Ci0KLUdMVV9nbHVUZXNzUHJvcGVydHk9Ci1HTFVfZ2x1VGVzc1Byb3BlcnR5XzA9Y2FzdD0oR0xVdGVzc2VsYXRvciAqKQotR0xVX2dsdVRlc3NQcm9wZXJ0eV8xPQotR0xVX2dsdVRlc3NQcm9wZXJ0eV8yPQotCi1HTFVfZ2x1VGVzc1ZlcnRleD0KLUdMVV9nbHVUZXNzVmVydGV4XzA9Y2FzdD0oR0xVdGVzc2VsYXRvciAqKQotR0xVX2dsdVRlc3NWZXJ0ZXhfMT1mbGFncz1jcml0aWNhbAotR0xVX2dsdVRlc3NWZXJ0ZXhfMj1jYXN0PShHTHZvaWQgKikKLQotR0xVX2dsdVVuUHJvamVjdD0KLUdMVV9nbHVVblByb2plY3RfMD0KLUdMVV9nbHVVblByb2plY3RfMT0KLUdMVV9nbHVVblByb2plY3RfMj0KLUdMVV9nbHVVblByb2plY3RfMz1mbGFncz1jcml0aWNhbAotR0xVX2dsdVVuUHJvamVjdF80PWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1VW5Qcm9qZWN0XzU9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVVblByb2plY3RfNj1mbGFncz1jcml0aWNhbAotR0xVX2dsdVVuUHJvamVjdF83PWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1VW5Qcm9qZWN0Xzg9ZmxhZ3M9Y3JpdGljYWwKLQotCi1vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX0xpYnJhcnk9ZmxhZ3M9bm9fZ2VuCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL01vemlsbGEgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTW96aWxsYUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvTW96aWxsYSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9Nb3ppbGxhR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNjVmZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvTW96aWxsYSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9Nb3ppbGxhR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qIFByb2R1Y2VzIHRoZSBqYXZhIGNsYXNzZXMgbWFwcGluZyB0byBYUENPTSBNb3ppbGxhIG9iamVjdHMgKi8KLXB1YmxpYyBjbGFzcyBNb3ppbGxhR2VuZXJhdG9yIHsKLQlGaWxlUmVhZGVyIHIgPSBudWxsOwotCUZpbGVXcml0ZXIgdyA9IG51bGw7Ci0JaW50IG1heExpbmVzID0gMTAwMDsKLQlpbnQgY250TGluZXMgPSAwOwotCWludCBuID0gMDsKLQlTdHJpbmdbXSBiID0gbnVsbDsKLQlTdHJpbmcgYm9keSA9IG51bGw7Ci0JaW50IG5NZXRob2RzID0gMDsKLQlTdHJpbmcgdXVpZE5hbWU7Ci0JU3RyaW5nIHV1aWRWYWx1ZTsKLQlTdHJpbmcgY2xhc3NOYW1lOwotCVN0cmluZyBwYXJlbnROYW1lOwotCVN0cmluZ1tdIGNvbnN0YW50TmFtZXM7Ci0JU3RyaW5nW10gY29uc3RhbnRWYWx1ZXM7Ci0JU3RyaW5nW10gbWV0aG9kTmFtZXM7Ci0JU3RyaW5nW11bXSBhcmdUeXBlczsKLQlTdHJpbmdbXVtdIGFyZ05hbWVzOwotCVN0cmluZyBib2R5T3JkZXI7Ci0JSGFzaHRhYmxlIHZ0YmxzOwotCi0Jc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotCS8vIENvbnRhaW5zIHRoZSBjaGFyYWN0ZXJzIGZvdW5kIGJlZm9yZSBhIG1ldGhvZCBuYW1lCi0JLy8gVXNlZnVsIHRvIGV4dHJhY3QgdGhlIG1ldGhvZCBuYW1lLiBlLmcuCi0JLy8gIE5TX0lNRVRIT0QgUXVlcnlJbnRlcmZhY2UoY29uc3QgbnNJSUQgJiB1dWlkLCB2b2lkICogKnJlc3VsdCkgPSAwOwotCS8vICBOU19JTUVUSE9EXyhuc3JlZmNudCkgQWRkUmVmKHZvaWQpID0gMDsKLQkvLyBtZXRob2QgbmFtZSBmb2xsb3dzOiBRdWVyeUludGVyZmFjZSwgQWRkUmVmIGV0Yy4KLQlzdGF0aWMgU3RyaW5nW10gQkVGT1JFX01FVEhPRF9OQU1FID0gewotCQkiICBOU19JTUVUSE9EICIsCi0JCSIgIE5TX0lNRVRIT0RfKG5zcmVmY250KSAiLAotCQkiICBOU19JTUVUSE9EXyh2b2lkICopICIsCi0JCSIgIE5TX0lNRVRIT0RfKHZvaWQpICIKLQl9OwotCXN0YXRpYyBTdHJpbmcgTk9fU1VQRVJfQ0xBU1MgPSAiU1dUX05PX1NVUEVSX0NMQVNTIjsKLQkKLQlzdGF0aWMgU3RyaW5nW11bXSBUWVBFU19DMkpBVkEgPSB7IAotCQl7ICJQUkJvb2wgKiIsICJib29sZWFuW10iIH0sCi0JCXsgIm5zSUlEICYiLCAibnNJRCIgfSwKLQkJeyAibnNDSUQgJiIsICJuc0lEIiB9LAotCQl7ICJuc0NJRCAqICoiLCAiaW50IC8qbG9uZyovIiB9LCAvLyBuc0lEW10gbm90IHN1cHBvcnRlZCBieSBqbmlnZW4KLQkJeyAiKiAqIiwgImludCAvKmxvbmcqL1tdIiB9LAotCQl7ICIqKiIsICJpbnQgLypsb25nKi9bXSIgfSwKLQkJeyAiKiAmIiwgImludCAvKmxvbmcqL1tdIiB9LAotCQl7ICJQUlVpbnQzMiAqIiwgImludFtdIiB9LCAKLQkJeyAiUFJJbnQzMiAqIiwgImludFtdIiB9LAotCQl7ICJQUkludDY0ICoiLCAibG9uZ1tdIiB9LAotCQl7ICJQUlVuaWNoYXIgKiIsICJjaGFyW10iIH0sCi0JCXsgImNoYXIgKiIsICJieXRlW10iIH0sCi0JCXsgImZsb2F0ICoiLCAiZmxvYXRbXSIgfSwKLQkJeyAiUFJVaW50MTYgKiIsICJzaG9ydFtdIiB9LAotCQl7ICJuYXRpdmVXaW5kb3cgKiIsICJpbnQgLypsb25nKi9bXSIgfSwKLQkJeyAibnNXcml0ZVNlZ21lbnRGdW4iLCAiaW50IC8qbG9uZyovIiB9LAotCQl7ICJuYXRpdmVXaW5kb3ciLCAiaW50IC8qbG9uZyovIiB9LAotCi0JCXsgIioiLCAiaW50IC8qbG9uZyovIiB9LCAvLyBjIHR5cGUgY29udGFpbmluZyBvbmUgb3IgbW9yZSAqIChhbmQgYW55IG90aGVyIGNoYXJhY3RlciwgYW5kIGRpZCBub3QgbWF0Y2ggcHJldmlvdXMgcGF0dGVybnMpIGlzIGEgc2ltcGxlIHBvaW50ZXIKLQkJeyAiJiIsICJpbnQgLypsb25nKi8iIH0sIAotCi0JCXsgIlBSVWludDMyIiwgImludCIgfSwKLQkJeyAiUFJJbnQzMiIsICJpbnQiIH0sIAotCQl7ICJQUkludDY0IiwgImxvbmciIH0sIAotCQl7ICJuc3Jlc3VsdCIsICJpbnQiIH0sCi0JCXsgIlBSQm9vbCIsICJib29sZWFuIiB9LAotCQl7ICJmbG9hdCIsICJmbG9hdCIgfSwKLQkJeyAiUFJVaW50MTYiLCAic2hvcnQiIH0sCi0JCXsgInNpemVfdCIsICJpbnQiIH0sCi0JCX07Ci0KLQlzdGF0aWMgU3RyaW5nIEdFQ0tPID0gIi9tb3ppbGxhL21vemlsbGEvMS40L2xpbnV4X2d0azIvbW96aWxsYS9kaXN0L2luY2x1ZGUvIjsKLQlzdGF0aWMgU3RyaW5nIFRBUkdFVF9GT0xERVIgPSAiL2JsdWViaXJkL3RlYW1zd3QvY2hyaXN4L2FtZDY0L3dvcmtzcGFjZS9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgTW96aWxsYS9jb21tb24vb3JnL2VjbGlwc2Uvc3d0L2ludGVybmFsL21vemlsbGEvIjsKLQlzdGF0aWMgU3RyaW5nW10gWFBDT01fSEVBREVSUyA9IHsgCi0JCSJwcm9maWxlL25zSVByb2ZpbGUuaCIsCi0JCSJ3aWRnZXQvbnNJQXBwU2hlbGwuaCIsCi0JCSJ3aWRnZXQvbnNJQmFzZVdpbmRvdy5oIiwgCi0JCSJ4cGNvbS9uc0lDb21wb25lbnRNYW5hZ2VyLmgiLAotCQkieHBjb20vbnNJQ29tcG9uZW50UmVnaXN0cmFyLmgiLAotCQkid2ViYnJ3c3IvbnNJQ29udGV4dE1lbnVMaXN0ZW5lci5oIiwgCi0JCSJkb2NzaGVsbC9uc0lEb2NTaGVsbC5oIiwKLQkJImRvbS9uc0lET01FdmVudC5oIiwgCi0JCSJkb20vbnNJRE9NTW91c2VFdmVudC5oIiwKLQkJImRvbS9uc0lET01VSUV2ZW50LmgiLCAKLQkJImRvbS9uc0lET01XaW5kb3cuaCIsCi0JCSJ1cmlsb2FkZXIvbnNJRG93bmxvYWQuaCIsIAotCQkid2ViYnJ3c3IvbnNJRW1iZWRkaW5nU2l0ZVdpbmRvdy5oIiwKLQkJInhwY29tL25zSUZhY3RvcnkuaCIsIAotCQkieHBjb20vbnNJRmlsZS5oIiwKLQkJImhlbHBlckFwcERsZy9uc0lIZWxwZXJBcHBMYXVuY2hlckRpYWxvZy5oIiwKLQkJImV4dGhhbmRsZXIvbnNJRXh0ZXJuYWxIZWxwZXJBcHBTZXJ2aWNlLmgiLCAvLyBjb250YWlucyBuc0lIZWxwZXJBcHBMYXVuY2hlcgotCQkieHBjb20vbnNJSW5wdXRTdHJlYW0uaCIsIAotCQkieHBjb20vbnNJSW50ZXJmYWNlUmVxdWVzdG9yLmgiLAotCQkibmVja28vbnNJSU9TZXJ2aWNlLmgiLCAKLQkJInhwY29tL25zSUxvY2FsRmlsZS5oIiwgCi0JCSJ4cGNvbS9uc0lNZW1vcnkuaCIsCi0JCSJwcm9ncmVzc0RsZy9uc0lQcm9ncmVzc0RpYWxvZy5oIiwKLQkJIndpbmRvd3dhdGNoZXIvbnNJUHJvbXB0U2VydmljZS5oIiwgCi0JCSJ4cGNvbS9uc0lTZXJ2aWNlTWFuYWdlci5oIiwKLQkJInhwY29tL25zSVN1cHBvcnRzLmgiLCAKLQkJIndlYmJyd3NyL25zSVRvb2x0aXBMaXN0ZW5lci5oIiwgCi0JCSJuZWNrby9uc0lVUkkuaCIsCi0JCSJ1cmlsb2FkZXIvbnNJVVJJQ29udGVudExpc3RlbmVyLmgiLCAKLQkJInhwY29tL25zSVdlYWtSZWZlcmVuY2UuaCIsCi0JCSJ3ZWJicndzci9uc0lXZWJCcm93c2VyLmgiLCAKLQkJIndlYmJyd3NyL25zSVdlYkJyb3dzZXJDaHJvbWUuaCIsCi0JCSJ3ZWJicndzci9uc0lXZWJCcm93c2VyQ2hyb21lRm9jdXMuaCIsCi0JCSJ3ZWJicndzci9uc0lXZWJCcm93c2VyRm9jdXMuaCIsIAotCQkiZG9jc2hlbGwvbnNJV2ViTmF2aWdhdGlvbi5oIiwKLQkJInVyaWxvYWRlci9uc0lXZWJQcm9ncmVzcy5oIiwgCi0JCSJ1cmlsb2FkZXIvbnNJV2ViUHJvZ3Jlc3NMaXN0ZW5lci5oIiwKLQkJImVtYmVkX2Jhc2UvbnNJV2luZG93Q3JlYXRvci5oIiwgCi0JCSJ3aW5kb3d3YXRjaGVyL25zSVdpbmRvd1dhdGNoZXIuaCIgfTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJTW96aWxsYUdlbmVyYXRvciB4ID0gbmV3IE1vemlsbGFHZW5lcmF0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBYUENPTV9IRUFERVJTLmxlbmd0aDsgaSsrKQotCQkJeC5wYXJzZShHRUNLTyArIFhQQ09NX0hFQURFUlNbaV0sIFRBUkdFVF9GT0xERVIpOwotCQl4Lm91dHB1dFZ0YmxDYWxsKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZG9uZSIpOwotCX0KLQotCXB1YmxpYyBNb3ppbGxhR2VuZXJhdG9yKCkgewotCQl2dGJscyA9IG5ldyBIYXNodGFibGUoKTsKLQl9Ci0KLQkvKiogV3JpdGUgY2FsbGJhY2tzICovCi0JcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIGRhdGEpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KGRhdGEpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQl3LndyaXRlKGRhdGEpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGVMaW5lKCkgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXdyaXRlKCJcclxuIik7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGVMaW5lKFN0cmluZyBkYXRhKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGRhdGEpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXdyaXRlKGRhdGEgKyAiXHJcbiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlQ29weXJpZ2h0cygpIHsKLQkJd3JpdGVMaW5lKENPUFlSSUdIVFMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlUGFja2FnZURlY2xhcmF0aW9uKCkgewotCQl3cml0ZUxpbmUoUEFDS0FHRV9ERUNMQVJBVElPTik7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGVDbGFzc0RlY2xhcmF0aW9uKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBwYXJlbnROYW1lKSB7Ci0JCVN0cmluZyBsaW5lID0gInB1YmxpYyBjbGFzcyAiICsgY2xhc3NOYW1lOwotCQlpZiAoIXBhcmVudE5hbWUuZXF1YWxzKE5PX1NVUEVSX0NMQVNTKSkgbGluZSArPSAiIGV4dGVuZHMgIiArIHBhcmVudE5hbWU7Ci0JCWxpbmUgKz0gIiB7IjsKLQkJd3JpdGVMaW5lKGxpbmUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlTGFzdE1ldGhvZElkKFN0cmluZyBwYXJlbnROYW1lLCBpbnQgbk1ldGhvZHMpIHsKLQkJU3RyaW5nIGxpbmUgPSAiXHRzdGF0aWMgZmluYWwgaW50IExBU1RfTUVUSE9EX0lEID0gIjsKLQkJaWYgKCFwYXJlbnROYW1lLmVxdWFscyhOT19TVVBFUl9DTEFTUykpIGxpbmUgKz0gcGFyZW50TmFtZSArICIuTEFTVF9NRVRIT0RfSUQgKyAiICsgbk1ldGhvZHMgKyAiOyI7Ci0JCWVsc2UgbGluZSArPSAiIiArIChuTWV0aG9kcyAtIDEpKyAiOyI7IC8vIHplcm8gaW5kZXhlZAotCQl3cml0ZUxpbmUobGluZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGVJSUQoU3RyaW5nIHV1aWROYW1lLCBTdHJpbmcgdXVpZFZhbHVlKSB7Ci0JCXdyaXRlTGluZSgiXHRwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyAiICsgdXVpZE5hbWUgKyAiID0iKTsKLQkJd3JpdGVMaW5lKCJcdFx0XCIiICsgdXVpZFZhbHVlICsgIlwiOyIpOwotCQl3cml0ZUxpbmUoKTsKLQkJU3RyaW5nIGlpZCA9IHV1aWROYW1lLnN1YnN0cmluZygwLCB1dWlkTmFtZS5pbmRleE9mKCJfU1RSIikpOwotCQl3cml0ZUxpbmUoIlx0cHVibGljIHN0YXRpYyBmaW5hbCBuc0lEICIgKyBpaWQgKyAiID0iKTsKLQkJd3JpdGVMaW5lKCJcdFx0bmV3IG5zSUQoIiArIHV1aWROYW1lICsgIik7Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGVBZGRyZXNzRmllbGQoKSB7Ci0JCXdyaXRlTGluZSgiXHRpbnQgLypsb25nKi8gYWRkcmVzczsiKTsKLQl9Ci0JcHVibGljIHZvaWQgd3JpdGVDb25zdHJ1Y3RvcihTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgcGFyZW50TmFtZSkgewotCQl3cml0ZUxpbmUoIlx0cHVibGljICIgKyBjbGFzc05hbWUgKyAiKGludCAvKmxvbmcqLyBhZGRyZXNzKSB7Iik7Ci0JCWlmICghcGFyZW50TmFtZS5lcXVhbHMoTk9fU1VQRVJfQ0xBU1MpKSB7Ci0JCQl3cml0ZUxpbmUoIlx0XHRzdXBlcihhZGRyZXNzKTsiKTsKLQkJfSBlbHNlIHsKLQkJCXdyaXRlTGluZSgiXHRcdHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7Iik7Ci0JCX0KLQkJd3JpdGVMaW5lKCJcdH0iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZUFkZHJlc3NHZXR0ZXIoKSB7Ci0JCXdyaXRlTGluZSgiXHRwdWJsaWMgaW50IC8qbG9uZyovIGdldEFkZHJlc3MoKSB7Iik7Ci0JCXdyaXRlTGluZSgiXHRcdHJldHVybiB0aGlzLmFkZHJlc3M7Iik7Ci0JCXdyaXRlTGluZSgiXHR9Iik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHdyaXRlQ29uc3RhbnQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl3cml0ZUxpbmUoIlx0cHVibGljIHN0YXRpYyBmaW5hbCBpbnQgIiArIG5hbWUgKyAiID0gIiArIHZhbHVlICsgIjsiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZU1ldGhvZChTdHJpbmcgbmFtZSwgU3RyaW5nIHBhcmVudE5hbWUsIGludCBtZXRob2RJbmRleCwgU3RyaW5nW10gYXJnVHlwZXMsIFN0cmluZ1tdIGFyZ05hbWVzKSB7Ci0JCXdyaXRlKCJcdHB1YmxpYyBpbnQgIiArIG5hbWUgKyAiKCIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ1R5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl3cml0ZShhcmdUeXBlc1tpXSArICIgIiArIGFyZ05hbWVzW2ldKTsKLQkJCWlmIChpIDwgYXJnVHlwZXMubGVuZ3RoIC0gMSkKLQkJCQl3cml0ZSgiLCAiKTsKLQkJfQotCQl3cml0ZSgiKSB7Iik7Ci0JCXdyaXRlTGluZSgpOwotCQlTdHJpbmcgbGluZSA9ICJcdFx0cmV0dXJuIFhQQ09NLlZ0YmxDYWxsKCI7Ci0JCWlmICghcGFyZW50TmFtZS5lcXVhbHMoTk9fU1VQRVJfQ0xBU1MpKSBsaW5lICs9IHBhcmVudE5hbWUgKyAiLkxBU1RfTUVUSE9EX0lEICsgIiArIChtZXRob2RJbmRleCArIDEpICsgIiwgZ2V0QWRkcmVzcygpIjsKLQkJZWxzZSBsaW5lICs9IG1ldGhvZEluZGV4ICsgIiwgZ2V0QWRkcmVzcygpIjsgLy8gemVybyBpbmRleGVkCi0JCXdyaXRlKGxpbmUpOwotCQlpZiAoYXJnVHlwZXMubGVuZ3RoID4gMCkKLQkJCXdyaXRlKCIsICIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ1R5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl3cml0ZShhcmdOYW1lc1tpXSk7Ci0JCQlpZiAoaSA8IGFyZ1R5cGVzLmxlbmd0aCAtIDEpCi0JCQkJd3JpdGUoIiwgIik7Ci0JCX0KLQkJd3JpdGVMaW5lKCIpOyIpOwotCQl3cml0ZUxpbmUoIlx0fSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlQ2xhc3NFbmQoKSB7Ci0JCXdyaXRlKCJ9Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9nVnRibENhbGwoU3RyaW5nW10gYXJnVHlwZXMpIHsKLQkJU3RyaW5nIHZ0YmwgPSAic3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgVnRibENhbGwoaW50IGZuTnVtYmVyLCBpbnQgLypsb25nKi8gcHBWdGJsIjsKLQkJaWYgKGFyZ1R5cGVzLmxlbmd0aCA+IDApCi0JCQl2dGJsICs9ICIsICI7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJnVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCXZ0YmwgKz0gYXJnVHlwZXNbaV0gKyAiIGFyZyIgKyBpOwotCQkJaWYgKGkgPCBhcmdUeXBlcy5sZW5ndGggLSAxKQotCQkJCXZ0YmwgKz0gIiwgIjsKLQkJfQotCQl2dGJsICs9ICIpOyI7Ci0JCUludGVnZXIga2V5ID0gbmV3IEludGVnZXIoYXJnVHlwZXMubGVuZ3RoKTsKLQkJVmVjdG9yIGxpc3QgPSAoVmVjdG9yKSB2dGJscy5nZXQoa2V5KTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJCXZ0YmxzLnB1dChrZXksIGxpc3QpOwotCQl9Ci0JCWJvb2xlYW4gZHVwbGljYXRlID0gZmFsc2U7Ci0JCUVudW1lcmF0aW9uIGUgPSBsaXN0LmVsZW1lbnRzKCk7Ci0JCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlTdHJpbmcgcyA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmICh2dGJsLmVxdWFscyhzKSkgewotCQkJCWR1cGxpY2F0ZSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFkdXBsaWNhdGUpCi0JCQlsaXN0LmFkZCh2dGJsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvdXRwdXRWdGJsQ2FsbCgpIHsKLQkJRW51bWVyYXRpb24gZSA9IHZ0YmxzLmtleXMoKTsKLQkJaW50IG4gPSAwOwotCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZS5uZXh0RWxlbWVudCgpOwotCQkJbisrOwotCQl9Ci0JCUludGVnZXJbXSBrZXlzID0gbmV3IEludGVnZXJbbl07Ci0JCWUgPSB2dGJscy5rZXlzKCk7Ci0JCW4gPSAwOwotCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJa2V5c1tuXSA9IChJbnRlZ2VyKSBlLm5leHRFbGVtZW50KCk7Ci0JCQluKys7Ci0JCX0KLQkJQXJyYXlzLnNvcnQoa2V5cyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJVmVjdG9yIGxpc3QgPSAoVmVjdG9yKSB2dGJscy5nZXQoa2V5c1tpXSk7Ci0JCQlPYmplY3RbXSBlbHRzID0gKE9iamVjdFtdKSBsaXN0LnRvQXJyYXkoKTsKLQkJCUFycmF5cy5zb3J0KGVsdHMpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbHRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGVsdHNbal0pOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKiogUGFyc2luZyBpbnZva2luZyB3cml0ZSBjYWxsYmFja3MgKi8KLQotCS8qCi0JICogQ29udmVydCBhIEMgaGVhZGVyIGZpbGUgaW50byBhIEphdmEgc291cmNlIGZpbGUgbWF0Y2hpbmcgU1dUIE1vemlsbGEKLQkgYmluZGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgc3JjLCBTdHJpbmcgZGVzdFBhdGgpIHsKLQkJaWYgKERFQlVHKSB3cml0ZUxpbmUoIioqKiBQQVJTSU5HIDwiK3NyYysiPiB0byBmb2xkZXIgIitkZXN0UGF0aCk7Ci0JCWIgPSBuZXcgU3RyaW5nW21heExpbmVzXTsKLQkJY250TGluZXMgPSAwOwotCQl0cnkgewotCQkJciA9IG5ldyBGaWxlUmVhZGVyKHNyYyk7Ci0JCQlCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyKTsKLQkJCXdoaWxlICgoYltjbnRMaW5lc10gPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJY250TGluZXMrKzsKLQkJCX0KLQkJCWJyLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbiA9IDA7Ci0JCWJvb2xlYW4gbG9va0ZvckNsYXNzZXMgPSB0cnVlOwotCQl3aGlsZSAobG9va0ZvckNsYXNzZXMpIHsJCi0JCQkvKiBwYXJzaW5nICovCi0JCQlsb29rRm9yQ2xhc3NlcyA9IHBhcnNlKCk7Ci0JCi0JCQlTdHJpbmcgZGVzdEZpbGUgPSBkZXN0UGF0aCArIGNsYXNzTmFtZSArICIuamF2YSI7Ci0JCQl0cnkgewotCQkJCXcgPSBuZXcgRmlsZVdyaXRlcihkZXN0RmlsZSk7Ci0JCQkJaWYgKERFQlVHKSB3cml0ZUxpbmUoIioqIENSRUFURUQgSkFWQSBGSUxFIDwiK2Rlc3RGaWxlKyI+Iik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCi0JCQkvKiB3cml0aW5nICovCi0JCQl3cml0ZUNvcHlyaWdodHMoKTsKLQkJCXdyaXRlUGFja2FnZURlY2xhcmF0aW9uKCk7Ci0JCQl3cml0ZUxpbmUoKTsKLQkJCXdyaXRlQ2xhc3NEZWNsYXJhdGlvbihjbGFzc05hbWUsIHBhcmVudE5hbWUpOwotCQkJd3JpdGVMaW5lKCk7Ci0JCQl3cml0ZUxhc3RNZXRob2RJZChwYXJlbnROYW1lLCBuTWV0aG9kcyk7Ci0JCQl3cml0ZUxpbmUoKTsKLQkJCXdyaXRlSUlEKHV1aWROYW1lLCB1dWlkVmFsdWUpOwotCQkJd3JpdGVMaW5lKCk7Ci0JCQlpZiAocGFyZW50TmFtZS5lcXVhbHMoTk9fU1VQRVJfQ0xBU1MpKSB7Ci0JCQkJd3JpdGVBZGRyZXNzRmllbGQoKTsKLQkJCQl3cml0ZUxpbmUoKTsKLQkJCX0KLQkJCXdyaXRlQ29uc3RydWN0b3IoY2xhc3NOYW1lLCBwYXJlbnROYW1lKTsKLQkJCXdyaXRlTGluZSgpOwotCQkJCi0JCQlpZiAocGFyZW50TmFtZS5lcXVhbHMoTk9fU1VQRVJfQ0xBU1MpKSB7Ci0JCQkJd3JpdGVBZGRyZXNzR2V0dGVyKCk7Ci0JCQkJd3JpdGVMaW5lKCk7Ci0JCQl9Ci0JCi0JCQlpbnQgY29uc3RhbnRJbmRleCA9IDAsIG1ldGhvZEluZGV4ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYm9keU9yZGVyLmxlbmd0aCgpOyBpKyspIHsKLQkJCQlpZiAoYm9keU9yZGVyLmNoYXJBdChpKSA9PSAnQycpIHsKLQkJCQkJd3JpdGVDb25zdGFudChjb25zdGFudE5hbWVzW2NvbnN0YW50SW5kZXhdLAotCQkJCQkJCWNvbnN0YW50VmFsdWVzW2NvbnN0YW50SW5kZXhdKTsKLQkJCQkJaWYgKGkgPCBib2R5T3JkZXIubGVuZ3RoKCkgLSAxKSB3cml0ZUxpbmUoKTsKLQkJCQkJY29uc3RhbnRJbmRleCsrOwotCQkJCX0gZWxzZSBpZiAoYm9keU9yZGVyLmNoYXJBdChpKSA9PSAnTScpIHsKLQkJCQkJd3JpdGVNZXRob2QobWV0aG9kTmFtZXNbbWV0aG9kSW5kZXhdLCBwYXJlbnROYW1lLCBtZXRob2RJbmRleCwKLQkJCQkJCQlhcmdUeXBlc1ttZXRob2RJbmRleF0sIGFyZ05hbWVzW21ldGhvZEluZGV4XSk7Ci0JCQkJCWlmIChpIDwgYm9keU9yZGVyLmxlbmd0aCgpIC0gMSkgd3JpdGVMaW5lKCk7Ci0JCQkJCW1ldGhvZEluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQotCQkJd3JpdGVDbGFzc0VuZCgpOwotCQotCQkJdHJ5IHsKLQkJCQl3LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZXMoKSB7Ci0JCXJldHVybiAicGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW96aWxsYTsiOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBhcnNlKCkgewotCQlpZiAoIWp1bXBUb1V1aWREZWNsYXJhdGlvbigpKSByZXR1cm4gZmFsc2U7Ci0JCXV1aWROYW1lID0gZ2V0VXVpZE5hbWUoYltuXSk7Ci0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVVVJRCBuYW1lOiA8IiArIHV1aWROYW1lICsgIj4iKTsKLQkJdXVpZFZhbHVlID0gZ2V0VXVpZFZhbHVlKGJbbl0pOwotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVVSUQgdmFsdWU6IDwiICsgdXVpZFZhbHVlICsgIj4iKTsKLQkJanVtcFRvSW50ZXJmYWNlRGVjbGFyYXRpb24oKTsKLQkJY2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKGJbbl0pOwotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZSBuYW1lOiA8IiArIGNsYXNzTmFtZSArICI+Iik7Ci0JCXBhcmVudE5hbWUgPSBnZXRQYXJlbnROYW1lKGJbbl0pOwotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInBhcmVudE5hbWU6IDwiICsgcGFyZW50TmFtZSArICI+Iik7Ci0JCXBhcnNlQm9keSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlib29sZWFuIGp1bXBUb1V1aWREZWNsYXJhdGlvbigpIHsKLQkJLy8ganVtcCB0byBsaW5lIG1hdGNoaW5nOiAiI2RlZmluZSBOU19JV0VCQlJPV1NFUkNIUk9NRV9JSURfU1RSICJiYTQzNGM2MC05ZDUyLTExZDMtYWZiMC0wMGEwMjRmZmMwOGMiIgotCQl3aGlsZSAoIShiW25dLnN0YXJ0c1dpdGgoIiNkZWZpbmUgIikgJiYgYltuXS5pbmRleE9mKCJfSUlEX1NUUiBcIiIpICE9IC0xKSkgewotCQkJbisrOwotCQkJaWYgKG4gPj0gY250TGluZXMpIHJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvL2Fzc3VtZSBhIGRlY2xhcmF0aW9uIG1hdGNoaW5nOiAiI2RlZmluZSBOU19JV0VCQlJPV1NFUkNIUk9NRV9JSURfU1RSICJiYTQzNGM2MC05ZDUyLTExZDMtYWZiMC0wMGEwMjRmZmMwOGMiIgotCS8vcmV0dXJucyBOU19JV0VCQlJPV1NFUkNIUk9NRV9JSURfU1RSCi0JU3RyaW5nIGdldFV1aWROYW1lKFN0cmluZyBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uc3Vic3RyaW5nKGRlY2xhcmF0aW9uLmluZGV4T2YoIiNkZWZpbmUgIikKLQkJCQkrICIjZGVmaW5lICIubGVuZ3RoKCksIGRlY2xhcmF0aW9uLmluZGV4T2YoIiBcIiIpKTsKLQl9Ci0KLQkvL2Fzc3VtZSBhIGRlY2xhcmF0aW9uIG1hdGNoaW5nOiAiI2RlZmluZSBOU19JV0VCQlJPV1NFUkNIUk9NRV9JSURfU1RSICJiYTQzNGM2MC05ZDUyLTExZDMtYWZiMC0wMGEwMjRmZmMwOGMiIgotCS8vcmV0dXJucyBiYTQzNGM2MC05ZDUyLTExZDMtYWZiMC0wMGEwMjRmZmMwOGMKLQlTdHJpbmcgZ2V0VXVpZFZhbHVlKFN0cmluZyBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uc3Vic3RyaW5nKGRlY2xhcmF0aW9uLmluZGV4T2YoIl9JSURfU1RSIFwiIikKLQkJCQkrICJfSUlEX1NUUiBcIiIubGVuZ3RoKCksIGRlY2xhcmF0aW9uLmxhc3RJbmRleE9mKCciJykpOwotCX0KLQotCXZvaWQganVtcFRvSW50ZXJmYWNlRGVjbGFyYXRpb24oKSB7Ci0JCS8vIGp1bXAgdG8gbGluZSBtYXRjaGluZzogImNsYXNzIE5TX05PX1ZUQUJMRSBuc0lXZWJCcm93c2VyQ2hyb21lIDogcHVibGljIG5zSVN1cHBvcnRzIHsiCi0JCXdoaWxlICghKGJbbl0uc3RhcnRzV2l0aCgiY2xhc3MgTlNfTk9fVlRBQkxFICIpKSkgewotCQkJbisrOwotCQl9Ci0JfQotCi0JLy8gYXNzdW1lIGEgZGVjbGFyYXRpb24gbWF0Y2hpbmc6ICJjbGFzcyBOU19OT19WVEFCTEUgbnNJV2ViQnJvd3NlckNocm9tZSA6IHB1YmxpYyBuc0lTdXBwb3J0cyB7IgotCS8vIHJldHVybnMgbnNJV2ViQnJvd3NlckNocm9tZQotCS8vIHNwZWNpYWwgY2FzZSBmb3IgbnNJU3VwcG9ydHMgdGhhdCBoYXMgbm8gc3VwZXIgY2xhc3M6IGNsYXNzIE5TX05PX1ZUQUJMRSBuc0lTdXBwb3J0cyB7Ci0JU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgZGVjbGFyYXRpb24pIHsKLQkJaW50IGVuZEluZGV4ID0gZGVjbGFyYXRpb24uaW5kZXhPZigiIDoiKTsKLQkJLy8gbnNJU3VwcG9ydHMgc3BlY2lhbCBjYXNlIChubyBzdXBlciBjbGFzcykKLQkJaWYgKGVuZEluZGV4ID09IC0xKSBlbmRJbmRleCA9IGRlY2xhcmF0aW9uLmluZGV4T2YoIiB7Iik7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5zdWJzdHJpbmcoZGVjbGFyYXRpb24uaW5kZXhPZigiY2xhc3MgTlNfTk9fVlRBQkxFICIpCi0JCQkJKyAiY2xhc3MgTlNfTk9fVlRBQkxFICIubGVuZ3RoKCksIGVuZEluZGV4KTsKLQl9Ci0KLQkvLyBhc3N1bWUgYSBkZWNsYXJhdGlvbiBtYXRjaGluZzogImNsYXNzIE5TX05PX1ZUQUJMRSBuc0lXZWJCcm93c2VyQ2hyb21lIDogcHVibGljIG5zSVN1cHBvcnRzIHsiCi0JLy8gcmV0dXJucyBuc0lTdXBwb3J0cwotCS8vIHNwZWNpYWwgY2FzZSBmb3IgbnNJU3VwcG9ydHMgdGhhdCBoYXMgbm8gc3VwZXIgY2xhc3M6IGNsYXNzIE5TX05PX1ZUQUJMRSBuc0lTdXBwb3J0cyB7Ci0JU3RyaW5nIGdldFBhcmVudE5hbWUoU3RyaW5nIGRlY2xhcmF0aW9uKSB7Ci0JCWlmIChkZWNsYXJhdGlvbi5pbmRleE9mKCIgOiIpID09IC0xKSByZXR1cm4gTk9fU1VQRVJfQ0xBU1M7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5zdWJzdHJpbmcoZGVjbGFyYXRpb24uaW5kZXhPZigiOiBwdWJsaWMgIikKLQkJCQkrICI6IHB1YmxpYyAiLmxlbmd0aCgpLCBkZWNsYXJhdGlvbi5pbmRleE9mKCIgeyIpKTsKLQl9Ci0KLQkvLyBwYXJzZSBtZXRob2RzIGFuZCBjb25zdGFudHMgZGVjbGFyYXRpb25zIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGluZGV4Ci0JLy8gb3V0OgotCS8vIC5TdHJpbmcgYm9keSAtIGNvbnRhaW5zIHRoZSBjb3JyZXNwb25kaW5nIGphdmEgY29udGVudAotCS8vIC5uIC0gc2V0IHRvIHRoZSBlbmQgb2YgdGhlIGludGVyZmFjZSBib2R5IGRlY2xhcmF0aW9uICggbGluZSB3aXRoIHRoZSBlbmNsb3NpbmcgIn07IiApCi0JLy8gLm5NZXRob2RzICAgIC0gc2V0IHRvIHRoZSBudW1iZXIgb2YgbWV0aG9kcyBwYXJzZWQKLQl2b2lkIHBhcnNlQm9keSgpIHsKLQkJYm9keSA9ICIiOwotCQlib2R5T3JkZXIgPSAiIjsKLQkJaW50IG5Db25zdGFudHMgPSAwOwotCQluTWV0aG9kcyA9IDA7Ci0KLQkJaW50IHRtcF9uID0gbjsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWludCB0eXBlID0ganVtcFRvTmV4dENvbnN0YW50T3JNZXRob2QoKTsKLQkJCWlmICh0eXBlID09IENPTlNUQU5UKQotCQkJCW5Db25zdGFudHMrKzsKLQkJCWlmICh0eXBlID09IE1FVEhPRCkKLQkJCQluTWV0aG9kcysrOwotCQkJaWYgKHR5cGUgPT0gRU5EX0JPRFkpCi0JCQkJYnJlYWs7Ci0JCQluKys7Ci0JCX0KLQkJbiA9IHRtcF9uOwotCQljb25zdGFudE5hbWVzID0gbmV3IFN0cmluZ1tuQ29uc3RhbnRzXTsKLQkJY29uc3RhbnRWYWx1ZXMgPSBuZXcgU3RyaW5nW25Db25zdGFudHNdOwotCQltZXRob2ROYW1lcyA9IG5ldyBTdHJpbmdbbk1ldGhvZHNdOwotCQlhcmdUeXBlcyA9IG5ldyBTdHJpbmdbbk1ldGhvZHNdW107Ci0JCWFyZ05hbWVzID0gbmV3IFN0cmluZ1tuTWV0aG9kc11bXTsKLQkJaW50IGNvbnN0YW50SW5kZXggPSAwLCBtZXRob2RJbmRleCA9IDA7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpbnQgdHlwZSA9IGp1bXBUb05leHRDb25zdGFudE9yTWV0aG9kKCk7Ci0JCQlpZiAodHlwZSA9PSBDT05TVEFOVCkgewotCQkJCXBhcnNlQ29uc3RhbnQoYltuXSwgY29uc3RhbnRJbmRleCk7Ci0JCQkJYm9keU9yZGVyICs9ICJDIjsKLQkJCQljb25zdGFudEluZGV4Kys7Ci0JCQl9Ci0JCQlpZiAodHlwZSA9PSBNRVRIT0QpIHsKLQkJCQlwYXJzZU1ldGhvZChiW25dLCBtZXRob2RJbmRleCk7Ci0JCQkJbG9nVnRibENhbGwoYXJnVHlwZXNbbWV0aG9kSW5kZXhdKTsKLQkJCQlib2R5T3JkZXIgKz0gIk0iOwotCQkJCW1ldGhvZEluZGV4Kys7Ci0JCQl9Ci0JCQlpZiAodHlwZSA9PSBFTkRfQk9EWSkKLQkJCQlyZXR1cm47Ci0JCQluKys7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgaW50IENPTlNUQU5UID0gMDsKLQotCXN0YXRpYyBpbnQgTUVUSE9EID0gMTsKLQotCXN0YXRpYyBpbnQgRU5EX0JPRFkgPSAyOwotCi0JYm9vbGVhbiBpc0VuZE9mSW50ZXJmYWNlQm9keSgpIHsKLQkJcmV0dXJuIGJbbl0uc3RhcnRzV2l0aCgifTsiKTsKLQl9Ci0KLQlpbnQganVtcFRvTmV4dENvbnN0YW50T3JNZXRob2QoKSB7Ci0JCXdoaWxlICghaXNFbmRPZkludGVyZmFjZUJvZHkoKSkgewotCQkJaWYgKGJbbl0uc3RhcnRzV2l0aCgiICBlbnVtIHsgIikpIHsKLQkJCQlyZXR1cm4gQ09OU1RBTlQ7Ci0JCQl9Ci0JCQlpZiAobWV0aG9kTmFtZVN0YXJ0SW5kZXhPZihiW25dKSAhPSAtMSkgewotCQkJCXJldHVybiBNRVRIT0Q7Ci0JCQl9Ci0JCQluKys7Ci0JCX0KLQkJcmV0dXJuIEVORF9CT0RZOwotCX0KLQotCXZvaWQgcGFyc2VDb25zdGFudChTdHJpbmcgY29uc3RhbnQsIGludCBjb25zdGFudEluZGV4KSB7Ci0JCVN0cmluZyBjb25zdGFudE5hbWUgPSBjb25zdGFudC5zdWJzdHJpbmcoY29uc3RhbnQuaW5kZXhPZigiIGVudW0geyAiKQotCQkJCSsgIiBlbnVtIHsgIi5sZW5ndGgoKSwgY29uc3RhbnQuaW5kZXhPZigiID0iKSk7Ci0JCWlmIChERUJVRykKLQkJCXdyaXRlTGluZSgiY29uc3RhbnROYW1lIDwiICsgY29uc3RhbnROYW1lICsgIj4iKTsKLQkJY29uc3RhbnROYW1lc1tjb25zdGFudEluZGV4XSA9IGNvbnN0YW50TmFtZTsKLQkJCi0JCS8vIG1vc3QgY29uc3RhbnRzIHZhbHVlcyBoYXZlIGEgdHJhaWxpbmcgVQotCQkvLyBlbnVtIHsgQVBQX1RZUEVfVU5LTk9XTiA9IDBVIH07Ci0JCWludCBlbmRJbmRleCA9IGNvbnN0YW50LmluZGV4T2YoIlUgfTsiKTsKLQkJLy8gYSBmZXcgb3RoZXJzIGRvbid0Ci0JCS8vIGVudW0geyBFTlVNRVJBVEVfRk9SV0FSRFMgPSAwIH07CQkKLQkJaWYgKGVuZEluZGV4ID09IC0xKSBlbmRJbmRleCA9IGNvbnN0YW50LmluZGV4T2YoIiB9OyIpOwotCQlTdHJpbmcgY29uc3RhbnRWYWx1ZSA9IGNvbnN0YW50LnN1YnN0cmluZyhjb25zdGFudC5pbmRleE9mKCIgPSAiKQotCQkJCSsgIiA9ICIubGVuZ3RoKCksIGVuZEluZGV4KTsKLQkJaWYgKERFQlVHKQotCQkJd3JpdGVMaW5lKCJjb25zdGFudFZhbHVlIDwiICsgY29uc3RhbnRWYWx1ZSArICI+Iik7Ci0JCWNvbnN0YW50VmFsdWVzW2NvbnN0YW50SW5kZXhdID0gY29uc3RhbnRWYWx1ZTsKLQl9Ci0KLQkvLyBOU19JTUVUSE9EIFNldFN0YXR1cyhQUlVpbnQzMiBzdGF0dXNUeXBlLCBjb25zdCBQUlVuaWNoYXIgKnN0YXR1cykgPSAwOwotCS8vIGlkZW50aWZ5OgotCS8vIG1ldGhvZCBuYW1lOiA8U2V0U3RhdHVzPgotCS8vIE5iciBvZiBhcmd1bWVudHM6IDIKLQkvLyBUeXBlIG9mIGFyZ3VtZW50IDA6IFBSVWludDMyCi0JLy8gTmFtZSBvZiBhcmd1bWVudCAwOiBzdGF0dXNUeXBlCi0JLy8gVHlwZSBvZiBhcmd1bWVudCAxOiBjb25zdCBQUlVuaWNoYXIgKgotCS8vIE5hbWUgb2YgYXJndW1lbnQgMTogc3RhdHVzCi0Jdm9pZCBwYXJzZU1ldGhvZChTdHJpbmcgbGluZSwgaW50IG1ldGhvZEluZGV4KSB7Ci0JCWludCBzdGFydCA9IG1ldGhvZE5hbWVTdGFydEluZGV4T2YobGluZSk7Ci0JCWludCBlbmQgPSBtZXRob2ROYW1lRW5kSW5kZXhPZihsaW5lKTsKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBsaW5lLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQkJaWYgKERFQlVHKQotCQkJd3JpdGVMaW5lKCJtZXRob2QgbmFtZTogPCIgKyBtZXRob2ROYW1lICsgIj4iKTsKLQkJbWV0aG9kTmFtZXNbbWV0aG9kSW5kZXhdID0gbWV0aG9kTmFtZTsKLQkJaW50IGFyZ1N0YXJ0ID0gZW5kKyIoIi5sZW5ndGgoKTsKLQkJaW50IGFyZ0VuZCA9IGxpbmUuaW5kZXhPZigiKSIsIGFyZ1N0YXJ0KTsKLQkJcGFyc2VBcmdzKGxpbmUuc3Vic3RyaW5nKGFyZ1N0YXJ0LCBhcmdFbmQpLCBtZXRob2RJbmRleCk7Ci0JfQotCi0JLy8gR2l2ZW4gYSBsaW5lLCByZXR1cm5zIHRoZSBzdGFydCBvZiB0aGUgbWV0aG9kIG5hbWUgb3IgLTEKLQkvLyBpZiB0aGUgbGluZSBkb2VzIG5vdCBjb250YWluIGEgbWV0aG9kIGRlY2xhcmF0aW9uLgotCWludCBtZXRob2ROYW1lU3RhcnRJbmRleE9mKFN0cmluZyBsaW5lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgQkVGT1JFX01FVEhPRF9OQU1FLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgaW5kZXggPSBsaW5lLmluZGV4T2YoQkVGT1JFX01FVEhPRF9OQU1FW2ldKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgcmV0dXJuIGluZGV4ICsgQkVGT1JFX01FVEhPRF9OQU1FW2ldLmxlbmd0aCgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JaW50IG1ldGhvZE5hbWVFbmRJbmRleE9mKFN0cmluZyBsaW5lKSB7Ci0JCWludCBzdGFydEluZGV4ID0gbWV0aG9kTmFtZVN0YXJ0SW5kZXhPZihsaW5lKTsKLQkJcmV0dXJuIGxpbmUuaW5kZXhPZigiKCIsIHN0YXJ0SW5kZXgpOwotCX0KLQl2b2lkIHBhcnNlQXJncyhTdHJpbmcgYXJncywgaW50IG1ldGhvZEluZGV4KSB7Ci0JCWludCBuQXJncyA9IC0xOwotCQkvLyBtZXRob2RzIHdpdGggbm8gYXJncyBsb29rIGxpa2U6ICgpIG9yICh2b2lkKQotCQlTdHJpbmdbXSBub0FyZ3MgPSBuZXcgU3RyaW5nW10geyAiIiwgInZvaWQiIH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9BcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYXJncy5lcXVhbHMobm9BcmdzW2ldKSkgewotCQkJCW5BcmdzID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobkFyZ3MgPT0gLTEpCi0JCQluQXJncyA9IGNvdW50KGFyZ3MsICIsICIpICsgMTsKLQkJU3RyaW5nW10gYXJnVHlwZXMgPSBuZXcgU3RyaW5nW25BcmdzXTsKLQkJdGhpcy5hcmdUeXBlc1ttZXRob2RJbmRleF0gPSBhcmdUeXBlczsKLQkJU3RyaW5nW10gYXJnTmFtZXMgPSBuZXcgU3RyaW5nW25BcmdzXTsKLQkJdGhpcy5hcmdOYW1lc1ttZXRob2RJbmRleF0gPSBhcmdOYW1lczsKLQkJaW50IHR5cGVTdGFydCA9IDA7Ci0KLQkJLy8gbmFtZSBpcyBzZXBhcmF0ZWQgZnJvbSBpdHMgdHlwZSBieSBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyAoc29ydGVkIGJ5IGRlY3JlYXNpbmcgc2l6ZSB0byBmaW5kIHRoZSBtb3N0IGNvbXBsZXRlIHBhdHRlcm4gKi8KLQkJU3RyaW5nW10gdHlwZU5hbWVTZXAgPSBuZXcgU3RyaW5nW10geyAiICogKiIsICIgKioiLCAiICogJiAiLCAiICogIiwgIiAqIiwKLQkJCQkiICYgIiwgIiAiIH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkFyZ3M7IGkrKykgewotCQkJLyogZ2V0IHRoZSB0eXBlICovCi0JCQlpbnQgbmV4dFR5cGVTdGFydCA9IGkgPCBuQXJncyAtIDEgPyBhcmdzLmluZGV4T2YoIiwgIiwgdHlwZVN0YXJ0KQotCQkJCQkrICIsICIubGVuZ3RoKCkgOiBhcmdzLmxlbmd0aCgpOwotCQkJaW50IHR5cGVOYW1lU2VwSW5kZXggPSAwOwotCQkJaW50IHNlcGFyYXRvckluZGV4ID0gMDsKLQkJCWZvciAoOyB0eXBlTmFtZVNlcEluZGV4IDwgdHlwZU5hbWVTZXAubGVuZ3RoOyB0eXBlTmFtZVNlcEluZGV4KyspIHsKLQkJCQlzZXBhcmF0b3JJbmRleCA9IGFyZ3MuaW5kZXhPZih0eXBlTmFtZVNlcFt0eXBlTmFtZVNlcEluZGV4XSwKLQkJCQkJCXR5cGVTdGFydCk7Ci0JCQkJaWYgKHNlcGFyYXRvckluZGV4ICE9IC0xICYmIHNlcGFyYXRvckluZGV4IDwgbmV4dFR5cGVTdGFydCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlTdHJpbmcgc2VwYXJhdG9yID0gdHlwZU5hbWVTZXBbdHlwZU5hbWVTZXBJbmRleF07Ci0JCQlhcmdUeXBlc1tpXSA9IGdldEMySmF2YVR5cGUoYXJncy5zdWJzdHJpbmcodHlwZVN0YXJ0LAotCQkJCQlzZXBhcmF0b3JJbmRleCArIHNlcGFyYXRvci5sZW5ndGgoKSkpOwotCQkJaWYgKERFQlVHKQotCQkJCXdyaXRlTGluZSgiYXJnIHR5cGUiICsgaSArICI6IDwiICsgYXJnVHlwZXNbaV0gKyAiPiIpOwotCQkJLyogZ2V0IHRoZSBuYW1lICovCi0JCQlpbnQgbmFtZVN0YXJ0ID0gc2VwYXJhdG9ySW5kZXggKyBzZXBhcmF0b3IubGVuZ3RoKCk7Ci0JCQlpbnQgbmFtZUVuZCA9IGkgPCBuQXJncyAtIDEgPyBhcmdzLmluZGV4T2YoIiwgIiwgbmFtZVN0YXJ0KSA6IGFyZ3MKLQkJCQkJLmxlbmd0aCgpOwotCQkJYXJnTmFtZXNbaV0gPSBhcmdzLnN1YnN0cmluZyhuYW1lU3RhcnQsIG5hbWVFbmQpOwotCQkJaWYgKERFQlVHKQotCQkJCXdyaXRlTGluZSgiYXJnIG5hbWUiICsgaSArICI6IDwiICsgYXJnTmFtZXNbaV0gKyAiPiIpOwotCi0JCQl0eXBlU3RhcnQgPSBuZXh0VHlwZVN0YXJ0OwotCQl9Ci0JfQotCi0JU3RyaW5nIGdldEMySmF2YVR5cGUoU3RyaW5nIGNUeXBlKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVFlQRVNfQzJKQVZBLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY1R5cGUuaW5kZXhPZihUWVBFU19DMkpBVkFbaV1bMF0pICE9IC0xKQotCQkJCXJldHVybiBUWVBFU19DMkpBVkFbaV1bMV07Ci0JCX0KLQkJcmV0dXJuICIhRVJST1IgVU5LTk9XTiBDIFRZUEUgPCIgKyBjVHlwZSArICI+ISI7Ci0JfQotCi0JLy8gaG93IG1hbnkgdGltZXMgcGFydCBjYW4gYmUgZm91bmQgaW4gcwotCXN0YXRpYyBpbnQgY291bnQoU3RyaW5nIHMsIFN0cmluZyBwYXJ0KSB7Ci0JCWludCBpbmRleCA9IC0xLCBjbnQgPSAwOwotCQl3aGlsZSAoKGluZGV4ID0gcy5pbmRleE9mKHBhcnQsIGluZGV4ICsgMSkpICE9IC0xKQotCQkJY250Kys7Ci0JCXJldHVybiBjbnQ7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBDT1BZUklHSFRTID0KLQkJIi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKipcclxuIgotCQkrICIgKiBWZXJzaW9uOiBNUEwgMS4xXHJcbiIKLQkJKyAiICpcclxuIgotCQkrICIgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb25cclxuIgotCQkrICIgKiAxLjEgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxyXG4iCi0JCSsgIiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuIgotCQkrICIgKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9cclxuIgotCQkrICIgKlxyXG4iCi0JCSsgIiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcclxuIgotCQkrICIgKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2VcclxuIgotCQkrICIgKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZVxyXG4iCi0JCSsgIiAqIExpY2Vuc2UuXHJcbiIKLQkJKyAiICpcclxuIgotCQkrICIgKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZSwgcmVsZWFzZWQgTWFyY2ggMzEsIDE5OTguXHJcbiIKLQkJKyAiICpcclxuIgotCQkrICIgKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXNcclxuIgotCQkrICIgKiBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi5cclxuIgotCQkrICIgKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IE5ldHNjYXBlIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgtMTk5OVxyXG4iCi0JCSsgIiAqIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuIgotCQkrICIgKlxyXG4iIAotCQkrICIgKiBDb250cmlidXRvcihzKTpcclxuIiAKLQkJKyAiICpcclxuIiAKLQkJKyAiICogSUJNXHJcbiIKLQkJKyAiICogLSAgQmluZGluZyB0byBwZXJtaXQgaW50ZXJmYWNpbmcgYmV0d2VlbiBNb3ppbGxhIGFuZCBTV1RcclxuIgotCQkrICIgKiAtICBDb3B5cmlnaHQgKEMpIDIwMDMgSUJNIENvcnAuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4iCi0JCSsgIiAqXHJcbiIgKyAiICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8iOwotCi0Jc3RhdGljIFN0cmluZyBQQUNLQUdFX0RFQ0xBUkFUSU9OID0gInBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm1vemlsbGE7IjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvTmF0aXZlU3RhdHMvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL05hdGl2ZVN0YXRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9OYXRpdmVTdGF0cy9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTmF0aXZlU3RhdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThhYjY3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9OYXRpdmVTdGF0cy9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTmF0aXZlU3RhdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotLyoqCi0gKiBJbnN0cnVjdGlvbnMgb24gaG93IHRvIHVzZSB0aGUgTmF0aXZlU3RhdHMgdG9vbCB3aXRoIGEgc3RhbmRsYW9uZSBTV1QgZXhhbXBsZToKLSAqIAotICogMSkgQ29tcGlsZSB0aGUgU1dUIG5hdGl2ZSBsaWJyYXJpZXMgZGVmaW5pbmcgdGhlIE5BVElWRV9TVEFUUyBmbGFnIChpLmUuIHVuY29tbWVudCBsaW5lIGluIG1ha2VmaWxlKS4KLSAqIDIpIEFkZCB0aGUgZm9sbG93aW5nIGNvZGUgYXJvdW5kIHRoZSBzZWN0aW9ucyBvZiBpbnRlcmVzdCB0byBkdW1wIHRoZQotICogbmF0aXZlIGNhbGxzIGRvbmUgaW4gdGhhdCBzZWN0aW9uLgotICogCi0gKiAJCU5hdGl2ZVN0YXRzIHN0YXRzID0gbmV3IE5hdGl2ZVN0YXRzKCk7Ci0gKiAJCS4uLgotICogCQk8Y29kZSBzZWN0aW9uPgotICogCQkuLi4KLSAqIAkJc3RhdHMuZHVtcERpZmYoU3lzdGVtLm91dCk7Ci0gKiAKLSAqIDMpIE9yIGFkZCB0aGUgZm9sbG93aW5nIGNvZGUgYXQgYSBnaXZlbiBwb2ludCB0byBkdW1wIGEgc25hcHNob3Qgb2YKLSAqIHRoZSBuYXRpdmUgY2FsbHMgZG9uZSB1bnRpbCB0aGF0IHBvaW50LgotICogCi0gKiAJCW5ldyBOYXRpdmVTdGF0cygpLmR1bXBTbmFwc2hvdChTeXN0ZW0ub3V0KTsgCi0gKi8KLXB1YmxpYyBjbGFzcyBOYXRpdmVTdGF0cyB7Ci0JCi0JSGFzaHRhYmxlIHNuYXBzaG90OwotCQotCWZpbmFsIHN0YXRpYyBTdHJpbmdbXSBjbGFzc2VzID0gbmV3IFN0cmluZ1tdeyJPUyIsICJBVEsiLCAiQ0RFIiwgIkdOT01FIiwgIkdUSyIsICJYUENPTSIsICJDT00ifTsKLQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTmF0aXZlRnVuY3Rpb24gaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQkJU3RyaW5nIG5hbWU7Ci0JCWludCBjYWxsQ291bnQ7Ci0JCQotCXB1YmxpYyBOYXRpdmVGdW5jdGlvbihTdHJpbmcgbmFtZSwgaW50IGNhbGxDb3VudCkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmNhbGxDb3VudCA9IGNhbGxDb3VudDsKLQl9Ci0KLQl2b2lkIHN1YnRyYWN0KE5hdGl2ZUZ1bmN0aW9uIGZ1bmMpIHsKLQkJdGhpcy5jYWxsQ291bnQgLT0gZnVuYy5jYWxsQ291bnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRDYWxsQ291bnQoKSB7Ci0JCXJldHVybiBjYWxsQ291bnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IGZ1bmMpIHsKLQkJcmV0dXJuICgoTmF0aXZlRnVuY3Rpb24pZnVuYykuY2FsbENvdW50IC0gY2FsbENvdW50OwotCX0KLQl9Ci0JCi1wdWJsaWMgTmF0aXZlU3RhdHMoKSB7Ci0Jc25hcHNob3QgPSBzbmFwc2hvdCgpOwotfQotCQotcHVibGljIEhhc2h0YWJsZSBkaWZmKCkgewotCUhhc2h0YWJsZSBuZXdTbmFwc2hvdCA9IHNuYXBzaG90KCk7Ci0JRW51bWVyYXRpb24ga2V5cyA9IG5ld1NuYXBzaG90LmtleXMoKTsKLQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7Ci0JCU5hdGl2ZUZ1bmN0aW9uW10gbmV3RnVuY3MgPSAoTmF0aXZlRnVuY3Rpb25bXSluZXdTbmFwc2hvdC5nZXQoY2xhc3NOYW1lKTsKLQkJTmF0aXZlRnVuY3Rpb25bXSBmdW5jcyA9IChOYXRpdmVGdW5jdGlvbltdKXNuYXBzaG90LmdldChjbGFzc05hbWUpOwotCQlpZiAoZnVuY3MgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdGdW5jcy5sZW5ndGg7IGkrKykgewotCQkJCW5ld0Z1bmNzW2ldLnN1YnRyYWN0KGZ1bmNzW2ldKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gbmV3U25hcHNob3Q7Ci19Ci0KLXB1YmxpYyB2b2lkIGR1bXBEaWZmKFByaW50U3RyZWFtIHBzKSB7Ci0JZHVtcChkaWZmKCksIHBzKTsKLX0KLQotcHVibGljIHZvaWQgZHVtcFNuYXBzaG90KFByaW50U3RyZWFtIHBzKSB7Ci0JZHVtcChzbmFwc2hvdCgpLCBwcyk7Ci19Ci0KLXB1YmxpYyB2b2lkIGR1bXBTbmFwc2hvdChTdHJpbmcgY2xhc3NOYW1lLCBQcmludFN0cmVhbSBwcykgewotCUhhc2h0YWJsZSBzbmFwc2hvdCA9IG5ldyBIYXNodGFibGUoKTsKLQlzbmFwc2hvdChjbGFzc05hbWUsIHNuYXBzaG90KTsKLQlkdW1wKGNsYXNzTmFtZSwgKE5hdGl2ZUZ1bmN0aW9uW10pc25hcHNob3QuZ2V0KGNsYXNzTmFtZSksIHBzKTsKLX0KLQotcHVibGljIHZvaWQgZHVtcChIYXNodGFibGUgc25hcHNob3QsIFByaW50U3RyZWFtIHBzKSB7Ci0JRW51bWVyYXRpb24ga2V5cyA9IHNuYXBzaG90LmtleXMoKTsKLQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7Ci0JCWR1bXAoY2xhc3NOYW1lLCAoTmF0aXZlRnVuY3Rpb25bXSlzbmFwc2hvdC5nZXQoY2xhc3NOYW1lKSwgcHMpOwotCX0KLX0KLQkKLXZvaWQgZHVtcChTdHJpbmcgY2xhc3NOYW1lLCBOYXRpdmVGdW5jdGlvbltdIGZ1bmNzLCBQcmludFN0cmVhbSBwcykgewotCWlmIChmdW5jcyA9PSBudWxsKSByZXR1cm47Ci0JQXJyYXlzLnNvcnQoZnVuY3MpOwotCWludCB0b3RhbCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmdW5jcy5sZW5ndGg7IGkrKykgewotCQlOYXRpdmVGdW5jdGlvbiBmdW5jID0gZnVuY3NbaV07Ci0JCXRvdGFsICs9IGZ1bmMuZ2V0Q2FsbENvdW50KCk7Ci0JfQotCXBzLnByaW50KGNsYXNzTmFtZSk7Ci0JcHMucHJpbnQoIj0iKTsKLQlwcy5wcmludCh0b3RhbCk7Ci0JcHMucHJpbnRsbigpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZnVuY3MubGVuZ3RoOyBpKyspIHsKLQkJTmF0aXZlRnVuY3Rpb24gZnVuYyA9IGZ1bmNzW2ldOwotCQlpZiAoZnVuYy5nZXRDYWxsQ291bnQoKSA+IDApIHsKLQkJCXBzLnByaW50KCJcdCIpOwotCQkJcHMucHJpbnQoZnVuYy5nZXROYW1lKCkpOwotCQkJcHMucHJpbnQoIj0iKTsKLQkJCXBzLnByaW50KGZ1bmMuZ2V0Q2FsbENvdW50KCkpOwotCQkJcHMucHJpbnRsbigpOwotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCByZXNldCgpIHsKLQlzbmFwc2hvdCA9IHNuYXBzaG90KCk7IAotfQotCi1wdWJsaWMgSGFzaHRhYmxlIHNuYXBzaG90KCkgewotCUhhc2h0YWJsZSBzbmFwc2hvdCA9IG5ldyBIYXNodGFibGUoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzZXNbaV07Ci0JCXNuYXBzaG90KGNsYXNzTmFtZSwgc25hcHNob3QpOwotCX0KLQlyZXR1cm4gc25hcHNob3Q7Ci19Ci0KLXB1YmxpYyBIYXNodGFibGUgc25hcHNob3QoU3RyaW5nIGNsYXNzTmFtZSwgSGFzaHRhYmxlIHNuYXBzaG90KSB7Ci0JdHJ5IHsKLQkJQ2xhc3MgY2xhenogPSBnZXRDbGFzcygpOwotCQlNZXRob2QgZnVuY3Rpb25Db3VudCA9IGNsYXp6LmdldE1ldGhvZChjbGFzc05hbWUgKyAiX0dldEZ1bmN0aW9uQ291bnQiLCBuZXcgQ2xhc3NbMF0pOwotCQlNZXRob2QgZnVuY3Rpb25DYWxsQ291bnQgPSBjbGF6ei5nZXRNZXRob2QoY2xhc3NOYW1lICsgIl9HZXRGdW5jdGlvbkNhbGxDb3VudCIsIG5ldyBDbGFzc1tde2ludC5jbGFzc30pOwotCQlNZXRob2QgZnVuY3Rpb25OYW1lID0gY2xhenouZ2V0TWV0aG9kKGNsYXNzTmFtZSArICJfR2V0RnVuY3Rpb25OYW1lIiwgbmV3IENsYXNzW117aW50LmNsYXNzfSk7Ci0JCWludCBjb3VudCA9ICgoSW50ZWdlcilmdW5jdGlvbkNvdW50Lmludm9rZShjbGF6eiwgbmV3IE9iamVjdFswXSkpLmludFZhbHVlKCk7Ci0JCU5hdGl2ZUZ1bmN0aW9uW10gZnVuY3MgPSBuZXcgTmF0aXZlRnVuY3Rpb25bY291bnRdOwotCQlPYmplY3RbXSBpbmRleCA9IG5ldyBPYmplY3RbMV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaW5kZXhbMF0gPSBuZXcgSW50ZWdlcihpKTsKLQkJCWludCBjYWxsQ291bnQgPSAoKEludGVnZXIpZnVuY3Rpb25DYWxsQ291bnQuaW52b2tlKGNsYXp6LCBpbmRleCkpLmludFZhbHVlKCk7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpZnVuY3Rpb25OYW1lLmludm9rZShjbGF6eiwgaW5kZXgpOwotCQkJZnVuY3NbaV0gPSBuZXcgTmF0aXZlRnVuY3Rpb24obmFtZSwgY2FsbENvdW50KTsKLQkJfQotCQlzbmFwc2hvdC5wdXQoY2xhc3NOYW1lLCBmdW5jcyk7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLS8vCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQl9Ci0JcmV0dXJuIHNuYXBzaG90OwotfQotCQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IE9TX0dldEZ1bmN0aW9uQ291bnQoKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIFN0cmluZyBPU19HZXRGdW5jdGlvbk5hbWUoaW50IGluZGV4KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBPU19HZXRGdW5jdGlvbkNhbGxDb3VudChpbnQgaW5kZXgpOwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgQVRLX0dldEZ1bmN0aW9uQ291bnQoKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIFN0cmluZyBBVEtfR2V0RnVuY3Rpb25OYW1lKGludCBpbmRleCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgQVRLX0dldEZ1bmN0aW9uQ2FsbENvdW50KGludCBpbmRleCk7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBDREVfR2V0RnVuY3Rpb25Db3VudCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIENERV9HZXRGdW5jdGlvbk5hbWUoaW50IGluZGV4KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBDREVfR2V0RnVuY3Rpb25DYWxsQ291bnQoaW50IGluZGV4KTsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEdOT01FX0dldEZ1bmN0aW9uQ291bnQoKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIFN0cmluZyBHTk9NRV9HZXRGdW5jdGlvbk5hbWUoaW50IGluZGV4KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBHTk9NRV9HZXRGdW5jdGlvbkNhbGxDb3VudChpbnQgaW5kZXgpOwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgR1RLX0dldEZ1bmN0aW9uQ291bnQoKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIFN0cmluZyBHVEtfR2V0RnVuY3Rpb25OYW1lKGludCBpbmRleCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgR1RLX0dldEZ1bmN0aW9uQ2FsbENvdW50KGludCBpbmRleCk7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBYUENPTV9HZXRGdW5jdGlvbkNvdW50KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgWFBDT01fR2V0RnVuY3Rpb25OYW1lKGludCBpbmRleCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgWFBDT01fR2V0RnVuY3Rpb25DYWxsQ291bnQoaW50IGluZGV4KTsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IENPTV9HZXRGdW5jdGlvbkNvdW50KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgQ09NX0dldEZ1bmN0aW9uTmFtZShpbnQgaW5kZXgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IENPTV9HZXRGdW5jdGlvbkNhbGxDb3VudChpbnQgaW5kZXgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9TbGVhay9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU2xlYWsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL1NsZWFrL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TbGVhay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmMzNWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL1NsZWFrL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TbGVhay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBJbnN0cnVjdGlvbnMgb24gaG93IHRvIHVzZSB0aGUgU2xlYWsgdG9vbCB3aXRoIGEgc3RhbmRsYW9uZSBTV1QgZXhhbXBsZToKLSAqIAotICogTW9kaWZ5IHRoZSBtYWluIG1ldGhvZCBiZWxvdyB0byBsYXVuY2ggeW91ciBhcHBsaWNhdGlvbi4KLSAqIFJ1biBTbGVhay4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2xlYWsgewotCURpc3BsYXkgZGlzcGxheTsKLQlTaGVsbCBzaGVsbDsKLQlMaXN0IGxpc3Q7Ci0JQ2FudmFzIGNhbnZhczsKLQlCdXR0b24gc3RhcnQsIHN0b3AsIGNoZWNrOwotCVRleHQgdGV4dDsKLQlMYWJlbCBsYWJlbDsKLQkKLQlPYmplY3QgW10gb2xkT2JqZWN0cyA9IG5ldyBPYmplY3QgWzBdOwotCUVycm9yIFtdIG9sZEVycm9ycyA9IG5ldyBFcnJvciBbMF07Ci0JT2JqZWN0IFtdIG9iamVjdHMgPSBuZXcgT2JqZWN0IFswXTsKLQlFcnJvciBbXSBlcnJvcnMgPSBuZXcgRXJyb3IgWzBdOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEZXZpY2VEYXRhIGRhdGEgPSBuZXcgRGV2aWNlRGF0YSgpOwotCWRhdGEudHJhY2tpbmcgPSB0cnVlOwotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5IChkYXRhKTsKLQlTbGVhayBzbGVhayA9IG5ldyBTbGVhayAoKTsKLQlzbGVhay5vcGVuICgpOwotCQotCS8vIExhdW5jaCB5b3UgYXBwbGljYXRpb24gaGVyZQotCS8vIGUuZy4JCQotLy8JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0vLwlCdXR0b24gYnV0dG9uMSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLS8vCWJ1dHRvbjEuc2V0Qm91bmRzKDEwLCAxMCwgMTAwLCA1MCk7Ci0vLwlidXR0b24xLnNldFRleHQoIkhlbGxvIFdvcmxkIik7Ci0vLwlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAyMCwgMjApOwotLy8JQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0vLwlidXR0b24yLnNldEJvdW5kcygxMCwgNzAsIDEwMCwgNTApOwotLy8JYnV0dG9uMi5zZXRJbWFnZShpbWFnZSk7Ci0vLwlzaGVsbC5vcGVuKCk7Ci0JCi0Jd2hpbGUgKCFzbGVhay5zaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQkKLXZvaWQgb3BlbiAoKSB7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCAoKTsKLQlzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCAoIlMtTGVhayIpOwotCWxpc3QgPSBuZXcgTGlzdCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCWxpc3QuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJcmVmcmVzaE9iamVjdCAoKTsKLQkJfQotCX0pOwotCXRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCWNhbnZhcyA9IG5ldyBDYW52YXMgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljYW52YXMuYWRkTGlzdGVuZXIgKFNXVC5QYWludCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlwYWludENhbnZhcyAoZXZlbnQpOwotCQl9Ci0JfSk7Ci0JY2hlY2sgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULkNIRUNLKTsKLQljaGVjay5zZXRUZXh0ICgiU3RhY2siKTsKLQljaGVjay5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCXRvZ2dsZVN0YWNrVHJhY2UgKCk7Ci0JCX0KLQl9KTsKLQlzdGFydCA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0Jc3RhcnQuc2V0VGV4dCAoIlNuYXAiKTsKLQlzdGFydC5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlyZWZyZXNoQWxsICgpOwotCQl9Ci0JfSk7Ci0Jc3RvcCA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0Jc3RvcC5zZXRUZXh0ICgiRGlmZiIpOwotCXN0b3AuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJcmVmcmVzaERpZmZlcmVuY2UgKCk7Ci0JCX0KLQl9KTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWxhYmVsLnNldFRleHQgKCIwIG9iamVjdChzKSIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJbGF5b3V0ICgpOwotCQl9Ci0JfSk7Ci0JY2hlY2suc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JdGV4dC5zZXRWaXNpYmxlIChmYWxzZSk7Ci0JUG9pbnQgc2l6ZSA9IHNoZWxsLmdldFNpemUgKCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoc2l6ZS54IC8gMiwgc2l6ZS55IC8gMik7Ci0Jc2hlbGwub3BlbiAoKTsKLX0KLQotdm9pZCByZWZyZXNoTGFiZWwgKCkgewotCWludCBjb2xvcnMgPSAwLCBjdXJzb3JzID0gMCwgZm9udHMgPSAwLCBnY3MgPSAwLCBpbWFnZXMgPSAwLCByZWdpb25zID0gMDsKLQlmb3IgKGludCBpPTA7IGk8b2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQlPYmplY3Qgb2JqZWN0ID0gb2JqZWN0cyBbaV07Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDb2xvcikgY29sb3JzKys7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDdXJzb3IpIGN1cnNvcnMrKzsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZvbnQpIGZvbnRzKys7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBHQykgZ2NzKys7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJbWFnZSkgaW1hZ2VzKys7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBSZWdpb24pIHJlZ2lvbnMrKzsKLQl9Ci0JU3RyaW5nIHN0cmluZyA9ICIiOwotCWlmIChjb2xvcnMgIT0gMCkgc3RyaW5nICs9IGNvbG9ycyArICIgQ29sb3IocylcbiI7Ci0JaWYgKGN1cnNvcnMgIT0gMCkgc3RyaW5nICs9IGN1cnNvcnMgKyAiIEN1cnNvcihzKVxuIjsKLQlpZiAoZm9udHMgIT0gMCkgc3RyaW5nICs9IGZvbnRzICsgIiBGb250KHMpXG4iOwotCWlmIChnY3MgIT0gMCkgc3RyaW5nICs9IGdjcyArICIgR0MocylcbiI7Ci0JaWYgKGltYWdlcyAhPSAwKSBzdHJpbmcgKz0gaW1hZ2VzICsgIiBJbWFnZShzKVxuIjsKLQlpZiAocmVnaW9ucyAhPSAwKSBzdHJpbmcgKz0gcmVnaW9ucyArICIgUmVnaW9uKHMpXG4iOwotCWlmIChzdHJpbmcubGVuZ3RoICgpICE9IDApIHsKLQkJc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZyAoMCwgc3RyaW5nLmxlbmd0aCAoKSAtIDEpOwotCX0KLQlsYWJlbC5zZXRUZXh0IChzdHJpbmcpOwotfQotCi12b2lkIHJlZnJlc2hEaWZmZXJlbmNlICgpIHsKLQlEZXZpY2VEYXRhIGluZm8gPSBkaXNwbGF5LmdldERldmljZURhdGEgKCk7Ci0JaWYgKCFpbmZvLnRyYWNraW5nKSB7Ci0JCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3ggKHNoZWxsLCBTV1QuSUNPTl9XQVJOSU5HIHwgU1dULk9LKTsKLQkJZGlhbG9nLnNldFRleHQgKHNoZWxsLmdldFRleHQgKCkpOwotCQlkaWFsb2cuc2V0TWVzc2FnZSAoIldhcm5pbmc6IERldmljZSBpcyBub3QgdHJhY2tpbmcgcmVzb3VyY2UgYWxsb2NhdGlvbiIpOwotCQlkaWFsb2cub3BlbiAoKTsKLQl9Ci0JT2JqZWN0IFtdIG5ld09iamVjdHMgPSBpbmZvLm9iamVjdHM7Ci0JRXJyb3IgW10gbmV3RXJyb3JzID0gaW5mby5lcnJvcnM7Ci0JT2JqZWN0IFtdIGRpZmZPYmplY3RzID0gbmV3IE9iamVjdCBbbmV3T2JqZWN0cy5sZW5ndGhdOwotCUVycm9yIFtdIGRpZmZFcnJvcnMgPSBuZXcgRXJyb3IgW25ld0Vycm9ycy5sZW5ndGhdOwotCWludCBjb3VudCA9IDA7Ci0JZm9yIChpbnQgaT0wOyBpPG5ld09iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJaW50IGluZGV4ID0gMDsKLQkJd2hpbGUgKGluZGV4IDwgb2xkT2JqZWN0cy5sZW5ndGgpIHsKLQkJCWlmIChuZXdPYmplY3RzIFtpXSA9PSBvbGRPYmplY3RzIFtpbmRleF0pIGJyZWFrOwotCQkJaW5kZXgrKzsKLQkJfQotCQlpZiAoaW5kZXggPT0gb2xkT2JqZWN0cy5sZW5ndGgpIHsKLQkJCWRpZmZPYmplY3RzIFtjb3VudF0gPSBuZXdPYmplY3RzIFtpXTsKLQkJCWRpZmZFcnJvcnMgW2NvdW50XSA9IG5ld0Vycm9ycyBbaV07Ci0JCQljb3VudCsrOwotCQl9Ci0JfQotCW9iamVjdHMgPSBuZXcgT2JqZWN0IFtjb3VudF07Ci0JZXJyb3JzID0gbmV3IEVycm9yIFtjb3VudF07Ci0JU3lzdGVtLmFycmF5Y29weSAoZGlmZk9iamVjdHMsIDAsIG9iamVjdHMsIDAsIGNvdW50KTsKLQlTeXN0ZW0uYXJyYXljb3B5IChkaWZmRXJyb3JzLCAwLCBlcnJvcnMsIDAsIGNvdW50KTsKLQlsaXN0LnJlbW92ZUFsbCAoKTsKLQl0ZXh0LnNldFRleHQgKCIiKTsKLQljYW52YXMucmVkcmF3ICgpOwotCWZvciAoaW50IGk9MDsgaTxvYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCWxpc3QuYWRkIChvYmplY3ROYW1lIChvYmplY3RzIFtpXSkpOwotCX0KLQlyZWZyZXNoTGFiZWwgKCk7Ci0JbGF5b3V0ICgpOwotfQotCi1TdHJpbmcgb2JqZWN0TmFtZSAoT2JqZWN0IG9iamVjdCkgewotCVN0cmluZyBzdHJpbmcgPSBvYmplY3QudG9TdHJpbmcgKCk7Ci0JaW50IGluZGV4ID0gc3RyaW5nLmxhc3RJbmRleE9mICgnLicpOwotCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuIHN0cmluZzsKLQlyZXR1cm4gc3RyaW5nLnN1YnN0cmluZyAoaW5kZXggKyAxLCBzdHJpbmcubGVuZ3RoICgpKTsKLX0KLQotdm9pZCB0b2dnbGVTdGFja1RyYWNlICgpIHsKLQlyZWZyZXNoT2JqZWN0ICgpOwotCWxheW91dCAoKTsKLX0KLQotdm9pZCBwYWludENhbnZhcyAoRXZlbnQgZXZlbnQpIHsKLQljYW52YXMuc2V0Q3Vyc29yIChudWxsKTsKLQlpbnQgaW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuOwotCUdDIGdjID0gZXZlbnQuZ2M7Ci0JT2JqZWN0IG9iamVjdCA9IG9iamVjdHMgW2luZGV4XTsKLQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29sb3IpIHsKLQkJaWYgKCgoQ29sb3Ipb2JqZWN0KS5pc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0JCWdjLnNldEJhY2tncm91bmQgKChDb2xvcikgb2JqZWN0KTsKLQkJZ2MuZmlsbFJlY3RhbmdsZSAoY2FudmFzLmdldENsaWVudEFyZWEoKSk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKG9iamVjdCBpbnN0YW5jZW9mIEN1cnNvcikgewotCQlpZiAoKChDdXJzb3Ipb2JqZWN0KS5pc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0JCWNhbnZhcy5zZXRDdXJzb3IgKChDdXJzb3IpIG9iamVjdCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZvbnQpIHsKLQkJaWYgKCgoRm9udClvYmplY3QpLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJZ2Muc2V0Rm9udCAoKEZvbnQpIG9iamVjdCk7Ci0JCUZvbnREYXRhIFtdIGFycmF5ID0gZ2MuZ2V0Rm9udCAoKS5nZXRGb250RGF0YSAoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQlTdHJpbmcgbGYgPSB0ZXh0LmdldExpbmVEZWxpbWl0ZXIgKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxhcnJheS5sZW5ndGg7IGkrKykgewotCQkJRm9udERhdGEgZGF0YSA9IGFycmF5IFtpXTsKLQkJCVN0cmluZyBzdHlsZSA9ICJOT1JNQUwiOwotCQkJaW50IGJpdHMgPSBkYXRhLmdldFN0eWxlICgpOwotCQkJaWYgKGJpdHMgIT0gMCkgewotCQkJCWlmICgoYml0cyAmIFNXVC5CT0xEKSAhPSAwKSBzdHlsZSA9ICJCT0xEICI7Ci0JCQkJaWYgKChiaXRzICYgU1dULklUQUxJQykgIT0gMCkgc3R5bGUgKz0gIklUQUxJQyI7Ci0JCQl9Ci0JCQlzdHJpbmcgKz0gZGF0YS5nZXROYW1lICgpICsgIiAiICsgZGF0YS5nZXRIZWlnaHQgKCkgKyAiICIgKyBzdHlsZSArIGxmOwotCQl9Ci0JCWdjLmRyYXdTdHJpbmcgKHN0cmluZywgMCwgMCk7Ci0JCXJldHVybjsKLQl9Ci0JLy9OT1RISU5HIFRPIERSQVcgRk9SIEdDCi0vLwlpZiAob2JqZWN0IGluc3RhbmNlb2YgR0MpIHsKLS8vCQlyZXR1cm47Ci0vLwl9Ci0JaWYgKG9iamVjdCBpbnN0YW5jZW9mIEltYWdlKSB7Ci0JCWlmICgoKEltYWdlKW9iamVjdCkuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQlnYy5kcmF3SW1hZ2UgKChJbWFnZSkgb2JqZWN0LCAwLCAwKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUmVnaW9uKSB7Ci0JCWlmICgoKFJlZ2lvbilvYmplY3QpLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJU3RyaW5nIHN0cmluZyA9ICgoUmVnaW9uKW9iamVjdCkuZ2V0Qm91bmRzKCkudG9TdHJpbmcoKTsKLQkJZ2MuZHJhd1N0cmluZyAoc3RyaW5nLCAwLCAwKTsKLQkJcmV0dXJuOwotCX0KLX0KLQotdm9pZCByZWZyZXNoT2JqZWN0ICgpIHsKLQlpbnQgaW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuOwotCWlmIChjaGVjay5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gKCk7Ci0JCVByaW50U3RyZWFtIHMgPSBuZXcgUHJpbnRTdHJlYW0gKHN0cmVhbSk7Ci0JCWVycm9ycyBbaW5kZXhdLnByaW50U3RhY2tUcmFjZSAocyk7Ci0JCXRleHQuc2V0VGV4dCAoc3RyZWFtLnRvU3RyaW5nICgpKTsKLQkJdGV4dC5zZXRWaXNpYmxlICh0cnVlKTsKLQkJY2FudmFzLnNldFZpc2libGUgKGZhbHNlKTsKLQl9IGVsc2UgewotCQljYW52YXMuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JCXRleHQuc2V0VmlzaWJsZSAoZmFsc2UpOwotCQljYW52YXMucmVkcmF3ICgpOwotCX0KLX0KLQotdm9pZCByZWZyZXNoQWxsICgpIHsKLQlvbGRPYmplY3RzID0gbmV3IE9iamVjdCBbMF07Ci0Jb2xkRXJyb3JzID0gbmV3IEVycm9yIFswXTsKLQlyZWZyZXNoRGlmZmVyZW5jZSAoKTsKLQlvbGRPYmplY3RzID0gb2JqZWN0czsKLQlvbGRFcnJvcnMgPSBlcnJvcnM7Ci19Ci0KLXZvaWQgbGF5b3V0ICgpIHsKLQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JaW50IHdpZHRoID0gMDsKLQlTdHJpbmcgW10gaXRlbXMgPSBsaXN0LmdldEl0ZW1zICgpOwotCUdDIGdjID0gbmV3IEdDIChsaXN0KTsKLQlmb3IgKGludCBpPTA7IGk8b2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQl3aWR0aCA9IE1hdGgubWF4ICh3aWR0aCwgZ2Muc3RyaW5nRXh0ZW50IChpdGVtcyBbaV0pLngpOwotCX0KLQlnYy5kaXNwb3NlICgpOwotCVBvaW50IHNpemUxID0gc3RhcnQuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JUG9pbnQgc2l6ZTIgPSBzdG9wLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCVBvaW50IHNpemUzID0gY2hlY2suY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JUG9pbnQgc2l6ZTQgPSBsYWJlbC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQl3aWR0aCA9IE1hdGgubWF4IChzaXplMS54LCBNYXRoLm1heCAoc2l6ZTIueCwgTWF0aC5tYXggKHNpemUzLngsIHdpZHRoKSkpOwotCXdpZHRoID0gTWF0aC5tYXggKDY0LCBNYXRoLm1heCAoc2l6ZTQueCwgbGlzdC5jb21wdXRlU2l6ZSAod2lkdGgsIFNXVC5ERUZBVUxUKS54KSk7Ci0Jc3RhcnQuc2V0Qm91bmRzICgwLCAwLCB3aWR0aCwgc2l6ZTEueSk7Ci0Jc3RvcC5zZXRCb3VuZHMgKDAsIHNpemUxLnksIHdpZHRoLCBzaXplMi55KTsKLQljaGVjay5zZXRCb3VuZHMgKDAsIHNpemUxLnkgKyBzaXplMi55LCB3aWR0aCwgc2l6ZTMueSk7Ci0JbGFiZWwuc2V0Qm91bmRzICgwLCByZWN0LmhlaWdodCAtIHNpemU0LnksIHdpZHRoLCBzaXplNC55KTsKLQlpbnQgaGVpZ2h0ID0gc2l6ZTEueSArIHNpemUyLnkgKyBzaXplMy55OwotCWxpc3Quc2V0Qm91bmRzICgwLCBoZWlnaHQsIHdpZHRoLCByZWN0LmhlaWdodCAtIGhlaWdodCAtIHNpemU0LnkpOwotCXRleHQuc2V0Qm91bmRzICh3aWR0aCwgMCwgcmVjdC53aWR0aCAtIHdpZHRoLCByZWN0LmhlaWdodCk7Ci0JY2FudmFzLnNldEJvdW5kcyAod2lkdGgsIDAsIHJlY3Qud2lkdGggLSB3aWR0aCwgcmVjdC5oZWlnaHQpOwotfQotCQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDIyMzRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2Uuc3d0dG9vbHMuamFyPUpOSSBHZW5lcmF0aW9uLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3ZmM5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBTV1QgVG9vbHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM0MTRhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3QudG9vbHMiCi0gICBuYW1lPSIlcGx1Z2luTmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiIGV4cG9ydD0idHJ1ZSIvPgotICAgPC9yZXF1aXJlcz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBDdXN0b20gV2lkZ2V0cy9jb21tb24vb3JnL2VjbGlwc2Uvc3d0L2N1c3RvbS9TdHlsZWRUZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBDdXN0b20gV2lkZ2V0cy9jb21tb24vb3JnL2VjbGlwc2Uvc3d0L2N1c3RvbS9TdHlsZWRUZXh0LmphdmEKaW5kZXggOTcwNmQ1ZC4uNmNjOGY2ZCAxMDA3NTUKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgQ3VzdG9tIFdpZGdldHMvY29tbW9uL29yZy9lY2xpcHNlL3N3dC9jdXN0b20vU3R5bGVkVGV4dC5qYXZhCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIEN1c3RvbSBXaWRnZXRzL2NvbW1vbi9vcmcvZWNsaXBzZS9zd3QvY3VzdG9tL1N0eWxlZFRleHQuamF2YQpAQCAtMTMzOSw3ICsxMzM5LDcgQEAKICAqIEBzaW5jZSAzLjIKICAqIAogICogQHNlZSBQYWludE9iamVjdExpc3RlbmVyCi0gKiBAc3NlIFBhaW50T2JqZWN0RXZlbnQKKyAqIEBzZWUgUGFpbnRPYmplY3RFdmVudAogICovCiBwdWJsaWMgdm9pZCBhZGRQYWludE9iamVjdExpc3RlbmVyKFBhaW50T2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpIHsKIAljaGVja1dpZGdldCgpOwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMGI0N2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuQnJvd3NlckRlbW88L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+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+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9pY29ucy9wYXduLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2ljb25zL3Bhd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODExZjhiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2ljb25zL3Bhd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhMGZlYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUQnJvd3NlckRlbW9zLm5hbWUgPSBTV1QgQnJvd3NlciBEZW1vcyBQbHVnaW4KLWNhdGVnb3J5LlNXVEV4YW1wbGVzLm5hbWUgPSBTV1QgRXhhbXBsZXMKLXZpZXcuQnJvd3NlckRlbW9zLm5hbWUgPSBCcm93c2VyIERlbW8KLQotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLm5hbWUgPSBXb3JrYmVuY2ggVmlld3MKLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5kZXNjcmlwdGlvbiA9IFwKLQlBIGNvbGxlY3Rpb24gb2YgU3RhbmRhcmQgV2lkZ2V0IFRvb2xraXQgZXhhbXBsZXMgdGhhdCBydW4gYXMgVmlld3MgaW5zaWRlIHRoZSBXb3JrYmVuY2guICBcCi0JVGhlc2UgZXhhbXBsZXMgd2lsbCBjcmVhdGUgYSBuZXcgVmlldyBpbiB0aGUgY3VycmVudCBQZXJzcGVjdGl2ZS4KLQotbGF1bmNoaXRlbS5Ccm93c2VyRGVtb3MubmFtZSA9IEJyb3dzZXIgRGVtbwotbGF1bmNoaXRlbS5Ccm93c2VyRGVtb3MuZGVzY3JpcHRpb24gPSBcCi0JVGhlIGV4YW1wbGUgaWxsdXN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0IGZvciBIVE1MIHJlbmRlcmluZy5cblxuXAotCVRoZSBQYXducyBHYW1lIGlzIGEgYm9hcmQgZ2FtZSB0aGF0IGNhbiBiZSBwbGF5ZWQgYWdhaW5zdCB0aGUgY29tcHV0ZXIgb3IgYWdhaW5zdCBhbm90aGVyIHBsYXllci5cblxuXAotCVJlbmRlcmluZyBpcyBiYXNlZCBvbiBIVE1MIGFuZCBDU1MgdGVjaG5pcXVlcy4gVGhlIGJvYXJkIGlzIGEgdGFibGUgZmlsbGVkIHdpdGggaHlwZXJsaW5rcy4gQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyBcCi0JcHJvdmlkZSB2YXJpb3VzIHRoZW1lcyBhbmQgY29udHJvbCB0aGUgdGFibGUgYWVzdGhldGljIGFwcGVhcmFuY2UuIFxuXAotCVRoZSBBUEkgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3Nlci5zZXRUZXh0KGphdmEubGFuZy5TdHJpbmcpIGRyYXdzIHRoZSBib2FyZCBnYW1lIGZyb20gSFRNTCBnZW5lcmF0ZWQgaW4gbWVtb3J5LlxuXAotCVBsYXllciBtb3ZlcyBhcmUgY2FwdHVyZWQgYnkgaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25MaXN0ZW5lci4gZS5nIHRoZSBwbGF5ZXIgY2xpY2tzIFwKLQlvbiBhIGNlbGwgdGhhdCBkZWZpbmVzIGFuIGh5cGVybGluayB3aXRoIGEgVVJMIGh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MveHgxeXkyLlwKLQlUaGF0IGh5cGVybGluayBpZGVudGlmaWVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2VsbCBzZWxlY3RlZCBieSB0aGUgcGxheWVyLiBUaGUgbW92ZSBpcyBjb21wbGV0ZWQgYnkgZ2VuZXJhdGluZyBcCi0JbmV3IEhUTUwgY29udGVudCBhbmQgaW52b2tpbmcgQnJvd3Nlci5zZXRUZXh0IHRvIHVwZGF0ZSB0aGUgYm9hcmQgZ2FtZS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzFlZTI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zIgotICAgbmFtZT0iJXBsdWdpbi5TV1RCcm93c2VyRGVtb3MubmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5Ccm93c2VyRGVtb1BsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iQnJvd3NlckRlbW8uamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3LkJyb3dzZXJEZW1vcy5uYW1lIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLkJyb3dzZXJEZW1vIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgYWxsb3dNdWx0aXBsZT0iZmFsc2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mudmlld3MuQnJvd3NlckRlbW9WaWV3IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvcGF3bi5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5IgotICAgICAgICAgICAgbmFtZT0iQnJvd3NlciBEZW1vIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnZpZXdzLkJyb3dzZXJEZW1vVmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxpdGVtCi0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5Ccm93c2VyRGVtb3MubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL3NhbXBsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5Ccm93c2VyRGVtb3MuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJkZW1vcy52aWV3bGF1bmNoZXIiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mudmlld3MuQnJvd3NlckRlbW9WaWV3Ij4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvaXRlbT4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3MvQnJvd3NlckRlbW9QbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy9Ccm93c2VyRGVtb1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjNkYmRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy9Ccm93c2VyRGVtb1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyRGVtb1BsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JcHVibGljIHN0YXRpYyBCcm93c2VyRGVtb1BsdWdpbiBwbHVnaW47Ci0JUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUExVR0lOX1BBVEggPSBudWxsOwotCQotCXB1YmxpYyBCcm93c2VyRGVtb1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5Ccm93c2VyRGVtb1BsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCVBMVUdJTl9QQVRIID0gUGxhdGZvcm0ucmVzb2x2ZShwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi4iKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBCcm93c2VyRGVtb1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gQnJvd3NlckRlbW9QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL1Bhd25zLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3MvUGF3bnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUyZWY3MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3MvUGF3bnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3M7Ci0KLXB1YmxpYyBjbGFzcyBQYXducyB7Ci0KLQkvKiBDdXJyZW50IGJvYXJkIHJlcHJlc2VudGF0aW9uIGluIGNvbXBhY3RlZCBmb3JtICovCi0JYnl0ZVtdIGdhbWUgPSBuZXcgYnl0ZVs2NF07Ci0JLyogQmVzdCBtb3ZlICovCi0JaW50IGJlc3RJbmRleCA9IC0xOwotCS8qIFJlbGF0ZWQgYmVzdCBzY29yZSAqLwotCWludCBiZXN0U2NvcmUgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLQkvKiBFc3RpbWF0ZWQgc3RyYXRlZ2ljIHZhbHVlIG9mIGVhY2ggY2VsbCBiYXNlZCBvbiBwcm94aW1pdHkgdG8gd2FsbHMgKi8KLQlzdGF0aWMgaW50W10gZ2FtZVdhbGxXZWlnaHQgPSBuZXcgaW50WzY0XTsKLQlUaHJlYWQgdGhyZWFkID0gbnVsbDsKLQlib29sZWFuIHRocmVhZFN0b3AgPSBmYWxzZTsKLQkKLQlmaW5hbCBzdGF0aWMgYnl0ZSBFTVBUWSA9IDA7Ci0JZmluYWwgc3RhdGljIGJ5dGUgV0hJVEUgPSAxOwotCWZpbmFsIHN0YXRpYyBieXRlIEJMQUNLID0gMjsKLQlmaW5hbCBzdGF0aWMgYnl0ZSBXQUxMID0gMzsKLQkKLXB1YmxpYyBQYXducygpIHsKLX0KLQotLyogUHJvdmlkZSB0aGUgY3VycmVudCBnYW1lIGFuZCBpZ25pdGlhdGUgdGhlIHNlYXJjaCBvZiB0aGUgYmVzdCBtb3ZlIGZvciB0aGUgZ2l2ZW4gdHlwZQotICogTXVzdCByZXR1cm4gaW1tZWRpYXRlbHkgYXMgaXQgd2lsbCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLgotICogVGhlIFVJIHRocmVhZCB3aWxsIGZldGNoIHRoZSBiZXN0IG1vdmUgYW55IHRpbWUgdGhlcmVhZnRlci4KLSAqLwotcHVibGljIHZvaWQgcGxheVJlcXVlc3QoYnl0ZVtdW10gZ2FtZSwgaW50IHR5cGUpIHsKLQl0aHJlYWRTdG9wID0gdHJ1ZTsKLQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJYmVzdEluZGV4ID0gLTE7Ci0JCWJlc3RTY29yZSA9IEludGVnZXIuTUlOX1ZBTFVFOwotCQljb252ZXJ0KGdhbWUsIHRoaXMuZ2FtZSk7Ci0JCWluaXRQYXduQm9yZGVycyh0aGlzLmdhbWUsIGdhbWVXYWxsV2VpZ2h0KTsKLQkJLyogUXVpY2tseSBjb21wdXRlIGEgbGVnYWwgbW92ZSAqLwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZ2FtZS5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRoaXMuZ2FtZVtpXSA9PSBFTVBUWSkgewotCQkJCWJlc3RJbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzeW5jaHJvbml6ZWQoUGF3bnMudGhpcykgewotCQkJCQl0aHJlYWRTdG9wID0gZmFsc2U7Ci0JCQkJCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbMl07Ci0JCQkJCS8qIGlmIGxvbmcgdGltZSwgbXVzdCBjaGVjayBmb3IgdGhyZWFkU3RvcCBhbmQgZXhpdCBlYXJseSAqLyAKLQkJCQkJZXZhbEJlc3QoUGF3bnMudGhpcy5nYW1lLCBCTEFDSywgMiwgcmVzdWx0KTsKLQkJCQkJYmVzdEluZGV4ID0gcmVzdWx0WzBdOwotCQkJCQliZXN0U2NvcmUgPSByZXN1bHRbMV07Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JfQotfQotCi0vKiBGZXRjaCBiZXN0IG1vdmUgaW4gbmF0dXJhbCBjb29yZGluYXRlcyBmb3IgdGhlIGJvYXJkIHByZXZpb3VzbHkgZ2l2ZW4gaW4KLSAqIHRoZSBjYWxsIHRvIHBsYXlSZXF1ZXN0LgotICovCi1wdWJsaWMgdm9pZCBnZXRCZXN0TW92ZShpbnRbXSBwb2ludCkgewotCWNvbnZlcnQoYmVzdEluZGV4LCBwb2ludCk7Ci0JdGhyZWFkU3RvcCA9IHRydWU7Ci19Ci0KLS8qIEdpdmVuIGFuIGV4cGFuZGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBib2FyZCwgZm9ybWF0IGludGVybmFsIGNvbXBhY3QgbW9kZSAqLwotc3RhdGljIHZvaWQgY29udmVydChieXRlW11bXSBib2FyZCwgYnl0ZVtdIGcpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IGJvYXJkLmxlbmd0aDsgaSsrKSBTeXN0ZW0uYXJyYXljb3B5KGJvYXJkW2ldLCAwLCBnLCBpICogOCwgOCk7Ci19Ci0vKiBVcGRhdGUgZ2l2ZW4gY29tcGFjdCBtb2RlbCBiYXNlZCBvbiBwbGF5ZXIgbW92ZSBpbiBuYXR1cmFsIGNvb3JkaW5hdGVzICovCi1zdGF0aWMgdm9pZCBzZXQoYnl0ZVtdIGcsIGludCB4LCBpbnQgeSwgYnl0ZSB0eXBlKSB7Ci0JZ1t4KjgreV0gPSB0eXBlOwotfQotLyogR2l2ZW4gYW4gaW5kZXggaW4gY29tcGFjdCByZXByZXNlbnRhdGlvbiwgcmV0dXJuIG5hdHVyYWwgY29vcmRpbmF0ZXMgKi8KLXN0YXRpYyB2b2lkIGNvbnZlcnQoaW50IGluZGV4LCAvKm91dCBbMF0geCBbMV0geSAqL2ludFtdIHBvaW50KSB7Ci0JcG9pbnRbMF0gPSBpbmRleCAvIDg7Ci0JcG9pbnRbMV0gPSBpbmRleCAlIDg7Ci19Ci0vKiBHaXZlbiBhbiBpbmRleCBpbnRvIHRoZSBjb21wYWN0IG1vZGVsIGFuZCB0aGUgbmVpZ2hib3VyIGNvZGUsCi0gKiByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBjb3JyZXNwb25kaW5nIG5laWdoYm91ciBpbmRleC4KLSAqIFJldHVybnMgLTEgaWYgdGhlcmUgaXMgbm8gbmVpZ2hib3VyLgotICogCi0gKiBOZWlnaGJvdXIgY29kZSBmb3IgdGhlIGluZGV4IFgKLSAqIDAgMSAyCi0gKiAzIFggNAotICogNSA2IDcgCi0gKi8KLXN0YXRpYyBpbnQgZ2V0TmVpZ2hib3VySW5kZXgoYnl0ZVtdIGcsIGludCBpbmRleCwgaW50IG5laWdoYm91cikgewotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gZy5sZW5ndGgpIHJldHVybiAtMTsKLQlpbnQgcmVzdWx0ID0gLTE7Ci0Jc3dpdGNoIChuZWlnaGJvdXIpIHsKLQkJY2FzZSAwOiByZXN1bHQgPSBpbmRleCA8IDggfHwgaW5kZXggJSA4ID09IDAgPyAtMSA6IGluZGV4IC0gOTsgYnJlYWs7Ci0JCWNhc2UgMTogcmVzdWx0ID0gaW5kZXggPCA4ID8gLTEgOiBpbmRleCAtIDg7IGJyZWFrOwotCQljYXNlIDI6IHJlc3VsdCA9IGluZGV4IDwgOCB8fCBpbmRleCAlIDggPT0gNyA/IC0xIDogaW5kZXggLSA3OyBicmVhazsKLQkJY2FzZSAzOiByZXN1bHQgPSBpbmRleCAlIDggPT0gMCA/IC0xIDogaW5kZXggLSAxOyBicmVhazsKLQkJY2FzZSA0OiByZXN1bHQgPSBpbmRleCAlIDggPT0gNyA/IC0xIDogaW5kZXggKyAxOyBicmVhazsKLQkJY2FzZSA1OiByZXN1bHQgPSBpbmRleCAlIDggPT0gMCB8fCBpbmRleCA+PSA1NiA/IC0xIDogaW5kZXggKyA3OyBicmVhazsKLQkJY2FzZSA2OiByZXN1bHQgPSBpbmRleCA+PSA1NiA/IC0xIDogaW5kZXggKyA4OyBicmVhazsKLQkJY2FzZSA3OiByZXN1bHQgPSBpbmRleCAlIDggPT0gNyB8fCBpbmRleCA+PSA1NiA/IC0xIDogaW5kZXggKyA5OyBicmVhazsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLS8qIE1ha2UgdGhlIHBsYXllciB0eXBlIHBsYXkgYXQgaW5kZXggb24gZ2l2ZW4gY29tcGFjdCBib2FyZCAKLSAqIENvbXB1dGUgYWxsIHBhd25zIHRoYXQgbXVzdCBiZSByZXZlcnNlZC4KLSAqLwotc3RhdGljIHZvaWQgcGxheShieXRlW10gZywgaW50IGluZGV4LCBieXRlIHR5cGUpIHsKLQlieXRlIG9wcG9uZW50VHlwZSA9IHR5cGUgPT0gV0hJVEUgPyBCTEFDSyA6IFdISVRFOwotCWZvciAoaW50IG5laWdoYm91ciA9IDA7IG5laWdoYm91ciA8PSA3OyBuZWlnaGJvdXIrKykgewotCQlpbnQgbkluZGV4ID0gZ2V0TmVpZ2hib3VySW5kZXgoZywgaW5kZXgsIG5laWdoYm91cik7Ci0JCWludFtdIHJldmVyc2lJbmRlY2VzID0gbmV3IGludFs2XTsKLQkJaW50IG5SZXZlcnNpID0gMDsKLQkJd2hpbGUgKG5JbmRleCAhPSAtMSAmJiBuUmV2ZXJzaSA8IDYgJiYgZ1tuSW5kZXhdID09IG9wcG9uZW50VHlwZSkgewotCQkJcmV2ZXJzaUluZGVjZXNbblJldmVyc2ldID0gbkluZGV4OwotCQkJblJldmVyc2krKzsKLQkJCW5JbmRleCA9IGdldE5laWdoYm91ckluZGV4KGcsIG5JbmRleCwgbmVpZ2hib3VyKTsJCQkKLQkJfQotCQlpZiAoblJldmVyc2kgPiAwICYmIG5JbmRleCAhPSAtMSAmJiBnW25JbmRleF0gPT0gdHlwZSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUmV2ZXJzaTsgaSsrKSBnW3JldmVyc2lJbmRlY2VzW2ldXSA9IHR5cGU7Ci0JCX0KLQl9Ci0JZ1tpbmRleF0gPSB0eXBlOwotfQotLyogRXZhbHVhdGUgdGhlIGdpdmVuIGNvbXBhY3QgbW9kZWwgYmFzZWQgb24gcGF3bnMgZGlzdHJpYnV0aW9uIAotICogSGlnaCBtZWFucyB3aGl0ZSBoYXMgYWR2YW50YWdlLiBCZWxvdyB6ZXJvIG1lYW5zIGJsYWNrIGhhcyBhZHZhbnRhZ2UuCi0gKi8KLXN0YXRpYyBpbnQgZXZhbChieXRlW10gZykgewotCWludCBjbnRXaGl0ZSA9IDAsIGNudEJsYWNrID0gMCwgY250RW1wdHkgPSAwOwotCWludCBjbnRXaGl0ZVdhbGxBZHZhbnRhZ2UgPSAwLCBjbnRCbGFja1dhbGxBZHZhbnRhZ2UgPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNjQ7IGkrKykgewotCQlpZiAoZ1tpXSA9PSBXSElURSkgewotCQkJY250V2hpdGUrKzsKLQkJCWNudFdoaXRlV2FsbEFkdmFudGFnZSArPSBnYW1lV2FsbFdlaWdodFtpXTsKLQkJfQotCQllbHNlIGlmIChnW2ldID09IEJMQUNLKSB7Ci0JCQljbnRCbGFjaysrOwotCQkJY250QmxhY2tXYWxsQWR2YW50YWdlICs9IGdhbWVXYWxsV2VpZ2h0W2ldOwotCQl9Ci0JCWVsc2UgaWYgKGdbaV0gPT0gRU1QVFkpIGNudEVtcHR5Kys7Ci0JfQotCWlmIChjbnRFbXB0eSA9PSAwKSB7Ci0JCWlmIChjbnRXaGl0ZSA+IGNudEJsYWNrKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7IC8qIFdoaXRlIHdpbnMgKi8KLQkJaWYgKGNudFdoaXRlIDwgY250QmxhY2spIHJldHVybiBJbnRlZ2VyLk1JTl9WQUxVRTsgLyogQmxhY2sgd2lucyAqLwotCQlyZXR1cm4gMDsgLyogU3RhbGVtYXRlICovCi0JfQotCXJldHVybiBjbnRXaGl0ZSArIGNudFdoaXRlV2FsbEFkdmFudGFnZSAtIGNudEJsYWNrIC0gY250QmxhY2tXYWxsQWR2YW50YWdlOwotfQotCi0vKiBSZWNvZ25pemUgcGF3bnMgcHJvdGVjdGVkIGJ5IHdhbGxzIG9yIGJvcmRlcnMgCi0gKiBUQkQgLSBub3RlIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UgZm9yIGVhY2ggY2VsbCBhbmQgc3RvcmVkCi0gKiBpbiBhIHNlcGFyYXRlIGJ5dGVbXSBnV2FsbEdhaW4KLSAqICovCi1zdGF0aWMgdm9pZCBpbml0UGF3bkJvcmRlcnMoYnl0ZVtdIGcsIGludFtdIGdhbWVXYWxsV2VpZ2h0KSB7Ci0JLyogQSBwYXduIGhhcyA4IG5laWdoYm91cnMgb24gNCBheGVzLgotCSAqIFN0cmF0ZWdpYyBwYXducyBoYXZlIG9uZSBzaWRlIG9mIGVhY2ggYXhpcyBwcm90ZWN0ZWQgYnkgYSB3YWxsIGFuZCB0aGUgb3RoZXIKLQkgKiBzaWRlIG5vdCBjbG9zZWQgYnkgYSB3YWxsLgotCSAqIEEgcGF3biBjYW5ub3QgYmUgcmV2ZXJzZWQgd2hlbiBlYWNoIG9mIGl0cyA0IGF4ZXMgYXJlIHByb3RlY3RlZCBieSBhIHdhbGwgb24KLQkgKiBvbmUgc2lkZS4gUGF3bnMgdGhhdCBoYXZlIG1vcmUgdGhhbiA0IHdhbGxzIGFyZSBsZXNzIGludGVyZXN0aW5nIHNpbmNlIHRoZXkKLQkgKiBhcmUgbm90IG9wZW4gZW5vdWdoIHRvIHRoZSBib2FyZC4KLQkgKiAKLQkgKiBOYnIgd2FsbHMsIG5iciBheGlzIGNvdmVyZWQsIGVzdGltYXRlZCB2YWx1ZQotCSAqIDAgbi9hIDAKLQkgKiAxIDEgMgotCSAqIDIgMSAxCi0JICogMiAyIDYKLQkgKiAzIDIgNAotCSAqIDQgMiAyCi0JICogMyAzIDkKLQkgKiA0IDMgOAotCSAqIDQgNCAxNgotCSAqIDUgNCAxNAotCSAqIDYgNCA5Ci0JICogNyA0IDYKLQkgKiA4IDQgMAotCSAqLwotCWludFtdIG5UeXBlcyA9IG5ldyBpbnRbOF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0JCWludCBuV2FsbHMgPSAwOwotCQlpbnQgbkF4aXMgPSAwOwotCQlmb3IgKGludCBuID0gMDsgbiA8IDg7IG4rKykgewotCQkJaW50IG5JbmRleCA9IGdldE5laWdoYm91ckluZGV4KGcsIGksIG4pOwotCQkJblR5cGVzW25dID0gbkluZGV4ICE9IC0xID8gZ1tuSW5kZXhdIDogV0FMTDsKLQkJCWlmIChuVHlwZXNbbl0gPT0gV0FMTCkgbldhbGxzKys7Ci0JCX0KLQkJaW50IHNjb3JlID0gbldhbGxzOwotCQlpZiAobldhbGxzID4gMCkgewotCQkJaWYgKG5UeXBlc1swXSA9PSBXQUxMIHx8IG5UeXBlc1s3XSA9PSBXQUxMKSBuQXhpcysrOwotCQkJaWYgKG5UeXBlc1sxXSA9PSBXQUxMIHx8IG5UeXBlc1s2XSA9PSBXQUxMKSBuQXhpcysrOwotCQkJaWYgKG5UeXBlc1syXSA9PSBXQUxMIHx8IG5UeXBlc1s1XSA9PSBXQUxMKSBuQXhpcysrOwotCQkJaWYgKG5UeXBlc1s0XSA9PSBXQUxMIHx8IG5UeXBlc1szXSA9PSBXQUxMKSBuQXhpcysrOwotCQkJc3dpdGNoIChuQXhpcykgewotCQkJCWNhc2UgNDogc3dpdGNoIChuV2FsbHMpIHsgY2FzZSA0OiBzY29yZSA9IDE2OyBicmVhazsgY2FzZSA1OiBzY29yZSA9IDE0OyBicmVhazsgY2FzZSA2OiBzY29yZSA9IDk7IGNhc2UgNzogc2NvcmUgPSA2OyBicmVhazsgY2FzZSA4OiBzY29yZSA9IDA7IGJyZWFrO30gYnJlYWs7Ci0JCQkJY2FzZSAzOiBzd2l0Y2ggKG5XYWxscykgeyBjYXNlIDM6IHNjb3JlID0gOTsgYnJlYWs7IGNhc2UgNDogc2NvcmUgPSA4O30gYnJlYWs7Ci0JCQkJY2FzZSAyOiBzd2l0Y2ggKG5XYWxscykgeyBjYXNlIDI6IHNjb3JlID0gNjsgYnJlYWs7IGNhc2UgMzogc2NvcmUgPSA0OyBicmVhazsgY2FzZSA0OiBzY29yZSA9IDI7IH0gYnJlYWs7Ci0JCQkJY2FzZSAxOiBzd2l0Y2ggKG5XYWxscykgeyBjYXNlIDE6IHNjb3JlID0gMjsgYnJlYWs7IGNhc2UgMjogc2NvcmUgPSAxOyBicmVhazt9IGJyZWFrOwotCQkJfQotCQl9Ci0JCWdhbWVXYWxsV2VpZ2h0W2ldID0gc2NvcmU7Ci0JfQotfQotCi0vKiBFdmFsdWF0ZSB0aGUgYmVzdCBtb3ZlIGZvciBwbGF5ZXIgdHlwZSBmb3IgdGhlIGdpdmVuIGJvYXJkLCBkb2luZyBhIGRlcHRoIDEgc2VhcmNoICovCi1zdGF0aWMgdm9pZCBldmFsQmVzdChieXRlW10gZywgYnl0ZSB0eXBlLCBpbnQgZGVwdGgsIC8qIG91dCBbMF0gYmVzdCBtb3ZlLCBbMV0gbWluaW1heCAqL2ludFtdIHJlc3VsdCkgewotCWJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVs2NF07Ci0JYnl0ZSBvcHBvbmVudFR5cGUgPSB0eXBlID09IFdISVRFID8gQkxBQ0sgOiBXSElURTsKLQlyZXN1bHRbMF0gPSAtMTsgcmVzdWx0WzFdID0gSW50ZWdlci5NSU5fVkFMVUU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0JCWlmIChnW2ldID09IEVNUFRZKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGcsIDAsIHRtcCwgMCwgNjQpOwotCQkJcGxheSh0bXAsIGksIHR5cGUpOwotCQkJaW50IHNjb3JlID0gZXZhbCh0bXApOwotCQkJaWYgKGRlcHRoID4gMSkgewotCQkJCWludFtdIHRtcFJlc3VsdCA9IG5ldyBpbnRbMl07Ci0JCQkJZXZhbEJlc3QodG1wLCBvcHBvbmVudFR5cGUsIGRlcHRoIC0gMSwgdG1wUmVzdWx0KTsKLQkJCQlzY29yZSA9IHRtcFJlc3VsdFsxXTsKLQkJCX0KLQkJCWlmICgodHlwZSA9PSBXSElURSAmJiBzY29yZSA+IHJlc3VsdFsxXSkgfHwgKHR5cGUgPT0gQkxBQ0sgJiYgc2NvcmUgPCByZXN1bHRbMV0pIHx8IHJlc3VsdFswXSA9PSAtMSkgewotCQkJCXJlc3VsdFswXSA9IGk7Ci0JCQkJcmVzdWx0WzFdID0gc2NvcmU7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvQnJvd3NlckRlbW9WaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvQnJvd3NlckRlbW9WaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMjM3MDEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL0Jyb3dzZXJEZW1vVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyRGVtb1ZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JQWN0aW9uIHBhd25BY3Rpb247Ci0JQWN0aW9uIGVkaXRBY3Rpb247Ci0JQ29tcG9zaXRlIHBhcmVudDsKLQkKLQlwdWJsaWMgQnJvd3NlckRlbW9WaWV3KCkgewotCX0KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0cnkgewotCQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlicm93c2VyLmRpc3Bvc2UoKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCXRleHQuc2V0VGV4dCgiQnJvd3NlciB3aWRnZXQgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gVGhlIGV4YWN0IGVycm9yIGlzOlxyXG4iK2UpOwotCQkJcGFyZW50LmxheW91dCh0cnVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlUYWJGb2xkZXIgZm9sZGVyID0gbmV3IFRhYkZvbGRlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCW5ldyBQYXduVGFiKGl0ZW0pOwotCQkKLQkJaXRlbSA9IG5ldyBUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOwotCQluZXcgRWRpdG9yVGFiKGl0ZW0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQl9Ci0JCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvRWRpdG9yVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvRWRpdG9yVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNTMxNjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL0VkaXRvclRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0b3JUYWIgewotCUJyb3dzZXIgYnJvd3NlcjsKLQlUZXh0IGh0bWxUZXh0LCBzY3JpcHRUZXh0OwotCUJ1dHRvbiBodG1sQnV0dG9uLCBzY3JpcHRCdXR0b247Ci0Jc3RhdGljIFN0cmluZyBodG1sID0gCi0JCSI8aHRtbD5cclxuIisKLQkJIgk8Ym9keT5cclxuIisKLQkJIgkJPGgxIGlkPSdteWlkJz5IVE1MIERvY3VtZW50PC9oMT5cclxuIisKLQkJIgkJPGgyPlNldCBIVE1MIGNvbnRlbnQ8L2gyPlxyXG4iKwotCQkiCQk8b2w+XHJcbiIrCi0JCSIJCQk8bGk+RW50ZXIgaHRtbCBkYXRhIGludG8gdGhlICdzZXRUZXh0JyBwYW5lPC9saT5cclxuIisKLQkJIgkJCTxsaT5DbGljayBvbiAnc2V0VGV4dCcgdG8gc2V0IHRoZSBuZXcgY29udGVudDwvbGk+XHJcbiIrCi0JCSIJCTwvb2w+XHJcbiIrCi0JCSIJCTxoMj5RdWVyeSBvciBtb2RpZnkgSFRNTCBkb2N1bWVudDwvaDI+XHJcbiIrCi0JCSIJCTxvbD5cclxuIisKLQkJIgkJPGxpPkVudGVyIGphdmFzY3JpcHQgY29tbWFuZHMgaW50byB0aGUgJ2V4ZWN1dGUnIHBhbmU8L2xpPlxyXG4iKwotCQkiCQk8bGk+Q2xpY2sgb24gJ2V4ZWN1dGUnIHRvIHJ1biB0aGUgamF2YXNjcmlwdCBpbiB0aGUgY3VycmVudCBkb2N1bWVudDwvbGk+XHJcbiIrCi0JCSIJCTwvb2w+XHJcbiIrCi0JCSIJPC9ib2R5PlxyXG4iKwotCQkiPC9odG1sPiI7Ci0JCi0Jc3RhdGljIFN0cmluZyBzY3JpcHQgPSAKLQkJInZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnUCcpO1xyXG4iKwotCQkidmFyIHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnQ29udGVudCBpbnNlcnRlZCEnKTtcclxuIisKLQkJIm5vZGUuYXBwZW5kQ2hpbGQodGV4dCk7XHJcbiIrCi0JCSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXlpZCcpLmFwcGVuZENoaWxkKG5vZGUpO1xyXG5cclxuIisKLQkJImRvY3VtZW50LmJnQ29sb3IgPSAneWVsbG93JzsiOwotCQotCXB1YmxpYyBFZGl0b3JUYWIoVGFiSXRlbSBpdGVtKSB7Ci0JCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKGl0ZW0uZ2V0UGFyZW50KCksIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJFZGl0b3IiKTsKLQkJaXRlbS5zZXRDb250cm9sKHBhcmVudCk7Ci0JCQotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHBhcmVudCwgU1dULk5PTkUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZpbmFsIFNhc2ggc2FzaCA9IG5ldyBTYXNoKHBhcmVudCwgU1dULlZFUlRJQ0FMKTsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJZmluYWwgRm9ybUxheW91dCBmb3JtID0gbmV3IEZvcm1MYXlvdXQoKTsKLQkJcGFyZW50LnNldExheW91dChmb3JtKTsKLQkJCi0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHNhc2gsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJYnJvd3Nlci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJZmluYWwgRm9ybURhdGEgc2FzaERhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJc2FzaERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCwgMCk7Ci0JCXNhc2hEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJc2FzaERhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCXNhc2guc2V0TGF5b3V0RGF0YShzYXNoRGF0YSk7Ci0JCXNhc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVJlY3RhbmdsZSByZWN0ID0gc2FzaC5nZXRCb3VuZHMoKTsKLQkJCQlSZWN0YW5nbGUgcGFyZW50UmVjdCA9IHNhc2guZ2V0UGFyZW50KCkuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCWludCByaWdodCA9IHBhcmVudFJlY3Qud2lkdGggLSByZWN0LndpZHRoIC0gMjA7Ci0JCQkJZS54ID0gTWF0aC5tYXgoTWF0aC5taW4oZS54LCByaWdodCksIDIwKTsKLQkJCQlpZiAoZS54ICE9IHJlY3QueCkgewotCQkJCQlzYXNoRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIGUueCk7Ci0JCQkJCXBhcmVudC5sYXlvdXQoKTsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0pOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChzYXNoLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCS8qIEluaXRpYWxpemUgUGFuZWwgKi8KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCQlHcm91cCBodG1sR3JvdXAgPSBuZXcgR3JvdXAocGFuZWwsIFNXVC5OT05FKTsKLQkJaHRtbEdyb3VwLnNldFRleHQoInNldFRleHQiKTsKLQkJaHRtbFRleHQgPSBuZXcgVGV4dChodG1sR3JvdXAsIFNXVC5NVUxUSSk7Ci0JCWh0bWxCdXR0b24gPSBuZXcgQnV0dG9uKGh0bWxHcm91cCwgU1dULlBVU0gpOwotCQlodG1sQnV0dG9uLnNldFRleHQoInNldFRleHQiKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaHRtbEdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJaHRtbFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5FTkQ7Ci0JCWh0bWxCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWh0bWxHcm91cC5sYXlvdXQoKTsKLQkJCi0JCUdyb3VwIHNjcmlwdEdyb3VwID0gbmV3IEdyb3VwKHBhbmVsLCBTV1QuTk9ORSk7Ci0JCXNjcmlwdEdyb3VwLnNldFRleHQoImV4ZWN1dGUiKTsKLQkJc2NyaXB0VGV4dCA9IG5ldyBUZXh0KHNjcmlwdEdyb3VwLCBTV1QuTVVMVEkpOwotCQlzY3JpcHRCdXR0b24gPSBuZXcgQnV0dG9uKHNjcmlwdEdyb3VwLCBTV1QuUFVTSCk7Ci0JCXNjcmlwdEJ1dHRvbi5zZXRUZXh0KCJleGVjdXRlIik7Ci0JCWdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlzY3JpcHRHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCXNjcmlwdFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5FTkQ7Ci0JCXNjcmlwdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJc2NyaXB0R3JvdXAubGF5b3V0KCk7Ci0JCQotCQlicm93c2VyLnNldFRleHQoaHRtbCk7Ci0JCWh0bWxUZXh0LnNldFRleHQoaHRtbCk7Ci0JCXNjcmlwdFRleHQuc2V0VGV4dChzY3JpcHQpOwotCQlwYXJlbnQubGF5b3V0KCk7Ci0JCQotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlXaWRnZXQgdyA9IGUud2lkZ2V0OwotCQkJCWlmICh3ID09IGh0bWxCdXR0b24pIGJyb3dzZXIuc2V0VGV4dChodG1sVGV4dC5nZXRUZXh0KCkpOwotCQkJCWlmICh3ID09IHNjcmlwdEJ1dHRvbikgYnJvd3Nlci5leGVjdXRlKHNjcmlwdFRleHQuZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfTsKLQkJCi0JCWh0bWxCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlzY3JpcHRCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9QYXduVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvUGF3blRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTNmMTJlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9QYXduVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MuQnJvd3NlckRlbW9QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MuUGF3bnM7Ci0KLXB1YmxpYyBjbGFzcyBQYXduVGFiIHsKLQotCUFjdGlvbiBwYXduQWN0aW9uOwotCUFjdGlvbiBlZGl0QWN0aW9uOwotCQotCUJyb3dzZXIgYnJvd3NlciA9IG51bGw7Ci0JUmV2ZXJzaUxpc3RlbmVyIHJldmVyc2lMaXN0ZW5lcjsKLQotCWZpbmFsIHN0YXRpYyBpbnQgVFlQRV9XRUxDT01FID0gMTsKLQlmaW5hbCBzdGF0aWMgaW50IFRZUEVfU1RBUlQgPSAyOwotCWZpbmFsIHN0YXRpYyBpbnQgVFlQRV9CT0FSRCA9IDM7Ci0JZmluYWwgc3RhdGljIGludCBUWVBFX0JPQVJEX09WRVIgPSA0OwotCi0JZmluYWwgc3RhdGljIFN0cmluZyBVUkwgPSAiaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy8iOwotCXN0YXRpYyBTdHJpbmcgUExVR0lOX1BBVEggPSBCcm93c2VyRGVtb1BsdWdpbi5QTFVHSU5fUEFUSDsKLQlzdGF0aWMgU3RyaW5nIENTU19GT0xERVIgPSAiY3NzMiI7Ci0Jc3RhdGljIFN0cmluZyBVUkxfQ1NTID0gUExVR0lOX1BBVEgrQ1NTX0ZPTERFUisiL3N0eWxlLmNzcyI7Ci0Jc3RhdGljIFN0cmluZyBVUkxfV0VMQ09NRSA9UExVR0lOX1BBVEgrQ1NTX0ZPTERFUisiL3dlbGNvbWUuaHRtbCI7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9TVEFSVF8yX1BMQVlFUlMgPSAiYWN0aW9uc3RhcnQycGxheWVycyI7Ci0JZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fU1RBUlRfMV9QTEFZRVIgPSAiYWN0aW9uc3RhcnQxcGxheWVyIjsKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9XSElURSA9ICJhY3Rpb253aGl0ZSI7Ci0JZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fQkxBQ0sgPSAiYWN0aW9uYmxhY2siOwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX1RIRU1FID0gImFjdGlvbnRoZW1lIjsKLQotCXN0YXRpYyBieXRlW11bXSBnYW1lID0gbnVsbDsKLQlzdGF0aWMgYm9vbGVhbiBpc1doaXRlID0gdHJ1ZTsKLQlzdGF0aWMgaW50IGNudFdoaXRlID0gMCwgY250QmxhY2sgPSAwOwotCXN0YXRpYyBib29sZWFuIGNvbXB1dGVyID0gZmFsc2U7Ci0Jc3RhdGljIGludCBjeCwgY3k7Ci0JZmluYWwgc3RhdGljIGJ5dGUgRU1QVFkgPSAwOwotCWZpbmFsIHN0YXRpYyBieXRlIFdISVRFID0gMTsKLQlmaW5hbCBzdGF0aWMgYnl0ZSBCTEFDSyA9IDI7Ci0JZmluYWwgc3RhdGljIGJ5dGUgV0FMTCA9IDM7Ci0JCi0Jc3RhdGljIFBhd25zIHR0ciA9IG51bGw7Ci0Jc3RhdGljIGludFtdIG1vdmUgPSBuZXcgaW50WzJdOwotCXN0YXRpYyBNZW51IG1lbnUgPSBudWxsOwotCQotCXB1YmxpYyBQYXduVGFiKFRhYkl0ZW0gaXRlbSkgewkJCi0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoaXRlbS5nZXRQYXJlbnQoKSwgU1dULk5PTkUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWl0ZW0uc2V0VGV4dCgiUGF3bnMiKTsKLQkJaXRlbS5zZXRDb250cm9sKGJyb3dzZXIpOwotCi0JCW1lbnUgPSBuZXcgTWVudShicm93c2VyLmdldFNoZWxsKCksIFNXVC5QT1BfVVApOwotCQlNZW51SXRlbSBpdGVtMiA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0yLnNldFRleHQoIkVuZCBHYW1lIik7Ci0JCWl0ZW0yLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlnYW1lID0gbnVsbDsKLQkJCQlpc1doaXRlID0gdHJ1ZTsKLQkJCQljbnRXaGl0ZSA9IDA7IGNudEJsYWNrID0gMDsKLQkJCQl0dHIgPSBudWxsOwotCQkJCWJyb3dzZXIuc2V0VXJsKFVSTF9XRUxDT01FKTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuc2V0TWVudShtZW51KTsKLQkJCi0JCXJldmVyc2lMaXN0ZW5lciA9IG5ldyBSZXZlcnNpTGlzdGVuZXIoKTsKLQkJYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKHJldmVyc2lMaXN0ZW5lcik7Ci0JCWJyb3dzZXIuc2V0VXJsKFVSTF9XRUxDT01FKTsKLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGdldEh0bWwoaW50IHR5cGUpIHsKLQkJU3RyaW5nIGh0bWwgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBUWVBFX0JPQVJEOgotCQljYXNlIFRZUEVfQk9BUkRfT1ZFUjogewotCQkJaHRtbCA9ICI8aHRtbD48aGVhZGVyPjxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIiBocmVmPVwiIitVUkxfQ1NTKyJcIj48L2hlYWRlcj48Ym9keT48ZGl2IGNsYXNzPVwiYm9hcmRcIj48dGFibGU+PHRib2R5PiI7Ci0JCQlTdHJpbmcgY2xhc3NQbGF5ZXJXaGl0ZSA9ICJwbGF5ZXJ3aGl0ZSIsIGNsYXNzUGxheWVyQmxhY2sgPSAicGxheWVyYmxhY2siOwotCQkJaWYgKHR5cGUgPT0gVFlQRV9CT0FSRF9PVkVSKSB7Ci0JCQkJaWYgKGNudFdoaXRlID4gY250QmxhY2spIHsKLQkJCQkJY2xhc3NQbGF5ZXJXaGl0ZSArPSAiIHdpbm5lciI7Ci0JCQkJCWNsYXNzUGxheWVyQmxhY2sgKz0gIiBsb3NlciI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2xhc3NQbGF5ZXJXaGl0ZSArPSAiIGxvc2VyIjsKLQkJCQkJY2xhc3NQbGF5ZXJCbGFjayArPSAiIHdpbm5lciI7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIHdoaXRlID0gIjx0ZCBjbGFzcz1cIndoaXRlXCIvPiI7Ci0JCQlTdHJpbmcgYmxhY2sgPSAiPHRkIGNsYXNzPVwiYmxhY2tcIi8+IjsKLQkJCVN0cmluZyB3YWxsID0gIjx0ZCBjbGFzcz1cIndhbGxcIi8+IjsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZ2FtZS5sZW5ndGg7IGkrKykgewotCQkJCWh0bWwgKz0gIjx0cj4iOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZ2FtZVswXS5sZW5ndGg7IGorKykgewotCQkJCQlzd2l0Y2ggKGdhbWVbaV1bal0pIHsKLQkJCQkJCWNhc2UgRU1QVFk6IHsKLQkJCQkJCQlTdHJpbmcgZW1wdHkgPSAiPHRkIGNsYXNzPVwiIisoaXNXaGl0ZSA/ICJ3aGl0ZWxpbmsiIDogImJsYWNrbGluayIpKyJcIj4iKyAoaXNXaGl0ZSB8fCAoIWlzV2hpdGUgJiYgIWNvbXB1dGVyKSA/ICI8YSBocmVmPVwiIitVUkwrKGlzV2hpdGUgPyBBQ1RJT05fV0hJVEUgOiBBQ1RJT05fQkxBQ0spKyIveHgiK2krInl5IitqKyJcIiBjbGFzcz1cImVtcHR5XCIvPiIgOiAiPGRpdiBjbGFzcz1cImVtcHR5XCIvPiIpKyI8L3RkPiI7Ci0JCQkJCQkJaHRtbCArPSBlbXB0eTsgYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQljYXNlIFdISVRFOiBodG1sICs9IHdoaXRlOyBicmVhazsKLQkJCQkJCWNhc2UgQkxBQ0s6IGh0bWwgKz0gYmxhY2s7IGJyZWFrOwotCQkJCQkJY2FzZSBXQUxMOiBodG1sICs9IHdhbGw7IGJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWh0bWwgKz0iPC90cj4iOwotCQkJfQotCQkJaHRtbCArPSAiPC90Ym9keT48L3RhYmxlPjwvZGl2PiI7Ci0JCQlodG1sICs9ICI8ZGl2IGNsYXNzPVwiIitjbGFzc1BsYXllcldoaXRlKyJcIj4iK2NudFdoaXRlKyI8L2Rpdj4iOwotCQkJaHRtbCArPSAiPGRpdiBjbGFzcz1cIiIrY2xhc3NQbGF5ZXJCbGFjaysiXCI+IitjbnRCbGFjaysiPC9kaXY+IjsKLQkJCWh0bWwgKz0gIjwvYm9keT48L2h0bWw+IjsKLQkJCWJyZWFrOwotCQl9Ci0JCX0KLQkJcmV0dXJuIGh0bWw7Ci0JfQotCi0JcHVibGljIGNsYXNzIFJldmVyc2lMaXN0ZW5lciBpbXBsZW1lbnRzIExvY2F0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZSkgewotCQkJdHJ5IHsKLQkJCWZpbmFsIEJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWUud2lkZ2V0OwotCQkJaWYgKGUubG9jYXRpb24uaW5kZXhPZihBQ1RJT05fU1RBUlRfMV9QTEFZRVIpICE9IC0xIHx8IGUubG9jYXRpb24uaW5kZXhPZihBQ1RJT05fU1RBUlRfMl9QTEFZRVJTKSAhPSAtMSkgewotCQkJCWNvbXB1dGVyID0gZS5sb2NhdGlvbi5pbmRleE9mKEFDVElPTl9TVEFSVF8xX1BMQVlFUikgIT0gLTE7Ci0JCQkJZ2FtZSA9IG5ldyBieXRlWzhdWzhdOwotCQkJCWlmIChjb21wdXRlcikgdHRyID0gbmV3IFBhd25zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIGdhbWVbKGludCkoTWF0aC5yYW5kb20oKSpnYW1lLmxlbmd0aCldWyhpbnQpKE1hdGgucmFuZG9tKCkqZ2FtZVswXS5sZW5ndGgpXSA9IFdBTEw7Ci0JCQkJZS5kaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWJyb3dzZXIuc2V0VGV4dChnZXRIdG1sKFRZUEVfQk9BUkQpKTsKLQkJCQl9fSk7Ci0JCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKGUubG9jYXRpb24uaW5kZXhPZihBQ1RJT05fVEhFTUUpICE9IC0xKSB7Ci0JCQkJaW50IGluZGV4ID0gZS5sb2NhdGlvbi5pbmRleE9mKEFDVElPTl9USEVNRSkgKyBBQ1RJT05fVEhFTUUubGVuZ3RoKCkgKyAxOwotCQkJCUNTU19GT0xERVIgPSBlLmxvY2F0aW9uLnN1YnN0cmluZyhpbmRleCwgaW5kZXggKyA0KTsKLQkJCQlVUkxfQ1NTID0gUExVR0lOX1BBVEgrQ1NTX0ZPTERFUisiL3N0eWxlLmNzcyI7Ci0JCQkJVVJMX1dFTENPTUUgPSBQTFVHSU5fUEFUSCtDU1NfRk9MREVSKyIvd2VsY29tZS5odG1sIjsKLQkJCQllLmRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJYnJvd3Nlci5zZXRVcmwoVVJMX1dFTENPTUUpOwotCQkJCX19KTsKLQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlieXRlIHBsYXllciA9IEVNUFRZOwotCQkJaWYgKGUubG9jYXRpb24uaW5kZXhPZihBQ1RJT05fV0hJVEUpICE9IC0xKSBwbGF5ZXIgPSBXSElURTsKLQkJCWVsc2UgaWYgKGUubG9jYXRpb24uaW5kZXhPZihBQ1RJT05fQkxBQ0spICE9IC0xKSBwbGF5ZXIgPSBCTEFDSzsKLQkJCWlmIChwbGF5ZXIgIT0gRU1QVFkpIHsKLQkJCQlpbnQgaW5kZXggPSBlLmxvY2F0aW9uLmluZGV4T2YoInh4IikgKyAyOwotCQkJCWludCB4ID0gSW50ZWdlci5wYXJzZUludChlLmxvY2F0aW9uLnN1YnN0cmluZyhpbmRleCwgaW5kZXggKyAxKSk7Ci0JCQkJaW5kZXggPSBlLmxvY2F0aW9uLmluZGV4T2YoInl5IikgKyAyOwotCQkJCWludCB5ID0gSW50ZWdlci5wYXJzZUludChlLmxvY2F0aW9uLnN1YnN0cmluZyhpbmRleCwgaW5kZXggKyAxKSk7Ci0JCQkJYm9vbGVhbiBoYXNNb3JlID0gYWRkKHgsIHksIHBsYXllcik7Ci0JCQkJaXNXaGl0ZSA9IHBsYXllciAhPSBXSElURTsKLQkJCQlicm93c2VyLnNldFRleHQoZ2V0SHRtbChoYXNNb3JlID8gVFlQRV9CT0FSRCA6IFRZUEVfQk9BUkRfT1ZFUikpOwotCQkJCWlmIChjb21wdXRlciAmJiBoYXNNb3JlICYmICFpc1doaXRlKSBwbGF5KGUuZGlzcGxheSwgYnJvd3NlciwgNTAwMCk7Ci0JCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQl9Ci0JCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlMSApIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGQoaW50IHgsIGludCB5LCBieXRlIGNvbG9yKSB7Ci0JCWdhbWVbeF1beV0gPSBjb2xvcjsKLQkJaW50IGNudCA9IE1hdGgubWluKHgsIHkpLCBuID0gMDsKLQkJaW50IG90aGVyX2NvbG9yID0gY29sb3IgPT0gV0hJVEUgPyBCTEFDSyA6IFdISVRFOwotCQlmb3IgKGludCBkID0gMTsgZCA8PSBjbnQ7IGQrKykgewotCQkJaWYgKGdhbWVbeC1kXVt5LWRdID09IG90aGVyX2NvbG9yKSBuKys7Ci0JCQllbHNlIGlmIChnYW1lW3gtZF1beS1kXSAhPSBjb2xvcikgYnJlYWs7Ci0JCQllbHNlIHsgaWYgKG4gPiAwKSBmb3IgKGQgPSAxOyBkIDw9IG47IGQrKykgZ2FtZVt4LWRdW3ktZF0gPSBjb2xvcjsgYnJlYWs7IH0KLQkJfQotCQljbnQgPSBNYXRoLm1pbihnYW1lLmxlbmd0aCAtIDEgLSB4LCBnYW1lWzBdLmxlbmd0aCAtIDEgLSB5KTsgbiA9IDA7Ci0JCWZvciAoaW50IGQgPSAxOyBkIDw9IGNudDsgZCsrKSB7Ci0JCQlpZiAoZ2FtZVt4K2RdW3krZF0gPT0gb3RoZXJfY29sb3IpIG4rKzsKLQkJCWVsc2UgaWYgKGdhbWVbeCtkXVt5K2RdICE9IGNvbG9yKSBicmVhazsKLQkJCWVsc2UgeyBpZiAobiA+IDApIGZvciAoZCA9IDE7IGQgPD0gbjsgZCsrKSBnYW1lW3grZF1beStkXSA9IGNvbG9yOyBicmVhazsgfQotCQl9Ci0JCWNudCA9IE1hdGgubWluKGdhbWUubGVuZ3RoIC0gMSAtIHgsIHkpOyBuID0gMDsKLQkJZm9yIChpbnQgZCA9IDE7IGQgPD0gY250OyBkKyspIHsKLQkJCWlmIChnYW1lW3grZF1beS1kXSA9PSBvdGhlcl9jb2xvcikgbisrOwotCQkJZWxzZSBpZiAoZ2FtZVt4K2RdW3ktZF0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeCtkXVt5LWRdID0gY29sb3I7IGJyZWFrOyB9Ci0JCX0KLQkJY250ID0gTWF0aC5taW4oeCwgZ2FtZVswXS5sZW5ndGggLSAxIC0geSk7IG4gPSAwOwotCQlmb3IgKGludCBkID0gMTsgZCA8PSBjbnQ7IGQrKykgewotCQkJaWYgKGdhbWVbeC1kXVt5K2RdID09IG90aGVyX2NvbG9yKSBuKys7Ci0JCQllbHNlIGlmIChnYW1lW3gtZF1beStkXSAhPSBjb2xvcikgYnJlYWs7Ci0JCQllbHNlIHsgaWYgKG4gPiAwKSBmb3IgKGQgPSAxOyBkIDw9IG47IGQrKykgZ2FtZVt4LWRdW3krZF0gPSBjb2xvcjsgYnJlYWs7IH0KLQkJfQotCQljbnQgPSB5OyBuID0gMDsKLQkJZm9yIChpbnQgZCA9IDE7IGQgPD0gY250OyBkKyspIHsKLQkJCWlmIChnYW1lW3hdW3ktZF0gPT0gb3RoZXJfY29sb3IpIG4rKzsKLQkJCWVsc2UgaWYgKGdhbWVbeF1beS1kXSAhPSBjb2xvcikgYnJlYWs7Ci0JCQllbHNlIHsgaWYgKG4gPiAwKSBmb3IgKGQgPSAxOyBkIDw9IG47IGQrKykgZ2FtZVt4XVt5LWRdID0gY29sb3I7IGJyZWFrOyB9Ci0JCX0KLQkJY250ID0gZ2FtZVswXS5sZW5ndGggLSAxIC0geTsgbiA9IDA7Ci0JCWZvciAoaW50IGQgPSAxOyBkIDw9IGNudDsgZCsrKSB7Ci0JCQlpZiAoZ2FtZVt4XVt5K2RdID09IG90aGVyX2NvbG9yKSBuKys7Ci0JCQllbHNlIGlmIChnYW1lW3hdW3krZF0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeF1beStkXSA9IGNvbG9yOyBicmVhazsgfQotCQl9Ci0JCWNudCA9IHg7IG4gPSAwOwotCQlmb3IgKGludCBkID0gMTsgZCA8PSBjbnQ7IGQrKykgewotCQkJaWYgKGdhbWVbeC1kXVt5XSA9PSBvdGhlcl9jb2xvcikgbisrOwotCQkJZWxzZSBpZiAoZ2FtZVt4LWRdW3ldICE9IGNvbG9yKSBicmVhazsKLQkJCWVsc2UgeyBpZiAobiA+IDApIGZvciAoZCA9IDE7IGQgPD0gbjsgZCsrKSBnYW1lW3gtZF1beV0gPSBjb2xvcjsgYnJlYWs7IH0KLQkJfQotCQljbnQgPSBnYW1lLmxlbmd0aCAtIDEgLSB4OyBuID0gMDsKLQkJZm9yIChpbnQgZCA9IDE7IGQgPD0gY250OyBkKyspIHsKLQkJCWlmIChnYW1lW3grZF1beV0gPT0gb3RoZXJfY29sb3IpIG4rKzsKLQkJCWVsc2UgaWYgKGdhbWVbeCtkXVt5XSAhPSBjb2xvcikgYnJlYWs7Ci0JCQllbHNlIHsgaWYgKG4gPiAwKSBmb3IgKGQgPSAxOyBkIDw9IG47IGQrKykgZ2FtZVt4K2RdW3ldID0gY29sb3I7IGJyZWFrOyB9Ci0JCX0KLQotCQlib29sZWFuIGhhc01vcmUgPSBmYWxzZTsKLQkJY250V2hpdGUgPSAwOyBjbnRCbGFjayA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2FtZS5sZW5ndGg7IGkrKykKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZ2FtZVswXS5sZW5ndGg7IGorKykgewotCQkJCXN3aXRjaCAoZ2FtZVtpXVtqXSkgewotCQkJCQljYXNlIEVNUFRZOiBoYXNNb3JlID0gdHJ1ZTsgYnJlYWs7Ci0JCQkJCWNhc2UgV0hJVEU6IGNudFdoaXRlKys7IGJyZWFrOwotCQkJCQljYXNlIEJMQUNLOiBjbnRCbGFjaysrOyBicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCXJldHVybiBoYXNNb3JlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcGxheShmaW5hbCBEaXNwbGF5IGRpc3BsYXksIGZpbmFsIEJyb3dzZXIgYnJvd3NlciwgaW50IGRlbGF5KSB7Ci0JCXR0ci5wbGF5UmVxdWVzdChnYW1lLCBCTEFDSyk7Ci0JCWRpc3BsYXkudGltZXJFeGVjKDMwMDAsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXR0ci5nZXRCZXN0TW92ZShtb3ZlKTsKLQkJCQkJYm9vbGVhbiBoYXNNb3JlID0gYWRkKG1vdmVbMF0sIG1vdmVbMV0sIEJMQUNLKTsKLQkJCQkJaXNXaGl0ZSA9IHRydWU7Ci0JCQkJCWJyb3dzZXIuc2V0VGV4dChnZXRIdG1sKGhhc01vcmUgPyBUWVBFX0JPQVJEIDogVFlQRV9CT0FSRF9PVkVSKSk7Ci0JCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjE0ZTE1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZDVlZTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRlNjQ0Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotCSAgICAgICAgICAgKi5qYXIKLQotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotCSAgICAgICAKLXNvdXJjZS5icm93c2VyZXhhbXBsZS5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9kb2MtaHRtbC9zd3RfYnJvd3Nlcl9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvZG9jLWh0bWwvc3d0X2Jyb3dzZXJfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY1ZTE4MS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9kb2MtaHRtbC9zd3RfYnJvd3Nlcl9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gQ29udHJvbHMgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIEJyb3dzZXI8L2gyPgotCi08cD4KLVRoZSBCcm93c2VyIEV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0LiAKLUl0IGNvbnNpc3RzIG9mIGEgY29tcG9zaXRlIGNvbnRhaW5pbmcgYSBCcm93c2VyIHdpZGdldCB0byByZW5kZXIgSFRNTCBhbmQgc29tZQotYWRkaXRpb25hbCB3aWRnZXRzIHRvIGltcGxlbWVudCBhY3Rpb25zIGNvbW1vbmx5IGZvdW5kIG9uIGJyb3dzZXJzICh0b29sYmFyCi13aXRoIGJhY2ssIGZvcndhcmQsIHJlZnJlc2ggYW5kIHN0b3AgYnV0dG9ucywgc3RhdHVzIGJhciBldGMuKS4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUuQnJvd3NlckV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkJyb3dzZXI8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9pY29ucy9icm93c2VyX2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvaWNvbnMvYnJvd3Nlcl9leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1ZTIyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9pY29ucy9icm93c2VyX2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5N2NmMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUQnJvd3NlckV4YW1wbGUubmFtZSA9IFNXVCBCcm93c2VyIEV4YW1wbGUgUGx1Z2luCi1jYXRlZ29yeS5TV1RFeGFtcGxlcy5uYW1lID0gU1dUIEV4YW1wbGVzCi12aWV3LkJyb3dzZXJFeGFtcGxlLm5hbWUgPSBXZWIgQnJvd3NlcgotCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSA9IFdvcmtiZW5jaCBWaWV3cwotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyB0aGF0IHJ1biBhcyBWaWV3cyBpbnNpZGUgdGhlIFdvcmtiZW5jaC4gIFwKLQlUaGVzZSBleGFtcGxlcyB3aWxsIGNyZWF0ZSBhIG5ldyBWaWV3IGluIHRoZSBjdXJyZW50IFBlcnNwZWN0aXZlLgotCi1sYXVuY2hpdGVtLkJyb3dzZXJFeGFtcGxlLm5hbWUgPSBXZWIgQnJvd3NlcgotbGF1bmNoaXRlbS5Ccm93c2VyRXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBpbnRlZ3JhdGUgYSBXZWIgQnJvd3NlciB3aXRoIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQuXG5cblwKLQlJdCBjb25zaXN0cyBvZiBhIGNvbXBvc2l0ZSBjb250YWluaW5nIGEgQnJvd3NlciB3aWRnZXQgdG8gcmVuZGVyIEhUTUwuIFwKLQlBZGRpdGlvbmFsIHdpZGdldHMgYWxsb3cgdGhlIHVzZXIgdG8gcGVyZm9ybSB0eXBpY2FsIGJyb3dzZXIgYWN0aW9ucyAoZm9yIGV4YW1wbGUsIG5hdmlnYXRlIHRvIGEgcGFydGljdWxhciBVUkwsIGdvIGJhY2ssIGZvcndhcmQsIHJlZnJlc2ggYW5kIHN0b3ApLgotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU1MzQ1OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlciIKLSAgIG5hbWU9IiVwbHVnaW4uU1dUQnJvd3NlckV4YW1wbGUubmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUuQnJvd3NlclBsdWdpbiI+Ci0KLTwhLS0gUnVudGltZSAtLT4KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iYnJvd3NlcmV4YW1wbGUuamFyIj4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLTwhLS0gUmVxdWlyZWQgcGx1Z2lucyAtLT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIvPgotICAgPC9yZXF1aXJlcz4KLQotCi08IS0tIEV4dGVuc2lvbiBwb2ludHMgLS0+Ci08IS0tIEV4dGVuc2lvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3LkJyb3dzZXJFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9icm93c2VyX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUuQnJvd3NlclZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlLnZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPGl0ZW0KLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkJyb3dzZXJFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9icm93c2VyX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uQnJvd3NlckV4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlLnZpZXdsYXVuY2hlciI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgdmlld0lkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUudmlldyI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2l0ZW0+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvaW1wb3J0LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvaW1wb3J0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNDFkYWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQZXJzaXN0IHByb2plY3Qgc2V0dGluZ3MgZm9yIGxhdGVyIGltcG9ydCAKLW5hdHVyZXMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlOyBvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlCi1idWlsZGVycyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcgotdmFyLkVDTElQU0VfUExVR0lOUyA9IDw8RUNMSVBTRV9QTFVHSU5TPj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvQnJvd3NlclBsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjE2MGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEJyb3dzZXJQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEJyb3dzZXJQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyVmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGY2Y2UwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvQnJvd3NlclZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLQotLyoqCi0gKiA8Y29kZT5Ccm93c2VyVmlldzwvY29kZT4gaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbgotICogb2YgdGhlIFNXVCBCcm93c2VyIHdpZGdldC4gIEl0IGNvbnNpc3RzIG9mIGEgd29ya2JlbmNoCi0gKiB2aWV3IGFuZCB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZQotICogdXNlciB0byBpbnRlcmFjdCB3aXRoIGEgY29udHJvbC4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NlclZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JQnJvd3NlckV4YW1wbGUgaW5zdGFuY2UgPSBudWxsOwotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZXhhbXBsZQotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgZnJhbWUpIHsKLQkJaW5zdGFuY2UgPSBuZXcgQnJvd3NlckV4YW1wbGUoZnJhbWUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaW5zdGFuY2UuZm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgVmlldyBpcyB0byBiZSBkaXNwb3NlZAotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbnN0YW5jZS5kaXNwb3NlKCk7Ci0JCWluc3RhbmNlID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGM2OGViLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDVjNzZmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotCSAgICAgICAgICAgKi5qYXIKLQotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotCSAgICAgICAKLXNvdXJjZS5jb250cm9scy5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvZG9jLWh0bWwvc3d0X2NvbnRyb2xzX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvZG9jLWh0bWwvc3d0X2NvbnRyb2xzX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5NDYzMDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2RvYy1odG1sL3N3dF9jb250cm9sc19leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gQ29udHJvbHMgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIENvbnRyb2xzPC9oMj4KLQotPHA+Ci1UaGUgQ29udHJvbHMgRXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIGNvbW1vbiBTV1QgY29udHJvbHMuIAotSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZSB1c2VyIAotdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBjb250cm9sLgotVGhlIHVzZXIgY2FuIGNoYW5nZSBzdHlsZXMgYW5kIHNldHRpbmdzIGFuZCB2aWV3IGhvdyB0aGlzIGFmZmVjdHMgZWFjaCBjb250cm9sLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZS5Db250cm9sRXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+Q29udHJvbHM8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9kb2MtaHRtbC9zd3RfY3VzdG9tY29udHJvbHNfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9kb2MtaHRtbC9zd3RfY3VzdG9tY29udHJvbHNfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiMGQyNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvZG9jLWh0bWwvc3d0X2N1c3RvbWNvbnRyb2xzX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBDb250cm9scyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gQ3VzdG9tIENvbnRyb2xzPC9oMj4KLQotPHA+Ci1UaGUgQ3VzdG9tIENvbnRyb2xzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBlbXVsYXRlZCBTV1QgY29udHJvbHMuIAotSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZSB1c2VyIAotdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBlbXVsYXRlZCBjb250cm9sLgotVGhlIHVzZXIgY2FuIGNoYW5nZSBzdHlsZXMgYW5kIHNldHRpbmdzIGFuZCB2aWV3IGhvdyB0aGlzIGFmZmVjdHMgZWFjaCBjb250cm9sLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZS5DdXN0b21Db250cm9sRXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+Q3VzdG9tIENvbnRyb2xzPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvaWNvbnMvY29udHJvbHNfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvaWNvbnMvY29udHJvbHNfZXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiZGVlOTcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2ljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDdjMGNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUQ29udHJvbHNFeGFtcGxlLm5hbWUgPSBTV1QgQ29udHJvbHMgRXhhbXBsZSBQbHVnaW4KLWNhdGVnb3J5LlNXVEV4YW1wbGVzLm5hbWUgPSBTV1QgRXhhbXBsZXMKLXZpZXcuQ29udHJvbHNFeGFtcGxlLm5hbWUgPSBTV1QgQ29udHJvbHMKLXZpZXcuQ3VzdG9tQ29udHJvbHNFeGFtcGxlLm5hbWUgPSBTV1QgQ3VzdG9tIENvbnRyb2xzCi0KLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lID0gV29ya2JlbmNoIFZpZXdzCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24gPSBcCi0JQSBjb2xsZWN0aW9uIG9mIFN0YW5kYXJkIFdpZGdldCBUb29sa2l0IGV4YW1wbGVzIHRoYXQgcnVuIGFzIFZpZXdzIGluc2lkZSB0aGUgV29ya2JlbmNoLiAgXAotCVRoZXNlIGV4YW1wbGVzIHdpbGwgY3JlYXRlIGEgbmV3IFZpZXcgaW4gdGhlIGN1cnJlbnQgUGVyc3BlY3RpdmUuCi0KLWxhdW5jaGl0ZW0uQ29udHJvbHNFeGFtcGxlLm5hbWUgPSBDb250cm9scwotbGF1bmNoaXRlbS5Db250cm9sc0V4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgbmF0aXZlIFNXVCBjb250cm9scy5cblxuXAotCUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBhbGxvd3MgdGhlIHVzZXIgXAotCXRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgU1dUIGNvbnRyb2wuIFwKLQlUaGUgdXNlciBjYW4gY2hhbmdlIHN0eWxlcyBhbmQgc2V0dGluZ3MgYW5kIHZpZXcgaG93IHRoaXMgYWZmZWN0cyB0aGUgY29udHJvbC4KLQkKLWxhdW5jaGl0ZW0uQ3VzdG9tQ29udHJvbHNFeGFtcGxlLm5hbWUgPSBDdXN0b20gQ29udHJvbHMKLWxhdW5jaGl0ZW0uQ3VzdG9tQ29udHJvbHNFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIGN1c3RvbSBTV1QgY29udHJvbHMuXG5cblwKLQlJdCBjb25zaXN0cyBvZiBhIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgYWxsb3dzIHRoZSB1c2VyIFwKLQl0byBpbnRlcmFjdCB3aXRoIGEgZGlmZmVyZW50IFNXVCBjdXN0b20gY29udHJvbC4gXAotCVRoZSB1c2VyIGNhbiBjaGFuZ2Ugc3R5bGVzIGFuZCBzZXR0aW5ncyBhbmQgdmlldyBob3cgdGhpcyBhZmZlY3RzIHRoZSBjb250cm9sLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjY0OTQ4My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzIgotICAgbmFtZT0iJXBsdWdpbi5TV1RDb250cm9sc0V4YW1wbGUubmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMuQ29udHJvbFBsdWdpbiI+Ci0KLTwhLS0gUnVudGltZSAtLT4KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iY29udHJvbHMuamFyIj4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLTwhLS0gUmVxdWlyZWQgcGx1Z2lucyAtLT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIvPgotICAgPC9yZXF1aXJlcz4KLQotCi08IS0tIEV4dGVuc2lvbiBwb2ludHMgLS0+Ci08IS0tIEV4dGVuc2lvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3LkNvbnRyb2xzRXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvY29udHJvbHNfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy5Db250cm9sVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMudmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iJXZpZXcuQ3VzdG9tQ29udHJvbHNFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9jb250cm9sc19leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLkN1c3RvbUNvbnRyb2xWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jdXN0b21jb250cm9scy52aWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxpdGVtCi0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5Db250cm9sc0V4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkNvbnRyb2xzRXhhbXBsZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy52aWV3bGF1bmNoZXIiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLnZpZXciPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9pdGVtPgotICAgICAgPGl0ZW0KLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvY29udHJvbHNfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uQ3VzdG9tQ29udHJvbHNFeGFtcGxlLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmN1c3RvbWNvbnRyb2xzLnZpZXdsYXVuY2hlciI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgdmlld0lkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY3VzdG9tY29udHJvbHMudmlldyI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2l0ZW0+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9pbXBvcnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0MWRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQZXJzaXN0IHByb2plY3Qgc2V0dGluZ3MgZm9yIGxhdGVyIGltcG9ydCAKLW5hdHVyZXMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlOyBvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlCi1idWlsZGVycyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcgotdmFyLkVDTElQU0VfUExVR0lOUyA9IDw8RUNMSVBTRV9QTFVHSU5TPj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0NvbnRyb2xQbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0NvbnRyb2xQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWViNmQ1NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9Db250cm9sUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIENvbnRyb2xQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbHMvQ29udHJvbFZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0NvbnRyb2xWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhOTUzMjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbHMvQ29udHJvbFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHM7Ci0KLSAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLQotLyoqCi0gKiA8Y29kZT5Db250cm9sczwvY29kZT4gaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbgotICogb2YgdGhlIG5hdGl2ZSBjb250cm9scyBkZWZpbmVkIGJ5IFNXVC4gIEl0IGNvbnNpc3RzIG9mIGEgd29ya2JlbmNoCi0gKiB2aWV3IGFuZCB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZQotICogdXNlciB0byBpbnRlcmFjdCB3aXRoIGEgY29udHJvbC4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbFZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UgPSBudWxsOwotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZXhhbXBsZQotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgZnJhbWUpIHsKLQkJaW5zdGFuY2UgPSBuZXcgQ29udHJvbEV4YW1wbGUoZnJhbWUpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaW5zdGFuY2Uuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgVmlldyBpcyB0byBiZSBkaXNwb3NlZAotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbnN0YW5jZS5kaXNwb3NlKCk7Ci0JCWluc3RhbmNlID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0N1c3RvbUNvbnRyb2xWaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9DdXN0b21Db250cm9sVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTQzMDJkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0N1c3RvbUNvbnRyb2xWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIDxjb2RlPkN1c3RvbUNvbnRyb2xzPC9jb2RlPiBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uCi0gKiBvZiB0aGUgY3VzdG9tIGNvbnRyb2xzIGRlZmluZWQgYnkgU1dULiAgSXQgY29uc2lzdHMgb2YgYSB3b3JrYmVuY2gKLSAqIHZpZXcgYW5kIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgaW4gdGhlIGZvbGRlciBhbGxvd3MgdGhlCi0gKiB1c2VyIHRvIGludGVyYWN0IHdpdGggYSBjb250cm9sLgotICogCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21Db250cm9sVmlldyBleHRlbmRzIENvbnRyb2xWaWV3IHsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZXhhbXBsZQotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgZnJhbWUpIHsKLQkJaW5zdGFuY2UgPSBuZXcgQ3VzdG9tQ29udHJvbEV4YW1wbGUoZnJhbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGNjN2ZmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTllNDk4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZG9jLyxcCi0gICAgICAgICAgICAgICBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLQkgICAgICAgICAgICouamFyCi0JICAgICAgICAgICAKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLQotc291cmNlLmxhdW5jaGVyLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjVmNGY4Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBFeGFtcGxlIExhdW5jaGVyPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIEV4YW1wbGUgTGF1bmNoZXI8L2gyPgotCi08cD4KLVRoZSBFeGFtcGxlIExhdW5jaGVyIGlzIHVzZWQgdG8gbGF1bmNoIFNXVCBleGFtcGxlcywgd2hpY2ggY2FuIGVpdGhlciBiZSBXb3JrYmVuY2ggdmlld3MgCi1vciBzdGFuZGFsb25lIGFwcGxpY2F0aW9ucy4KLTwvcD4KLQotPHVsPgotPGxpPldvcmtiZW5jaCB2aWV3cyBhcmUgZXhhbXBsZXMgdGhhdCBhcmUgaW50ZWdyYXRlZCBpbnRvIEVjbGlwc2UuICBXaGVuIHRoZSBsYXVuY2hlcgotc3RhcnRzIGEgV29ya2JlbmNoIHZpZXcsIGl0IGlzIG9wZW5lZCBpbiB0aGUgY3VycmVudGx5IGFjdGl2ZSBwZXJzcGVjdGl2ZS4KLTxsaT5TdGFuZGFsb25lIGFwcGxpY2F0aW9ucyBhcmUgbGF1bmNoZWQgaW4gYSBzZXBhcmF0ZSB3aW5kb3cuCi08L3VsPgotCi08cD4KLUZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gcnVuIHRoZSBzdGFuZGFsb25lIGV4YW1wbGVzIHdpdGhvdXQgdGhlIFNXVCBFeGFtcGxlIExhdW5jaGVyLCAKLXJlZmVyIHRvIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPi4KLTwvcD4KLTxwPgotVGhlIFNXVCBXb3JrYmVuY2ggdmlldyBleGFtcGxlcyBjYW4gYWxzbyBiZSBsYXVuY2hlZCBkaXJlY3RseSB3aXRob3V0IHVzaW5nIHRoZSBTV1QgRXhhbXBsZSAKLUxhdW5jaGVyLiAgU1dUIFdvcmtiZW5jaCB2aWV3IGV4YW1wbGVzIGNhbiBiZSBmb3VuZCB1bmRlciB0aGUgPHN0cm9uZz5TV1QgRXhhbXBsZXM8L3N0cm9uZz4gY2F0ZWdvcnkgb2YgdGhlIAotPHN0cm9uZz5TaG93IFZpZXdzPC9zdHJvbmc+IGRpYWxvZy4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIEV4YW1wbGUgTGF1bmNoZXI8L2gzPgotCi08cD4KLUZyb20gRWNsaXBzZSdzIDxzdHJvbmc+V2luZG93PC9zdHJvbmc+IG1lbnUsIHNlbGVjdCA8c3Ryb25nPlNob3cgVmlldyAmZ3Q7IE90aGVyPC9zdHJvbmc+LiAKLUluIHRoZSA8c3Ryb25nPlNob3cgVmlldzwvc3Ryb25nPiBkaWFsb2csIGV4cGFuZCA8c3Ryb25nPlNXVCBFeGFtcGxlczwvc3Ryb25nPiBhbmQgc2VsZWN0IHRoZSA8c3Ryb25nPlNXVCBFeGFtcGxlIExhdW5jaGVyPC9zdHJvbmc+IHZpZXcuIAotQSB2aWV3IGNvbnRhaW5pbmcgYSBsaXN0IG9mIGV4YW1wbGVzIHdpbGwgYXBwZWFyIGluIHlvdXIgY3VycmVudCBwZXJzcGVjdGl2ZS4KLVdoZW4geW91IHNlbGVjdCBhbiBleGFtcGxlIGZyb20gdGhlIGxpc3QgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgZXhhbXBsZSBpcyBkaXNwbGF5ZWQuCi1DbGljayBvbiB0aGUgPHN0cm9uZz5SdW48L3N0cm9uZz4gYnV0dG9uIHRvIGxhdW5jaCB0aGUgZXhhbXBsZS4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2Mvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlZGY5MTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08SEVBRD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9IRUFEPgotPEhUTUw+Ci08Qk9EWT4KLTxIMT48Q0VOVEVSPkxhdW5jaCBJdGVtczwvQ0VOVEVSPjwvSDE+Ci08SDI+SWRlbnRpZmllcjwvSDI+Ci1vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXM8SDI+RGVzY3JpcHRpb248L0gyPgotVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBhZGQgJ3N0YW5kYWxvbmUgcHJvZ3JhbScgYW5kCi0nV29ya2JlbmNoIHZpZXcnCi1sYXVuY2ggaXRlbXMgdG8gdGhlIExhdW5jaGVyLCBvcHRpb25hbGx5IGdyb3VwaW5nIHRoZW0gaW50bwotY2F0ZWdvcmllcyBzbyBhcyB0byBmb3JtIGEgbXVsdGktdGllcmVkIGhpZXJhcmNoeS4KLVN0YW5kYWxvbmUgcHJvZ3JhbXMgYXJlIGV4ZWN1dGVkIHVzaW5nIHRoZSBwbGF0Zm9ybSdzIGV2ZW50IGxvb3AuCi1Xb3JrYmVuY2ggdmlld3MgYXJlIGNyZWF0ZWQgd2l0aGluIHRoZSBhY3RpdmUgV29ya2JlbmNoIFBlcnNwZWN0aXZlLjxIMj5NYXJrdXA8L0gyPgotPHA+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshRUxFTUVOVCBleHRlbnNpb24gRU1QVFkmZ3Q7PC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyAmbHQ7IUFUVExJU1QgZXh0ZW5zaW9uPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3BvaW50Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2lkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7bmFtZSZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyAmZ3Q7PC9zYW1wPgotPHVsPgotPGxpPjxiPnBvaW50PC9iPiAtIDwvbGk+PGxpPjxiPmlkPC9iPiAtIDwvbGk+PGxpPjxiPm5hbWU8L2I+IC0gPC9saT48L3VsPgotPHA+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshRUxFTUVOVCBwcm9ncmFtIEVNUFRZJmd0Ozwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFBVFRMSVNUIHByb2dyYW08L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7bWFpbkNsYXNzJm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3BsdWdpbklkJm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyAmZ3Q7PC9zYW1wPgotPHVsPgotPGxpPjxiPm1haW5DbGFzczwvYj4gLSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHdob3NlIG1haW4oKSBtZXRob2QgaXMgdG8gYmUgbGF1bmNoZWQuPC9saT48bGk+PGI+cGx1Z2luSWQ8L2I+IC0gVGhlIHVuaXF1ZSBpZCBvZiB0aGUgRWNsaXBzZSBQbGF0Zm9ybSBwbHVnaW4gY29udGFpbmluZyB0aGUgcHJvZ3JhbS48L2xpPjwvdWw+Ci08cD48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFFTEVNRU5UIHZpZXcgRU1QVFkmZ3Q7PC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyAmbHQ7IUFUVExJU1Qgdmlldzwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt2aWV3SWQmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZndDs8L3NhbXA+Ci08dWw+Ci08bGk+PGI+dmlld0lkPC9iPiAtIFRoZSB1bmlxdWUgaWQgb2YgdGhlIFdvcmtiZW5jaCBWaWV3IHRvIGJlIGFjdGl2YXRlZCB3aGVuIHRoZSBpdGVtIGlzIGxhdW5jaGVkLjwvbGk+PC91bD4KLTxwPjxzYW1wPiZuYnNwOyZuYnNwOyAmbHQ7IUVMRU1FTlQgY2F0ZWdvcnkgRU1QVFkmZ3Q7PC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyAmbHQ7IUFUVExJU1QgY2F0ZWdvcnk8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7bmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtpZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtjYXRlZ29yeSZuYnNwO0NEQVRBICNJTVBMSUVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyAmZ3Q7PC9zYW1wPgotPHVsPgotPGxpPjxiPm5hbWU8L2I+IC0gVGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgY2F0ZWdvcnkuPC9saT48bGk+PGI+aWQ8L2I+IC0gVGhlIHVuaXF1ZSBpZCBvZiB0aGlzIGNhdGVnb3J5LiAgQ2F0ZWdvcmllcyB3aXRoIGR1cGxpY2F0ZSBpZCdzIHdpbGwgYmUgZGlzY2FyZGVkLjwvbGk+PGxpPjxiPmNhdGVnb3J5PC9iPiAtIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHBhcmVudCBjYXRlZ29yeS48L2xpPjwvdWw+Ci08cD48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFFTEVNRU5UIGl0ZW0gRU1QVFkmZ3Q7PC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyAmbHQ7IUFUVExJU1QgaXRlbTwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtuYW1lJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2lkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2NhdGVnb3J5Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7aWNvbiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2VuYWJsZWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsodHJ1ZSB8IGZhbHNlKSAiZmFsc2UiInRydWUiPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2Rlc2NyaXB0aW9uJm5ic3A7Q0RBVEEgI0lNUExJRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZndDs8L3NhbXA+Ci08dWw+Ci08bGk+PGI+bmFtZTwvYj4gLSBUaGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyBsYXVuY2ggaXRlbS48L2xpPjxsaT48Yj5pZDwvYj4gLSBUaGUgdW5pcXVlIGlkIG9mIHRoaXMgbGF1bmNoIGl0ZW0uIExhdW5jaCBpdGVtcyB3aXRoIGR1cGxpY2F0ZSBpZCdzIHdpbGwgYmUgZGlzY2FyZGVkLjwvbGk+PGxpPjxiPmNhdGVnb3J5PC9iPiAtIFRoZSB1bmlxdWUgaWQgb2YgdGhlIGNhdGVnb3J5IHRoaXMgbGF1bmNoIGl0ZW0gYmVsb25ncyB0by48L2xpPjxsaT48Yj5pY29uPC9iPiAtIFRoZSBkZWNsYXJpbmcgcGx1Z2luIHJlbGF0aXZlIHBhdGggb2YgYW4gaWNvbiB0byBkaXNwbGF5IHdpdGggdGhpcyBsYXVuY2ggaXRlbSBpbiB0aGUgTGF1bmNoZXIuPC9saT48bGk+PGI+ZW5hYmxlZDwvYj4gLSBTZXQgdG8gImZhbHNlIiB0byBkaXNhYmxlIHRoaXMgbGF1bmNoIGl0ZW0sIG9yIHRvICJ0cnVlIiB0byBlbmFibGUgaXQgKGRlZmF1bHQpLjwvbGk+PGxpPjxiPmRlc2NyaXB0aW9uPC9iPiAtIFRoZSBsb2NhbGl6ZWQgcGxhaW4tdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGlzIGxhdW5jaCBpdGVtLjwvbGk+PC91bD4KLTxIMj5FeGFtcGxlPC9IMj4KLTxIMj5BUEkgSW5mb3JtYXRpb248L0gyPgotPEgyPlN1cHBsaWVkIEltcGxlbWVudGF0aW9uPC9IMj4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9jbG9zZWRGb2xkZXIuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL2Nsb3NlZEZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJlYjZlZDEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL2Nsb3NlZEZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvZ2VuZXJpY19leGFtcGxlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9nZW5lcmljX2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOWZiNmIwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9nZW5lcmljX2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL2xhdW5jaGVyX2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL2xhdW5jaGVyX2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYWI0ZDMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9sYXVuY2hlcl9leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9vcGVuRm9sZGVyLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9vcGVuRm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTljNzc3MzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL29wZW5Gb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YTAzYWExLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUTGF1bmNoZXJFeGFtcGxlLm5hbWUgPSBTV1QgTGF1bmNoZXIgRXhhbXBsZSBQbHVnaW4KLWNhdGVnb3J5LlNXVEV4YW1wbGVzLm5hbWUgPSBTV1QgRXhhbXBsZXMKLXZpZXcuTGF1bmNoZXJFeGFtcGxlLm5hbWUgPSBTV1QgRXhhbXBsZSBMYXVuY2hlcgotCi1leHRlbnNpb24tcG9pbnQubGF1bmNoSXRlbXMubmFtZSA9IExhdW5jaCBJdGVtcwotCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSA9IFdvcmtiZW5jaCBWaWV3cwotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyB0aGF0IHJ1biBhcyBWaWV3cyBpbnNpZGUgdGhlIFdvcmtiZW5jaC4gIFwKLQlUaGVzZSBleGFtcGxlcyB3aWxsIGNyZWF0ZSBhIG5ldyBWaWV3IGluIHRoZSBjdXJyZW50IFBlcnNwZWN0aXZlLgotCi1sYXVuY2hpdGVtLkxhdW5jaGVyRXhhbXBsZS5uYW1lID0gTGF1bmNoZXIKLWxhdW5jaGl0ZW0uTGF1bmNoZXJFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoZSBFeGFtcGxlIExhdW5jaGVyIGlzIHVzZWQgdG8gbGF1bmNoIFNXVCBleGFtcGxlcyB3aGljaCBjYW4gZWl0aGVyIGJlIFwKLQlXb3JrYmVuY2ggVmlld3MsIG9yIFN0YW5kYWxvbmUgYXBwbGljYXRpb25zLlxuXG5cCi0JV29ya2JlbmNoIFZpZXdzIGFyZSBleGFtcGxlcyB0aGF0IGFyZSBpbnRlZ3JhdGVkIGludG8gRWNsaXBzZS4gIFdoZW4gdGhlIExhdW5jaGVyIFwKLQlzdGFydHMgYSBXb3JrYmVuY2ggVmlldywgaXQgaXMgb3BlbmVkIGluIHRoZSBjdXJyZW50bHkgYWN0aXZlIHBlcnNwZWN0aXZlLlxuXG5cCi0JU3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMgYXJlIGxhdW5jaGVkIGluIGEgc2VwYXJhdGUgd2luZG93LgotCi1lcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMgPSBVbmFibGUgdG8gbG9hZCByZXNvdXJjZXMKLWVycm9yLkNvdWxkTm90RmluZFJlZ2lzdGVyZWRFeHRlbnNpb25zID0gQ291bGQgTm90IEZpbmQgUmVnaXN0ZXJlZCBFeHRlbnNpb25zCi1lcnJvci5JbmNvbXBsZXRlUHJvZ3JhbUxhdW5jaEl0ZW0gPSBJbmNvbXBsZXRlIFhNTCBQcm9ncmFtTGF1bmNoSXRlbSBkZWZpbml0aW9uLCBpZCA9IHswfQotZXJyb3IuSW5jb21wbGV0ZVZpZXdMYXVuY2hJdGVtID0gSW5jb21wbGV0ZSBYTUwgVmlld0xhdW5jaEl0ZW0gZGVmaW5pdGlvbiwgaWQgPSB7MH0KLWVycm9yLkluY29tcGxldGVMYXVuY2hJdGVtID0gSW5jb21wbGV0ZSBvciB1bnJlY29nbml6ZWQgWE1MIExhdW5jaEl0ZW0gZGVmaW5pdGlvbiwgaWQgPSB7MH0KLQotbGF1bmNoaXRlbS5OdWxsLmRlc2NyaXB0aW9uID0gPDxubyBpdGVtIHNlbGVjdGVkPj4KLQotbGF1bmNoaXRlbS5NaXNzaW5nLm5hbWUgPSA8PHVubmFtZWQ+PgotbGF1bmNoaXRlbS5NaXNzaW5nLmRlc2NyaXB0aW9uID0gPDxubyBkZXNjcmlwdGlvbiBhdmFpbGFibGU+PgotCi12aWV3LmxhdW5jaEdyb3VwLnRleHQgPSBFeGFtcGxlcwotdmlldy5sYXVuY2hCdXR0b24udGV4dCA9IFJ1bgotdmlldy5kZXNjcmlwdGlvbkdyb3VwLnRleHQgPSBEZXNjcmlwdGlvbgotCi1ydW4uZXJyb3IuSW52b2NhdGlvbiA9IEEgZmF0YWwgZXJyb3Igb2NjdXJyZWQgd2hpbGUgbGF1bmNoaW5nIHRoZSBwcm9ncmFtLgotcnVuLmVycm9yLkRvZXNOb3RJbXBsZW1lbnRNZXRob2QgPSBUaGUgY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcGVuKCkgbWV0aG9kLgotcnVuLmVycm9yLkNvdWxkTm90RmluZENsYXNzID0gQ291bGQgbm90IGZpbmQgdGhlIGNsYXNzIHRvIHJ1bi4KLXJ1bi5lcnJvci5Db3VsZE5vdEluc3RhbnRpYXRlQ2xhc3MgPSBDb3VsZCBub3QgaW5zdGFudGlhdGUgdGhlIGNsYXNzIHRvIHJ1bi4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwMjgxYjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlciIKLSAgIG5hbWU9IiVwbHVnaW4uU1dUTGF1bmNoZXJFeGFtcGxlLm5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLkxhdW5jaGVyUGx1Z2luIj4KLQotPCEtLSBSdW50aW1lIC0tPgotPCEtLSBSdW50aW1lIC0tPgotPCEtLSBSdW50aW1lIC0tPgotPCEtLSBSdW50aW1lIC0tPgotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJsYXVuY2hlci5qYXIiPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotPCEtLSBSZXF1aXJlZCBwbHVnaW5zIC0tPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuYm9vdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLTwhLS0gRXh0ZW5zaW9uIHBvaW50cyAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImxhdW5jaEl0ZW1zIiBuYW1lPSIlZXh0ZW5zaW9uLXBvaW50LmxhdW5jaEl0ZW1zLm5hbWUiIHNjaGVtYT0ic2NoZW1hL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcy5leHNkIi8+Ci0KLTwhLS0gRXh0ZW5zaW9ucyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJhcHBsaWNhdGlvbiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWNhdGVnb3J5LlNXVEV4YW1wbGVzLm5hbWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5Ij4KLSAgICAgIDwvY2F0ZWdvcnk+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+IDApIHsKLQkJCW5vZGUubmV4dFNpYmxpbmcgPSBmaXJzdENoaWxkOwotCQkJZmlyc3RDaGlsZCA9IG5vZGU7Ci0JCX0gZWxzZSB7Ci0JCQlJdGVtVHJlZU5vZGUgY3Vyc29yOwotCQkJZm9yIChjdXJzb3IgPSBmaXJzdENoaWxkOyBjdXJzb3IubmV4dFNpYmxpbmcgIT0gbnVsbDsgY3Vyc29yID0gY3Vyc29yLm5leHRTaWJsaW5nKSB7Ci0JCQkJSXRlbVRyZWVOb2RlIHNpYmxpbmcgPSBjdXJzb3IubmV4dFNpYmxpbmc7Ci0JCQkJaWYgKHNpYmxpbmcuZGVzY3JpcHRvci5nZXROYW1lKCkuY29tcGFyZVRvKG5vZGUuZGVzY3JpcHRvci5nZXROYW1lKCkpID4gMCkgYnJlYWs7Ci0JCQl9Ci0JCQlub2RlLm5leHRTaWJsaW5nID0gY3Vyc29yLm5leHRTaWJsaW5nOwotCQkJY3Vyc29yLm5leHRTaWJsaW5nID0gbm9kZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGZvciB0aGlzIG5vZGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBJdGVtRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXh0IHNpYmxpbmcgb2YgdGhpcyBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5leHQgc2libGluZywgb3IgbnVsbCBpZiBub25lCi0JICovCi0JcHVibGljIEl0ZW1UcmVlTm9kZSBnZXROZXh0U2libGluZygpIHsKLQkJcmV0dXJuIG5leHRTaWJsaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIG9mIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBjaGlsZCwgb3IgbnVsbCBpZiBub25lCi0JICovCi0JcHVibGljIEl0ZW1UcmVlTm9kZSBnZXRGaXJzdENoaWxkKCkgewotCQlyZXR1cm4gZmlyc3RDaGlsZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9MYXVuY2hlclBsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvTGF1bmNoZXJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTFlZjMzNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9MYXVuY2hlclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXI7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hlclBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBMYXVuY2hlclBsdWdpbiBwbHVnaW47Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwotCQlMQVVOQ0hfSVRFTVNfUE9JTlRfSUQgPSAib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9DQVRFR09SWSA9ICJjYXRlZ29yeSIsCi0JCUxBVU5DSF9JVEVNU19YTUxfSVRFTSA9ICJpdGVtIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9JVEVNX0lDT04gPSAiaWNvbiIsCi0JCUxBVU5DSF9JVEVNU19YTUxfSVRFTV9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiIsCi0JCUxBVU5DSF9JVEVNU19YTUxfUFJPR1JBTSA9ICJwcm9ncmFtIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9QUk9HUkFNX1BMVUdJTiA9ICJwbHVnaW5JZCIsCi0JCUxBVU5DSF9JVEVNU19YTUxfUFJPR1JBTV9DTEFTUyA9ICJtYWluQ2xhc3MiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX1ZJRVcgPSAidmlldyIsCi0JCUxBVU5DSF9JVEVNU19YTUxfVklFV19WSUVXSUQgPSAidmlld0lkIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfSUQgPSAiaWQiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9OQU1FID0gIm5hbWUiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9FTkFCTEVEID0gImVuYWJsZWQiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9DQVRFR09SWSA9ICJjYXRlZ29yeSIsCi0JCUxBVU5DSF9JVEVNU19YTUxfVkFMVUVfVFJVRSA9ICJ0cnVlIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9WQUxVRV9GQUxTRSA9ICJmYWxzZSI7CQkKLQotCXN0YXRpYyBmaW5hbCBpbnQKLQkJbGlDbG9zZWRGb2xkZXIgPSAwLAotCQlsaU9wZW5Gb2xkZXIgPSAxLAotCQlsaUdlbmVyaWNFeGFtcGxlID0gMjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gaW1hZ2VMb2NhdGlvbnMgPSB7Ci0JCSJpY29ucy9jbG9zZWRGb2xkZXIuZ2lmIiwKLQkJImljb25zL29wZW5Gb2xkZXIuZ2lmIiwKLQkJImljb25zL2dlbmVyaWNfZXhhbXBsZS5naWYiIH07Ci0Jc3RhdGljIEltYWdlIGltYWdlc1tdOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyB0aGUgTGF1bmNoZXJQbHVnaW4uCi0JICovCi0JcHVibGljIExhdW5jaGVyUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKGdldEJ1bmRsZSgpKTsKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogQ2xlYW4gdXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZyZWVSZXNvdXJjZXMoKTsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBMYXVuY2hlclBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSByZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdFJlc291cmNlcygpIHsKLQkJaWYgKGltYWdlcyA9PSBudWxsKSB7Ci0JCQlpbWFnZXMgPSBuZXcgSW1hZ2VbaW1hZ2VMb2NhdGlvbnMubGVuZ3RoXTsKLQkJCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VMb2NhdGlvbnMubGVuZ3RoOyArK2kpIHsKLQkJCQlpbWFnZXNbaV0gPSBnZXRJbWFnZUZyb21QbHVnaW4ocGx1Z2luLmdldEJ1bmRsZSgpLCBpbWFnZUxvY2F0aW9uc1tpXSk7Ci0JCQkJaWYgKGltYWdlc1tpXSA9PSBudWxsKSB7Ci0JCQkJCWZyZWVSZXNvdXJjZXMoKTsKLQkJCQkJbG9nRXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIpLCBudWxsKTsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfQkKLQl9Ci0KLQkvKioKLQkgKiBGcmVlcyB0aGUgcmVzb3VyY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyZWVSZXNvdXJjZXMoKSB7Ci0JCWlmIChpbWFnZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyArK2kpIHsKLQkJCQlmaW5hbCBJbWFnZSBpbWFnZSA9IGltYWdlc1tpXTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQkJaW1hZ2VzID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvZyBhbiBlcnJvciB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgdGV4dAotCSAqIEBwYXJhbSBleGNlcHRpb24gdGhlIGFzc29jaWF0ZWQgZXhjZXB0aW9uLCBvciBudWxsCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXBsdWdpbi5nZXRMb2coKS5sb2cobmV3IFN0YXR1cygKLQkJCUlTdGF0dXMuRVJST1IsIHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgYW5kIGJpbmRzIGl0Ci0JICogd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwKLQkgKiByZXR1cm4gdGhlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9Ci0JfQotCi0JLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGxpc3Qgb2YgYXZhaWxhYmxlIHByb2dyYW1zIGZyb20gcmVnaXN0ZXJlZCBleHRlbnNpb25zLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gSXRlbVRyZWVOb2RlIHJlcHJlc2VudGluZyB0aGUgcm9vdCBvZiBhIHRyZWUgb2YgaXRlbXMgKHRoZSByb290IGlzIG5vdCB0byBiZSBkaXNwbGF5ZWQpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVtVHJlZU5vZGUgZ2V0TGF1bmNoSXRlbVRyZWUoKSB7Ci0JCUl0ZW1UcmVlTm9kZSBjYXRlZ29yeVRyZWUgPQotCQkJbmV3IEl0ZW1UcmVlTm9kZShuZXcgSXRlbURlc2NyaXB0b3IoIjw8Um9vdD4+IiwgIjw8Um9vdD4+IiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCi0JCS8vIGdldCB0aGUgcGxhdGZvcm0ncyBwdWJsaWMgcGx1Z2luIHJlZ2lzdHJ5Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCS8vIHJldHJpZXZlIGFsbCBjb25maWd1cmF0aW9uIGVsZW1lbnRzIHJlZ2lzdGVyZWQgYXQgb3VyIGxhdW5jaEl0ZW1zIGV4dGVuc2lvbi1wb2ludAotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWd1cmF0aW9uRWxlbWVudHMgPQotCQkJZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKExBVU5DSF9JVEVNU19QT0lOVF9JRCk7Ci0JCQkKLQkJaWYgKGNvbmZpZ3VyYXRpb25FbGVtZW50cyA9PSBudWxsIHx8IGNvbmZpZ3VyYXRpb25FbGVtZW50cy5sZW5ndGggPT0gMCkgewotCQkJbG9nRXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90RmluZFJlZ2lzdGVyZWRFeHRlbnNpb25zIiksIG51bGwpOwotCQkJcmV0dXJuIGNhdGVnb3J5VHJlZTsKLQkJfQotCQkKLQkJLyogQ29sbGVjdCBhbGwgbGF1bmNoIGNhdGVnb3JpZXMgLS0gY29hbGVzY2UgdGhvc2Ugd2l0aCBzYW1lIElEICovCi0JCUhhc2hNYXAgaWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyYXRpb25FbGVtZW50cy5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlID0gY29uZmlndXJhdGlvbkVsZW1lbnRzW2ldOwotCQkJZmluYWwgU3RyaW5nIGNlTmFtZSA9IGNlLmdldE5hbWUoKTsKLQkJCWZpbmFsIFN0cmluZyBhdHRyaWJJZCA9IGdldEl0ZW1BdHRyaWJ1dGUoY2UsIExBVU5DSF9JVEVNU19YTUxfQVRUUklCX0lELCBudWxsKTsKLQkJCQotCQkJaWYgKGlkTWFwLmNvbnRhaW5zS2V5KGF0dHJpYklkKSkgY29udGludWU7Ci0JCQlpZiAoY2VOYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEFVTkNIX0lURU1TX1hNTF9DQVRFR09SWSkpIHsKLQkJCQlmaW5hbCBTdHJpbmcgYXR0cmliTmFtZSA9IGdldEl0ZW1OYW1lKGNlKTsgCi0JCQkJSXRlbURlc2NyaXB0b3IgdGhlRGVzY3JpcHRvciA9IG5ldyBJdGVtRGVzY3JpcHRvcihhdHRyaWJJZCwgYXR0cmliTmFtZSwKLQkJCQkJZ2V0SXRlbURlc2NyaXB0aW9uKGNlKSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgY2UpOwotCQkJCWlkTWFwLnB1dChhdHRyaWJJZCwgbmV3IEl0ZW1UcmVlTm9kZSh0aGVEZXNjcmlwdG9yKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qIEdlbmVyYXRlIGxhdW5jaCBjYXRlZ29yeSBoaWVyYXJjaHkgKi8KLQkJU2V0IHRlbXBJZFNldCA9IG5ldyBIYXNoU2V0KCk7IC8vIHVzZWQgdG8gcHJldmVudCBkdXBsaWNhdGVzIGZyb20gYmVpbmcgZW50ZXJlZCBpbnRvIHRoZSB0cmVlCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbkVsZW1lbnRzLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UgPSBjb25maWd1cmF0aW9uRWxlbWVudHNbaV07Ci0JCQlmaW5hbCBTdHJpbmcgY2VOYW1lID0gY2UuZ2V0TmFtZSgpOwotCQkJZmluYWwgU3RyaW5nIGF0dHJpYklkID0gZ2V0SXRlbUF0dHJpYnV0ZShjZSwgTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfSUQsIG51bGwpOwotCQkJCi0JCQlpZiAodGVtcElkU2V0LmNvbnRhaW5zKGF0dHJpYklkKSkgY29udGludWU7Ci0JCQlpZiAoY2VOYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEFVTkNIX0lURU1TX1hNTF9DQVRFR09SWSkpIHsKLQkJCQlmaW5hbCBJdGVtVHJlZU5vZGUgdGhlTm9kZSA9IChJdGVtVHJlZU5vZGUpIGlkTWFwLmdldChhdHRyaWJJZCk7Ci0JCQkJYWRkSXRlbUJ5Q2F0ZWdvcnkoY2UsIGNhdGVnb3J5VHJlZSwgdGhlTm9kZSwgaWRNYXApOwotCQkJCXRlbXBJZFNldC5hZGQoYXR0cmliSWQpOwotCQkJfQotCQl9Ci0JCQotCQkvKiBHZW5lcmF0ZSBwcm9ncmFtIHRyZWUgKi8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9uRWxlbWVudHMubGVuZ3RoOyArK2kpIHsKLQkJCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA9IGNvbmZpZ3VyYXRpb25FbGVtZW50c1tpXTsKLQkJCWZpbmFsIFN0cmluZyBjZU5hbWUgPSBjZS5nZXROYW1lKCk7Ci0JCQlmaW5hbCBTdHJpbmcgYXR0cmliSWQgPSBnZXRJdGVtQXR0cmlidXRlKGNlLCBMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9JRCwgbnVsbCk7Ci0KLQkJCWlmIChpZE1hcC5jb250YWluc0tleShhdHRyaWJJZCkpIGNvbnRpbnVlOwotCQkJaWYgKGNlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKExBVU5DSF9JVEVNU19YTUxfQ0FURUdPUlkpKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9IGVsc2UgaWYgKGNlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKExBVU5DSF9JVEVNU19YTUxfSVRFTSkpIHsKLQkJCQlmaW5hbCBTdHJpbmcgZW5hYmxlZCA9IGdldEl0ZW1BdHRyaWJ1dGUoY2UsIExBVU5DSF9JVEVNU19YTUxfQVRUUklCX0VOQUJMRUQsIAotCQkJCQlMQVVOQ0hfSVRFTVNfWE1MX1ZBTFVFX1RSVUUpOwotCQkJCWlmIChlbmFibGVkLmVxdWFsc0lnbm9yZUNhc2UoTEFVTkNIX0lURU1TX1hNTF9WQUxVRV9GQUxTRSkpIGNvbnRpbnVlOwotCQkJCUl0ZW1EZXNjcmlwdG9yIHRoZURlc2NyaXB0b3IgPSBjcmVhdGVJdGVtRGVzY3JpcHRvcihjZSwgYXR0cmliSWQpOwkJCQkKLQkJCQotCQkJCWlmICh0aGVEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJZmluYWwgSXRlbVRyZWVOb2RlIHRoZU5vZGUgPSBuZXcgSXRlbVRyZWVOb2RlKHRoZURlc2NyaXB0b3IpOwotCQkJCQlhZGRJdGVtQnlDYXRlZ29yeShjZSwgY2F0ZWdvcnlUcmVlLCB0aGVOb2RlLCBpZE1hcCk7Ci0JCQkJCWlkTWFwLnB1dChhdHRyaWJJZCwgdGhlTm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjYXRlZ29yeVRyZWU7Ci0JfQotCi0JCQkJCi0JLyoqCi0JICogQWRkcyBhbiBpdGVtIHRvIHRoZSBjYXRlZ29yeSB0cmVlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSXRlbUJ5Q2F0ZWdvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlLCBJdGVtVHJlZU5vZGUgcm9vdCwKLQkJSXRlbVRyZWVOb2RlIHRoZU5vZGUsIEhhc2hNYXAgaWRNYXApIHsKLQkJZmluYWwgU3RyaW5nIGF0dHJpYkNhdGVnb3J5ID0gZ2V0SXRlbUF0dHJpYnV0ZShjZSwgTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfQ0FURUdPUlksIG51bGwpOwotCQkJCQotCQkvLyBsb2NhdGUgdGhlIHBhcmVudCBub2RlCi0JCUl0ZW1UcmVlTm9kZSBwYXJlbnROb2RlID0gbnVsbDsKLQkJaWYgKGF0dHJpYkNhdGVnb3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudE5vZGUgPSAoSXRlbVRyZWVOb2RlKSBpZE1hcC5nZXQoYXR0cmliQ2F0ZWdvcnkpOwotCQl9Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpIHBhcmVudE5vZGUgPSByb290OwotCQkJCQotCQkvLyBhZGQgdGhlIGl0ZW0KLQkJcGFyZW50Tm9kZS5hZGRTb3J0ZWROb2RlKHRoZU5vZGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gSXRlbURlc2NyaXB0b3IgZnJvbSBhbiBYTUwgZGVmaW5pdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY2UgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBkZXNjcmliaW5nIHRoZSBpdGVtCi0JICogQHBhcmFtIGF0dHJpYklkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcmV0dXJuIGEgbmV3IEl0ZW1EZXNjcmlwdG9yLCBvciBudWxsIGlmIGFuIGVycm9yIG9jY3VycwotCSAqLwotCXByaXZhdGUgc3RhdGljIEl0ZW1EZXNjcmlwdG9yIGNyZWF0ZUl0ZW1EZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSwgU3RyaW5nIGF0dHJpYklkKSB7Ci0JCWZpbmFsIFN0cmluZyBhdHRyaWJOYW1lID0gZ2V0SXRlbU5hbWUoY2UpOwotCQlmaW5hbCBJbWFnZSAgYXR0cmliSWNvbiA9IGdldEl0ZW1JY29uKGNlKTsKLQkJZmluYWwgU3RyaW5nIGF0dHJpYkRlc2NyaXB0aW9uID0gZ2V0SXRlbURlc2NyaXB0aW9uKGNlKTsKLQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgdmlld0NFID0gZ2V0SXRlbUVsZW1lbnQoY2UsIExBVU5DSF9JVEVNU19YTUxfVklFVyk7Ci0JCWlmICh2aWV3Q0UgIT0gbnVsbCkgewotCQkJLy9JdGVtIGlzIGEgdmlldwotCQkJZmluYWwgU3RyaW5nIGF0dHJpYlZpZXcgPSBnZXRJdGVtQXR0cmlidXRlKHZpZXdDRSwgTEFVTkNIX0lURU1TX1hNTF9WSUVXX1ZJRVdJRCwgbnVsbCk7CQkKLQkJCWlmIChhdHRyaWJWaWV3ID09IG51bGwpIHsKLQkJCQlsb2dFcnJvcihnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuSW5jb21wbGV0ZVZpZXdMYXVuY2hJdGVtIiwKLQkJCQkJbmV3IE9iamVjdFtdIHsgYXR0cmliSWQgfSApLCBudWxsKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBuZXcgSXRlbURlc2NyaXB0b3IoYXR0cmliSWQsIGF0dHJpYk5hbWUsIGF0dHJpYkRlc2NyaXB0aW9uLAotCQkJCQlhdHRyaWJJY29uLCBhdHRyaWJWaWV3LCBudWxsLCBudWxsLCB2aWV3Q0UpOwotCQl9IGVsc2UgewotCQkJLy9JdGVtIGlzIGEgc3RhbmRhbG9uZQotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IHByb2dyYW1DRSA9IGdldEl0ZW1FbGVtZW50KGNlLCBMQVVOQ0hfSVRFTVNfWE1MX1BST0dSQU0pOwotCQkJaWYgKHByb2dyYW1DRSAhPSBudWxsKSB7Ci0JCQkJZmluYWwgU3RyaW5nIGF0dHJpYlBsdWdpbklkID0gZ2V0SXRlbUF0dHJpYnV0ZShwcm9ncmFtQ0UsIExBVU5DSF9JVEVNU19YTUxfUFJPR1JBTV9QTFVHSU4sIG51bGwpOwotCQkJCWZpbmFsIFN0cmluZyBhdHRyaWJDbGFzcyAgICA9IGdldEl0ZW1BdHRyaWJ1dGUocHJvZ3JhbUNFLCBMQVVOQ0hfSVRFTVNfWE1MX1BST0dSQU1fQ0xBU1MsIG51bGwpOwotCQkJCWlmIChhdHRyaWJDbGFzcyA9PSBudWxsIHx8IGF0dHJpYlBsdWdpbklkID09IG51bGwpIHsKLQkJCQkJbG9nRXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkluY29tcGxldGVQcm9ncmFtTGF1bmNoSXRlbSIsCi0JCQkJCW5ldyBPYmplY3RbXSB7IGF0dHJpYklkIH0gKSwgbnVsbCk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IEl0ZW1EZXNjcmlwdG9yKGF0dHJpYklkLCBhdHRyaWJOYW1lLCBhdHRyaWJEZXNjcmlwdGlvbiwKLQkJCQkJYXR0cmliSWNvbiwgbnVsbCwgYXR0cmliQ2xhc3MsIGF0dHJpYlBsdWdpbklkLCBwcm9ncmFtQ0UpOwotCQkJfSBlbHNlIHsKLQkJCQlsb2dFcnJvcihnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuSW5jb21wbGV0ZUxhdW5jaEl0ZW0iLAotCQkJCQluZXcgT2JqZWN0W10geyBhdHRyaWJJZCB9ICksIG51bGwpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYSBwYXJ0aWN1bGFyIGNoaWxkIFhNTCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBjZSB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHBhcmVudAotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIGZldGNoCi0JICogQHJldHVybiB0aGUgZWxlbWVudCdzIElDb25maWd1cmF0aW9uRWxlbWVudCwgb3IgbnVsbCBpZiBub3QgZm91bmQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0SXRlbUVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlLCBTdHJpbmcgZWxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50Q0VzID0gY2UuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCXJldHVybiAoZWxlbWVudENFcyAhPSBudWxsICYmIGVsZW1lbnRDRXMubGVuZ3RoICE9IDApID8gZWxlbWVudENFc1swXSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYW4gWE1MIGF0dHJpYnV0ZSBmb3IgYW4gaXRlbS4KLQkgKiAKLQkgKiBAcGFyYW0gY2UgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBkZXNjcmliaW5nIHRoZSBpdGVtCi0JICogQHBhcmFtIGF0dHJpYnV0ZSB0aGUgYXR0cmlidXRlIHRvIGZldGNoCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IGZvdW5kCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEl0ZW1BdHRyaWJ1dGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlLCBTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGNlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpOwotCQlyZXR1cm4gKHZhbHVlICE9IG51bGwpID8gdmFsdWUgOiBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gc3RyaW5nIGdpdmVuIHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZm9yIGFuIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGNlIHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZGVzY3JpYmluZyB0aGUgaXRlbQotCSAqIEByZXR1cm4gYSBuZXdsaW5lLWRlbGltaXRlZCBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhpcyBpdGVtLCBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SXRlbURlc2NyaXB0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSkgewotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBnZXRJdGVtQXR0cmlidXRlKGNlLCBMQVVOQ0hfSVRFTVNfWE1MX0lURU1fREVTQ1JJUFRJT04sICIiKTsKLQkJcmV0dXJuIChkZXNjcmlwdGlvbi5sZW5ndGgoKSA9PSAwKSA/IG51bGwgOiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGFuIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGNlIHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZGVzY3JpYmluZyB0aGUgaXRlbQotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJdGVtTmFtZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UpIHsKLQkJcmV0dXJuIGdldEl0ZW1BdHRyaWJ1dGUoY2UsIExBVU5DSF9JVEVNU19YTUxfQVRUUklCX05BTUUsCi0JCQlnZXRSZXNvdXJjZVN0cmluZygibGF1bmNoaXRlbS5NaXNzaW5nLm5hbWUiKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpY29uIGZvciBhbiBpdGVtLgotCSAqIAotCSAqIEBwYXJhbSBjZSB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlc2NyaWJpbmcgdGhlIGl0ZW0KLQkgKiBAcmV0dXJuIGFuIGljb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBnZXRJdGVtSWNvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UpIHsKLQkJU3RyaW5nIGljb25QYXRoID0gZ2V0SXRlbUF0dHJpYnV0ZShjZSwgTEFVTkNIX0lURU1TX1hNTF9JVEVNX0lDT04sICIiKTsKLQkJaWYgKGljb25QYXRoLmxlbmd0aCgpICE9IDApIHsKLQkJCVN0cmluZyBzeW1ib2xpY05hbWUgPSBjZS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoc3ltYm9saWNOYW1lKTsKLQkJCUltYWdlIGljb24gPSBnZXRJbWFnZUZyb21QbHVnaW4oYnVuZGxlLCBpY29uUGF0aCk7Ci0JCQlpZiAoaWNvbiAhPSBudWxsKSB7Ci0JCQkJSW1hZ2VbXSBuZXdJbWFnZXMgPSBuZXcgSW1hZ2VbaW1hZ2VzLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoaW1hZ2VzLCAwLCBuZXdJbWFnZXMsIDAsIGltYWdlcy5sZW5ndGgpOwotCQkJCW5ld0ltYWdlc1tpbWFnZXMubGVuZ3RoXSA9IGljb247Ci0JCQkJaW1hZ2VzID0gbmV3SW1hZ2VzOwotCQkJCXJldHVybiBpY29uOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZXNbbGlHZW5lcmljRXhhbXBsZV07Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbiBpbWFnZSBmcm9tIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIGluc3RhbGwgZGlyZWN0b3J5LgotCSAqCi0JICogQHBhcmFtIGJ1bmRsZSB0aGUgcGx1Z2luIGRlc2NyaXB0b3IgZm9yIHRoZSBwbHVnaW4gd2l0aCB0aGUgaW1hZ2UKLQkgKiBAcGFyYW0gaWNvblBhdGggdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGluc3RhbGwgZGlyZWN0b3J5Ci0JICogQHJldHVybiB0aGUgaW1hZ2UsIG9yIG51bGwgaWYgbm90IGZvdW5kCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2VGcm9tUGx1Z2luKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBpY29uUGF0aCkgewotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVybCA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOwotCQkJVVJMIHVybCA9IG5ldyBVUkwoaW5zdGFsbFVybCwgaWNvblBhdGgpOwotCQkJaXMgPSB1cmwub3BlbkNvbm5lY3Rpb24oKS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJSW1hZ2VEYXRhIHNvdXJjZSA9IG5ldyBJbWFnZURhdGEoaXMpOwotCQkJSW1hZ2VEYXRhIG1hc2sgPSBzb3VyY2UuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UobnVsbCwgc291cmNlLCBtYXNrKTsKLQkJCXJldHVybiBpbWFnZTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGlzICE9IG51bGwpIGlzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9MYXVuY2hlclZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0xhdW5jaGVyVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZWVhMjQ4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0xhdW5jaGVyVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi0vKioKLSAqIExhdW5jaGVyIHVzZXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0PC9jb2RlPiAKLSAqIHRvIGxhdW5jaCB0aGUgb3RoZXIgcmVnaXN0ZXJlZCBleGFtcGxlcy4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoZXJWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCXByaXZhdGUgU2hlbGwgd29ya2JlbmNoU2hlbGw7Ci0JCi0JcHJpdmF0ZSBUcmVlIGxhdW5jaFRyZWU7Ci0JcHJpdmF0ZSBUZXh0IGRlc2NyaXB0aW9uVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBydW5CdXR0b247Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgTGF1bmNoZXJWaWV3LgotCSAqLwotCXB1YmxpYyBMYXVuY2hlclZpZXcoKSB7Ci0JCUxhdW5jaGVyUGx1Z2luLmluaXRSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBleGFtcGxlLgotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXdvcmtiZW5jaFNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IFNwbGl0TGF5b3V0KCkpOwotCQkJCQotCQlHcm91cCBsYXVuY2hHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGF1bmNoR3JvdXAuc2V0VGV4dChMYXVuY2hlclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygidmlldy5sYXVuY2hHcm91cC50ZXh0IikpOwotCQkKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF1bmNoR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCWxhdW5jaFRyZWUgPSBuZXcgVHJlZShsYXVuY2hHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhdW5jaFRyZWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWxhdW5jaFRyZWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBJdGVtRGVzY3JpcHRvciBpdGVtID0gZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0JCQkJc2V0RGVzY3JpcHRpb25CeUl0ZW0oaXRlbSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBJdGVtRGVzY3JpcHRvciBpdGVtID0gZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0JCQkJc2V0RGVzY3JpcHRpb25CeUl0ZW0oaXRlbSk7Ci0JCQkJaWYgKGl0ZW0uZ2V0TWFpblR5cGUoKSA9PSBudWxsICYmIGl0ZW0uZ2V0VmlldygpID09IG51bGwpIHsKLQkJCQkJLy8gQ2F0ZWdvcnkgc2VsZWN0ZWQsIHNvIGp1c3QgZXhwYW5kL2NvbGFwc2UgdGhlIG5vZGUKLQkJCQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJCWJvb2xlYW4gZXhwYW5kZWQgPSB0cmVlSXRlbS5nZXRFeHBhbmRlZCgpOwotCQkJCQlpZiAodHJlZUl0ZW0gIT0gbnVsbCkgdHJlZUl0ZW0uc2V0RXhwYW5kZWQoIWV4cGFuZGVkKTsKLQkJCQkJdHJlZUl0ZW0uc2V0SW1hZ2UoTGF1bmNoZXJQbHVnaW4uaW1hZ2VzW2V4cGFuZGVkID8gTGF1bmNoZXJQbHVnaW4ubGlDbG9zZWRGb2xkZXIgOiBMYXVuY2hlclBsdWdpbi5saU9wZW5Gb2xkZXJdKTsKLQkJCQl9IGVsc2UgewotCQkJCQlsYXVuY2hJdGVtKGdldFNlbGVjdGVkSXRlbSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlsYXVuY2hUcmVlLmFkZFRyZWVMaXN0ZW5lcihuZXcgVHJlZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZChUcmVlRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCQlpdGVtLnNldEltYWdlKExhdW5jaGVyUGx1Z2luLmltYWdlc1tMYXVuY2hlclBsdWdpbi5saUNsb3NlZEZvbGRlcl0pOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFdmVudCBldmVudCkgewotCQkJCWZpbmFsIFRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQkJCWl0ZW0uc2V0SW1hZ2UoTGF1bmNoZXJQbHVnaW4uaW1hZ2VzW0xhdW5jaGVyUGx1Z2luLmxpT3BlbkZvbGRlcl0pOwotCQkJfQotCQl9KTsKLQotCQlydW5CdXR0b24gPSBuZXcgQnV0dG9uKGxhdW5jaEdyb3VwLCBTV1QuUFVTSCk7Ci0JCXJ1bkJ1dHRvbi5zZXRUZXh0KExhdW5jaGVyUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJ2aWV3LmxhdW5jaEJ1dHRvbi50ZXh0IikpOwotCQlydW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlsYXVuY2hJdGVtKGdldFNlbGVjdGVkSXRlbSgpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQotCQlHcm91cCBkZXNjcmlwdGlvbkdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlkZXNjcmlwdGlvbkdyb3VwLnNldFRleHQoTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInZpZXcuZGVzY3JpcHRpb25Hcm91cC50ZXh0IikpOwotCQlkZXNjcmlwdGlvbkdyb3VwLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCi0JCWRlc2NyaXB0aW9uVGV4dCA9IG5ldyBUZXh0KGRlc2NyaXB0aW9uR3JvdXAsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfAotCQkJU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQotCQlzZXREZXNjcmlwdGlvbkJ5SXRlbShudWxsKTsKLQkJc2V0SXRlbURlc2NyaXB0b3JzKExhdW5jaGVyUGx1Z2luLmdldExhdW5jaEl0ZW1UcmVlKCkpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpICB7Ci0JCWxhdW5jaFRyZWUuc2V0Rm9jdXMoKTsKLQkJcnVuQnV0dG9uLmdldFNoZWxsKCkuc2V0RGVmYXVsdEJ1dHRvbihydW5CdXR0b24pOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBWaWV3IGlzIHRvIGJlIGRpc3Bvc2VkCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXdvcmtiZW5jaFNoZWxsID0gbnVsbDsKLQkJbGF1bmNoVHJlZSA9IG51bGw7Ci0JCWRlc2NyaXB0aW9uVGV4dCA9IG51bGw7Ci0JCXJ1bkJ1dHRvbiA9IG51bGw7CQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEluc3RhbGxzIGEgbmV3IGxhdW5jaCBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBuZXdSb290IHRoZSBuZXcgdHJlZSBvZiBsYXVuY2ggaXRlbXMgZm9yIHRoZSBVSQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEl0ZW1EZXNjcmlwdG9ycyhmaW5hbCBJdGVtVHJlZU5vZGUgbmV3Um9vdCkgewotCQlpZiAod29ya2JlbmNoU2hlbGwgPT0gbnVsbCkgcmV0dXJuOwotCQl3b3JrYmVuY2hTaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICgobGF1bmNoVHJlZSA9PSBudWxsKSB8fCAobGF1bmNoVHJlZS5pc0Rpc3Bvc2VkKCkpKSByZXR1cm47Ci0JCQkJbGF1bmNoVHJlZS5yZW1vdmVBbGwoKTsKLQkJCQotCQkJCWZvciAoSXRlbVRyZWVOb2RlIG5vZGUgPSBuZXdSb290LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOwotCQkJCQlub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCWRvTm9kZShub2RlLCBuZXcgVHJlZUl0ZW0obGF1bmNoVHJlZSwgU1dULk5PTkUpKTsgLy8gdG9wLWxldmVsIFRyZWVJdGVtCi0JCQkJfQotCQkJfQotCQkJcHJpdmF0ZSB2b2lkIGFkZEdyb3VwKFRyZWVJdGVtIHBhcmVudCwgSXRlbVRyZWVOb2RlIG5vZGUpIHsKLQkJCQlmb3IgKDtub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJZG9Ob2RlKG5vZGUsIG5ldyBUcmVlSXRlbShwYXJlbnQsIFNXVC5OT05FKSk7IC8vIFRyZWVJdGVtIGF0IGRlcHRoID4gMAotCQkJCX0KLQkJCX0KLQkJCXByaXZhdGUgdm9pZCBkb05vZGUoSXRlbVRyZWVOb2RlIG5vZGUsIFRyZWVJdGVtIHRyZWVJdGVtKSB7Ci0JCQkJZmluYWwgSXRlbURlc2NyaXB0b3IgaXRlbSA9IG5vZGUuZ2V0RGVzY3JpcHRvcigpOwotCQkJCXRyZWVJdGVtLnNldFRleHQoaXRlbS5nZXROYW1lKCkpOwotCQkJCXRyZWVJdGVtLnNldERhdGEoaXRlbSk7Ci0JCQkJaWYgKG5vZGUuZ2V0RGVzY3JpcHRvcigpLmlzRm9sZGVyKCkpIHsKLQkJCQkJdHJlZUl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCQkJCQl0cmVlSXRlbS5zZXRJbWFnZShMYXVuY2hlclBsdWdpbi5pbWFnZXNbTGF1bmNoZXJQbHVnaW4ubGlDbG9zZWRGb2xkZXJdKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0cmVlSXRlbS5zZXRJbWFnZShub2RlLmdldERlc2NyaXB0b3IoKS5nZXRJY29uKCkpOwotCQkJCX0KLQkJCQlhZGRHcm91cCh0cmVlSXRlbSwgbm9kZS5nZXRGaXJzdENoaWxkKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSBzcGVjaWZpZWQgbGF1bmNoIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGl0ZW1EZXNjcmlwdG9yIHRoZSBsYXVuY2ggaXRlbSB0byBleGVjdXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxhdW5jaEl0ZW0oSXRlbURlc2NyaXB0b3IgaXRlbURlc2NyaXB0b3IpIHsKLQkJLyogQ2FzZSAxOiBUaGUgbGF1bmNoIGl0ZW0gaXMgYSB2aWV3ICovCi0JCVN0cmluZyBwbHVnaW5WaWV3SWQgPSBpdGVtRGVzY3JpcHRvci5nZXRWaWV3ICgpOwotCQlpZiAocGx1Z2luVmlld0lkICE9IG51bGwpIHsKLQkJCWZpbmFsIElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQgPSB0aGlzOwotCQkJZmluYWwgSVdvcmtiZW5jaFBhcnRTaXRlIHdvcmtiZW5jaFBhcnRTaXRlID0gd29ya2JlbmNoUGFydC5nZXRTaXRlKCk7Ci0JCQlmaW5hbCBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd29ya2JlbmNoUGFydFNpdGUuZ2V0UGFnZSgpOwotCQkJdHJ5IHsKLQkJCQl3b3JrYmVuY2hQYWdlLnNob3dWaWV3KHBsdWdpblZpZXdJZCk7Ci0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGF1bmNoZXJQbHVnaW4ubG9nRXJyb3IoTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInJ1bi5lcnJvci5JbnZvY2F0aW9uIiksIGUpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCS8qIENhc2UgMjogVGhlIGxhdW5jaCBpdGVtIGlzIGEgc3RhbmRhbG9uZSBwcm9ncmFtICovCi0JCWlmICh3b3JrYmVuY2hTaGVsbCA9PSBudWxsKSByZXR1cm47Ci0JCXRyeSB7Ci0JCQlPYmplY3QgaW5zdGFuY2UgPSBpdGVtRGVzY3JpcHRvci5jcmVhdGVJdGVtSW5zdGFuY2UoKTsKLQkJCWlmIChpbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQkJRGlzcGxheSBkaXNwbGF5ID0gd29ya2JlbmNoU2hlbGwuZ2V0RGlzcGxheSgpOwotCQkJCU1ldGhvZCBvcGVuTWV0aG9kID0gaW5zdGFuY2UuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgib3BlbiIsIG5ldyBDbGFzc1tdIHtEaXNwbGF5LmNsYXNzfSk7Ci0JCQkJb3Blbk1ldGhvZC5pbnZva2UoaW5zdGFuY2UsIG5ldyBPYmplY3RbXSB7ZGlzcGxheX0pOwotCQkJfQotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJTGF1bmNoZXJQbHVnaW4ubG9nRXJyb3IoTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInJ1bi5lcnJvci5Eb2VzTm90SW1wbGVtZW50TWV0aG9kIiksIG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGF1bmNoZXJQbHVnaW4ubG9nRXJyb3IoTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInJ1bi5lcnJvci5Db3VsZE5vdEluc3RhbnRpYXRlQ2xhc3MiKSwgZSk7Ci0JCX0JCQotCX0KLQotCS8qKgotCSAqIE9idGFpbnMgdGhlIHNlbGVjdGVkIGxhdW5jaCBpdGVtLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBJdGVtRGVzY3JpcHRvcgotCSAqLwotCXByaXZhdGUgSXRlbURlc2NyaXB0b3IgZ2V0U2VsZWN0ZWRJdGVtKCkgewotCQlmaW5hbCBUcmVlSXRlbVtdIHNlbGVjdGlvbnMgPSBsYXVuY2hUcmVlLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7Ci0JCWZpbmFsIEl0ZW1EZXNjcmlwdG9yIGl0ZW1EZXNjcmlwdG9yID0gKEl0ZW1EZXNjcmlwdG9yKSBzZWxlY3Rpb25zWzBdLmdldERhdGEoKTsKLQkJcmV0dXJuIGl0ZW1EZXNjcmlwdG9yOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBkZXNjcmlwdGlvbiB0ZXh0IHRvIHJlZmxlY3QgdGhhdCBvZiBhIHBhcnRpY3VsYXIgSXRlbURlc2NyaXB0b3IuCi0JICoKLQkgKiBAcGFyYW0gaXRlbURlc2NyaXB0b3IgdGhlIGxhdW5jaCBpdGVtIHdob3NlIGRlc2NyaXB0aW9uIGlzIHRvIGJlIGRpc3BsYXllZCwgb3IgbnVsbCBpZiBub25lCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERlc2NyaXB0aW9uQnlJdGVtKEl0ZW1EZXNjcmlwdG9yIGl0ZW1EZXNjcmlwdG9yKSB7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbjsKLQkJaWYgKGl0ZW1EZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9uID0gTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImxhdW5jaGl0ZW0uTnVsbC5kZXNjcmlwdGlvbiIpOwotCQkJaWYgKHJ1bkJ1dHRvbiAhPSBudWxsKSBydW5CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXNjcmlwdGlvbiA9IGl0ZW1EZXNjcmlwdG9yLmdldERlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCQlkZXNjcmlwdGlvbiA9IExhdW5jaGVyUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJsYXVuY2hpdGVtLk1pc3NpbmcuZGVzY3JpcHRpb24iKTsKLQkJCWlmIChydW5CdXR0b24gIT0gbnVsbCkgewotCQkJCXJ1bkJ1dHRvbi5zZXRFbmFibGVkKGl0ZW1EZXNjcmlwdG9yLmdldFZpZXcoKSAhPSBudWxsIHx8IGl0ZW1EZXNjcmlwdG9yLmdldE1haW5UeXBlKCkgIT0gbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZGVzY3JpcHRpb25UZXh0LnNldFRleHQoZGVzY3JpcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL1NwbGl0TGF5b3V0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9TcGxpdExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NjM3YWYxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL1NwbGl0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlcjsKLQotIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQSBMYXlvdXQgY2xhc3MgdGhhdCBhdXRvbWF0aWNhbGx5IHN3aXRjaGVzIGZyb20gYSBob3Jpem9udGFsIHNwbGl0IHRvIGEgdmVydGljYWwKLSAqIHNwbGl0IGxheW91dCB0byBhY2NvbW9kYXRlIGNoYW5naW5nIHNpemUgY29uZGl0aW9ucy4KLSAqIAotICogTGF0ZXIgb24gd2UgbWlnaHQgaW1wcm92ZSB0aGlzIGNsYXNzIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSAicHJlZmVycmVkIiBzaXplIG9mCi0gKiB0aGUgd2lkZ2V0cy4KLSAqLwotcHVibGljIGNsYXNzIFNwbGl0TGF5b3V0IGV4dGVuZHMgTGF5b3V0IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQKLQkJc3BsaXRIb3Jpem9udGFsbHkgPSAwLAotCQlzcGxpdFZlcnRpY2FsbHkgPSAxOwotCXByaXZhdGUgaW50IHNwbGl0RGlyZWN0aW9uID0gc3BsaXRIb3Jpem9udGFsbHk7Ci0KLQlwdWJsaWMgaW50IHNwYWNpbmcgPSAzOwotCXB1YmxpYyBpbnQgbWFyZ2luVG9wID0gMzsKLQlwdWJsaWMgaW50IG1hcmdpbkxlZnQgPSAzOwotCXB1YmxpYyBpbnQgbWFyZ2luUmlnaHQgPSAzOwotCXB1YmxpYyBpbnQgbWFyZ2luQm90dG9tID0gMzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGF5b3V0Ci0JICovCi0JcHVibGljIFNwbGl0TGF5b3V0KCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgTGF5b3V0I2NvbXB1dGVTaXplKENvbXBvc2l0ZSwgaW50LCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJaWYgKHdIaW50ID09IFNXVC5ERUZBVUxUKSB7Ci0JCQlpZiAoaEhpbnQgPT0gU1dULkRFRkFVTFQpIHsKLQkJCQlQb2ludCBoU3BsaXRTaXplID0gY29tcHV0ZUhTcGxpdFNpemUoY29tcG9zaXRlLCB3SGludCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQkJCVBvaW50IHZTcGxpdFNpemUgPSBjb21wdXRlVlNwbGl0U2l6ZShjb21wb3NpdGUsIHdIaW50LCBoSGludCwgZmFsc2UpOwotCQkJCWludCBoU3BsaXRBcmVhID0gaFNwbGl0U2l6ZS54ICogaFNwbGl0U2l6ZS55OwotCQkJCWludCB2U3BsaXRBcmVhID0gdlNwbGl0U2l6ZS54ICogdlNwbGl0U2l6ZS55OwotCQkJCS8vIENob29zZSBkaXJlY3Rpb24gY29uc3VtaW5nIGxlYXN0IGFyZWEKLQkJCQlpZiAoaFNwbGl0QXJlYSA8IHZTcGxpdEFyZWEpIHsKLQkJCQkJc3BsaXREaXJlY3Rpb24gPSBzcGxpdEhvcml6b250YWxseTsKLQkJCQkJcmV0dXJuIGhTcGxpdFNpemU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3BsaXREaXJlY3Rpb24gPSBzcGxpdFZlcnRpY2FsbHk7Ci0JCQkJCXJldHVybiB2U3BsaXRTaXplOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gQ29uc3RyYWluZWQgaW4gaGVpZ2h0OiBzcGxpdCB2ZXJ0aWNhbGx5Ci0JCQkJc3BsaXREaXJlY3Rpb24gPSBzcGxpdFZlcnRpY2FsbHk7Ci0JCQkJcmV0dXJuIGNvbXB1dGVWU3BsaXRTaXplKGNvbXBvc2l0ZSwgd0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChoSGludCA9PSBTV1QuREVGQVVMVCkgewotCQkJCS8vIENvbnN0cmFpbmVkIGluIHdpZHRoOiBzcGxpdCBob3Jpem9udGFsbHkKLQkJCQlzcGxpdERpcmVjdGlvbiA9IHNwbGl0SG9yaXpvbnRhbGx5OwotCQkJCXJldHVybiBjb21wdXRlSFNwbGl0U2l6ZShjb21wb3NpdGUsIHdIaW50LCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChoSGludCA8IHdIaW50KSB7Ci0JCQkJCXNwbGl0RGlyZWN0aW9uID0gc3BsaXRWZXJ0aWNhbGx5OwotCQkJCQlyZXR1cm4gY29tcHV0ZVZTcGxpdFNpemUoY29tcG9zaXRlLCB3SGludCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNwbGl0RGlyZWN0aW9uID0gc3BsaXRIb3Jpem9udGFsbHk7Ci0JCQkJCXJldHVybiBjb21wdXRlSFNwbGl0U2l6ZShjb21wb3NpdGUsIHdIaW50LCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCQkJfQkJCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogQHNlZSBMYXlvdXQjbGF5b3V0KENvbXBvc2l0ZSwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQkJY29tcHV0ZVNpemUoY29tcG9zaXRlLCBjbGllbnRBcmVhLndpZHRoLCBjbGllbnRBcmVhLmhlaWdodCwgZmFsc2UpOwotCQkKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCWNsaWVudEFyZWEueCArPSBtYXJnaW5MZWZ0OwotCQljbGllbnRBcmVhLnkgKz0gbWFyZ2luVG9wOwotCQljbGllbnRBcmVhLndpZHRoIC09IG1hcmdpblJpZ2h0ICsgbWFyZ2luTGVmdDsKLQkJY2xpZW50QXJlYS5oZWlnaHQgLT0gbWFyZ2luQm90dG9tICsgbWFyZ2luVG9wOwotCQlQb2ludCBwb3NpdGlvbiA9IG5ldyBQb2ludChjbGllbnRBcmVhLngsIGNsaWVudEFyZWEueSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCQkJZmluYWwgUmVjdGFuZ2xlIGJvdW5kczsKLQkJCWlmIChzcGxpdERpcmVjdGlvbiA9PSBzcGxpdEhvcml6b250YWxseSkgewotCQkJCWludCBoZWlnaHQgPSBjbGllbnRBcmVhLmhlaWdodCAvIGNoaWxkcmVuLmxlbmd0aDsKLQkJCQlib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIGNsaWVudEFyZWEud2lkdGgsIGhlaWdodCk7Ci0JCQkJcG9zaXRpb24ueSArPSBoZWlnaHQgKyBzcGFjaW5nOwotCQkJfSBlbHNlIHsKLQkJCQlpbnQgd2lkdGggPSBjbGllbnRBcmVhLndpZHRoIC8gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCWJvdW5kcyA9IG5ldyBSZWN0YW5nbGUocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgd2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0KTsKLQkJCQlwb3NpdGlvbi54ICs9IHdpZHRoICsgc3BhY2luZzsKLQkJCX0KLQkJCWJvdW5kcy53aWR0aCA9IE1hdGgubWF4KGJvdW5kcy53aWR0aCwgMCk7Ci0JCQlib3VuZHMuaGVpZ2h0ID0gTWF0aC5tYXgoYm91bmRzLmhlaWdodCwgMCk7Ci0JCQljaGlsZC5zZXRCb3VuZHMoYm91bmRzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUG9pbnQgY29tcHV0ZUhTcGxpdFNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlQb2ludCBzaXplID0gbmV3IFBvaW50KG1hcmdpbkxlZnQgKyBtYXJnaW5SaWdodCwgbWFyZ2luVG9wICsgbWFyZ2luQm90dG9tKTsKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLQkJCWZpbmFsIENvbnRyb2wgY2hpbGQgPSBjaGlsZHJlbltpXTsKLQotCQkJUG9pbnQgY2hpbGRTaXplID0gY2hpbGQuY29tcHV0ZVNpemUod0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKLQkJCXNpemUueCA9IE1hdGgubWF4KHNpemUueCwgY2hpbGRTaXplLngpOwotCQkJc2l6ZS55ICs9IGNoaWxkU2l6ZS55ICsgc3BhY2luZzsKLQkJfQotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQlwcml2YXRlIFBvaW50IGNvbXB1dGVWU3BsaXRTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJUG9pbnQgc2l6ZSA9IG5ldyBQb2ludChtYXJnaW5MZWZ0ICsgbWFyZ2luUmlnaHQsIG1hcmdpblRvcCArIG1hcmdpbkJvdHRvbSk7Ci0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07Ci0KLQkJCVBvaW50IGNoaWxkU2l6ZSA9IGNoaWxkLmNvbXB1dGVTaXplKHdIaW50LCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCQlzaXplLnggKz0gY2hpbGRTaXplLnggKyBzcGFjaW5nOwotCQkJc2l6ZS55ID0gTWF0aC5tYXgoc2l6ZS55LCBjaGlsZFNpemUueSk7Ci0JCX0KLQkJcmV0dXJuIHNpemU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmZjMmNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTU1ZDUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgICouamFyCi0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLQotc291cmNlLmxheW91dHMuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvZG9jLWh0bWwvc3d0X2xheW91dF9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvZG9jLWh0bWwvc3d0X2xheW91dF9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTgyOWZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2RvYy1odG1sL3N3dF9sYXlvdXRfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIExheW91dCBFeGFtcGxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBMYXlvdXRzPC9oMj4KLQotPHA+Ci1UaGlzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjb21tb24gU1dUIGxheW91dHMuIAotSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZSAKLXVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBTV1QgbGF5b3V0LgotVGhlIHVzZXIgY2FuIGluc2VydCB3aWRnZXRzIGludG8gYSBsYXlvdXQgYW5kIHNldCB0aGUgdmFsdWVzIG9mIHRoZSBsYXlvdXQgZGF0YQotdXNpbmcgYSBwcm9wZXJ0eSBzaGVldC4gIFdoZW4gdGhlIHVzZXIgaGFzIGEgc3VpdGFibGUgYXJyYW5nZW1lbnQsIHRoZSB1bmRlcmx5aW5nCi1jb2RlIGNhbiBiZSBnZW5lcmF0ZWQgYnkgY2xpY2tpbmcgb24gdGhlIDxzdHJvbmc+Q29kZTwvc3Ryb25nPiBidXR0b24uCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dGV4YW1wbGUuTGF5b3V0RXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+TGF5b3V0czwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+V29ya2JlbmNoIFZpZXdzPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2ljb25zL2xheW91dHNfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9pY29ucy9sYXlvdXRzX2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQ1ZGRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2ljb25zL2xheW91dHNfZXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTBiZGIwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLXBsdWdpbi5TV1RMYXlvdXRFeGFtcGxlLm5hbWUgPSBTV1QgTGF5b3V0IEV4YW1wbGUgUGx1Z2luCi1jYXRlZ29yeS5TV1RFeGFtcGxlcy5uYW1lID0gU1dUIEV4YW1wbGVzCi12aWV3LkxheW91dEV4YW1wbGUubmFtZSA9IFNXVCBMYXlvdXRzCi0KLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lID0gV29ya2JlbmNoIFZpZXdzCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24gPSBcCi0JQSBjb2xsZWN0aW9uIG9mIFN0YW5kYXJkIFdpZGdldCBUb29sa2l0IGV4YW1wbGVzIHRoYXQgcnVuIGFzIFZpZXdzIGluc2lkZSB0aGUgV29ya2JlbmNoLiAgXAotCVRoZXNlIGV4YW1wbGVzIHdpbGwgY3JlYXRlIGEgbmV3IFZpZXcgaW4gdGhlIGN1cnJlbnQgUGVyc3BlY3RpdmUuCi0KLWxhdW5jaGl0ZW0uTGF5b3V0RXhhbXBsZS5uYW1lID0gTGF5b3V0cwotbGF1bmNoaXRlbS5MYXlvdXRFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIGNvbW1vbiBTV1QgbGF5b3V0cy4gXG5cblwKLQlJdCBjb25zaXN0cyBvZiBhIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgYWxsb3dzIHRoZSBcCi0JdXNlciB0byBpbnRlcmFjdCB3aXRoIGEgZGlmZmVyZW50IFNXVCBsYXlvdXQuXAotCVRoZSB1c2VyIGNhbiBpbnNlcnQgd2lkZ2V0cyBpbnRvIGEgbGF5b3V0IGFuZCBzZXQgdGhlIHZhbHVlcyBvZiB0aGUgbGF5b3V0IGRhdGEgXAotCXVzaW5nIGEgcHJvcGVydHkgc2hlZXQuICBXaGVuIHRoZSB1c2VyIGhhcyBhIHN1aXRhYmxlIGFycmFuZ2VtZW50LCBjb2RlIGNhbiBiZSBcCi0JZ2VuZXJhdGVkIGJ5IGNsaWNraW5nIG9uIHRoZSBDb2RlIGJ1dHRvbi4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTM5MDYzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzIgotICAgbmFtZT0iJXBsdWdpbi5TV1RMYXlvdXRFeGFtcGxlLm5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMuTGF5b3V0UGx1Z2luIj4KLQotPCEtLSBSdW50aW1lIC0tPgotPCEtLSBSdW50aW1lIC0tPgotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJsYXlvdXRzLmphciI+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci08IS0tIFJlcXVpcmVkIHBsdWdpbnMgLS0+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPCEtLSBFeHRlbnNpb24gcG9pbnRzIC0tPgotPCEtLSBFeHRlbnNpb25zIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSIldmlldy5MYXlvdXRFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9sYXlvdXRzX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy5MYXlvdXRWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLnZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPGl0ZW0KLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkxheW91dEV4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2xheW91dHNfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uTGF5b3V0RXhhbXBsZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLnZpZXdsYXVuY2hlciI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgdmlld0lkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy52aWV3Ij4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvaXRlbT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9pbXBvcnQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9pbXBvcnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0MWRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvaW1wb3J0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBlcnNpc3QgcHJvamVjdCBzZXR0aW5ncyBmb3IgbGF0ZXIgaW1wb3J0IAotbmF0dXJlcyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU7IG9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmUKLWJ1aWxkZXJzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyCi12YXIuRUNMSVBTRV9QTFVHSU5TID0gPDxFQ0xJUFNFX1BMVUdJTlM+PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRzL0xheW91dFBsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRzL0xheW91dFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQyZGEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0cy9MYXlvdXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0czsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIExheW91dFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dHMvTGF5b3V0Vmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRzL0xheW91dFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M2OWIzZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dHMvTGF5b3V0Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzOwotCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dGV4YW1wbGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLQotLyoqCi0gKiA8Y29kZT5MYXlvdXRzPC9jb2RlPiBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uCi0gKiBvZiB0aGUgbGF5b3V0cyBkZWZpbmVkIGJ5IFNXVC4gIEl0IGNvbnNpc3RzIG9mIGEgd29ya2JlbmNoCi0gKiB2aWV3IGFuZCB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZQotICogdXNlciB0byBpbnRlcmFjdCB3aXRoIGEgbGF5b3V0LgotICogCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCUxheW91dEV4YW1wbGUgaW5zdGFuY2UgPSBudWxsOwotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZXhhbXBsZQotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgZnJhbWUpIHsKLQkJaW5zdGFuY2UgPSBuZXcgTGF5b3V0RXhhbXBsZShmcmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gd2UgbXVzdCBncmFiIGZvY3VzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNzZXRGb2N1cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpbnN0YW5jZS5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBWaWV3IGlzIHRvIGJlIGRpc3Bvc2VkCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWluc3RhbmNlLmRpc3Bvc2UoKTsKLQkJaW5zdGFuY2UgPSBudWxsOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwMGY2OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmZTc2MDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgKi5qYXIKLQotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotICAgICAgICAgICAgCi1zb3VyY2Uub2xld2luMzIuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9kb2MtaHRtbC9zd3Rfb2xlX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2RvYy1odG1sL3N3dF9vbGVfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDI3ZGE4ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2RvYy1odG1sL3N3dF9vbGVfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIE9MRSBXZWIgQnJvd3NlcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gT0xFIFdlYiBCcm93c2VyPC9oMj4KLQotPHA+Ci1UaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGVtYmVkIGFuIEFjdGl2ZSBYIGNvbnRyb2wgaW50byBhbiBTV1QgYXBwbGljYXRpb24gb3IgYW4gRWNsaXBzZSB2aWV3LgotPC9wPgotPHA+Ci1XaGVuIHRoZSB2aWV3IGlzIG9wZW5lZCwgaXQgd2lsbCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIFdpbmRvd3MgSW50ZXJuZXQgRXhwbG9yZXIKLWNvbnRyb2wuICBUaGUgT0xFIHdlYiBicm93c2VyIGhhcwotPHN0cm9uZz5CYWNrPC9zdHJvbmc+IGFuZCA8c3Ryb25nPkZvcndhcmQ8L3N0cm9uZz4gYnV0dG9ucyB0byB0YWtlIHlvdSB0byByZWNlbnRseSB2aXNpdGVkIHBhZ2VzLiAgVGhlIGJyb3dzZXIgYWxzbyBjb250YWlucwotYSA8c3Ryb25nPkhvbWU8L3N0cm9uZz4gYnV0dG9uIHRvIHRha2UgeW91IHRvIHRoZSB3ZWIgYnJvd3NlcidzIGhvbWUgcGFnZSwgYSA8c3Ryb25nPlN0b3A8L3N0cm9uZz4gYnV0dG9uIHdoaWNoIHN0b3BzIHRoZSAKLWN1cnJlbnQgdHJhbnNmZXIsIGEgPHN0cm9uZz5TZWFyY2g8L3N0cm9uZz4gYnV0dG9uIHdoaWNoIHdpbGwgc2VhcmNoIGZvciB0ZXh0IHR5cGVkIGluIHRoZSA8c3Ryb25nPkFkZHJlc3M8L3N0cm9uZz4gdGV4dCBmaWVsZCwgYW5kCi1hIDxzdHJvbmc+UmVmcmVzaDwvc3Ryb25nPiBidXR0b24gd2hpY2ggcmUtZHJhd3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIHBhZ2UuIFRoZXJlIGlzIGFsc28gYQotPHN0cm9uZz5Hbzwvc3Ryb25nPiBidXR0b24gd2hpY2gsIHdoZW4gY2xpY2tlZCwgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIHBhZ2Ugc3BlY2lmaWVkIGluIHRoZSA8c3Ryb25nPkFkZHJlc3M8L3N0cm9uZz4gZmllbGQuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLQotPHA+Ci1Gcm9tIEVjbGlwc2UncyA8c3Ryb25nPldpbmRvdzwvc3Ryb25nPiBtZW51IHNlbGVjdCA8c3Ryb25nPlNob3cgVmlldzwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+T3RoZXI8L3N0cm9uZz4uICAKLUluIHRoZSA8c3Ryb25nPlNob3cgVmlldzwvc3Ryb25nPiBkaWFsb2csIGV4cGFuZCA8c3Ryb25nPlNXVCBFeGFtcGxlczwvc3Ryb25nPiBhbmQgc2VsZWN0Ci10aGUgdmlldyBuYW1lZCA8c3Ryb25nPk9MRSBXZWIgQnJvd3NlciAod2luMzIpPC9zdHJvbmc+LiBBIHZpZXcgY29udGFpbmluZyBhIHdlYiBicm93c2VyIHdpbGwgYXBwZWFyLgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPk9MRSBXZWIgQnJvd3Nlcjwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+V2luMzIgb25seTwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL2JhY2t3YXJkX25hdi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL2JhY2t3YXJkX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmY2Y0MWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9iYWNrd2FyZF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9mb3J3YXJkX25hdi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL2ZvcndhcmRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2I5YjZhZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL2ZvcndhcmRfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvaG9tZV9uYXYuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9ob21lX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc3YTIzMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9ob21lX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3JlZnJlc2hfbmF2LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvcmVmcmVzaF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjcwZTE4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvcmVmcmVzaF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9zZWFyY2hfbmF2LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvc2VhcmNoX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczYWM5MWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9zZWFyY2hfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvc3RvcF9uYXYuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9zdG9wX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY1M2QzNDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9zdG9wX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3dlYmJyb3dzZXJfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3dlYmJyb3dzZXJfZXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5NWUyMjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy93ZWJicm93c2VyX2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ4MTEzODguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUT0xFRXhhbXBsZS5uYW1lID0gU1dUIE9MRSBFeGFtcGxlIFBsdWdpbiAoV2luMzIpCi1jYXRlZ29yeS5TV1RFeGFtcGxlcy5uYW1lID0gU1dUIEV4YW1wbGVzCi12aWV3Lk9MRVdlYkJyb3dzZXJFeGFtcGxlLm5hbWUgPSBPTEUgV2ViIEJyb3dzZXIgKFdpbjMyKQotCi1sYXVuY2hjYXRlZ29yeS5TV1RXaW4zMk9ubHlFeGFtcGxlcy5uYW1lID0gV2luMzIgb25seQotbGF1bmNoY2F0ZWdvcnkuU1dUV2luMzJPbmx5RXhhbXBsZXMuZGVzY3JpcHRpb24gPSBcCi0JQSBjb2xsZWN0aW9uIG9mIFN0YW5kYXJkIFdpZGdldCBUb29sa2l0IGV4YW1wbGVzIGZvciBXaW5kb3dzIHN5c3RlbXMgb25seS4KLQotbGF1bmNoaXRlbS5PTEVXZWJCcm93c2VyRXhhbXBsZS5uYW1lID0gT0xFIFdlYiBCcm93c2VyCi1sYXVuY2hpdGVtLk9MRVdlYkJyb3dzZXJFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGVtYmVkIGFuIEFjdGl2ZSBYIGNvbnRyb2wgaW50byBhbiBTV1QgYXBwbGljYXRpb24gb3IgYW4gRWNsaXBzZSB2aWV3LlxuXG5cCi0JV2hlbiB0aGUgdmlldyBpcyBvcGVuZWQsIGl0IHdpbGwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBXaW5kb3dzIEludGVybmV0IEV4cGxvcmVyIFwKLQljb250cm9sLiAgVGhlIE9MRSBXZWIgQnJvd3NlciBoYXMgXAotCUJhY2sgYW5kIEZvcndhcmQgYnV0dG9ucyB0byB0YWtlIHlvdSB0byByZWNlbnRseSB2aXNpdGVkIHBhZ2VzLiAgVGhlIGJyb3dzZXIgYWxzbyBjb250YWlucyBcCi0JYSBIb21lIGJ1dHRvbiB0byB0YWtlIHlvdSB0byB0aGUgd2ViIGJyb3dzZXIncyBob21lIHBhZ2UsIGEgU3RvcCBidXR0b24gd2hpY2ggc3RvcHMgdGhlIFwKLQljdXJyZW50IHRyYW5zZmVyLCBhIFNlYXJjaCBidXR0b24gd2hpY2ggd2lsbCBzZWFyY2ggZm9yIHRleHQgdHlwZWQgaW4gdGhlIEFkZHJlc3MgdGV4dCBmaWVsZCwgYW5kIFwKLQlhIFJlZnJlc2ggYnV0dG9uIHdoaWNoIHJlLWRyYXdzIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBwYWdlLiBUaGVyZSBpcyBhbHNvIGEgXAotCUdvIGJ1dHRvbiB3aGljaCwgd2hlbiBjbGlja2VkLCB3aWxsIGF0dGVtcHQgdG8gbG9hZCB0aGUgcGFnZSBzcGVjaWZpZWQgaW4gdGhlIEFkZHJlc3MgZmllbGQuCi0KLWJyb3dzZXIuQmFjay50ZXh0ID0gQmFja3dhcmQKLWJyb3dzZXIuQmFjay50b29sdGlwID0gR28gdG8gcHJldmlvdXMgV2ViIHNpdGUgaW4gdGhlIGhpc3RvcnkgbGlzdAotCi1icm93c2VyLkZvcndhcmQudGV4dCA9IEZvcndhcmQKLWJyb3dzZXIuRm9yd2FyZC50b29sdGlwID0gR28gdG8gbmV4dCBXZWIgc2l0ZSBpbiB0aGUgaGlzdG9yeSBsaXN0Ci0KLWJyb3dzZXIuSG9tZS50ZXh0ID0gSG9tZQotYnJvd3Nlci5Ib21lLnRvb2x0aXAgPSBHbyB0byBob21lIFdlYiBzaXRlCi0KLWJyb3dzZXIuU3RvcC50ZXh0ID0gU3RvcAotYnJvd3Nlci5TdG9wLnRvb2x0aXAgPSBTdG9wIGxvYWRpbmcgY3VycmVudCBXZWIgc2l0ZQotCi1icm93c2VyLlJlZnJlc2gudGV4dCA9IFJlZnJlc2gKLWJyb3dzZXIuUmVmcmVzaC50b29sdGlwID0gUmVmcmVzaCBjdXJyZW50IFdlYiBzaXRlCi0KLWJyb3dzZXIuU2VhcmNoLnRleHQgPSBTZWFyY2gKLWJyb3dzZXIuU2VhcmNoLnRvb2x0aXAgPSBTZWFyY2ggdGhlIFdlYgotCi1icm93c2VyLkFkZHJlc3MubGFiZWwgPSBBZGRyZXNzIDoKLQotYnJvd3Nlci5Hby50ZXh0ID0gR28KLQotYnJvd3Nlci5TdGF0ZS5VbmluaXRpYWxpemVkLnRleHQgPSBOb3QgcmVhZHkuCi1icm93c2VyLlN0YXRlLkxvYWRpbmcudGV4dCA9IExvYWRpbmcgV2ViIHNpdGUuLi4KLWJyb3dzZXIuU3RhdGUuTG9hZGVkLnRleHQgPSBSZWFkeS4KLWJyb3dzZXIuU3RhdGUuSW50ZXJhY3RpdmUudGV4dCA9IExvYWRpbmcgV2ViIHNpdGUuLi4KLWJyb3dzZXIuU3RhdGUuQ29tcGxldGUudGV4dCA9IERvbmUuCi0KLWVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyA9IFVuYWJsZSB0byBsb2FkIHJlc291cmNlcwotZXJyb3IuQ291bGROb3RDcmVhdGVCcm93c2VyQ29udHJvbCA9IFVuYWJsZSB0byBjcmVhdGUgPDxCcm93c2VyIENvbnRyb2w+PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MTA3MjRmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08IS0tIEZpbGUgd3JpdHRlbiBieSBQREUgMS4wIC0tPgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIiCi0gICBuYW1lPSIlcGx1Z2luLlNXVE9MRUV4YW1wbGUubmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLk9sZVBsdWdpbiI+Ci08IS0tIFJlcXVpcmVkIHBsdWdpbnMgLS0+Ci08cmVxdWlyZXM+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIi8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotPC9yZXF1aXJlcz4KLQotPCEtLSBSdW50aW1lIC0tPgotPCEtLSBSdW50aW1lIC0tPgotPHJ1bnRpbWU+Ci0gICA8bGlicmFyeSBuYW1lPSJvbGV3aW4zMi5qYXIiPgotICAgPC9saWJyYXJ5PgotPC9ydW50aW1lPgotCi08IS0tIEV4dGVuc2lvbnMgLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludHMgLS0+Ci08ZXh0ZW5zaW9uCi0gICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgPHZpZXcKLSAgICAgICAgIG5hbWU9IiV2aWV3Lk9MRVdlYkJyb3dzZXJFeGFtcGxlLm5hbWUiCi0gICAgICAgICBpY29uPSJpY29ucy93ZWJicm93c2VyX2V4YW1wbGUuZ2lmIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jYXRlZ29yeSIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLk9sZUJyb3dzZXJWaWV3IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIuYnJvd3NlclZpZXciPgotICAgPC92aWV3PgotPC9leHRlbnNpb24+Ci08ZXh0ZW5zaW9uCi0gICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIj4KLSAgIDxjYXRlZ29yeQotICAgICAgICAgbmFtZT0iJWxhdW5jaGNhdGVnb3J5LlNXVFdpbjMyT25seUV4YW1wbGVzLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGNhdGVnb3J5LlNXVFdpbjMyT25seUV4YW1wbGVzLmRlc2NyaXB0aW9uIgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hXaW4zMk9ubHlDYXRlZ29yeSI+Ci0gICA8L2NhdGVnb3J5PgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLk9MRVdlYkJyb3dzZXJFeGFtcGxlLm5hbWUiCi0gICAgICAgICBpY29uPSJpY29ucy93ZWJicm93c2VyX2V4YW1wbGUuZ2lmIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLk9MRVdlYkJyb3dzZXJFeGFtcGxlLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hXaW4zMk9ubHlDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLnZpZXdsYXVuY2hlciI+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgdmlld0lkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLmJyb3dzZXJWaWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvaXRlbT4KLTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9pbXBvcnQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQxZGFjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQZXJzaXN0IHByb2plY3Qgc2V0dGluZ3MgZm9yIGxhdGVyIGltcG9ydCAKLW5hdHVyZXMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlOyBvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlCi1idWlsZGVycyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcgotdmFyLkVDTElQU0VfUExVR0lOUyA9IDw8RUNMSVBTRV9QTFVHSU5TPj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT2xlQnJvd3NlclZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT2xlQnJvd3NlclZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTliYTVkNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZUJyb3dzZXJWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC4qOwotCi0vKioKLSAqIE9sZSB1c2VzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dDwvY29kZT4gdG8gZGVtb25zdHJhdGUgV2luMzIgT0xFIC8gQWN0aXZlWAotICogaW50ZWdyYXRpb24uCi0gKiAKLSAqIEBzZWUgVmlld1BhcnQKLSAqLwotcHVibGljIGNsYXNzIE9sZUJyb3dzZXJWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgICAgICBkaXNwbGF5QXJlYTsKLQotCXByaXZhdGUgT2xlRnJhbWUgICAgICAgd2ViRnJhbWU7Ci0JcHJpdmF0ZSBPbGVXZWJCcm93c2VyICB3ZWJCcm93c2VyOwotCXByaXZhdGUgVGV4dCAgICAgICAgICAgd2ViVXJsOwotCXByaXZhdGUgT2xlQ29udHJvbFNpdGUgd2ViQ29udHJvbFNpdGU7Ci0JcHJpdmF0ZSBQcm9ncmVzc0JhciAgICB3ZWJQcm9ncmVzczsKLQlwcml2YXRlIExhYmVsICAgICAgICAgIHdlYlN0YXR1czsKLQlwcml2YXRlIEJ1dHRvbiAgICAgICAgIHdlYk5hdmlnYXRlQnV0dG9uOwotCQotCXByaXZhdGUgVG9vbEl0ZW0gd2ViQ29tbWFuZEJhY2t3YXJkOwotCXByaXZhdGUgVG9vbEl0ZW0gd2ViQ29tbWFuZEZvcndhcmQ7Ci0JcHJpdmF0ZSBUb29sSXRlbSB3ZWJDb21tYW5kSG9tZTsKLQlwcml2YXRlIFRvb2xJdGVtIHdlYkNvbW1hbmRTdG9wOwotCXByaXZhdGUgVG9vbEl0ZW0gd2ViQ29tbWFuZFJlZnJlc2g7Ci0JcHJpdmF0ZSBUb29sSXRlbSB3ZWJDb21tYW5kU2VhcmNoOwotCQotCXByaXZhdGUgYm9vbGVhbiBhY3RpdmF0ZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNQSURfQU1CSUVOVF9ETENPTlRST0wgPSAtNTUxMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRExDVExfTk9fU0NSSVBUUyA9IDB4ODA7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyB0aGUgT0xFIGJyb3dzZXIgdmlldy4KLQkgKi8KLQlwdWJsaWMgT2xlQnJvd3NlclZpZXcoKSB7Ci0JCU9sZVBsdWdpbi5pbml0UmVzb3VyY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZXhhbXBsZS4KLQkgKiAKLQkgKiBAc2VlIFZpZXdQYXJ0I2NyZWF0ZVBhcnRDb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlkaXNwbGF5QXJlYSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJZGlzcGxheUFyZWEuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQkKLQkJY3JlYXRlVG9vbGJhcigpOwotCQljcmVhdGVCcm93c2VyRnJhbWUoKTsJCQotCQljcmVhdGVTdGF0dXNBcmVhKCk7Ci0JCWNyZWF0ZUJyb3dzZXJDb250cm9sKCk7CQotCX0KLQkKLQkvKioKLQkgKiBDbGVhbnVwCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGFjdGl2YXRlZCkgewotCQkJd2ViQ29udHJvbFNpdGUuZGVhY3RpdmF0ZUluUGxhY2VDbGllbnQoKTsKLQkJCWFjdGl2YXRlZCA9IGZhbHNlOwotCQl9Ci0JCWlmICh3ZWJCcm93c2VyICE9IG51bGwpIHdlYkJyb3dzZXIuZGlzcG9zZSgpOwotCQl3ZWJCcm93c2VyID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB3ZSBtdXN0IGdyYWIgZm9jdXMuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0I3NldEZvY3VzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSAgewotCQl3ZWJVcmwuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBXZWIgYnJvd3NlciB0b29sYmFyLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUb29sYmFyKCkgewotCQkvLyBBZGQgYSB0b29sYmFyCi0JCVRvb2xCYXIgYmFyID0gbmV3IFRvb2xCYXIoZGlzcGxheUFyZWEsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQliYXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQkvLyBBZGQgYSBidXR0b24gdG8gbmF2aWdhdGUgYmFja3dhcmRzIHRocm91Z2ggcHJldmlvdXNseSB2aXNpdGVkIHdlYiBzaXRlcwotCQl3ZWJDb21tYW5kQmFja3dhcmQgPSBuZXcgVG9vbEl0ZW0oYmFyLCBTV1QuTk9ORSk7Ci0JCXdlYkNvbW1hbmRCYWNrd2FyZC5zZXRUb29sVGlwVGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuQmFjay50b29sdGlwIikpOwotCQl3ZWJDb21tYW5kQmFja3dhcmQuc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuQmFjay50ZXh0IikpOwotCQl3ZWJDb21tYW5kQmFja3dhcmQuc2V0SW1hZ2UoT2xlUGx1Z2luLmltYWdlc1tPbGVQbHVnaW4uYmlCYWNrXSk7Ci0JCXdlYkNvbW1hbmRCYWNrd2FyZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2ViQ29tbWFuZEJhY2t3YXJkLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAod2ViQnJvd3NlciA9PSBudWxsKSByZXR1cm47Ci0JCQkJd2ViQnJvd3Nlci5Hb0JhY2soKTsKLQkJCX0KLQkJfSk7Ci0JCi0JCS8vIEFkZCBhIGJ1dHRvbiB0byBuYXZpZ2F0ZSBmb3J3YXJkIHRocm91Z2ggcHJldmlvdXNseSB2aXNpdGVkIHdlYiBzaXRlcwotCQl3ZWJDb21tYW5kRm9yd2FyZCA9IG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKTsKLQkJd2ViQ29tbWFuZEZvcndhcmQuc2V0VG9vbFRpcFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLkZvcndhcmQudG9vbHRpcCIpKTsKLQkJd2ViQ29tbWFuZEZvcndhcmQuc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuRm9yd2FyZC50ZXh0IikpOwotCQl3ZWJDb21tYW5kRm9yd2FyZC5zZXRJbWFnZShPbGVQbHVnaW4uaW1hZ2VzW09sZVBsdWdpbi5iaUZvcndhcmRdKTsKLQkJd2ViQ29tbWFuZEZvcndhcmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXdlYkNvbW1hbmRGb3J3YXJkLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAod2ViQnJvd3NlciA9PSBudWxsKSByZXR1cm47Ci0JCQkJd2ViQnJvd3Nlci5Hb0ZvcndhcmQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQWRkIGEgc2VwYXJhdG9yCi0JCW5ldyBUb29sSXRlbShiYXIsIFNXVC5TRVBBUkFUT1IpOwotCQkKLQkJLy8gQWRkIGEgYnV0dG9uIHRvIG5hdmlnYXRlIHRvIHRoZSBIb21lIHBhZ2UKLQkJd2ViQ29tbWFuZEhvbWUgPSBuZXcgVG9vbEl0ZW0oYmFyLCBTV1QuTk9ORSk7Ci0JCXdlYkNvbW1hbmRIb21lLnNldFRvb2xUaXBUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5Ib21lLnRvb2x0aXAiKSk7Ci0JCXdlYkNvbW1hbmRIb21lLnNldFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLkhvbWUudGV4dCIpKTsKLQkJd2ViQ29tbWFuZEhvbWUuc2V0SW1hZ2UoT2xlUGx1Z2luLmltYWdlc1tPbGVQbHVnaW4uYmlIb21lXSk7Ci0JCXdlYkNvbW1hbmRIb21lLnNldEVuYWJsZWQoZmFsc2UpOwotCQl3ZWJDb21tYW5kSG9tZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCXdlYkJyb3dzZXIuR29Ib21lKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIEFkZCBhIGJ1dHRvbiB0byBhYm9ydCB3ZWIgcGFnZSBsb2FkaW5nCi0JCXdlYkNvbW1hbmRTdG9wID0gbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpOwotCQl3ZWJDb21tYW5kU3RvcC5zZXRUb29sVGlwVGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RvcC50b29sdGlwIikpOwotCQl3ZWJDb21tYW5kU3RvcC5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5TdG9wLnRleHQiKSk7Ci0JCXdlYkNvbW1hbmRTdG9wLnNldEltYWdlKE9sZVBsdWdpbi5pbWFnZXNbT2xlUGx1Z2luLmJpU3RvcF0pOwotCQl3ZWJDb21tYW5kU3RvcC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2ViQ29tbWFuZFN0b3AuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmICh3ZWJCcm93c2VyID09IG51bGwpIHJldHVybjsKLQkJCQl3ZWJCcm93c2VyLlN0b3AoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQWRkIGEgYnV0dG9uIHRvIHJlZnJlc2ggdGhlIGN1cnJlbnQgd2ViIHBhZ2UKLQkJd2ViQ29tbWFuZFJlZnJlc2ggPSBuZXcgVG9vbEl0ZW0oYmFyLCBTV1QuTk9ORSk7Ci0JCXdlYkNvbW1hbmRSZWZyZXNoLnNldFRvb2xUaXBUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5SZWZyZXNoLnRvb2x0aXAiKSk7Ci0JCXdlYkNvbW1hbmRSZWZyZXNoLnNldFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlJlZnJlc2gudGV4dCIpKTsKLQkJd2ViQ29tbWFuZFJlZnJlc2guc2V0SW1hZ2UoT2xlUGx1Z2luLmltYWdlc1tPbGVQbHVnaW4uYmlSZWZyZXNoXSk7Ci0JCXdlYkNvbW1hbmRSZWZyZXNoLnNldEVuYWJsZWQoZmFsc2UpOwotCQl3ZWJDb21tYW5kUmVmcmVzaC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCXdlYkJyb3dzZXIuUmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgYSBzZXBhcmF0b3IKLQkJbmV3IFRvb2xJdGVtKGJhciwgU1dULlNFUEFSQVRPUik7Ci0KLQkJLy8gQWRkIGEgYnV0dG9uIHRvIHNlYXJjaCB0aGUgd2ViCi0JCXdlYkNvbW1hbmRTZWFyY2ggPSBuZXcgVG9vbEl0ZW0oYmFyLCBTV1QuTk9ORSk7Ci0JCXdlYkNvbW1hbmRTZWFyY2guc2V0VG9vbFRpcFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlNlYXJjaC50b29sdGlwIikpOwotCQl3ZWJDb21tYW5kU2VhcmNoLnNldFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlNlYXJjaC50ZXh0IikpOwotCQl3ZWJDb21tYW5kU2VhcmNoLnNldEltYWdlKE9sZVBsdWdpbi5pbWFnZXNbT2xlUGx1Z2luLmJpU2VhcmNoXSk7Ci0JCXdlYkNvbW1hbmRTZWFyY2guc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXdlYkNvbW1hbmRTZWFyY2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmICh3ZWJCcm93c2VyID09IG51bGwpIHJldHVybjsKLQkJCQl3ZWJCcm93c2VyLkdvU2VhcmNoKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIEFkZCBhIHRleHQgYXJlYSBmb3IgVXNlcnMgdG8gZW50ZXIgYSB1cmwKLQkJQ29tcG9zaXRlIGFkZHJlc3NCYXIgPSBuZXcgQ29tcG9zaXRlKGRpc3BsYXlBcmVhLCBTV1QuTk9ORSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWFkZHJlc3NCYXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWFkZHJlc3NCYXIuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCUxhYmVsIGFkZHJlc3NMYWJlbCA9IG5ldyBMYWJlbChhZGRyZXNzQmFyLCBTV1QuTk9ORSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQlhZGRyZXNzTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWFkZHJlc3NMYWJlbC5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5BZGRyZXNzLmxhYmVsIikpOwotCQlhZGRyZXNzTGFiZWwuc2V0Rm9udChPbGVQbHVnaW4uYnJvd3NlckZvbnQpOwotCQkKLQkJd2ViVXJsID0gbmV3IFRleHQoYWRkcmVzc0JhciwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQl3ZWJVcmwuc2V0Rm9udChPbGVQbHVnaW4uYnJvd3NlckZvbnQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJd2ViVXJsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl3ZWJVcmwuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJd2ViTmF2aWdhdGVCdXR0b24uZ2V0U2hlbGwoKS5zZXREZWZhdWx0QnV0dG9uKHdlYk5hdmlnYXRlQnV0dG9uKTsKLQkJCX0KLQkJfSk7Ci0JCi0JCS8vIEFkZCBhIGJ1dHRvbiB0byBuYXZpZ2F0ZSB0byB0aGUgd2ViIHNpdGUgc3BlY2lmaWVkIGluIHRoZSBUZXh0IGFyZWEgZGVmaW5lZCBhYm92ZQotCQl3ZWJOYXZpZ2F0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYWRkcmVzc0JhciwgU1dULlBVU0gpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJd2ViTmF2aWdhdGVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXdlYk5hdmlnYXRlQnV0dG9uLnNldFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLkdvLnRleHQiKSk7Ci0JCXdlYk5hdmlnYXRlQnV0dG9uLnNldEZvbnQoT2xlUGx1Z2luLmJyb3dzZXJGb250KTsKLQkJd2ViTmF2aWdhdGVCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAod2ViQnJvd3NlciA9PSBudWxsKSByZXR1cm47Ci0JCQkJd2ViQnJvd3Nlci5OYXZpZ2F0ZSh3ZWJVcmwuZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgV2ViIGJyb3dzZXIgT2xlRnJhbWUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJyb3dzZXJGcmFtZSgpIHsKLQkJLy8gRXZlcnkgY29udHJvbCBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBPbGVGcmFtZToKLQkJd2ViRnJhbWUgPSBuZXcgT2xlRnJhbWUoZGlzcGxheUFyZWEsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJd2ViRnJhbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFdlYiBicm93c2VyIHN0YXR1cyBhcmVhLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTdGF0dXNBcmVhKCkgewotCQkvLyBBZGQgYSBwcm9ncmVzcyBiYXIgdG8gZGlzcGxheSBkb3dubG9hZGluZyBwcm9ncmVzcyBpbmZvcm1hdGlvbgotCQl3ZWJQcm9ncmVzcyA9IG5ldyBQcm9ncmVzc0JhcihkaXNwbGF5QXJlYSwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJd2ViUHJvZ3Jlc3Muc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CQkKLQotCQkvLyBBZGQgYSBsYWJlbCBmb3IgZGlzcGxheWluZyBzdGF0dXMgbWVzc2FnZXMgYXMgdGhleSBhcmUgcmVjZWl2ZWQgZnJvbSB0aGUgY29udHJvbAotCQl3ZWJTdGF0dXMgPSBuZXcgTGFiZWwoZGlzcGxheUFyZWEsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXdlYlN0YXR1cy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJd2ViU3RhdHVzLnNldEZvbnQoT2xlUGx1Z2luLmJyb3dzZXJGb250KTsKLQl9CQotCi0JLyoqCi0JICogQ3JlYXRlcyBXZWIgYnJvd3NlciBjb250cm9sLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVCcm93c2VyQ29udHJvbCgpIHsKLQkJdHJ5IHsKLQkJCS8vIENyZWF0ZSBhbiBBdXRvbWF0aW9uIG9iamVjdCBmb3IgYWNjZXNzIHRvIGV4dGVuZGVkIGNhcGFiaWxpdGllcwotCQkJd2ViQ29udHJvbFNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUod2ViRnJhbWUsIFNXVC5OT05FLCAiU2hlbGwuRXhwbG9yZXIiKTsKLQkJCVZhcmlhbnQgZG93bmxvYWQgPSBuZXcgVmFyaWFudChETENUTF9OT19TQ1JJUFRTKTsKLQkJCXdlYkNvbnRyb2xTaXRlLnNldFNpdGVQcm9wZXJ0eShESVNQSURfQU1CSUVOVF9ETENPTlRST0wsIGRvd25sb2FkKTsKLQkJCU9sZUF1dG9tYXRpb24gb2xlQXV0b21hdGlvbiA9IG5ldyBPbGVBdXRvbWF0aW9uKHdlYkNvbnRyb2xTaXRlKTsKLQkJCXdlYkJyb3dzZXIgPSBuZXcgT2xlV2ViQnJvd3NlcihvbGVBdXRvbWF0aW9uKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBDcmVhdGlvbiBtYXkgaGF2ZSBmYWlsZWQgYmVjYXVzZSBjb250cm9sIGlzIG5vdCBpbnN0YWxsZWQgb24gbWFjaGluZQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwod2ViRnJhbWUsIFNXVC5CT1JERVIpOwotCQkJT2xlUGx1Z2luLmxvZ0Vycm9yKE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuQ291bGROb3RDcmVhdGVCcm93c2VyQ29udHJvbCIpLCBleCk7Ci0JCQlsYWJlbC5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuQ291bGROb3RDcmVhdGVCcm93c2VyQ29udHJvbCIpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFJlc3BvbmQgdG8gUHJvZ3Jlc3NDaGFuZ2UgZXZlbnRzIGJ5IHVwZGF0aW5nIHRoZSBQcm9ncmVzcyBiYXIKLQkJd2ViQ29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihPbGVXZWJCcm93c2VyLlByb2dyZXNzQ2hhbmdlLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJCVZhcmlhbnQgcHJvZ3Jlc3MgPSBldmVudC5hcmd1bWVudHNbMF07Ci0JCQkJVmFyaWFudCBtYXhQcm9ncmVzcyA9IGV2ZW50LmFyZ3VtZW50c1sxXTsKLQkJCQlpZiAocHJvZ3Jlc3MgPT0gbnVsbCB8fCBtYXhQcm9ncmVzcyA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJd2ViUHJvZ3Jlc3Muc2V0TWF4aW11bShtYXhQcm9ncmVzcy5nZXRJbnQoKSk7Ci0JCQkJd2ViUHJvZ3Jlc3Muc2V0U2VsZWN0aW9uKHByb2dyZXNzLmdldEludCgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBSZXNwb25kIHRvIFN0YXR1c1RleHRDaGFuZ2UgZXZlbnRzIGJ5IHVwZGF0aW5nIHRoZSBTdGF0dXMgVGV4dCBsYWJlbAotCQl3ZWJDb250cm9sU2l0ZS5hZGRFdmVudExpc3RlbmVyKE9sZVdlYkJyb3dzZXIuU3RhdHVzVGV4dENoYW5nZSwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYXJpYW50IHN0YXR1c1RleHQgPSBldmVudC5hcmd1bWVudHNbMF07Ci0JCQkJaWYgKHN0YXR1c1RleHQgPT0gbnVsbCkJcmV0dXJuOwotCQkJCVN0cmluZyB0ZXh0ID0gc3RhdHVzVGV4dC5nZXRTdHJpbmcoKTsKLQkJCQlpZiAodGV4dCAhPSBudWxsKQotCQkJCQl3ZWJTdGF0dXMuc2V0VGV4dCh0ZXh0KTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBMaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlIHJlYWR5IHN0YXRlIGFuZCBwcmludCBvdXQgdGhlIGN1cnJlbnQgc3RhdGUgCi0JCXdlYkNvbnRyb2xTaXRlLmFkZFByb3BlcnR5TGlzdGVuZXIoT2xlV2ViQnJvd3Nlci5ESVNQSURfUkVBRFlTVEFURSwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZGV0YWlsID09IE9MRS5QUk9QRVJUWV9DSEFOR0lORykgcmV0dXJuOwotCQkJCWludCBzdGF0ZSA9IHdlYkJyb3dzZXIuZ2V0UmVhZHlTdGF0ZSgpOwotCQkJCXN3aXRjaCAoc3RhdGUpIHsKLQkJCQkJY2FzZSBPbGVXZWJCcm93c2VyLlJFQURZU1RBVEVfVU5JTklUSUFMSVpFRDoKLQkJCQkJCXdlYlN0YXR1cy5zZXRUZXh0KAotCQkJCQkJCU9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5TdGF0ZS5VbmluaXRpYWxpemVkLnRleHQiKSk7Ci0JCQkJCQl3ZWJDb21tYW5kQmFja3dhcmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQl3ZWJDb21tYW5kRm9yd2FyZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCXdlYkNvbW1hbmRIb21lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJd2ViQ29tbWFuZFJlZnJlc2guc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQl3ZWJDb21tYW5kU3RvcC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCXdlYkNvbW1hbmRTZWFyY2guc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBPbGVXZWJCcm93c2VyLlJFQURZU1RBVEVfTE9BRElORzoKLQkJCQkJCXdlYlN0YXR1cy5zZXRUZXh0KAotCQkJCQkJCU9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5TdGF0ZS5Mb2FkaW5nLnRleHQiKSk7Ci0JCQkJCQl3ZWJDb21tYW5kSG9tZS5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJd2ViQ29tbWFuZFJlZnJlc2guc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCXdlYkNvbW1hbmRTdG9wLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl3ZWJDb21tYW5kU2VhcmNoLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBPbGVXZWJCcm93c2VyLlJFQURZU1RBVEVfTE9BREVEOgotCQkJCQkJd2ViU3RhdHVzLnNldFRleHQoCi0JCQkJCQkJT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlN0YXRlLkxvYWRlZC50ZXh0IikpOwotCQkJCQkJd2ViQ29tbWFuZFN0b3Auc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE9sZVdlYkJyb3dzZXIuUkVBRFlTVEFURV9JTlRFUkFDVElWRToKLQkJCQkJCXdlYlN0YXR1cy5zZXRUZXh0KAotCQkJCQkJCU9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5TdGF0ZS5JbnRlcmFjdGl2ZS50ZXh0IikpOwotCQkJCQkJd2ViQ29tbWFuZFN0b3Auc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE9sZVdlYkJyb3dzZXIuUkVBRFlTVEFURV9DT01QTEVURToKLQkJCQkJCXdlYlN0YXR1cy5zZXRUZXh0KAotCQkJCQkJCU9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5TdGF0ZS5Db21wbGV0ZS50ZXh0IikpOwotCQkJCQkJd2ViQ29tbWFuZFN0b3Auc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIExpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGUgYWN0aXZlIGNvbW1hbmQgc3RhdGVzCi0JCXdlYkNvbnRyb2xTaXRlLmFkZEV2ZW50TGlzdGVuZXIoT2xlV2ViQnJvd3Nlci5Db21tYW5kU3RhdGVDaGFuZ2UsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LnR5cGUgIT0gT2xlV2ViQnJvd3Nlci5Db21tYW5kU3RhdGVDaGFuZ2UpIHJldHVybjsKLQkJCQlmaW5hbCBpbnQgY29tbWFuZElEID0KLQkJCQkJKGV2ZW50LmFyZ3VtZW50c1swXSAhPSBudWxsKSA/IGV2ZW50LmFyZ3VtZW50c1swXS5nZXRJbnQoKSA6IDA7Ci0JCQkJZmluYWwgYm9vbGVhbiBjb21tYW5kRW5hYmxlZCA9Ci0JCQkJCShldmVudC5hcmd1bWVudHNbMV0gIT0gbnVsbCkgPyBldmVudC5hcmd1bWVudHNbMV0uZ2V0Qm9vbGVhbigpIDogZmFsc2U7Ci0JCQkJCi0JCQkJc3dpdGNoIChjb21tYW5kSUQpIHsKLQkJCQkJY2FzZSBPbGVXZWJCcm93c2VyLkNTQ19OQVZJR0FURUJBQ0s6Ci0JCQkJCSAJd2ViQ29tbWFuZEJhY2t3YXJkLnNldEVuYWJsZWQoY29tbWFuZEVuYWJsZWQpOwotCQkJCQkgCWJyZWFrOwotCQkJCQljYXNlIE9sZVdlYkJyb3dzZXIuQ1NDX05BVklHQVRFRk9SV0FSRDoKLQkJCQkJIAl3ZWJDb21tYW5kRm9yd2FyZC5zZXRFbmFibGVkKGNvbW1hbmRFbmFibGVkKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gaW4gcGxhY2UgYWN0aXZhdGUgdGhlIEFjdGl2ZVggY29udHJvbAkJCi0JCWFjdGl2YXRlZCA9ICh3ZWJDb250cm9sU2l0ZS5kb1ZlcmIoT0xFLk9MRUlWRVJCX0lOUExBQ0VBQ1RJVkFURSkgPT0gT0xFLlNfT0spOwotCQlpZiAoYWN0aXZhdGVkKSB3ZWJCcm93c2VyLkdvSG9tZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT2xlUGx1Z2luLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNTVjMmUzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT2xlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzI7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBPbGVQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgT2xlUGx1Z2luIHBsdWdpbjsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCXN0YXRpYyBmaW5hbCBpbnQKLQkJYmlCYWNrID0gMCwKLQkJYmlGb3J3YXJkID0gMSwKLQkJYmlIb21lID0gMiwKLQkJYmlTdG9wID0gMywKLQkJYmlSZWZyZXNoID0gNCwKLQkJYmlTZWFyY2ggPSA1OwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpbWFnZUxvY2F0aW9ucyA9IHsKLQkJImljb25zL2JhY2t3YXJkX25hdi5naWYiLAotCQkiaWNvbnMvZm9yd2FyZF9uYXYuZ2lmIiwKLQkJImljb25zL2hvbWVfbmF2LmdpZiIsCi0JCSJpY29ucy9zdG9wX25hdi5naWYiLAotCQkiaWNvbnMvcmVmcmVzaF9uYXYuZ2lmIiwKLQkJImljb25zL3NlYXJjaF9uYXYuZ2lmIiB9OwotCXN0YXRpYyBJbWFnZSBpbWFnZXNbXTsKLQlzdGF0aWMgRm9udCAgYnJvd3NlckZvbnQ7Ci0gICAKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGFuIE9MRSBwbHVnaW4uCi0JICovCi0JcHVibGljIE9sZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHJlc291cmNlQnVuZGxlID0gUGxhdGZvcm0uZ2V0UmVzb3VyY2VCdW5kbGUoZ2V0QnVuZGxlKCkpOwotICAgIH0KLSAgICAKLQkvKioKLQkgKiBDbGVhbiB1cAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZnJlZVJlc291cmNlcygpOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9sZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqIFdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggYmVjYXVzZSBvZiBhIG1pc3NpbmcgU3RyaW5nLgotCSAqIFJldHVybnMgdGhlIGtleSBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQkJCQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGFuZCBiaW5kcyBpdAotCSAqIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gSWYgdGhlIGtleSBpcyBub3QgZm91bmQsCi0JICogcmV0dXJuIHRoZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFJlc291cmNlU3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvZyBhbiBlcnJvciB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgdGV4dAotCSAqIEBwYXJhbSBleGNlcHRpb24gdGhlIGFzc29jaWF0ZWQgZXhjZXB0aW9uLCBvciBudWxsCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXBsdWdpbi5nZXRMb2coKS5sb2cobmV3IFN0YXR1cygKLQkJCUlTdGF0dXMuRVJST1IsIHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIHJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdFJlc291cmNlcygpIHsKLQkJaWYgKGltYWdlcyA9PSBudWxsKSB7Ci0JCQlpbWFnZXMgPSBuZXcgSW1hZ2VbaW1hZ2VMb2NhdGlvbnMubGVuZ3RoXTsKLQkJCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VMb2NhdGlvbnMubGVuZ3RoOyArK2kpIHsKLQkJCQlpbWFnZXNbaV0gPSBnZXRJbWFnZUZyb21QbHVnaW4ocGx1Z2luLmdldEJ1bmRsZSgpLCBpbWFnZUxvY2F0aW9uc1tpXSk7Ci0JCQkJaWYgKGltYWdlc1tpXSA9PSBudWxsKSB7Ci0JCQkJCWZyZWVSZXNvdXJjZXMoKTsKLQkJCQkJbG9nRXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIpLCBudWxsKTsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoYnJvd3NlckZvbnQgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlicm93c2VyRm9udCA9IG5ldyBGb250IChudWxsLCAiTVMgU2FucyBTZXJpZiIsIDgsIFNXVC5OVUxMKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotCQkJfQotCQl9Ci0JCWlmIChpbWFnZXMgPT0gbnVsbCB8fCBicm93c2VyRm9udCA9PSBudWxsKSB7Ci0JCQlmcmVlUmVzb3VyY2VzKCk7Ci0JCQlsb2dFcnJvcihnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzIiksIG51bGwpOwotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRnJlZXMgdGhlIHJlc291cmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcmVlUmVzb3VyY2VzKCkgewotCQlpZiAoaW1hZ2VzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbaV07Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWltYWdlcyA9IG51bGw7Ci0JCX0KLQkJaWYgKGJyb3dzZXJGb250ICE9IG51bGwpIGJyb3dzZXJGb250LmRpc3Bvc2UgKCk7Ci0JCWJyb3dzZXJGb250ID0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhbiBpbWFnZSBmcm9tIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIGluc3RhbGwgZGlyZWN0b3J5LgotCSAqCi0JICogQHBhcmFtIHBkIHRoZSBwbHVnaW4gZGVzY3JpcHRvciBmb3IgdGhlIHBsdWdpbiB3aXRoIHRoZSBpbWFnZQotCSAqIEBwYXJhbSBpY29uUGF0aCB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgaW5zdGFsbCBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSwgb3IgbnVsbCBpZiBub3QgZm91bmQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBnZXRJbWFnZUZyb21QbHVnaW4oQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGljb25QYXRoKSB7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVVSTCBpbnN0YWxsVXJsID0gYnVuZGxlLmdldEVudHJ5KCIvIik7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChpbnN0YWxsVXJsLCBpY29uUGF0aCk7Ci0JCQlpcyA9IHVybC5vcGVuQ29ubmVjdGlvbigpLmdldElucHV0U3RyZWFtKCk7Ci0JCQlJbWFnZURhdGEgc291cmNlID0gbmV3IEltYWdlRGF0YShpcyk7Ci0JCQlJbWFnZURhdGEgbWFzayA9IHNvdXJjZS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShudWxsLCBzb3VyY2UsIG1hc2spOwotCQkJcmV0dXJuIGltYWdlOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaXMgIT0gbnVsbCkgaXMuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT2xlV2ViQnJvd3Nlci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVXZWJCcm93c2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0OTg4MTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVXZWJCcm93c2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLQotLyoqCi0gKiBXcmFwcGVyIGZvciBhbiBPbGVBdXRvbWF0aW9uIG9iamVjdCB1c2VkIHRvIHNlbmQgY29tbWFuZHMKLSAqIHRvIGEgV2luMzIgIlNoZWxsLkV4cGxvcmVyIiBPTEUgY29udHJvbC4KLSAqIAotICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgbWFuYWdlIHRoZSBzZXR1cCwgdHlwaWNhbCB1c2UgYW5kIHRlYXJkb3duIG9mCi0gKiBhIHNpbXBsZSB3ZWIgYnJvd3Nlci4KLSAqLwotY2xhc3MgT2xlV2ViQnJvd3NlciB7Ci0JLyogU2VlIHRoZSBXaW5kb3dzIFBsYXRmb3JtIFNESyBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZQotCSAqIE9MRSBjb250cm9sIHVzZWQgaGVyZSBhbmQgaXRzIHVzYWdlLgotCSAqLwotCS8vIEdlbmVyYXRlZCBmcm9tIHR5cGVsaWIgZmlsZW5hbWU6IHNoZG9jdncuZGxsCi0KLQkvLyBDb25zdGFudHMgZm9yIFdlYkJyb3dzZXIgQ29tbWFuZFN0YXRlQ2hhbmdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1NDX1VQREFURUNPTU1BTkRTID0gLTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1NDX05BVklHQVRFRk9SV0FSRCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1NDX05BVklHQVRFQkFDSyA9IDI7Ci0KLQkvLyBDT25zdGFudHMgZm9yIFdlYiBCcm93c2VyIFJlYWR5U3RhdGUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEWVNUQVRFX1VOSU5JVElBTElaRUQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZU1RBVEVfTE9BRElORyA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRFlTVEFURV9MT0FERUQgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZU1RBVEVfSU5URVJBQ1RJVkUgPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZU1RBVEVfQ09NUExFVEUgPSA0OwotCQotCS8vIFdlYiBCcm93c2VyIENvbnRyb2wgRXZlbnRzIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJlZm9yZU5hdmlnYXRlICAgICAgICA9IDEwMDsgLy8gRmlyZWQgd2hlbiBhIG5ldyBoeXBlcmxpbmsgaXMgYmVpbmcgbmF2aWdhdGVkIHRvLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5hdmlnYXRlQ29tcGxldGUgICAgICA9IDEwMTsgLy8gRmlyZWQgd2hlbiB0aGUgZG9jdW1lbnQgYmVpbmcgbmF2aWdhdGVkIHRvIGJlY29tZXMgdmlzaWJsZSBhbmQgZW50ZXJzIHRoZSBuYXZpZ2F0aW9uIHN0YWNrLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFN0YXR1c1RleHRDaGFuZ2UgICAgICA9IDEwMjsgLy8gU3RhdHVzYmFyIHRleHQgY2hhbmdlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9ncmVzc0NoYW5nZSAgICAgICAgPSAxMDg7IC8vIEZpcmVkIHdoZW4gZG93bmxvYWQgcHJvZ3Jlc3MgaXMgdXBkYXRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEb3dubG9hZENvbXBsZXRlICAgICAgPSAxMDQ7IC8vIERvd25sb2FkIG9mIHBhZ2UgY29tcGxldGUuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ29tbWFuZFN0YXRlQ2hhbmdlICAgID0gMTA1OyAvLyBUaGUgZW5hYmxlZCBzdGF0ZSBvZiBhIGNvbW1hbmQgY2hhbmdlZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERvd25sb2FkQmVnaW4gICAgICAgICA9IDEwNjsgLy8gRG93bmxvYWQgb2YgYSBwYWdlIHN0YXJ0ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTmV3V2luZG93ICAgICAgICAgICAgID0gMTA3OyAvLyBGaXJlZCB3aGVuIGEgbmV3IHdpbmRvdyBzaG91bGQgYmUgY3JlYXRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaXRsZUNoYW5nZSAgICAgICAgICAgPSAxMTM7IC8vIERvY3VtZW50IHRpdGxlIGNoYW5nZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRnJhbWVCZWZvcmVOYXZpZ2F0ZSAgID0gMjAwOyAvLyBGaXJlZCB3aGVuIGEgbmV3IGh5cGVybGluayBpcyBiZWluZyBuYXZpZ2F0ZWQgdG8gaW4gYSBmcmFtZS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGcmFtZU5hdmlnYXRlQ29tcGxldGUgPSAyMDE7IC8vIEZpcmVkIHdoZW4gYSBuZXcgaHlwZXJsaW5rIGlzIGJlaW5nIG5hdmlnYXRlZCB0byBpbiBhIGZyYW1lLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZyYW1lTmV3V2luZG93ICAgICAgICA9IDIwNDsgLy8gRmlyZWQgd2hlbiBhIG5ldyB3aW5kb3cgc2hvdWxkIGJlIGNyZWF0ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUXVpdCAgICAgICAgICAgICAgICAgID0gMTAzOyAvLyBGaXJlZCB3aGVuIGFwcGxpY2F0aW9uIGlzIHF1aXRpbmcuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93TW92ZSAgICAgICAgICAgID0gMTA5OyAvLyBGaXJlZCB3aGVuIHdpbmRvdyBoYXMgYmVlbiBtb3ZlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dSZXNpemUgICAgICAgICAgPSAxMTA7IC8vIEZpcmVkIHdoZW4gd2luZG93IGhhcyBiZWVuIHNpemVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd0FjdGl2YXRlICAgICAgICA9IDExMTsgLy8gRmlyZWQgd2hlbiB3aW5kb3cgaGFzIGJlZW4gYWN0aXZhdGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByb3BlcnR5Q2hhbmdlICAgICAgICA9IDExMjsgLy8gRmlyZWQgd2hlbiB0aGUgUHV0UHJvcGVydHkgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC4KLQotCS8vIFdlYiBCcm93c2VyIHByb3BlcnRpZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNQSURfUkVBRFlTVEFURSA9IC01MjU7Ci0KLQlwcml2YXRlIE9sZUF1dG9tYXRpb24gIG9sZUF1dG9tYXRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgV2ViIGJyb3dzZXIgY29udHJvbC4KLQkgKiA8cD4KLQkgKiBUeXBpY2FsIHVzZTo8YnI+Ci0JICogPGNvZGU+Ci0JICogT2xlQ29udHJvbFNpdGUgb2xlQ29udHJvbFNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUob2xlRnJhbWUsIHN0eWxlLCAiU2hlbGwuRXhwbG9yZXIiKTs8YnI+Ci0JICogT2xlQXV0b21hdGlvbiBvbGVBdXRvbWF0aW9uID0gbmV3IE9sZUF1dG9tYXRpb24ob2xlQ29udHJvbFNpdGUpOzxicj4KLQkgKiBPbGVXZWJCcm93c2VyIHdlYkJyb3dzZXIgPSBuZXcgT2xlV2ViQnJvd3NlcihvbGVDb250cm9sU2l0ZSwgb2xlQXV0b21hdGlvbik7PGJyPgotCSAqIDwvY29kZT4KLQkgKiAKLSAgICAgKiBAcGFyYW0gb2xlQXV0b21hdGlvbiB0aGUgT2xlQXV0b21hdGlvbiBvYmplY3QgZm9yIHRoaXMgY29udHJvbC4KLSAgICAgKiBAcGFyYW0gb2xlQ29udHJvbFNpdGUgdGhlIE9sZUNvbnRyb2xTaXRlIG9iamVjdCBmb3IgdGhpcyBjb250cm9sLgotCSAqLwotCXB1YmxpYyBPbGVXZWJCcm93c2VyKE9sZUF1dG9tYXRpb24gb2xlQXV0b21hdGlvbikgewotCQl0aGlzLm9sZUF1dG9tYXRpb24gPSBvbGVBdXRvbWF0aW9uOwotCX0KLQkKLQkKLQkvKioKLQkgKiBEaXNwb3NlcyBvZiB0aGUgV2ViIGJyb3dzZXIgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAob2xlQXV0b21hdGlvbiAhPSBudWxsKSBvbGVBdXRvbWF0aW9uLmRpc3Bvc2UoKTsKLQkJb2xlQXV0b21hdGlvbiA9IG51bGw7Ci0JfQotCQotCS8qCi0JICogSW50ZXJhY3Qgd2l0aCB0aGUgQ29udHJvbCB2aWEgT0xFIEF1dG9tYXRpb24KLQkgKiAKLQkgKiBOb3RlOiBZb3UgY2FuIGhhcmQgY29kZSB0aGUgRElTUElEcyBpZiB5b3Uga25vdyB0aGVtIGJlZm9yZWhhbmQKLQkgKiAgICAgICB0aGlzIGlzIG9mIGNvdXJzZSB0aGUgZmFzdGVzdCB3YXksIGJ1dCB5b3UgaW5jcmVhc2UgY291cGxpbmcKLQkgKiAgICAgICB0byB0aGUgY29udHJvbC4KLQkgKi8KLQkgCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCB3ZWIgcGFnZSB0aXRsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHdlYiBwYWdlIHRpdGxlIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25OYW1lKCkgewotCQkvLyBkaXNwaWQ9MjEwLCB0eXBlPVBST1BHRVQsIG5hbWU9IkxvY2F0aW9uTmFtZSIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJMb2NhdGlvbk5hbWUifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCVZhcmlhbnQgcFZhclJlc3VsdCA9IG9sZUF1dG9tYXRpb24uZ2V0UHJvcGVydHkoZGlzcElkTWVtYmVyKTsKLQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSAhPSBPTEUuVlRfQlNUUikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwVmFyUmVzdWx0LmdldFN0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IFVSTC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IFVSTCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uVVJMKCkgewotCQkvLyBkaXNwaWQ9MjExLCB0eXBlPVBST1BHRVQsIG5hbWU9IkxvY2F0aW9uVVJMIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IkxvY2F0aW9uVVJMIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQkKLQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gb2xlQXV0b21hdGlvbi5nZXRQcm9wZXJ0eShkaXNwSWRNZW1iZXIpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpICE9IE9MRS5WVF9CU1RSKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHBWYXJSZXN1bHQuZ2V0U3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY29udHJvbCwgb25lIG9mOgotCSAqICAgICAgICAgUkVBRFlTVEFURV9VTklOSVRJQUxJWkVEOwotCSAqICAgICAgICAgUkVBRFlTVEFURV9MT0FESU5HOwotCSAqICAgICAgICAgUkVBRFlTVEFURV9MT0FERUQ7Ci0JICogICAgICAgICBSRUFEWVNUQVRFX0lOVEVSQUNUSVZFOwotCSAqICAgICAgICAgUkVBRFlTVEFURV9DT01QTEVURS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlYWR5U3RhdGUoKSB7Ci0JCS8vIGRpc3BpZD00Mjk0OTY2NzcxLCB0eXBlPVBST1BHRVQsIG5hbWU9IlJlYWR5U3RhdGUiCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiUmVhZHlTdGF0ZSJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJCi0JCVZhcmlhbnQgcFZhclJlc3VsdCA9IG9sZUF1dG9tYXRpb24uZ2V0UHJvcGVydHkoZGlzcElkTWVtYmVyKTsKLQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSAhPSBPTEUuVlRfSTQpIHJldHVybiAtMTsKLQkJcmV0dXJuIHBWYXJSZXN1bHQuZ2V0SW50KCk7Ci0JfQotCQotCS8qKgotCSAqIE5hdmlnYXRlcyBiYWNrd2FyZHMgdGhyb3VnaCBwcmV2aW91c2x5IHZpc2l0ZWQgd2ViIHNpdGVzLgotCSAqLwotCXB1YmxpYyB2b2lkIEdvQmFjaygpIHsKLQkKLQkJLy8gZGlzcGlkPTEwMCwgdHlwZT1NRVRIT0QsIG5hbWU9IkdvQmFjayIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJHb0JhY2sifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCW9sZUF1dG9tYXRpb24uaW52b2tlKGRpc3BJZE1lbWJlcik7Ci0JfQotCQotCS8qKgotCSAqIE5hdmlnYXRlcyBiYWNrd2FyZHMgdGhyb3VnaCBwcmV2aW91c2x5IHZpc2l0ZWQgd2ViIHNpdGVzLgotCSAqLwotCXB1YmxpYyB2b2lkIEdvRm9yd2FyZCgpIHsKLQkKLQkJLy8gZGlzcGlkPTEwMSwgdHlwZT1NRVRIT0QsIG5hbWU9IkdvRm9yd2FyZCIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJHb0ZvcndhcmQifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCW9sZUF1dG9tYXRpb24uaW52b2tlKGRpc3BJZE1lbWJlcik7Ci0JfQotCQotCS8qKgotCSAqIE5hdmlnYXRlcyB0byBob21lIHBhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgR29Ib21lKCkgewotCQkvLyBkaXNwaWQ9MTAyLCB0eXBlPU1FVEhPRCwgbmFtZT0iR29Ib21lIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IkdvSG9tZSJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJb2xlQXV0b21hdGlvbi5pbnZva2UoZGlzcElkTWVtYmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogTmF2aWdhdGVzIHRvIHVzZXItc3BlY2lmaWVkIFdlYiBzZWFyY2ggZ2F0ZXdheS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBHb1NlYXJjaCgpIHsKLQkJLy8gZGlzcGlkPTEwMywgdHlwZT1NRVRIT0QsIG5hbWU9IkdvU2VhcmNoIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IkdvU2VhcmNoIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQlvbGVBdXRvbWF0aW9uLmludm9rZShkaXNwSWRNZW1iZXIpOwotCX0KLQkKLQkvKioKLQkgKiBOYXZpZ2F0ZXMgdG8gYSBwYXJ0aWN1bGFyIFVSTC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBOYXZpZ2F0ZShTdHJpbmcgdXJsKSB7Ci0JCS8vIGRpc3BpZD0xMDQsIHR5cGU9TUVUSE9ELCBuYW1lPSJOYXZpZ2F0ZSIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJOYXZpZ2F0ZSIsICJVUkwifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCQotCQlWYXJpYW50W10gcmd2YXJnID0gbmV3IFZhcmlhbnRbMV07Ci0JCXJndmFyZ1swXSA9IG5ldyBWYXJpYW50KHVybCk7Ci0JCWludFtdIHJnZGlzcGlkTmFtZWRBcmdzID0gbmV3IGludFsxXTsKLQkJcmdkaXNwaWROYW1lZEFyZ3NbMF0gPSByZ2Rpc3BpZFsxXTsgLy8gaWRlbnRpZmllciBvZiBhcmd1bWVudAotCQlvbGVBdXRvbWF0aW9uLmludm9rZShkaXNwSWRNZW1iZXIsIHJndmFyZywgcmdkaXNwaWROYW1lZEFyZ3MpOwotCX0KLQkKLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIGN1cnJlbnRseSB2aWV3ZWQgcGFnZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHBsYXRmb3JtLWRlZmluZWQgcmVzdWx0IGNvZGUgZm9yIHRoZSAiUmVmcmVzaCIgbWV0aG9kIGludm9jYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBSZWZyZXNoKCl7Ci0JCS8vIGRpc3BpZD0gNDI5NDk2Njc0NiwgdHlwZT1NRVRIT0QsIG5hbWU9IlJlZnJlc2giCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiUmVmcmVzaCJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJb2xlQXV0b21hdGlvbi5pbnZva2VOb1JlcGx5KGRpc3BJZE1lbWJlcik7Ci0JfQotCQotCS8qKgotCSAqIEFib3J0cyBsb2FkaW5nIG9mIHRoZSBjdXJybmV0IHBhZ2UuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBwbGF0Zm9ybS1kZWZpbmVkIHJlc3VsdCBjb2RlIGZvciB0aGUgIlN0b3AiIG1ldGhvZCBpbnZvY2F0aW9uCi0JICovCi0JcHVibGljIHZvaWQgU3RvcCgpIHsKLQkJLy8gZGlzcGlkPTEwNiwgdHlwZT1NRVRIT0QsIG5hbWU9IlN0b3AiCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiU3RvcCJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJb2xlQXV0b21hdGlvbi5pbnZva2UoZGlzcElkTWVtYmVyKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8uY3ZzaWdub3JlIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMzlhZjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmMGFlMGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAqLmphcgotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi0KLXNvdXJjZS5wYWludC5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvZG9jLWh0bWwvc3d0X3BhaW50X2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvZG9jLWh0bWwvc3d0X3BhaW50X2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0OGU3Y2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2RvYy1odG1sL3N3dF9wYWludF9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gUGFpbnQgVG9vbDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gUGFpbnQgVG9vbDwvaDI+Ci0KLTxwPgkKLVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBTV1QgZ3JhcGhpY3Mgb3BlcmF0aW9ucyBpbiB0aGUgZm9ybSBvZiBhCi1ydWRpbWVudGFyeSBiaXRtYXAgcGFpbnRpbmcgcHJvZ3JhbS4gIFRoZSBQYWludCBUb29sIGltcGxlbWVudGF0aW9uIGFsc28gCi1kZW1vbnN0cmF0ZXMgYSBtZWNoYW5pc20gZm9yIG1hbmFnaW5nIHRpbWVkIEdVSSBvcGVyYXRpb25zIGluIHRoZSBiYWNrZ3JvdW5kIAotdGhhdCBhcmUgdHJpZ2dlcmVkIGJ5IHVzZXIgaW5wdXQuCi08L3A+Ci08cD4JCi1TZWxlY3QgYSB0b29sIHdpdGggd2hpY2ggdG8gZHJhdyBpbiB0aGUgZHJhd2luZyBhcmVhLiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRvb2xzCi10byBjaG9vc2UgZnJvbSBvbiB0aGUgdG9vbGJhci4gIFRvIGNoYW5nZSB0aGUgY29sb3Igc2VsZWN0aW9uLCBjbGljayBvbiBhIGNvbG9yIGluIHRoZQotcGFsZXR0ZSBiZWxvdyB0aGUgZHJhd2luZyBhcmVhOyBsZWZ0LWNsaWNrIHRvIHNldCB0aGUgZm9yZWdyb3VuZCBjb2xvciwgcmlnaHQtY2xpY2sgdG8gc2V0IHRoZQotYmFja2dyb3VuZCBjb2xvci4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotCi08cD4KLUZyb20gRWNsaXBzZSdzIDxzdHJvbmc+V2luZG93PC9zdHJvbmc+IG1lbnUgc2VsZWN0IDxzdHJvbmc+U2hvdyBWaWV3PC9zdHJvbmc+ICZndDsgPHN0cm9uZz5PdGhlcjwvc3Ryb25nPi4gIAotSW4gdGhlIDxzdHJvbmc+U2hvdyBWaWV3PC9zdHJvbmc+IGRpYWxvZywgZXhwYW5kIDxzdHJvbmc+U1dUIEV4YW1wbGVzPC9zdHJvbmc+IGFuZCBzZWxlY3QKLXRoZSB2aWV3IG5hbWVkIDxzdHJvbmc+UGFpbnQ8L3N0cm9uZz4uIEEgdmlldyBjb250YWluaW5nIHRoZSBwYWludCBwcm9ncmFtIHdpbGwgYXBwZWFyLgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPlBhaW50PC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvaWNvbnMvcGFpbnRfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvaWNvbnMvcGFpbnRfZXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5NDVkZGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2ljb25zL3BhaW50X2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZDc4NzU5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUUGFpbnRFeGFtcGxlLm5hbWUgPSBTV1QgUGFpbnQgRXhhbXBsZSBQbHVnaW4KLWNhdGVnb3J5LlNXVEV4YW1wbGVzLm5hbWUgPSBTV1QgRXhhbXBsZXMKLXZpZXcuUGFpbnRFeGFtcGxlLm5hbWUgPSBQYWludAotCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSA9IFdvcmtiZW5jaCBWaWV3cwotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyB0aGF0IHJ1biBhcyBWaWV3cyBpbnNpZGUgdGhlIFdvcmtiZW5jaC4gIFwKLQlUaGVzZSBleGFtcGxlcyB3aWxsIGNyZWF0ZSBhIG5ldyBWaWV3IGluIHRoZSBjdXJyZW50IFBlcnNwZWN0aXZlLgotCi1sYXVuY2hpdGVtLlBhaW50RXhhbXBsZS5uYW1lID0gUGFpbnQKLWxhdW5jaGl0ZW0uUGFpbnRFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBTV1QgZ3JhcGhpY3Mgb3BlcmF0aW9ucyBpbiB0aGUgZm9ybSBvZiBhIFwKLQlydWRpbWVudGFyeSBiaXRtYXAgcGFpbnRpbmcgcHJvZ3JhbS4gIFRoZSBBaXJicnVzaCBUb29sIGltcGxlbWVudGF0aW9uIGFsc28gXAotCWRlbW9uc3RyYXRlcyBhIG1lY2hhbmlzbSBmb3IgbWFuYWdpbmcgdGltZWQgR1VJIG9wZXJhdGlvbnMgaW4gdGhlIGJhY2tncm91bmQgXAotCXRoYXQgYXJlIHRyaWdnZXJlZCBieSB1c2VyIGlucHV0LlxuXG5cCi0JU2VsZWN0IGEgdG9vbCB3aXRoIHdoaWNoIHRvIGRyYXcgaW4gdGhlIGRyYXdpbmcgYXJlYS4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiB0b29scyBcCi0JdG8gY2hvb3NlIGZyb20gb24gdGhlIHRvb2xiYXIuICBUbyBjaGFuZ2UgdGhlIGNvbG9yIHNlbGVjdGlvbiwgY2xpY2sgb24gYSBjb2xvciBpbiB0aGUgXAotCXBhbGV0dGUgYmVsb3cgdGhlIGRyYXdpbmcgYXJlYTogbGVmdC1jbGljayBmb3IgdGhlIGZvcmVncm91bmQgY29sb3IsIHJpZ2h0LWNsaWNrIGZvciB0aGUgXAotCWJhY2tncm91bmQgY29sb3IuXG5cblwKLQlVc2VzIFNXVCdzIEdDIGFuZCBGb250RGlhbG9nLCBhbmQgSkZhY2UncyBJbnB1dERpYWxvZyBhbmQgYWN0aW9uIHNldCBzdXBwb3J0LgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTMxYzg4Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50IgotICAgbmFtZT0iJXBsdWdpbi5TV1RQYWludEV4YW1wbGUubmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQuUGFpbnRQbHVnaW4iPgotCi08IS0tIFJ1bnRpbWUgLS0+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+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0YjA1NzguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHN3dGV4YW1wbGVzLmphcgotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBzcmMvCi0gICAgICAgICAgICAgICAKLXNvdXJjZS5zd3RleGFtcGxlcy5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2FkZHJlc3Nib29rX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2FkZHJlc3Nib29rX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiMDRjMmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9hZGRyZXNzYm9va19leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gQWRkcmVzcyBCb29rIEV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlIC0gQWRkcmVzcyBCb29rPC9oMj4KLQotPHA+Ci1UaGUgQWRkcmVzc0Jvb2sgZXhhbXBsZSBzaG93cyBob3cgYSBUYWJsZSBjb250cm9sIGNhbiBiZSB1c2VkIHRvCi1wcmVzZW50IGluZm9ybWF0aW9uIGluIGEgdGFidWxhciBmb3JtYXQuIFRoZSBhcHBsaWNhdGlvbiBjYW4gc2F2ZSBhbmQgbG9hZCBkYXRhIAotZnJvbSBhIGZpbGUsIHNvcnQgdGhlIGVudHJpZXMsIGFuZCBzZWFyY2ggZm9yIHN0cmluZ3Mgd2l0aGluIHRoZSBmaWVsZHMuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSJzd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWRkcmVzc2Jvb2suQWRkcmVzc0Jvb2s8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+QWRkcmVzcyBCb29rPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5TdGFuZGFsb25lPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9icm93c2VyX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2Jyb3dzZXJfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiYzQxNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2Jyb3dzZXJfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIENvbnRyb2xzIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBCcm93c2VyPC9oMj4KLQotPHA+Ci1UaGUgQnJvd3NlciBFeGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgdGhlIFNXVCBCcm93c2VyIHdpZGdldC4gCi1JdCBjb25zaXN0cyBvZiBhIGNvbXBvc2l0ZSBjb250YWluaW5nIGEgQnJvd3NlciB3aWRnZXQgdG8gcmVuZGVyIEhUTUwgYW5kIHNvbWUKLWFkZGl0aW9uYWwgd2lkZ2V0cyB0byBpbXBsZW1lbnQgYWN0aW9ucyBjb21tb25seSBmb3VuZCBvbiBicm93c2VycyAodG9vbGJhcgotd2l0aCBiYWNrLCBmb3J3YXJkLCByZWZyZXNoIGFuZCBzdG9wIGJ1dHRvbnMsIHN0YXR1cyBiYXIgZXRjLikuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlLkJyb3dzZXJFeGFtcGxlPC9jb2RlPi4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0ic3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPldlYiBCcm93c2VyPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2NsaXBib2FyZF9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9jbGlwYm9hcmRfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZiZTk2Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2NsaXBib2FyZF9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gQ2xpcGJvYXJkIEV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlIC0gQ2xpcGJvYXJkPC9oMj4KLQotPHA+Ci1UaGUgQ2xpcGJvYXJkIGV4YW1wbGUgc2hvd3MgdGhlIHZhcmlvdXMgU1dUIGNsaXBib2FyZCB0cmFuc2ZlciB0eXBlcyBpbiB1c2UuICBUaGUgZXhhbXBsZSBjYW4KLWN1dCwgY29weSBhbmQgcGFzdGUgdXNpbmcgVGV4dCwgUlRGLCBIVE1MIGFuZCBGaWxlIHRyYW5zZmVyIHR5cGVzLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNsaXBib2FyZC5DbGlwYm9hcmRFeGFtcGxlPC9jb2RlPi4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0ic3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkNsaXBib2FyZDwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+U3RhbmRhbG9uZTwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfY29udHJvbHNfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfY29udHJvbHNfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQyOTlhNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2NvbnRyb2xzX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBDb250cm9scyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gQ29udHJvbHM8L2gyPgotCi08cD4KLVRoZSBDb250cm9scyBFeGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgY29tbW9uIFNXVCBjb250cm9scy4gCi1JdCBjb25zaXN0cyBvZiBhIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgaW4gdGhlIGZvbGRlciBhbGxvd3MgdGhlIHVzZXIgCi10byBpbnRlcmFjdCB3aXRoIGEgZGlmZmVyZW50IGNvbnRyb2wuCi1UaGUgdXNlciBjYW4gY2hhbmdlIHN0eWxlcyBhbmQgc2V0dGluZ3MgYW5kIHZpZXcgaG93IHRoaXMgYWZmZWN0cyBlYWNoIGNvbnRyb2wuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlLkNvbnRyb2xFeGFtcGxlPC9jb2RlPi4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0ic3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkNvbnRyb2xzPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2N1c3RvbWNvbnRyb2xzX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2N1c3RvbWNvbnRyb2xzX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWYyOTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9jdXN0b21jb250cm9sc19leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gQ29udHJvbHMgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIEN1c3RvbSBDb250cm9sczwvaDI+Ci0KLTxwPgotVGhlIEN1c3RvbSBDb250cm9scyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgZW11bGF0ZWQgU1dUIGNvbnRyb2xzLiAKLUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgdXNlciAKLXRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgZW11bGF0ZWQgY29udHJvbC4KLVRoZSB1c2VyIGNhbiBjaGFuZ2Ugc3R5bGVzIGFuZCBzZXR0aW5ncyBhbmQgdmlldyBob3cgdGhpcyBhZmZlY3RzIGVhY2ggY29udHJvbC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZS5DdXN0b21Db250cm9sRXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9InN3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5DdXN0b20gQ29udHJvbHM8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfZG5kX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2RuZF9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODFhYTU3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfZG5kX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBEcmFnIGFuZCBEcm9wIEV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlIC0gRHJhZyBhbmQgRHJvcDwvaDI+Ci0KLTxwPgotVGhlIERyYWcgYW5kIERyb3AgZXhhbXBsZSBzaG93cyB0aGUgdmFyaW91cyBTV1QgZGF0YSB0cmFuc2ZlciB0eXBlcyBpbiB1c2UuICBUaGUgZXhhbXBsZSBjYW4KLWRyYWcgYW5kIGRyb3AgdXNpbmcgVGV4dCwgUlRGLCBIVE1MIGFuZCBGaWxlIHRyYW5zZmVyIHR5cGVzLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmRuZC5ETkRFeGFtcGxlPC9jb2RlPi4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0ic3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkRyYWcgYW5kIERyb3A8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPlN0YW5kYWxvbmU8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2ZpbGV2aWV3ZXJfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfZmlsZXZpZXdlcl9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZTIxY2NkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfZmlsZXZpZXdlcl9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gRmlsZSBWaWV3ZXIgRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBzdGFuZGFsb25lIGV4YW1wbGUgLSBGaWxlIFZpZXdlcjwvaDI+Ci0KLTxwPgotVGhlIEZpbGUgVmlld2VyIGV4YW1wbGUgc2hvd3MgaG93IGEgc2ltcGxlIGFwcGxpY2F0aW9uIGNhbiBiZSBpbXBsZW1lbnRlZCB1c2luZyBTV1QuCi1UaGlzIGFwcGxpY2F0aW9uIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIG5hdmlnYXRlIGZpbGVzIGFuZCBmb2xkZXJzIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBhbmQgbWFuaXB1bGF0ZSB0aGVtIHVzaW5nIGRyYWcgYW5kIGRyb3AuCi1JdCB1c2VzIGFsdGVybmF0ZSB0aHJlYWRzIGZvciBsb25nIGFjdGlvbnMgYW5kIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBUcmVlLAotVGFibGUsIGFuZCBUb29sYmFyIHdpZGdldHMgYW5kIHRoZSBQcm9ncmFtIGNsYXNzLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmZpbGV2aWV3ZXIuRmlsZVZpZXdlcjwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9InN3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5GaWxlIFZpZXdlcjwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+U3RhbmRhbG9uZTwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfaGVsbG93b3JsZF9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9oZWxsb3dvcmxkX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3ZWM3YTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9oZWxsb3dvcmxkX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBIZWxsbyBXb3JsZCBFeGFtcGxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBzdGFuZGFsb25lIGV4YW1wbGUgLSBIZWxsbyBXb3JsZDwvaDI+Ci0KLTxwPgotVGhlIEhlbGxvIFdvcmxkIGV4YW1wbGVzIGFyZSBhIHNldCBvZiBpbnRyb2R1Y3RvcnkgZXhhbXBsZXMgdGhhdCBzaG93IGhvdyB0byBnZXQgc3RhcnRlZCAKLW9uIGNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIHdpdGggU1dULiAgVGhleSBjb3ZlciB0aGUgY3JlYXRpb24gb2YgYSBzaGVsbCwgdGhlIHVzZSBvZiBldmVudCBsaXN0ZW5lcnMsIAotdXNpbmcgbGF5b3V0cywgcHJvY2Vzc2luZyBldmVudHMgaW4gYW4gZXZlbnQgbG9vcCwgYW5kIGRyYXdpbmcgd2l0aCBhIEdyYXBoaWNzIENvbnRleHQuCi08L3A+Ci0KLTxoND5IZWxsbyBXb3JsZCAxPC9oND4KLTxwPgotVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gb3BlbiBhIFNoZWxsIGFuZCBwcm9jZXNzIHRoZSBldmVudHMuCi08L3A+Ci0KLTxoND5IZWxsbyBXb3JsZCAyPC9oND4KLTxwPgotVGhpcyBleGFtcGxlIGJ1aWxkcyBvbiBIZWxsb1dvcmxkMSBhbmQgZGVtb25zdHJhdGVzIGhvdyB0byBkaXNwbGF5IGEgTGFiZWwgaW5zaWRlIG9mIHRoZSBTaGVsbC4KLTwvcD4KLQotPGg0PkhlbGxvIFdvcmxkIDM8L2g0PgotPHA+Ci1UaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQyIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBhIGxpc3RlbmVyIG1lY2hhbmlzbSB0byByZXNpemUgdGhlIExhYmVsCi13aGVuIHRoZSBTaGVsbCBzaXplIGNoYW5nZXMuCi08L3A+Ci0KLTxoND5IZWxsbyBXb3JsZCA0PC9oND4KLTxwPgotVGhpcyBleGFtcGxlIGJ1aWxkcyBvbiBIZWxsb1dvcmxkMiBhbmQgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgYSBMYXlvdXQgdG8gcmVzaXplIHRoZSBMYWJlbAotd2hlbiB0aGUgU2hlbGwgc2l6ZSBjaGFuZ2VzLgotPC9wPgotCi08aDQ+SGVsbG8gV29ybGQgNTwvaDQ+Ci08cD4KLVRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDEgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gZHJhdyBkaXJlY3RseQotb24gYW4gU1dUIENvbnRyb2wgdXNpbmcgYSBHcmFwaGljcyBDb250ZXh0LgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci0KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSJzd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZC5IZWxsb1dvcmxkWzEtNV08L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3Qgb25lIG9mIHRoZSA8c3Ryb25nPkhlbGxvIFdvcmxkPC9zdHJvbmc+IGl0ZW1zIGZyb20gdGhlIDxzdHJvbmc+U3RhbmRhbG9uZTwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfaG92ZXJoZWxwX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2hvdmVyaGVscF9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZWI4OWIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfaG92ZXJoZWxwX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBIb3ZlciBIZWxwIEV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlIC0gSG92ZXIgSGVscDwvaDI+Ci0KLTxwPgotVGhlIEhvdmVyIEhlbHAgZXhhbXBsZSBzaG93cyBob3cgdG8gaW1wbGVtZW50IGN1c3RvbSB0b29sdGlwcyBhbmQgaG92ZXIgaGVscCBzdXBwb3J0Ci1vbiB2YXJpb3VzIFNXVCBjb250cm9scyBpbmNsdWRpbmcgQnV0dG9ucywgVGFibGVJdGVtcywgVG9vbEl0ZW1zIGFuZCBUcmVlSXRlbXMuCi1UbyBzZWUgdGhlIGN1c3RvbSB0b29sdGlwcyBpbiBhY3Rpb24sIGhvdmVyIG92ZXIgYW4gaXRlbSBvciBidXR0b24gaW4gdGhlIFVJLCBhbmQKLW5vdGljZSB0aGF0IGltYWdlcyBhcHBlYXIgaW4gdGhlIGxlZnQtaGFuZCBjb3JuZXIgb2YgdGhlIHRvb2x0aXAuCi1UbyBzZWUgdGhlIGN1c3RvbSBob3ZlciBoZWxwIGluIGFjdGlvbiwgaG92ZXIgb3ZlciBhbiBpdGVtIG9yIGJ1dHRvbiBpbiB0aGUgVUkgdW50aWwKLXRoZSB0b29sdGlwIGlzIGRpc3BsYXllZC4gIFRoZW4sIHdpdGhvdXQgbW92aW5nIHRoZSBtb3VzZSwgcHJlc3MgPHN0cm9uZz5GMTwvc3Ryb25nPiBhbmQgYSBuZXcKLVNoZWxsIHdpbGwgYmUgc2hvd24gd2l0aCB0aGUgZXh0ZW5kZWQgaG92ZXIgaGVscCBpbmZvcm1hdGlvbiBmb3IgdGhlIFVJIGVsZW1lbnQuCi08L3A+CQotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhvdmVyaGVscC5Ib3ZlckhlbHA8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+SG92ZXIgSGVscDwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+U3RhbmRhbG9uZTwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfaW1hZ2VhbmFseXplcl9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9pbWFnZWFuYWx5emVyX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5ODRjZGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9pbWFnZWFuYWx5emVyX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBJbWFnZSBBbmFseXplciBFeGFtcGxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZSAtIEltYWdlIEFuYWx5emVyPC9oMj4KLQotPHA+Ci1UaGUgSW1hZ2VBbmFseXplciBleGFtcGxlIG9wZW5zIGltYWdlIGZpbGVzIGFuZCBkaXNwbGF5cyB0aGVpciB2aXN1YWwgY29udGVudHMgYW5kCi1hbiBpbWFnZSBkYXRhIHN1bW1hcnkuCi1UaGUgdXNlciBjYW4gbWFrZSBhZGp1c3RtZW50cyB0byB2YXJpb3VzIGVsZW1lbnRzIG9mIHRoZSBpbWFnZSBzdWNoIGFzIHNjYWxpbmcgYW5kIEFscGhhCi1ibGVuZGluZywgYW5kIGNhbiBzYXZlIHRoZXNlIGNoYW5nZXMgdG8gYSBmaWxlLgotPC9wPgotPHA+Ci1UaGUgSW1hZ2VBbmFseXplciBjYW4gbG9hZCBhbmQgZGlzcGxheSBpbWFnZSBmaWxlcyBvZiB0eXBlIEdJRiwgSlBFRywgQk1QLCBJQ08sIGFuZCBQTkcuCi1JZiBhIGxvYWRlZCBmaWxlIGlzIGFuIGludGVybGFjZWQgR0lGIG9yIFBORywgb3IgYSBwcm9ncmVzc2l2ZSBKUEVHLCBhbmQgPHN0cm9uZz5JbmNyZW1lbnRhbCBEaXNwbGF5PC9zdHJvbmc+IGlzIHNlbGVjdGVkLAotdGhlbiB0aGUgSW1hZ2VBbmFseXplciB3aWxsIGRpc3BsYXkgdGhlIGltYWdlIGluY3JlbWVudHMgYXMgdGhleSBhcmUgbG9hZGVkLgotSWYgdGhlIGZpbGUgY29udGFpbnMgYW4gYW5pbWF0ZWQgR0lGLCB0aGVuIHRoZSA8c3Ryb25nPk5leHQ8L3N0cm9uZz4sIDxzdHJvbmc+UHJldmlvdXM8L3N0cm9uZz4sIGFuZCA8c3Ryb25nPkFuaW1hdGU8L3N0cm9uZz4gYnV0dG9ucyBiZWNvbWUgZW5hYmxlZCwKLWFuZCBjYW4gYmUgdXNlZCB0byBjeWNsZSB0aHJvdWdoIGFuZCBhbmltYXRlIHRoZSBpbWFnZXMgaW4gdGhlIGZpbGUuIElmIGEgR0lGIGRlZmluZXMgYSBiYWNrZ3JvdW5kIGNvbG9yLAotYXMgbWFueSBhbmltYXRlZCBHSUZzIGRvLCB0aGVuIHNlbGVjdGluZyA8c3Ryb25nPkJhY2tncm91bmQ8L3N0cm9uZz4gd2lsbCB1c2UgdGhlIEdJRidzIGJhY2tncm91bmQgY29sb3IuCi1JZiB0aGUgaW1hZ2UgaGFzIHRyYW5zcGFyZW5jeSwgd2hpY2ggaXMgcG9zc2libGUgd2l0aCBpbWFnZXMgb2YgdHlwZSBHSUYsIFBORywgYW5kIElDTywgdGhlbiBzZWxlY3RpbmcgPHN0cm9uZz5EaXNwbGF5IE1hc2s8L3N0cm9uZz4gd2lsbCBkcmF3IHRoZSBpbWFnZSdzIHRyYW5zcGFyZW5jeQotbWFzayB0byB0aGUgcmlnaHQgb2YgdGhlIGltYWdlLiBZb3UgY2FuIGNoYW5nZSB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgSW1hZ2VBbmFseXplciBpbiBvcmRlciB0byBzZWUgdGhlIHRyYW5zcGFyZW5jeSB3b3JrLgotVG8gdHVybiBvZmYgdHJhbnNwYXJlbmN5LCBkZXNlbGVjdCA8c3Ryb25nPkRpc3BsYXkgVHJhbnNwYXJlbmN5PC9zdHJvbmc+LgotQWZ0ZXIgYW4gaW1hZ2UgaXMgbG9hZGVkLCBpdCBjYW4gYmUgc2NhbGVkIHdpdGggdGhlIDxzdHJvbmc+U2NhbGU8L3N0cm9uZz4gY29tYm8sIG9yIGhhdmUgYWxwaGEgdHJhbnNwYXJlbmN5IGFwcGxpZWQgdG8gaXQgdXNpbmcgdGhlIDxzdHJvbmc+QWxwaGEtSzwvc3Ryb25nPiBjb21ibwotYW5kIDxzdHJvbmc+QWxwaGE8L3N0cm9uZz4gbWVudS4gPHN0cm9uZz5GaWxlPC9zdHJvbmc+ICZndDsgPHN0cm9uZz5SZW9wZW48L3N0cm9uZz4gcmVzdG9yZXMgdGhlIHNjYWxpbmcgYW5kIGFscGhhIGF0dHJpYnV0ZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMgYW5kIHJlbG9hZHMgdGhlIGN1cnJlbnQgaW1hZ2UgZmlsZS4KLUlmIHRoZSBpbWFnZSBoYXMgdHJhbnNwYXJlbmN5LAotPHN0cm9uZz5GaWxlPC9zdHJvbmc+ICZndDsgPHN0cm9uZz5TYXZlIE1hc2sgQXMuLi48L3N0cm9uZz4gY2FuIGJlIHVzZWQgdG8gc2F2ZSB0aGUgaW1hZ2UncyB0cmFuc3BhcmVuY3kgbWFzay4KLTwvcD4KLTxwPgotV2hlbiBTV1QgbG9hZHMgYW4gaW1hZ2UgZmlsZSwgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTwvY29kZT4gaXMgY3JlYXRlZCAodGhvdWdoIGluIHRoZSBjYXNlIG9mIGFuIElDTyBmaWxlIG9yCi1tdWx0aS1pbWFnZSBHSUYgYW4gYXJyYXkgb2YgPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPiBpbnN0YW5jZXMgaXMgY3JlYXRlZCkuIFRoZSBJbWFnZUFuYWx5emVyIGRpc3BsYXlzIGFsbCBvZiB0aGUgZGF0YSBzdG9yZWQgaW4gdGhlIDxjb2RlPkltYWdlRGF0YTwvY29kZT4KLWluc3RhbmNlKHMpIGZvciB0aGUgY3VycmVudGx5IGxvYWRlZCBpbWFnZSBmaWxlLCBpbmNsdWRpbmcgdGhlIHBpeGVsIGRhdGEuIEhvdmVyaW5nIG92ZXIgYSBwaXhlbCBpbiB0aGUgaW1hZ2UgZGlzcGxheSB3aWxsIHNob3cgdGhlIFJHQgotY29sb3IgZGF0YSBmb3IgdGhhdCBwaXhlbC4gRm9yIGNlcnRhaW4gaW1hZ2VzLCBwYXJ0aWN1bGFybHkgYW5pbWF0ZWQgR0lGcywgYWRkaXRpb25hbCBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyPC9jb2RlPgotaW5zdGFuY2UgdGhhdCBpcyB1c2VkIHRvIGxvYWQgdGhlIGltYWdlLiBUaGUgSW1hZ2VBbmFseXplciBkaXNwbGF5cyB0aGlzIGRhdGEgYXMgd2VsbC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotCi08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmltYWdlYW5hbHl6ZXIuSW1hZ2VBbmFseXplcjwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9InN3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5JbWFnZSBBbmFseXplcjwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+U3RhbmRhbG9uZTwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfamF2YXZpZXdlcl9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9qYXZhdmlld2VyX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkMWU3NzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9qYXZhdmlld2VyX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBKYXZhIFN5bnRheCBWaWV3ZXIgRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBzdGFuZGFsb25lIGV4YW1wbGUgLSBKYXZhIFN5bnRheCBWaWV3ZXI8L2gyPgotCi08cD4KLVRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gaW1wbGVtZW50IGEgdXNlci1kZWZpbmVkIGxpbmUgc3R5bGVyIGZvciB0aGUgU3R5bGVkVGV4dCB3aWRnZXQuCi1UaGUgZXhhbXBsZSBwcm92aWRlcyBhIHR5cGljYWwgZWRpdG9yIGludGVyZmFjZS4KLVRvIHNlZSB0aGUgZWZmZWN0IG9mIHRoZSBsaW5lIHN0eWxlciwgb3BlbiBhICouamF2YSBmaWxlLCBhbmQKLXdoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIGVkaXRvciBhcmVhLCBub3RpY2UgdGhhdCB0aGUga2V5d29yZHMgaGF2ZSBiZWVuIGhpZ2hsaWdodGVkLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmphdmF2aWV3ZXIuSmF2YVZpZXdlcjwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9InN3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5KYXZhIFN5bnRheCBWaWV3ZXI8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPlN0YW5kYWxvbmU8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwY2JjODIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gRXhhbXBsZSBMYXVuY2hlcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBFeGFtcGxlIExhdW5jaGVyPC9oMj4KLQotPHA+Ci1UaGUgRXhhbXBsZSBMYXVuY2hlciBpcyB1c2VkIHRvIGxhdW5jaCBTV1QgZXhhbXBsZXMsIHdoaWNoIGNhbiBlaXRoZXIgYmUgV29ya2JlbmNoIHZpZXdzIAotb3Igc3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMuCi08L3A+Ci0KLTx1bD4KLTxsaT5Xb3JrYmVuY2ggdmlld3MgYXJlIGV4YW1wbGVzIHRoYXQgYXJlIGludGVncmF0ZWQgaW50byBFY2xpcHNlLiAgV2hlbiB0aGUgbGF1bmNoZXIKLXN0YXJ0cyBhIFdvcmtiZW5jaCB2aWV3LCBpdCBpcyBvcGVuZWQgaW4gdGhlIGN1cnJlbnRseSBhY3RpdmUgcGVyc3BlY3RpdmUuCi08bGk+U3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMgYXJlIGxhdW5jaGVkIGluIGEgc2VwYXJhdGUgd2luZG93LgotPC91bD4KLQotPHA+Ci1Gb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIHJ1biB0aGUgc3RhbmRhbG9uZSBleGFtcGxlcyB3aXRob3V0IHRoZSBTV1QgRXhhbXBsZSBMYXVuY2hlciwgCi1yZWZlciB0byA8YSBocmVmPSJzd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPi4KLTwvcD4KLTxwPgotVGhlIFNXVCBXb3JrYmVuY2ggdmlldyBleGFtcGxlcyBjYW4gYWxzbyBiZSBsYXVuY2hlZCBkaXJlY3RseSB3aXRob3V0IHVzaW5nIHRoZSBTV1QgRXhhbXBsZSAKLUxhdW5jaGVyLiAgU1dUIFdvcmtiZW5jaCB2aWV3IGV4YW1wbGVzIGNhbiBiZSBmb3VuZCB1bmRlciB0aGUgPHN0cm9uZz5TV1QgRXhhbXBsZXM8L3N0cm9uZz4gY2F0ZWdvcnkgb2YgdGhlIAotPHN0cm9uZz5TaG93IFZpZXdzPC9zdHJvbmc+IGRpYWxvZy4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIEV4YW1wbGUgTGF1bmNoZXI8L2gzPgotCi08cD4KLUZyb20gRWNsaXBzZSdzIDxzdHJvbmc+V2luZG93PC9zdHJvbmc+IG1lbnUsIHNlbGVjdCA8c3Ryb25nPlNob3cgVmlldyAmZ3Q7IE90aGVyPC9zdHJvbmc+LiAKLUluIHRoZSA8c3Ryb25nPlNob3cgVmlldzwvc3Ryb25nPiBkaWFsb2csIGV4cGFuZCA8c3Ryb25nPlNXVCBFeGFtcGxlczwvc3Ryb25nPiBhbmQgc2VsZWN0IHRoZSA8c3Ryb25nPlNXVCBFeGFtcGxlIExhdW5jaGVyPC9zdHJvbmc+IHZpZXcuIAotQSB2aWV3IGNvbnRhaW5pbmcgYSBsaXN0IG9mIGV4YW1wbGVzIHdpbGwgYXBwZWFyIGluIHlvdXIgY3VycmVudCBwZXJzcGVjdGl2ZS4KLVdoZW4geW91IHNlbGVjdCBhbiBleGFtcGxlIGZyb20gdGhlIGxpc3QgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgZXhhbXBsZSBpcyBkaXNwbGF5ZWQuCi1DbGljayBvbiB0aGUgPHN0cm9uZz5SdW48L3N0cm9uZz4gYnV0dG9uIHRvIGxhdW5jaCB0aGUgZXhhbXBsZS4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9sYXlvdXRfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbGF5b3V0X2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNTg5YjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9sYXlvdXRfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIExheW91dCBFeGFtcGxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBMYXlvdXRzPC9oMj4KLQotPHA+Ci1UaGlzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjb21tb24gU1dUIGxheW91dHMuIAotSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZSAKLXVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBTV1QgbGF5b3V0LgotVGhlIHVzZXIgY2FuIGluc2VydCB3aWRnZXRzIGludG8gYSBsYXlvdXQgYW5kIHNldCB0aGUgdmFsdWVzIG9mIHRoZSBsYXlvdXQgZGF0YQotdXNpbmcgYSBwcm9wZXJ0eSBzaGVldC4gIFdoZW4gdGhlIHVzZXIgaGFzIGEgc3VpdGFibGUgYXJyYW5nZW1lbnQsIHRoZSB1bmRlcmx5aW5nCi1jb2RlIGNhbiBiZSBnZW5lcmF0ZWQgYnkgY2xpY2tpbmcgb24gdGhlIDxzdHJvbmc+Q29kZTwvc3Ryb25nPiBidXR0b24uCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSJzd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0ZXhhbXBsZS5MYXlvdXRFeGFtcGxlPC9jb2RlPi4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0ic3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkxheW91dHM8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X21hbnVhbF9zZXR1cC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2RlZDkwZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X21hbnVhbF9zZXR1cC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIFN0YW5kYWxvbmUgRXhhbXBsZXMgU2V0dXA8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvaDI+Ci0KLTxoMz5BZGRpbmcgU1dUIHRvIHlvdXIgd29ya3NwYWNlPC9oMz4KLQotPG9sPgotPGxpPkRvd25sb2FkIFNXVCBmb3Igc3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMuICBBIHN0YW5kYWxvbmUgdmVyc2lvbiBvZiBTV1QgaXMgYXZhaWxhYmxlIAotb24gdGhlIHNhbWUgZG93bmxvYWQgcGFnZSBhcyB0aGUgRWNsaXBzZSBTREsuICBMb29rIGZvciB0aGUgc2VjdGlvbiB0aXRsZWQgCi08c3Ryb25nPlNXVCBCaW5hcnkgYW5kIFNvdXJjZTwvc3Ryb25nPi4gIERvIG5vdCBleHRyYWN0IHRoZSBhcmNoaXZlIGZpbGUsIGp1c3Qgc2F2ZSBpdCB0byBkaXNrLgotPGxpPlNlbGVjdCA8c3Ryb25nPkltcG9ydC4uLjwvc3Ryb25nPiBmcm9tIHRoZSA8c3Ryb25nPkZpbGU8L3N0cm9uZz4gbWVudS48L2xpPgotPGxpPlNlbGVjdCA8c3Ryb25nPkV4aXN0aW5nIFByb2plY3RzIGludG8gV29ya3NwYWNlPC9zdHJvbmc+IGFuZCBjbGljayBvbiB0aGUgPHN0cm9uZz5OZXh0PC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPGxpPlNlbGVjdCA8c3Ryb25nPlNlbGVjdCBhcmNoaXZlIGZpbGU6PC9zdHJvbmc+IGFuZCB1c2UgdGhlIDxzdHJvbmc+QnJvd3NlPC9zdHJvbmc+IGJ1dHRvbiB0byBsb2NhdGUgdGhlIFNXVCAKLXN0YW5kYWxvbmUgYXJjaGl2ZSB5b3UgaGF2ZSBwcmV2aW91c2x5IGRvd25sb2FkZWQuPC9saT4KLTxsaT5DbGljayBvbiB0aGUgPHN0cm9uZz5GaW5pc2g8L3N0cm9uZz4gYnV0dG9uLjwvbGk+Ci08L29sPgotCi08aDM+SW1wb3J0aW5nIGV4YW1wbGUgc291cmNlPC9oMz4KLQotPG9sPgotPGxpPkRvd25sb2FkIGFuZCBpbnN0YWxsIHRoZSBFY2xpcHNlIEV4YW1wbGUgUGx1Zy1pbnMuICBUaGUgRWNsaXBzZSBFeGFtcGxlIFBsdWctaW5zIGFyZSBhdmFpbGFibGUgb24gdGhlIHNhbWUKLWRvd25sb2FkIHBhZ2UgYXMgdGhlIEVjbGlwc2UgU0RLLiAgTG9vayBmb3IgdGhlIHNlY3Rpb24gdGl0bGVkIDxzdHJvbmc+RXhhbXBsZSBQbHVnLWluczwvc3Ryb25nPi4KLVlvdSBjYW4gaW5zdGFsbCB0aGUgZXhhbXBsZXMgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgeW91IGluc3RhbGxlZCBFY2xpcHNlIG9yIHlvdSBjYW4gY2hvb3NlCi1hIGRpZmZlcmVudCBsb2NhdGlvbi4gIElmIHlvdSBpbnN0YWxsIHRoZSBleGFtcGxlcyBpbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyBFY2xpcHNlLCB0aGUgZXhhbXBsZSB2aWV3cyAKLWFuZCBlZGl0b3JzIHdpbGwgc2hvdyB1cCBpbiB5b3VyIEVjbGlwc2UgZW52aXJvbm1lbnQgKGUuZy4gPHN0cm9uZz5XaW5kb3dzICZndDsgU2hvdyBWaWV3IC4uLiAmZ3Q7IE90aGVyIC4uLiAmZ3Q7IFNXVCBFeGFtcGxlczwvc3Ryb25nPgotSWYgdGhlIFNXVCBleGFtcGxlIHZpZXdzIGRvIG5vdCBhcHBlYXIgcmlnaHQgYXdheSBpbiB5b3VyIG1lbnUsIHJlc3RhcnQgZWNsaXBzZSB3aXRoIHRoZSA8c3Ryb25nPi1jbGVhbjwvc3Ryb25nPiBhcmd1bWVudCkuCi1UaGlzIGlzIGZpbmUgYnV0IGl0IGlzIG5vdCBuZWNlc3NhcnkuCi08bGk+U2VsZWN0IDxzdHJvbmc+TmV3ICZndDsgUHJvamVjdCAuLi48L3N0cm9uZz4gZnJvbSB0aGUgPHN0cm9uZz5GaWxlPC9zdHJvbmc+IG1lbnUuCi08bGk+U2VsZWN0IDxzdHJvbmc+SmF2YSBQcm9qZWN0PC9zdHJvbmc+IGFuZCBjbGljayBvbiB0aGUgPHN0cm9uZz5OZXh0PC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPGxpPkdpdmUgdGhlIGphdmEgcHJvamVjdCBhIG5hbWUgc3VjaCBhcyAiU1dUIEV4YW1wbGVzIi48L2xpPgotPGxpPlNlbGVjdCA8c3Ryb25nPkNyZWF0ZSBwcm9qZWN0IGZyb20gZXhpc3Rpbmcgc291cmNlPC9zdHJvbmc+IGFuZCBjbGljayBvbiB0aGUgPHN0cm9uZz5Ccm93c2UgLi4uPC9zdHJvbmc+IAotYnV0dG9uIHRvIGxvY2F0ZSB0aGUgZm9sbG93aW5nIGRpcmVjdG9yeToKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxjb2RlPmVjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMuc291cmNlXzMuMS4wL3NyYy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXNfMy4xLjA8L2NvZGU+Ci08bGk+Q2xpY2sgb24gdGhlIDxzdHJvbmc+TmV4dDwvc3Ryb25nPiBidXR0b24uPC9saT4KLTxsaT5DbGljayBvbiB0aGUgPHN0cm9uZz5Qcm9qZWN0czwvc3Ryb25nPiB0YWIgYW5kIGNsaWNrIG9uIHRoZSA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24uPC9saT4KLTxsaT5QbGFjZSBhIGNoZWNrIGJlc2lkZSA8c3Ryb25nPm9yZy5lY2xpcHNlLnN3dDwvc3Ryb25nPiBhbmQgY2xpY2sgb24gdGhlIDxzdHJvbmc+T0s8L3N0cm9uZz4gYnV0dG9uLjwvbGk+Ci08bGk+Q2xpY2sgb24gdGhlIDxzdHJvbmc+RmluaXNoPC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPC9vbD4KLQotPHA+QXQgdGhpcyBwb2ludCB5b3VyIFNXVCBleGFtcGxlcyBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBhbnkgZXJyb3JzLiAgQ2hlY2sgdGhlIDxzdHJvbmc+UHJvYmxlbXM8L3N0cm9uZz4gCi12aWV3IGZvciBlcnJvcnMuICBJZiB5b3UgZ2V0IGFuIGVycm9yIGxpa2UgIjxjb2RlPmphdmEubGFuZy5PYmplY3Q8L2NvZGU+IG5vdCBmb3VuZCIgaXQgbWVhbnMgCi15b3UgaGF2ZSBub3QgY29uZmlndXJlZCBhIEpSRS4gIEdvIHRvIHRoZSA8c3Ryb25nPldpbmRvdzwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+UHJlZmVyZW5jZXMgLi4uPC9zdHJvbmc+IGRpYWxvZwotYW5kIHNlbGVjdCB0aGUgPHN0cm9uZz5KYXZhPC9zdHJvbmc+ICZndDsgPHN0cm9uZz5JbnN0YWxsZWQgSlJFczwvc3Ryb25nPiBwcmVmZXJlbmNlIHBhZ2UuICBFbnN1cmUgdGhhdCBhIEpSRSBpcyBpbnN0YWxsZWQgCi1hbmQgdGhhdCB0aGUgcGF0aCB0byB0aGUgSlJFIGlzIGNvcnJlY3QuPC9wPgotCi08aDM+PGEgTkFNRT0iUnVuIj48L2E+UnVubmluZyB0aGUgRXhhbXBsZTwvaDM+Ci0KLTxwPk5vdyB5b3UgY2FuIHJ1biB0aGUgU1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMuCi0KLTxvbD4KLTxsaT5PcGVuIHRoZSBKYXZhIHBlcnNwZWN0aXZlLgotPGxpPkluIHRoZSBQYWNrYWdlcyB2aWV3LCBzZWxlY3QgdGhlIG1haW4gY2xhc3MgdGhhdCB5b3Ugd2FudCB0byBydW4uICAKLSAgICBGb3IgZXhhbXBsZSwgdGhlIG1haW4gY2xhc3MgZm9yIHRoZSBBZGRyZXNzIEJvb2sgZXhhbXBsZSBpcyAKLSAgICA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWRkcmVzc2Jvb2suQWRkcmVzc0Jvb2s8L2NvZGU+LgotPGxpPlNlbGVjdCA8c3Ryb25nPlJ1bjwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+UnVuIEFzLi4uPC9zdHJvbmc+ICZndDsgPHN0cm9uZz5KYXZhIEFwcGxpY2F0aW9uPC9zdHJvbmc+IGZyb20gdGhlIG1haW4gbWVudS4KLTwvb2w+Ci0KLQotPGgzPkV4YW1wbGVzIE92ZXJ2aWV3PC9oMz4KLTxwPgotQ29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBlYWNoIGluZGl2aWR1YWwgZXhhbXBsZSBmb3IgdGhlIG5hbWUgb2YKLWl0cyBtYWluIGNsYXNzIGFuZCBhZGRpdGlvbmFsIGRldGFpbHMuCi1UaGUgZm9sbG93aW5nIGV4YW1wbGVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+c3d0ZXhhbXBsZXMuamFyPC9jb2RlPjoKLTwvcD4KLTx1bD4KLTxsaT48YSBocmVmPSJzd3RfYWRkcmVzc2Jvb2tfZXguaHRtbCI+QWRkcmVzcyBCb29rPC9hPgotPGxpPjxhIGhyZWY9InN3dF9icm93c2VyX2V4Lmh0bWwiPkJyb3dzZXIgRXhhbXBsZTwvYT4KLTxsaT48YSBocmVmPSJzd3RfY2xpcGJvYXJkX2V4Lmh0bWwiPkNsaXBib2FyZDwvYT4KLTxsaT48YSBocmVmPSJzd3RfY29udHJvbHNfZXguaHRtbCI+Q29udHJvbHM8L2E+Ci08bGk+PGEgaHJlZj0ic3d0X2N1c3RvbWNvbnRyb2xzX2V4Lmh0bWwiPkN1c3RvbSBDb250cm9sczwvYT4KLTxsaT48YSBocmVmPSJzd3RfZG5kX2V4Lmh0bWwiPkRyYWcgYW5kIERyb3AgRXhhbXBsZTwvYT4KLTxsaT48YSBocmVmPSJzd3RfZmlsZXZpZXdlcl9leC5odG1sIj5GaWxlIFZpZXdlcjwvYT4KLTxsaT48YSBocmVmPSJzd3RfaGVsbG93b3JsZF9leC5odG1sIj5IZWxsbyBXb3JsZCBbMS01XTwvYT4KLTxsaT48YSBocmVmPSJzd3RfaG92ZXJoZWxwX2V4Lmh0bWwiPkhvdmVyIEhlbHA8L2E+Ci08bGk+PGEgaHJlZj0ic3d0X2ltYWdlYW5hbHl6ZXJfZXguaHRtbCI+SW1hZ2UgQW5hbHl6ZXI8L2E+Ci08bGk+PGEgaHJlZj0ic3d0X2phdmF2aWV3ZXJfZXguaHRtbCI+SmF2YSBTeW50YXggVmlld2VyPC9hPgotPGxpPjxhIGhyZWY9InN3dF9sYXlvdXRfZXguaHRtbCI+TGF5b3V0czwvYT4KLTxsaT48YSBocmVmPSJzd3RfcGFpbnRfZXguaHRtbCI+UGFpbnQgRXhhbXBsZTwvYT4KLTxsaT48YSBocmVmPSJzd3RfdGV4dGVkaXRvcl9leC5odG1sIj5UZXh0IEVkaXRvcjwvYT4KLTwvdWw+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfcGFpbnRfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfcGFpbnRfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY0Y2Y1YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X3BhaW50X2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBQYWludCBUb29sPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBQYWludCBUb29sPC9oMj4KLQotPHA+CQotVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIFNXVCBncmFwaGljcyBvcGVyYXRpb25zIGluIHRoZSBmb3JtIG9mIGEKLXJ1ZGltZW50YXJ5IGJpdG1hcCBwYWludGluZyBwcm9ncmFtLiAgVGhlIFBhaW50IFRvb2wgaW1wbGVtZW50YXRpb24gYWxzbyAKLWRlbW9uc3RyYXRlcyBhIG1lY2hhbmlzbSBmb3IgbWFuYWdpbmcgdGltZWQgR1VJIG9wZXJhdGlvbnMgaW4gdGhlIGJhY2tncm91bmQgCi10aGF0IGFyZSB0cmlnZ2VyZWQgYnkgdXNlciBpbnB1dC4KLTwvcD4KLTxwPgkKLVNlbGVjdCBhIHRvb2wgd2l0aCB3aGljaCB0byBkcmF3IGluIHRoZSBkcmF3aW5nIGFyZWEuICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgdG9vbHMKLXRvIGNob29zZSBmcm9tIG9uIHRoZSB0b29sYmFyLiAgVG8gY2hhbmdlIHRoZSBjb2xvciBzZWxlY3Rpb24sIGNsaWNrIG9uIGEgY29sb3IgaW4gdGhlCi1wYWxldHRlIGJlbG93IHRoZSBkcmF3aW5nIGFyZWE7IGxlZnQtY2xpY2sgdG8gc2V0IHRoZSBmb3JlZ3JvdW5kIGNvbG9yLCByaWdodC1jbGljayB0byBzZXQgdGhlCi1iYWNrZ3JvdW5kIGNvbG9yLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci0KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSJzd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQuUGFpbnRFeGFtcGxlPC9jb2RlPi4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0ic3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPlBhaW50PC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X3RleHRlZGl0b3JfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfdGV4dGVkaXRvcl9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyM2NlOWIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfdGV4dGVkaXRvcl9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gVGV4dCBFZGl0b3IgRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBzdGFuZGFsb25lIGV4YW1wbGUgLSBUZXh0IEVkaXRvcjwvaDI+Ci0KLTxwPgotVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIGEgU3R5bGVkVGV4dCB3aWRnZXQgdG8gaW1wbGVtZW50Ci1hIHRleHQgZWRpdG9yIHdpdGggZm9ybWF0dGluZyBzdXBwb3J0LgotVGhlIGV4YW1wbGUgaGFzIGEgdHlwaWNhbCB0ZXh0IGVkaXRvciBpbnRlcmZhY2UuCi1UaGUgPHN0cm9uZz5FZGl0PC9zdHJvbmc+IG1lbnUgY29udGFpbnMgPHN0cm9uZz5DdXQ8L3N0cm9uZz4sIDxzdHJvbmc+Q29weTwvc3Ryb25nPiwgPHN0cm9uZz5QYXN0ZTwvc3Ryb25nPiBhbmQgPHN0cm9uZz5TZXQgRm9udDwvc3Ryb25nPiBpdGVtcy4gIFRoZSB0b29sYmFyCi1wcm92aWRlcyBhIGJvbGQgdGV4dCB0b2dnbGUsIHRocmVlIGNvbG91ciB0b29scywgYW5kIGEgcmVzZXQgYnV0dG9uLCBhbGwgb2Ygd2hpY2ggb3BlcmF0ZSBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSJzd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMudGV4dGVkaXRvci5UZXh0RWRpdG9yPC9jb2RlPi4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0ic3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPlRleHQgRWRpdG9yPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5TdGFuZGFsb25lPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiODM4ZjViLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGx1Z2luLlNXVFN0YW5kYWxvbmVFeGFtcGxlU2V0Lm5hbWUgPSBTV1QgU3RhbmRhbG9uZSBFeGFtcGxlcyBQbHVnaW4KLQotbGF1bmNoY2F0ZWdvcnkuU1dUU3RhbmRhbG9uZUV4YW1wbGVzLm5hbWUgPSBTdGFuZGFsb25lCi1sYXVuY2hjYXRlZ29yeS5TV1RTdGFuZGFsb25lRXhhbXBsZXMuZGVzY3JpcHRpb24gPSBcCi0JQSBjb2xsZWN0aW9uIG9mIFN0YW5kYXJkIFdpZGdldCBUb29sa2l0IGV4YW1wbGVzIHRoYXQgcnVuIGluZGVwZW5kYW50IFwKLQlvZiB0aGUgRWNsaXBzZSBQbGF0Zm9ybS4KLQotbGF1bmNoaXRlbS5BZGRyZXNzQm9vay5uYW1lID0gQWRkcmVzcyBCb29rCi1sYXVuY2hpdGVtLkFkZHJlc3NCb29rLmRlc2NyaXB0aW9uID0gXAotCVRoZSBBZGRyZXNzQm9vayBleGFtcGxlIHNob3dzIGhvdyB0aGUgVGFibGUgY29udHJvbCBjYW4gYmUgdXNlZCB0byBcCi0JcHJlc2VudCBpbmZvcm1hdGlvbiBpbiBhIHRhYnVsYXIgZm9ybWF0LlxuXG5cCi0JVGhlIGFwcGxpY2F0aW9uIGNhbiBzYXZlIGFuZCBsb2FkIGRhdGEgZnJvbSBhIGZpbGUsIHNvcnQgdGhlIGVudHJpZXMsIGFuZCBcCi0Jc2VhcmNoIGZvciBzdHJpbmdzIHdpdGhpbiB0aGUgZmllbGRzLgotCi1sYXVuY2hpdGVtLkJyb3dzZXJFeGFtcGxlLm5hbWUgPSBCcm93c2VyCi1sYXVuY2hpdGVtLkJyb3dzZXJFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQuXG5cblwKLQlJdCBjb25zaXN0cyBvZiBhIGNvbXBvc2l0ZSBjb250YWluaW5nIGEgQnJvd3NlciB3aWRnZXQgdG8gcmVuZGVyIEhUTUwuIFwKLQlBZGRpdGlvbmFsIHdpZGdldHMgYWxsb3cgdGhlIHVzZXIgdG8gcGVyZm9ybSB0eXBpY2FsIGJyb3dzZXIgYWN0aW9ucyAoZm9yIGV4YW1wbGUsIG5hdmlnYXRlIHRvIGEgcGFydGljdWxhciBVUkwsIGdvIGJhY2ssIGZvcndhcmQsIHJlZnJlc2ggYW5kIHN0b3ApLgotCi1sYXVuY2hpdGVtLkNsaXBib2FyZC5uYW1lID0gQ2xpcGJvYXJkCi1sYXVuY2hpdGVtLkNsaXBib2FyZC5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgQ2xpcGJvYXJkIGV4YW1wbGUgc2hvd3MgdGhlIHZhcmlvdXMgU1dUIGNsaXBib2FyZCB0cmFuc2ZlciB0eXBlcyBpbiB1c2UuCi0KLWxhdW5jaGl0ZW0uQ29udHJvbEV4YW1wbGUubmFtZSA9IFNXVCBDb250cm9scyBFeGFtcGxlCi1sYXVuY2hpdGVtLkNvbnRyb2xFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoZSBDb250cm9scyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgY29tbW9uIFNXVCBjb250cm9scy4gXG5cblwKLQlJdCBjb25zaXN0cyBvZiBhIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgaW4gdGhlIGZvbGRlciBhbGxvd3MgdGhlIHVzZXIgXAotCXRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgY29udHJvbC4gXAotCVRoZSB1c2VyIGNhbiBjaGFuZ2Ugc3R5bGVzIGFuZCBzZXR0aW5ncyBhbmQgdmlldyBob3cgdGhpcyBhZmZlY3RzIHRoZSBjb250cm9sLgotCi1sYXVuY2hpdGVtLkRORC5uYW1lID0gRHJhZyBhbmQgRHJvcAotbGF1bmNoaXRlbS5ETkQuZGVzY3JpcHRpb24gPSBcCi0JVGhlIERyYWcgYW5kIERyb3AgZXhhbXBsZSBzaG93cyB0aGUgdmFyaW91cyBTV1QgZHJhZyBhbmQgZHJvcCB0cmFuc2ZlciB0eXBlcyBpbiB1c2UuCi0JCi1sYXVuY2hpdGVtLkZpbGVWaWV3ZXIubmFtZSA9IEZpbGUgVmlld2VyCi1sYXVuY2hpdGVtLkZpbGVWaWV3ZXIuZGVzY3JpcHRpb24gPSBcCi0JVGhlIEZpbGUgVmlld2VyIGV4YW1wbGUgc2hvd3MgaG93IGEgc2ltcGxlIGFwcGxpY2F0aW9uIGNhbiBiZSBpbXBsZW1lbnRlZCB1c2luZyBTV1QuXG5cblwKLQlUaGlzIGFwcGxpY2F0aW9uIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIG5hdmlnYXRlIGZpbGVzIGFuZCBmb2xkZXJzIGFuZCBtYW5pcHVsYXRlIHRoZW0gdmlhIERyYWcgYW5kIERyb3AuICBcCi0JSXQgaW5jbHVkZXMgdGhlIHVzZSBvZiBhbHRlcm5hdGUgdGhyZWFkcyBmb3IgbG9uZyBhY3Rpb25zIGFuZCBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgVHJlZSwgXAotCVRhYmxlLCBUb29sYmFyIGFuZCBQcm9ncmFtLgotCi1sYXVuY2hpdGVtLkhvdmVySGVscC5uYW1lID0gSG92ZXIgSGVscAotbGF1bmNoaXRlbS5Ib3ZlckhlbHAuZGVzY3JpcHRpb24gPSBcCi0JVGhlIEhvdmVyIEhlbHAgZXhhbXBsZSBzaG93cyBob3cgdG8gaW1wbGVtZW50IGN1c3RvbSB0b29sdGlwcyBhbmQgaG92ZXIgaGVscCBzdXBwb3J0IFwKLQlvbiBhIG51bWJlciBvZiBkaWZmZXJlbnQgU1dUIGNvbnRyb2xzIGluY2x1ZGluZyBCdXR0b25zLCBUYWJsZUl0ZW1zLCBUb29sSXRlbXMgYW5kIFRyZWVJdGVtcy5cblxuXAotCVRoZSBleGFtcGxlIGltcGxlbWVudHMgaXRzIG93biB0b29sdGlwIGFuZCBob3ZlciBoZWxwIHN1cHBvcnQuICBcCi0JVG8gc2VlIHRoZSBjdXN0b20gdG9vbHRpcHMgaW4gYWN0aW9uLCBob3ZlciBvdmVyIGFuIGl0ZW0gb3IgYnV0dG9uIGluIHRoZSBVSS4gIFwKLQlBbiBpbWFnZSBhcHBlYXJzIGluIHRoZSBsZWZ0LWhhbmQgY29ybmVyIG9mIHRoZSB0b29sdGlwLlxuXG5cCi0JVG8gc2VlIHRoZSBjdXN0b20gaG92ZXIgaGVscCBpbiBhY3Rpb24sIGhvdmVyIG92ZXIgYW4gaXRlbSBvciBidXR0b24gaW4gdGhlIFVJIHVudGlsIFwKLQl0aGUgdG9vbHRpcCBpcyBkaXNwbGF5ZWQuICBXaXRob3V0IG1vdmluZyB0aGUgbW91c2UsIGhpdCBGMS4gIEEgbmV3IFNoZWxsIHdpbGwgcG9wIHVwIHdpdGggdGhlIFwKLQlleHRlbmRlZCBob3ZlciBoZWxwIGluZm9ybWF0aW9uIGZvciB0aGUgVUkgZWxlbWVudCBpbiBxdWVzdGlvbgotCi1sYXVuY2hpdGVtLkhlbGxvV29ybGQxLm5hbWUgPSBIZWxsbyBXb3JsZCAoMSkKLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDEuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gb3BlbiBhIFNoZWxsIGFuZCBwcm9jZXNzIHRoZSBldmVudHMuCi0KLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDIubmFtZSA9IEhlbGxvIFdvcmxkICgyKQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkMi5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQxIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIGRpc3BsYXkgYSBMYWJlbCBpbnNpZGUgdGhlIFNoZWxsLgotCi1sYXVuY2hpdGVtLkhlbGxvV29ybGQzLm5hbWUgPSBIZWxsbyBXb3JsZCAoMykKLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDMuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGJ1aWxkcyBvbiBIZWxsb1dvcmxkMiBhbmQgZGVtb25zdHJhdGVzIGhvdyB0byByZXNpemUgdGhlIExhYmVsIFwKLQl3aGVuIHRoZSBTaGVsbCByZXNpemVzIHVzaW5nIGEgTGlzdGVuZXIgbWVjaGFuaXNtLgotCi1sYXVuY2hpdGVtLkhlbGxvV29ybGQ0Lm5hbWUgPSBIZWxsbyBXb3JsZCAoNCkKLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDQuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGJ1aWxkcyBvbiBIZWxsb1dvcmxkMiBhbmQgZGVtb25zdHJhdGVzIGhvdyB0byByZXNpemUgdGhlIExhYmVsIFwKLQl3aGVuIHRoZSBTaGVsbCByZXNpemVzIHVzaW5nIGEgTGF5b3V0LgotCi1sYXVuY2hpdGVtLkhlbGxvV29ybGQ1Lm5hbWUgPSBIZWxsbyBXb3JsZCAoNSkKLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDUuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGJ1aWxkcyBvbiBIZWxsb1dvcmxkMSBhbmQgZGVtb25zdHJhdGVzIGhvdyB0byBkcmF3IGRpcmVjdGx5IG9uIGFuIFNXVCBDb250cm9sIHVzaW5nIGEgZ3JhcGhpYyBjb250ZXh0LgotCi1sYXVuY2hpdGVtLkltYWdlQW5hbHl6ZXIubmFtZSA9IEltYWdlIEFuYWx5emVyCi1sYXVuY2hpdGVtLkltYWdlQW5hbHl6ZXIuZGVzY3JpcHRpb24gPSBcCi0JVGhlIEltYWdlQW5hbHl6ZXIgb3BlbnMgaW1hZ2UgZmlsZXMgYW5kIGRpc3BsYXlzIHRoZSB2aXN1YWwgY29udGVudHMgb2YgdGhlIGZpbGUgYWxvbmcgd2l0aCBhIFwKLQlzdW1tYXJ5IG9mIHRoZSBkYXRhIGluIHRoZSBpbWFnZSBmaWxlLlxuXG5cCi0JVGhlIHVzZXIgY2FuIG1ha2UgYWRqdXN0bWVudHMgdG8gdmFyaW91cyBlbGVtZW50cyBvZiB0aGUgaW1hZ2Ugc3VjaCBhcyBzY2FsaW5nIGFuZCBBbHBoYSBcCi0JYmxlbmRpbmcgYW5kIGNhbiBzYXZlIHRoZXNlIGNoYW5nZXMgdG8gYSBmaWxlLlxuXG5cCi0JVGhlIEltYWdlQW5hbHl6ZXIgd2lsbCBsb2FkIGFuZCBkaXNwbGF5IGltYWdlIGZpbGVzIG9mIHR5cGUgR0lGLCBKUEVHLCBCTVAsIElDTywgUE5HLCBhbmQgVElGRi4gIFwKLQlUbyBvcGVuIGEgZmlsZSwgdXNlIHRoZSBGaWxlLT5PcGVuLi4uIG1lbnUgaXRlbSwgYW5kIHNlbGVjdCB0aGUgaW1hZ2UgZmlsZSBpbiB0aGUgRmlsZURpYWxvZy5cblxuXAotCUlmIHRoZSBmaWxlIGlzIGFuIGludGVybGFjZWQgR0lGIG9yIFBORyBvciBhIHByb2dyZXNzaXZlIEpQRUcsIGFuZCBJbmNyZW1lbnRhbCBEaXNwbGF5IGlzIHNlbGVjdGVkLCBcCi0JdGhlbiB0aGUgSW1hZ2VBbmFseXplciBkaXNwbGF5cyB0aGUgaW1hZ2UgaW5jcmVtZW50cyBhcyB0aGV5IGFyZSBiZWluZyBsb2FkZWQuXG5cblwKLQlJZiB0aGUgZmlsZSBjb250YWlucyBhbiBhbmltYXRlZCBHSUYsIHRoZW4gdGhlIE5leHQsIFByZXZpb3VzLCBhbmQgQW5pbWF0ZSBidXR0b25zIGJlY29tZSBlbmFibGVkLCBcCi0JYW5kIHRoZXkgY2FuIGJlIHVzZWQgdG8gY3ljbGUgdGhyb3VnaCB0aGUgaW1hZ2VzIGluIHRoZSBmaWxlLCBvciBhbmltYXRlIHRoZW0uIElmIGEgR0lGIGRlZmluZXMgYSBiYWNrZ3JvdW5kIGNvbG9yLCBcCi0JYXMgbWFueSBhbmltYXRlZCBHSUZzIGRvLCBzZWxlY3RpbmcgQmFja2dyb3VuZCB3aWxsIHVzZSB0aGUgR0lGJ3MgYmFja2dyb3VuZCBjb2xvci5cblxuXAotCUlmIHRoZSBpbWFnZSBoYXMgdHJhbnNwYXJlbmN5IChwb3NzaWJsZSB3aXRoIEdJRiwgUE5HLCBvciBJQ08pLCB0aGVuIHNlbGVjdGluZyBEaXNwbGF5IE1hc2sgd2lsbCBkcmF3IHRoZSBpbWFnZSdzIHRyYW5zcGFyZW5jeSBcCi0JbWFzayB0byB0aGUgcmlnaHQgb2YgdGhlIGltYWdlLiBZb3UgY2FuIGNoYW5nZSB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgSW1hZ2VBbmFseXplciB0byBzZWUgdGhlIHRyYW5zcGFyZW5jeSB3b3JrLiBcCi0JVG8gdHVybiBvZmYgdGhlIHRyYW5zcGFyZW5jeSwgZGVzZWxlY3QgRGlzcGxheSBUcmFuc3BhcmVuY3kuXG5cblwKLQlBZnRlciBhbiBpbWFnZSBpcyBsb2FkZWQsIGl0IGNhbiBiZSBzY2FsZWQgb3IgaGF2ZSBhbHBoYSB0cmFuc3BhcmVuY3kgYXBwbGllZCwgdXNpbmcgdGhlIFNjYWxlIGFuZCBBbHBoYS1LIGNvbWJvcywgXAotCWFuZCB0aGUgQWxwaGEgbWVudS4gRmlsZS0+UmVvcGVuIHJlc3RvcmVzIHNjYWxpbmcgYW5kIEFscGhhIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzIGFuZCByZWxvYWRzIHRoZSBjdXJyZW50IGltYWdlIGZpbGUuXG5cblwKLQlGaWxlLT5TYXZlIEFzLi4uIGNhbiBiZSB1c2VkIHRvIHNhdmUgdGhlIGN1cnJlbnRseSBsb2FkZWQgaW1hZ2UgdG8gYW5vdGhlciB0eXBlIG9mIGltYWdlIGZpbGUuIElmIHRoZSBpbWFnZSBoYXMgdHJhbnNwYXJlbmN5LCBcCi0JRmlsZS0+U2F2ZSBNYXNrIEFzLi4uIHNhdmVzIHRoZSBpbWFnZSdzIHRyYW5zcGFyZW5jeSBtYXNrLlxuXG5cCi0JV2hlbiBTV1QgbG9hZHMgYW4gaW1hZ2UgZmlsZSwgYW4gaW5zdGFuY2Ugb2Ygb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YSBpcyBjcmVhdGVkLiAoSW4gdGhlIGNhc2Ugb2YgYW4gSUNPIGZpbGUgb3IgXAotCW11bHRpLWltYWdlIEdJRiwgYW4gYXJyYXkgb2YgSW1hZ2VEYXRhIGluc3RhbmNlcyBpcyBjcmVhdGVkKS4gVGhlIEltYWdlQW5hbHl6ZXIgZGlzcGxheXMgYWxsIG9mIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgSW1hZ2VEYXRhIFwKLQlpbnN0YW5jZShzKSBmb3IgdGhlIGN1cnJlbnRseSBsb2FkZWQgaW1hZ2UgZmlsZSwgaW5jbHVkaW5nIHRoZSBwaXhlbCBkYXRhLiBIb3ZlcmluZyBvdmVyIGEgcGl4ZWwgaW4gdGhlIGltYWdlIGRpc3BsYXkgd2lsbCBzaG93IHRoZSBSR0IgXAotCWNvbG9yIGRhdGEgZm9yIHRoYXQgcGl4ZWwuIEZvciBjZXJ0YWluIGltYWdlcyAocGFydGljdWxhcmx5IGFuaW1hdGVkIEdJRnMpIGFkZGl0aW9uYWwgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZUxvYWRlciBcCi0JaW5zdGFuY2UgdXNlZCB0byBsb2FkIHRoZSBpbWFnZS4gVGhlIEltYWdlQW5hbHl6ZXIgZGlzcGxheXMgdGhpcyBkYXRhIGFzIHdlbGwuCi0KLWxhdW5jaGl0ZW0uSmF2YVZpZXdlci5uYW1lID0gSmF2YSBTeW50YXggVmlld2VyCi1sYXVuY2hpdGVtLkphdmFWaWV3ZXIuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gaW1wbGVtZW50IGEgdXNlci1kZWZpbmVkIGxpbmUgc3R5bGVyIGZvciB0aGUgU3R5bGVkVGV4dCB3aWRnZXQuXG5cblwKLQlUaGUgZXhhbXBsZSBwcm92aWRlcyBhIHR5cGljYWwgZWRpdG9yIGludGVyZmFjZS4gIFwKLQlUbyBzZWUgdGhlIGVmZmVjdCBvZiB0aGUgbGluZSBzdHlsZXIsIG9wZW4gYSAqLmphdmEgZmlsZS4gIFwKLQlXaGVuIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhcmUgZGlzcGxheWVkIGluIHRoZSBlZGl0b3IgYXJlYSwgbm90aWNlIHRoYXQgdGhlIGtleXdvcmRzIGhhdmUgYmVlbiBoaWdobGlnaHRlZC4KLQotbGF1bmNoaXRlbS5MYXlvdXRFeGFtcGxlLm5hbWUgPSBMYXlvdXQgRXhhbXBsZQotbGF1bmNoaXRlbS5MYXlvdXRFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIGNvbW1vbiBTV1QgbGF5b3V0cy4gXG5cblwKLQlJdCBjb25zaXN0cyBvZiBhIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgaW4gdGhlIGZvbGRlciBhbGxvd3MgdGhlIFwKLQl1c2VyIHRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgU1dUIGxheW91dC4gXAotCVRoZSB1c2VyIGNhbiBpbnNlcnQgd2lkZ2V0cyBpbnRvIGEgbGF5b3V0IGFuZCBzZXQgdGhlIHZhbHVlcyBvZiB0aGUgbGF5b3V0IGRhdGEgXAotCXVzaW5nIGEgcHJvcGVydHkgc2hlZXQuICBXaGVuIHRoZSB1c2VyIGhhcyBhIHN1aXRhYmxlIGFycmFuZ2VtZW50LCBjb2RlIGNhbiBiZSBcCi0JZ2VuZXJhdGVkIGJ5IGNsaWNraW5nIG9uIHRoZSBDb2RlIGJ1dHRvbi4KLQotbGF1bmNoaXRlbS5BZHZhbmNlZEdyYXBoaWNzLm5hbWUgPSBBZHZhbmNlZCBHcmFwaGljcwotbGF1bmNoaXRlbS5BZHZhbmNlZEdyYXBoaWNzLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBhZHZhbmNlZCBncmFwaGljcyBvcGVyYXRpb25zLgotCi1sYXVuY2hpdGVtLlRleHRFZGl0b3IubmFtZSA9IFRleHQgRWRpdG9yCi1sYXVuY2hpdGVtLlRleHRFZGl0b3IuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIHRoZSBTdHlsZWRUZXh0IHdpZGdldCB0byBpbXBsZW1lbnQgXAotCWEgdGV4dCBlZGl0b3Igd2l0aCBmb3JtYXR0aW5nIHN1cHBvcnQuXG5cblwKLQlUaGUgZXhhbXBsZSBoYXMgYSB0eXBpY2FsIHRleHQgZWRpdG9yIGludGVyZmFjZS4gIFwKLQlUaGUgRWRpdCBtZW51IGNvbnRhaW5zIEN1dCwgQ29weSwgUGFzdGUgYW5kIFNldCBGb250IGl0ZW1zIGFuZCB0aGUgdG9vbGJhciBcCi0JcHJvdmlkZXMgYSBib2xkIHRleHQgdG9nZ2xlLCB0aHJlZSBjb2xvdXIgdG9vbHMgdGhhdCBvcGVyYXRlIG9uIHRoZSBjdXJyZW50IFwKLQlzZWxlY3Rpb24sIGFuZCBhIHJlc2V0IHRvIGRlZmF1bHRzIGJ1dHRvbiB0aGF0IGFsc28gb3BlcmF0ZXMgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwMzk3MzIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gRmlsZSB3cml0dGVuIGJ5IFBERSAxLjAgLS0+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgbmFtZT0iJXBsdWdpbi5TV1RTdGFuZGFsb25lRXhhbXBsZVNldC5uYW1lIgotICAgdmVyc2lvbj0iMy4xLjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9IiI+Ci08IS0tIFJlcXVpcmVkIHBsdWdpbnMgLS0+Ci08cmVxdWlyZXM+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci08L3JlcXVpcmVzPgotCi08IS0tIFJ1bnRpbWUgLS0+Ci08cnVudGltZT4KLSAgIDxsaWJyYXJ5IG5hbWU9InN3dGV4YW1wbGVzLmphciI+Ci0gICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgIDwvbGlicmFyeT4KLTwvcnVudGltZT4KLQotPCEtLSBFeHRlbnNpb25zIC0tPgotPCEtLSBFeHRlbnNpb24gcG9pbnRzIC0tPgotPGV4dGVuc2lvbgotICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICA8Y2F0ZWdvcnkKLSAgICAgICAgIG5hbWU9IiVsYXVuY2hjYXRlZ29yeS5TV1RTdGFuZGFsb25lRXhhbXBsZXMubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoY2F0ZWdvcnkuU1dUU3RhbmRhbG9uZUV4YW1wbGVzLmRlc2NyaXB0aW9uIgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiPgotICAgPC9jYXRlZ29yeT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5BZGRyZXNzQm9vay5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkFkZHJlc3NCb29rLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmFkZHJlc3Nib29rLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmFkZHJlc3Nib29rLkFkZHJlc3NCb29rIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5DbGlwYm9hcmQubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5DbGlwYm9hcmQuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2xpcGJvYXJkLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNsaXBib2FyZC5DbGlwYm9hcmRFeGFtcGxlIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5ETkQubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5ETkQuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZG5kLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmRuZC5ETkRFeGFtcGxlIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5GaWxlVmlld2VyLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uRmlsZVZpZXdlci5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5maWxldmlld2VyLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmZpbGV2aWV3ZXIuRmlsZVZpZXdlciI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uSG92ZXJIZWxwLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uSG92ZXJIZWxwLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhvdmVyaGVscC5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ob3ZlcmhlbHAuSG92ZXJIZWxwIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5IZWxsb1dvcmxkMS5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkhlbGxvV29ybGQxLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQxLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQuSGVsbG9Xb3JsZDEiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkhlbGxvV29ybGQyLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDIuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZDIuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZC5IZWxsb1dvcmxkMiI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDMubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5IZWxsb1dvcmxkMy5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkMy5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkLkhlbGxvV29ybGQzIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5IZWxsb1dvcmxkNC5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkhlbGxvV29ybGQ0LmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQ0LnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQuSGVsbG9Xb3JsZDQiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkhlbGxvV29ybGQ1Lm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDUuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZDUuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZC5IZWxsb1dvcmxkNSI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uSW1hZ2VBbmFseXplci5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkltYWdlQW5hbHl6ZXIuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaW1hZ2VhbmFseXplci5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5pbWFnZWFuYWx5emVyLkltYWdlQW5hbHl6ZXIiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkphdmFWaWV3ZXIubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5KYXZhVmlld2VyLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmphdmF2aWV3ZXIuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuamF2YXZpZXdlci5KYXZhVmlld2VyIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5UZXh0RWRpdG9yLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uVGV4dEVkaXRvci5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy50ZXh0ZWRpdG9yLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnRleHRlZGl0b3IuVGV4dEVkaXRvciI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uQWR2YW5jZWRHcmFwaGljcy5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkFkdmFuY2VkR3JhcGhpY3MuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3Muc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5BZHZhbmNlZEdyYXBoaWNzIgotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIvPgotICAgPC9pdGVtPgotPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfYWRkcmVzc2Jvb2sucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfYWRkcmVzc2Jvb2sucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyNTJlMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2FkZHJlc3Nib29rLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1MYXN0X25hbWUgPSBMYXN0IE5hbWUKLUZpcnN0X25hbWUgPSBGaXJzdCBOYW1lCi1CdXNpbmVzc19waG9uZSA9IEJ1c2luZXNzIFBob25lCi1Ib21lX3Bob25lID0gSG9tZSBQaG9uZQotRW1haWwgPSBFbWFpbAotRmF4ID0gRmF4Ci1DbG9zZV9zYXZlID0gVGhlIGFkZHJlc3MgYm9vayBjb250ZW50cyBoYXZlIGNoYW5nZWQuXG5EbyB5b3Ugd2FudCB0byBzYXZlIHRoZSBjaGFuZ2VzPwotTmV3X3RpdGxlID0gVW50aXRsZWQKLUNvbHVtbiA9IENvbHVtbjoKLUJvb2tfZXh0ZW5zaW9uID0gLmFkcgotQm9va19maWx0ZXJfbmFtZSA9IEFkZHJlc3MgQm9va3MKLUFsbF9maWx0ZXJfbmFtZSA9IEFsbCBGaWxlcwotRmlsZSA9IEZpbGUgCi1Eb2VzX25vdF9leGlzdCA9IGRvZXMgbm90IGV4aXN0LgotRmlsZV9ub3RfZm91bmQgPSBGaWxlIG5vdCBmb3VuZDoKLUlPX2Vycm9yX3JlYWQgPSBJTyBlcnJvciByZWFkaW5nIHRleHQgZmlsZToKLUlPX2Vycm9yX3dyaXRlID0gSU8gZXJyb3Igd3JpdGluZyB0ZXh0IGZpbGU6Ci1JT19lcnJvcl9jbG9zZSA9IElPIGVycm9yIGNsb3NpbmcgdGV4dCBmaWxlOgotVGl0bGVfYmFyID0gQWRkcmVzcyBCb29rIC0gCi1TYXZlX2FzX3RpdGxlID0gU2F2ZSBBcwotUXVlcnlfb3ZlcndyaXRlID0gYWxyZWFkeSBleGlzdHMuXG5EbyB5b3Ugd2FudCB0byByZXBsYWNlIGl0PwotRmlsZV9tZW51X3RpdGxlID0gJkZpbGUKLU5ld19jb250YWN0ID0gJk5ldyBDb250YWN0Li4uXHRDdHJsK04KLUVkaXRfY29udGFjdCA9ICZFZGl0IENvbnRhY3QuLi5cdEN0cmwrRQotTmV3X2FkZHJlc3NfYm9vayA9IE5ldyBBZGRyZXNzICZCb29rXHRDdHJsK0IKLU9wZW5fYWRkcmVzc19ib29rID0gJk9wZW4gQWRkcmVzcyBCb29rLi4uXHRDdHJsK08KLVNhdmVfYWRkcmVzc19ib29rID0gJlNhdmUgQWRkcmVzcyBCb29rXHRDdHJsK1MKLVNhdmVfYm9va19hcyA9IFNhdmUgJkFkZHJlc3MgQm9vayBBcy4uLlx0Q3RybCtBCi1FeGl0ID0gRSZ4aXQKLUVkaXRfbWVudV90aXRsZSA9ICZFZGl0Ci1FZGl0ID0gJkVkaXQuLi5cdEN0cmwrRQotQ29weSA9ICZDb3B5XHRDdHJsK0MKLVBhc3RlID0gJlBhc3RlXHRDdHJsK1YKLURlbGV0ZSA9IERlJmxldGVcdERlbAotU29ydCA9ICZTb3J0Ci1TZWFyY2hfbWVudV90aXRsZSA9ICZTZWFyY2gKLUZpbmQgPSAmRmluZC4uLlx0Q3RybCtGCi1GaW5kX25leHQgPSBGaW5kICZOZXh0Li4uXHRGMwotUG9wX3VwX25ldyA9ICZOZXcuLi4KLVBvcF91cF9lZGl0ID0gJkVkaXQuLi4KLVBvcF91cF9jb3B5ID0gJkNvcHkKLVBvcF91cF9wYXN0ZSA9ICZQYXN0ZQotUG9wX3VwX2RlbGV0ZSA9ICZEZWxldGUKLVBvcF91cF9maW5kID0gJkZpbmQuLi4KLUhlbHBfbWVudV90aXRsZSA9ICZIZWxwCi1BYm91dCA9ICZBYm91dCBBZGRyZXNzIEJvb2suLi4KLUFib3V0XzEgPSBBYm91dCAKLUFib3V0XzIgPSBcbnZlcnNpb24gMS4wCi1PSyA9IE9LCi1DYW5jZWwgPSBDYW5jZWwKLVNlYXJjaF9kaWFsb2dfdGl0bGUgPSBGaW5kCi1EaWFsb2dfZmluZF93aGF0ID0gRmkmbmQgd2hhdDoKLURpYWxvZ19tYXRjaF9jYXNlID0gTWF0Y2ggJmNhc2UKLURpYWxvZ19tYXRjaF93b3JkID0gTWF0Y2ggJndob2xlIHdvcmQKLURpYWxvZ19kaXJlY3Rpb24gPSBEaXJlY3Rpb24KLURpYWxvZ19kaXJfdXAgPSAmVXAKLURpYWxvZ19kaXJfZG93biA9ICZEb3duCi1EaWFsb2dfZmluZCA9ICZGaW5kCi1DYW5ub3RfZmluZCA9IENhbm5vdCBmaW5kIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfYnJvd3Nlci5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19icm93c2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5Nzc5OTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19icm93c2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1lcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMgPSBVbmFibGUgdG8gbG9hZCByZXNvdXJjZXMKLXdpbmRvdy50aXRsZSA9IFNXVCBCcm93c2VyCi0KLUJhY2sJCQkJPSBCYWNrCi1Ccm93c2VyTm90Q3JlYXRlZAk9IEVycm9yIC0gVGhlIEJyb3dzZXIgd2lkZ2V0IGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQuIFBsZWFzZSBjaGVjayB0aGUgQnJvd3NlciB3aWRnZXQgaXMgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0uIFN1cHBvcnRlZCBwbGF0Zm9ybXMgYW5kIHNvZnR3YXJlIHJlcXVpcmVtZW50cyBmb3IgdGhlIEJyb3dzZXIgd2lkZ2V0IGFyZSBsaXN0ZWQgb24gdGhlIFNXVCBGQVEgd2ViIHBhZ2UuCi1Gb3J3YXJkCQkJCT0gRm9yd2FyZAotU3RvcAkJCQk9IFN0b3AKLVJlZnJlc2gJCQkJPSBSZWZyZXNoCi1HbwkJCQkJPSBHbwotU3RhcnR1cAkJCQk9IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfY29udHJvbC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19jb250cm9sLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMzcyNTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19jb250cm9sLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzID0gVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzCi13aW5kb3cudGl0bGUgPSBTV1QgQ29udHJvbHMKLWN1c3RvbS53aW5kb3cudGl0bGUgPSBTV1QgQ3VzdG9tIENvbnRyb2xzCi0KLVRleHRfQnV0dG9ucwkJPSBUZXh0IEJ1dHRvbnMKLVNpemUgCQkJCT0gU2l6ZQotQWxpZ25tZW50CQkJPSBBbGlnbm1lbnQKLUxlZnQJCQkJPSBMZWZ0Ci1SaWdodAkJCQk9IFJpZ2h0Ci1VcAkJCQkJPSBVcAotRG93bgkJCQk9IERvd24KLUNlbnRlcgkJCQk9IENlbnRlcgotT25lCQkJCQk9IE9uZQotVHdvCQkJCQk9IFR3bwotVGhyZWUJCQkJPSBUaHJlZQotSW1hZ2VfQnV0dG9ucwkJPSBJbWFnZSBCdXR0b25zCi1JbWFnZV9UZXh0X0J1dHRvbnMJPSBJbWFnZSBhbmQgVGV4dCBCdXR0b25zCi1Db250cm9sX0V4YW1wbGUJCT0gQ29udHJvbCBFeGFtcGxlCi1QYXJhbWV0ZXJzCQkJPSBQYXJhbWV0ZXJzCi1PdGhlcgkJCQk9IE90aGVyCi1FbmFibGVkCQkJCT0gRW5hYmxlZAotVmlzaWJsZQkJCQk9IFZpc2libGUKLVByZWZlcnJlZCAJCQk9IFByZWZlcnJlZAotU3R5bGVzCSAJCQk9IFN0eWxlcwotTWVudV9TdHlsZXMJIAkJPSBNZW51IFN0eWxlcwotTWVudUl0ZW1fU3R5bGVzCSAJPSBNZW51SXRlbSBTdHlsZXMKLUxpc3RlbmVycwkJCT0gTGlzdGVuZXJzCi1TZWxlY3RfTGlzdGVuZXJzCT0gU2VsZWN0IExpc3RlbmVycwotTGlzdGVuCQkJCT0gTGlzdGVuCi1DbGVhcgkJCQk9IENsZWFyCi1TZXRfR2V0CQkJCT0gU2V0L0dldCBBUEkKLVBhcmFtZXRlcl9JbmZvCQk9IHswfSAgIGUuZy4gezF9IAotSW5mb19pbnQJCQk9IDQKLUluZm9faW50QQkJCT0gMCwxLDIKLUluZm9fbG9uZwkJCT0gNAotSW5mb19sb25nQQkJCT0gMCwxLDIKLUluZm9fY2hhcgkJCT0gYwotSW5mb19jaGFyQQkJCT0gYSxiLGMKLUluZm9fYm9vbGVhbgkJPSB0cnVlCi1JbmZvX2Jvb2xlYW5BCQk9IHRydWUsdHJ1ZSxmYWxzZQotSW5mb19TdHJpbmcJCQk9IGhlbGxvCi1JbmZvX1N0cmluZ0EJCT0gaGVsbG8sdGhlcmUKLUluZm9fUG9pbnQJCQk9IDAsMAotSW5mb19UYWJJdGVtCQk9IFRhYiAwCi1JbmZvX1RhYkl0ZW1BCQk9IFRhYiAwLFRhYiAyCi1JbmZvX1RhYmxlSXRlbQkJPSBJbmRleDoyCi1JbmZvX1RhYmxlSXRlbUEJCT0gSW5kZXg6MixJbmRleDo0Ci1JbmZvX1RyZWVJdGVtCQk9IE5vZGUgMQotSW5mb19UcmVlSXRlbUEJCT0gTm9kZSAxLE5vZGUgMwotU2VsZWN0X0FsbAkJCT0gU2VsZWN0IEFsbAotRGVzZWxlY3RfQWxsCQk9IERlc2VsZWN0IEFsbAotT0sJCQkJCT0gT0sKLUZpbGxEYW1hZ2UJCQk9IEZpbGwgRGFtYWdlZCBBcmVhIFdpdGggQ29sb3IKLVRpdGxlX1RleHQJCQk9IFRpdGxlIFRleHQKLVRleHRfTGFiZWxzCQkJPSBUZXh0IExhYmVscwotSW1hZ2VfTGFiZWxzCQk9IEltYWdlIExhYmVscwotQ3VzdG9tX0xhYmVscwkJPSBDdXN0b20gTGFiZWxzCi1DdXN0b21fQ29tYm8JCT0gQ3VzdG9tIENvbWJvCi1PbmVfVHdvX1RocmVlCQk9IE9uZSBUd28gVGhyZWUKLVRleHRfVG9vbEJhciAJCT0gVGV4dCBUb29sQmFyCi1JbWFnZV9Ub29sQmFyIAkJPSBJbWFnZSBUb29sQmFyCi1JbWFnZVRleHRfVG9vbEJhcgk9IEltYWdlIGFuZCBUZXh0IFRvb2xCYXIKLU1heGltdW0JCQkJPSBNYXhpbXVtCi1NaW5pbXVtCQkJCT0gTWluaW11bQotU2VsZWN0aW9uCQkJPSBTZWxlY3Rpb24KLUluY3JlbWVudAkJCT0gSW5jcmVtZW50Ci1QYWdlX0luY3JlbWVudAkJPSBQYWdlIEluY3JlbWVudAotVGh1bWIJCQkJPSBUaHVtYgotRGlnaXRzCQkJCT0gRGlnaXRzCi1UcmVlX1dpdGhfSW1hZ2VzCT0gVHJlZSBXaXRoIEltYWdlcwotRGlhbG9nX1R5cGUJCQk9IERpYWxvZyBUeXBlCi1DcmVhdGVfRGlhbG9nCQk9IENyZWF0ZSBEaWFsb2cKLUJ1dHRvbl9TdHlsZXMJCT0gQnV0dG9uIFN0eWxlcwotSWNvbl9TdHlsZXMJCQk9IEljb24gU3R5bGVzCi1Nb2RhbF9TdHlsZXMJCT0gTW9kYWwgU3R5bGVzCi1GaWxlX0RpYWxvZ19TdHlsZXMJPSBGaWxlIERpYWxvZyBTdHlsZXMKLUl0ZW1fU3R5bGVzCQkJPSBJdGVtIFN0eWxlcwotRGlhbG9nX1Jlc3VsdAkJPSBEaWFsb2cgUmVzdWx0Ci1Db2xvckRpYWxvZwkJCT0gQ29sb3JEaWFsb2cKLURpcmVjdG9yeURpYWxvZwkJPSBEaXJlY3RvcnlEaWFsb2cKLUZpbGVEaWFsb2cJCQk9IEZpbGVEaWFsb2cKLUZvbnREaWFsb2cJCQk9IEZvbnREaWFsb2cKLVByaW50RGlhbG9nCQkJPSBQcmludERpYWxvZwotTWVzc2FnZUJveAkJCT0gTWVzc2FnZUJveAotTXVsdGlfbGluZQkJCT0gQSBtdWx0aSBsaW5lIHRleHQgd2lkZ2V0LgotRXhhbXBsZV9zdHJpbmcJCT0gVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4KLUhlYWRlcl9WaXNpYmxlCQk9IEhlYWRlciBWaXNpYmxlCi1MaW5lc19WaXNpYmxlCQk9IExpbmVzIFZpc2libGUKLU1vdmVhYmxlX0NvbHVtbnMJPSBNb3ZlYWJsZSBDb2x1bW5zCi1NdWx0aXBsZV9Db2x1bW5zCT0gTXVsdGlwbGUgQ29sdW1ucwotTG9ja2VkCQkJCT0gTG9ja2VkCi1Db21ib19jaGlsZAkJCT0gQ29tYm8gQ2hpbGQKLU5vZGVfMQkJCQk9IE5vZGUgMQotTm9kZV8yCQkJCT0gTm9kZSAyCi1Ob2RlXzMJCQkJPSBOb2RlIDMKLU5vZGVfNAkJCQk9IE5vZGUgNAotTm9kZV8xXzEJCQk9IE5vZGUgMS4xCi1Ob2RlXzJfMQkJCT0gTm9kZSAyLjEKLU5vZGVfM18xCQkJPSBOb2RlIDMuMQotTm9kZV8yXzIJCQk9IE5vZGUgMi4yCi1Ob2RlXzJfMl8xCQkJPSBOb2RlIDIuMi4xCi1QYXJlbnQJCQkJPSBQYXJlbnQKLU5vX1BhcmVudAkJCT0gTm8gUGFyZW50Ci1EZWNvcmF0aW9uX1N0eWxlcwk9IERlY29yYXRpb24gU3R5bGVzCi1DcmVhdGVfU2hlbGwJCT0gQ3JlYXRlIFNoZWxsCi1DbG9zZV9BbGxfU2hlbGxzCT0gQ2xvc2UgQWxsIFNoZWxscwotUHVzaAkJCQk9IFB1c2gKLVJhZGlvCQkJCT0gUmFkaW8KLUNoZWNrCQkJCT0gQ2hlY2sKLUNhc2NhZGUJCQkJPSBDYXNjYWRlCi1Ecm9wX0Rvd24JCQk9IERyb3AgRG93bgotSW1hZ2VzX2ZhaWxlZAkJPSBXYXJuaW5nOiBGYWlsZWQgdG8gbG9hZCBpbWFnZXMKLXJlYWRtZV90eHQJCQk9IHJlYWRtZS50eHQKLUluZGV4CQkJCT0gSW5kZXg6Ci1UaXRsZQkJCQk9IFRpdGxlOgotQ2xvc2UJCQkJPSBDbG9zZQotUmVzdWx0CQkJCT0gUmVzdWx0OiB7MH0KLUZpbHRlck5hbWVfMAkJPSBUZXh0IEZpbGVzCi1GaWx0ZXJOYW1lXzEJCT0gQmF0Y2ggRmlsZXMKLUZpbHRlck5hbWVfMgkJPSBEb2MgRmlsZXMKLUZpbHRlck5hbWVfMwkJPSBBbGwgRmlsZXMKLVRhYmxlVGl0bGVfMAkJPSBOYW1lCi1UYWJsZVRpdGxlXzEJCT0gVHlwZQotVGFibGVUaXRsZV8yCQk9IFNpemUKLVRhYmxlVGl0bGVfMwkJPSBNb2RpZmllZAotVGFibGVMaW5lMF8wCQk9IDxlbXB0eT4KLVRhYmxlTGluZTBfMQkJPSBjbGFzc2VzCi1UYWJsZUxpbmUwXzIJCT0gMAotVGFibGVMaW5lMF8zCQk9IHRvZGF5Ci1UYWJsZUxpbmUxXzAJCT0gPGVtcHR5PgotVGFibGVMaW5lMV8xCQk9IGRhdGFiYXNlcwotVGFibGVMaW5lMV8yCQk9IDI1NTYKLVRhYmxlTGluZTFfMwkJPSB0b21vcnJvdwotVGFibGVMaW5lMl8wCQk9IDxlbXB0eT4KLVRhYmxlTGluZTJfMQkJPSBpbWFnZXMKLVRhYmxlTGluZTJfMgkJPSA5MTU3MQotVGFibGVMaW5lMl8zCQk9IHllc3RlcmRheQotTGlzdERhdGEwXzAJCQk9IExpbmUgMQotTGlzdERhdGEwXzEJCQk9IExpbmUgMgotTGlzdERhdGEwXzIJCQk9IExpbmUgMwotTGlzdERhdGEwXzMJCQk9IExpbmUgNAotTGlzdERhdGEwXzQJCQk9IExpbmUgNQotTGlzdERhdGEwXzUJCQk9IExpbmUgNgotTGlzdERhdGEwXzYJCQk9IExpbmUgNwotTGlzdERhdGEwXzcJCQk9IExpbmUgOAotTGlzdERhdGEwXzgJCQk9IExvbmdlc3QgTGluZSBJbiBMaXN0Ci1MaXN0RGF0YTFfMAkJCT0gQXBwbGVzCi1MaXN0RGF0YTFfMQkJCT0gT3JhbmdlcwotTGlzdERhdGExXzIJCQk9IEJhbmFuYXMKLUxpc3REYXRhMV8zCQkJPSBHcmFwZWZydWl0Ci1MaXN0RGF0YTFfNAkJCT0gUGVhY2hlcwotTGlzdERhdGExXzUJCQk9IEtpd2kKLUxpc3REYXRhMV82CQkJPSBBcHJpY290cwotTGlzdERhdGExXzcJCQk9IFN0cmF3YmVycmllcwotTGlzdERhdGExXzgJCQk9IFRoZSBMb25nZXN0IFN0cmluZwotRHJvcERvd25EYXRhXzAJCT0gQXBwbGVzCi1Ecm9wRG93bkRhdGFfMQkJPSBPcmFuZ2VzCi1Ecm9wRG93bkRhdGFfMgkJPQotRHJvcERvd25EYXRhXzMJCT0gR3JhcGVmcnVpdAotRHJvcERvd25EYXRhXzQJCT0gUGVhY2hlcwotRHJvcERvd25EYXRhXzUJCT0gS2l3aQotRHJvcERvd25EYXRhXzYJCT0KLURyb3BEb3duRGF0YV83CQk9IFN0cmF3YmVycmllcwotRHJvcERvd25EYXRhXzgJCT0gVGhlIExvbmdlc3QgU3RyaW5nCi1Db2xvcnMgCQkJCT0gQ29sb3JzIGFuZCBGb250Ci1UYWJsZV9JdGVtX0NvbG9ycwk9IFJvdyAwIENvbG9ycyBhbmQgRm9udAotVHJlZV9JdGVtX0NvbG9ycwk9IE5vZGUgMSBDb2xvcnMgYW5kIEZvbnQKLUl0ZW1fRm9udAkJCT0gSXRlbSBGb250IC4uLgotQmFja2dyb3VuZF9Db2xvcgk9IEJhY2tncm91bmQgQ29sb3IKLUZvcmVncm91bmRfQ29sb3IJPSBGb3JlZ3JvdW5kIENvbG9yCi1Gb250CQkJCT0gJkZvbnQuLi4KLURlZmF1bHRzCQkJPSAmRGVmYXVsdHMKLVdyYXBfVGV4dAkJCT0gSmFjayBhbmQgSmlsbCB3ZW50IHVwIHRoZSBoaWxsIHRvIGZldGNoIGEgcGFpbCBvZiB3YXRlciwgXAotCQkJCQkgIEphY2sgZmVsbCBkb3duIGFuZCBicm9rZSBoaXMgY3Jvd24gYW5kIEppbGwgY2FtZSB0dW1ibGluZyBhZnRlciEKLUZvcmVncm91bmRfU3R5bGUJPSBGb3JlZ3JvdW5kIFN0eWxlCi1CYWNrZ3JvdW5kX1N0eWxlIAk9IEJhY2tncm91bmQgU3R5bGUKLVN0eWxlZFRleHRfU3R5bGVzCT0gVGV4dCBTdHlsZXMKLVN0eWxlZFRleHRfU3R5bGVfSW5zdHJ1Y3Rpb25zCT0gU2VsZWN0IHRleHQsIHRoZW4gc3R5bGUuCi1Cb2xkCQkJCT0gQm9sZAotSXRhbGljCQkJCT0gSXRhbGljCi1VbmRlcmxpbmUJCT0gVW5kZXJsaW5lCi1TdHJpa2VvdXQJCT0gU3RyaWtlb3V0Ci1GaWxsX1gJCQkJPSBIb3Jpem9udGFsIEZpbGwKLUZpbGxfWQkJCQk9IFZlcnRpY2FsIEZpbGwKLVRhYkl0ZW0xXzAJCQk9IFRhYiAwCi1UYWJJdGVtMV8xCQkJPSBUYWIgMQotVGFiSXRlbTFfMgkJCT0gVGFiIDIKLVRhYkl0ZW1fY29udGVudAkJPSBUYWJJdGVtIENvbnRlbnQKLUNUYWJJdGVtMV8wCQkJPSBDVGFiSXRlbSAwCi1DVGFiSXRlbTFfMQkJCT0gQ1RhYkl0ZW0gMQotQ1RhYkl0ZW0xXzIJCQk9IENUYWJJdGVtIDIgaGFzIGEgbG9uZyBuYW1lCi1DSXRlbV9Db2xvcnMJCT0gQ1RhYkl0ZW0gQ29sb3JzCi1DVGFiSXRlbV9jb250ZW50CT0gQ1RhYkl0ZW0gQ29udGVudAotU2V0X1NpbXBsZV9UYWJzCQk9IFNpbXBsZSBUYWJzCi1TZXRfU2luZ2xlX1RhYnMJCT0gU2luZ2xlIFRhYgotU2V0X01pbl9WaXNpYmxlICAgICA9IE1pbmltaXplCi1TZXRfTWF4X1Zpc2libGUgICAgID0gTWF4aW1pemUKLVNldF9VbnNlbGVjdGVkX0Nsb3NlX1Zpc2libGUgPSBDbG9zZSBvbiBVbnNlbGVjdGVkIFRhYnMKLVNldF9VbnNlbGVjdGVkX0ltYWdlX1Zpc2libGUgPSBJbWFnZSBvbiBVbnNlbGVjdGVkIFRhYnMKLVNlbGVjdGlvbl9Gb3JlZ3JvdW5kX0NvbG9yID0gU2VsZWN0aW9uIEZvcmVncm91bmQgQ29sb3IKLVNlbGVjdGlvbl9CYWNrZ3JvdW5kX0NvbG9yID0gU2VsZWN0aW9uIEJhY2tncm91bmQgQ29sb3IKLVNldF9JbWFnZQkJCT0gU2V0IEltYWdlCi1UYWJsZVRyZWVfY29sdW1uCT0gQ29sdW1uCi1NZW51SXRlbV9DdXQJCT0gQ3UmdAlDdHJsK1gKLU1lbnVJdGVtX0NvcHkJCT0gJkNvcHkJQ3RybCtDCi1NZW51SXRlbV9QYXN0ZQkJPSAmUGFzdGUJQ3RybCtWCi1NZW51SXRlbV9TZWxlY3RBbGwJPSBTZWxlY3QgJkFsbAlDdHJsK0EKLU9yaWVudGF0aW9uIAkJPSBPcmllbnRhdGlvbgotRGVmYXVsdCAJCQk9IERlZmF1bHQgKEluaGVyaXQpCi1JbWFnZXMJCQkJPSBJbWFnZXMKLUFjY2VsZXJhdG9ycwkJPSBBY2NlbGVyYXRvcnMKLU1uZW1vbmljcwkJCT0gTW5lbW9uaWNzCi1TdWJNZW51CQkJCT0gU3ViLU1lbnUKLVN1YlN1Yk1lbnUJCQk9IFN1Yi1TdWItTWVudQotMVJhZGlvCQkJCT0gUmFkaW8xCi0yUmFkaW8JCQkJPSBSYWRpbzIKLTFSYWRpb1dpdGhNbmVtb25pYwk9IFJhZGlvJjEKLTJSYWRpb1dpdGhNbmVtb25pYwk9IFJhZGlvJjIKLVB1c2hXaXRoTW5lbW9uaWMJPSAmUHVzaAotUmFkaW9XaXRoTW5lbW9uaWMJPSAmUmFkaW8KLUNoZWNrV2l0aE1uZW1vbmljCT0gJkNoZWNrCi1DYXNjYWRlV2l0aE1uZW1vbmljCT0gQyZhc2NhZGUKLVBvcHVwTWVudUhlcmUJCT0gUG9wdXAgTWVudSBIZXJlCi1MaW5rVGV4dD1WaXNpdCB0aGUgPEEgSFJFRj1cInd3dy5lY2xpcHNlLm9yZ1wiPkVjbGlwc2Uub3JnPC9BPiBwcm9qZWN0IGFuZCB0aGUgPEEgSFJFRj1cInd3dy5lY2xpcHNlLm9yZ1xcc3d0Ij5TV1Q8L0E+IGhvbWVwYWdlLgotVG9vbHRpcAkJCQk9IFRvb2x0aXA6ICB7MH0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfZmlsZXZpZXdlci5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19maWxldmlld2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OTQyZTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19maWxldmlld2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1UaXRsZSA9IFNXVCBGaWxlVmlld2VyIC0gezB9Ci0KLW1lbnUuRmlsZS50ZXh0ID0gJkZpbGUKLW1lbnUuRmlsZS5DbG9zZS50ZXh0ID0gJkNsb3NlCi1tZW51LkZpbGUuU2ltdWxhdGVPbmx5LnRleHQgPSBTaW11bGF0ZSBGaWxlIE9wZXJhdGlvbnMKLW1lbnUuSGVscC50ZXh0ID0gJkhlbHAKLW1lbnUuSGVscC5BYm91dC50ZXh0ID0gJkFib3V0Ci0KLXRvb2wuQ3V0LnRpcHRleHQgPSBDdXQKLXRvb2wuQ29weS50aXB0ZXh0ID0gQ29weQotdG9vbC5EZWxldGUudGlwdGV4dCA9IERlbGV0ZQotdG9vbC5QYXJlbnQudGlwdGV4dCA9IFBhcmVudAotdG9vbC5QYXN0ZS50aXB0ZXh0ID0gUGFzdGUKLXRvb2wuUHJpbnQudGlwdGV4dCA9IFByaW50Ci10b29sLlJlZnJlc2gudGlwdGV4dCA9IFJlZnJlc2gKLXRvb2wuUmVuYW1lLnRpcHRleHQgPSBSZW5hbWUKLXRvb2wuU2VhcmNoLnRpcHRleHQgPSBTZWFyY2gKLQotZGV0YWlscy5BbGxGb2xkZXJzLnRleHQgPSBBbGwgRm9sZGVycwotZGV0YWlscy5Db250ZW50c09mLnRleHQgPSBDb250ZW50cyBvZiAnJ3swfScnCi1kZXRhaWxzLkZpbGVTaXplLnRleHQgPSB7MH0gYnl0ZXMKLWRldGFpbHMuRGlyTnVtYmVyT2ZPYmplY3RzLnRleHQgPSB7MH0gb2JqZWN0KHMpCi1kZXRhaWxzLk51bWJlck9mU2VsZWN0ZWRGaWxlcy50ZXh0ID0gezB9IG9iamVjdChzKSBzZWxlY3RlZAotCi10YWJsZS5OYW1lLnRpdGxlID0gTmFtZQotdGFibGUuU2l6ZS50aXRsZSA9IFNpemUKLXRhYmxlLlR5cGUudGl0bGUgPSBUeXBlCi10YWJsZS5Nb2RpZmllZC50aXRsZSA9IE1vZGlmaWVkCi0KLWZpbGV0eXBlLlVua25vd24gPSB7MH0gRmlsZQotZmlsZXR5cGUuTm9uZSA9IEZpbGUKLWZpbGV0eXBlLkZvbGRlciA9IEZvbGRlcgotZmlsZXNpemUuS0IgPSB7MH0ga2IKLQotZGlhbG9nLkFib3V0LnRpdGxlID0gQWJvdXQgU1dUIEZpbGVWaWV3ZXIKLWRpYWxvZy5BYm91dC5kZXNjcmlwdGlvbiA9IFNXVCBGaWxlVmlld2VyXG5cblZlcnNpb246IDAuOVxuXG5SdW5uaW5nIG9uOiB7MH0KLQotZGlhbG9nLk5vdEltcGxlbWVudGVkLnRpdGxlID0gTm90IEltcGxlbWVudGVkCi1kaWFsb2cuQWN0aW9uTm90SW1wbGVtZW50ZWQuZGVzY3JpcHRpb24gPSBTb3JyeSEgIFRoZSBhY3Rpb24geW91IHNlbGVjdGVkIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZC4KLQotZGlhbG9nLkZhaWxlZENvcHkudGl0bGUgPSBDb3B5IEZpbGVzIEVycm9yCi1kaWFsb2cuRmFpbGVkQ29weS5kZXNjcmlwdGlvbiA9IEFuIGVycm9yIG9jY3VyZWQgd2hpbGUgdHJ5aW5nIHRvIGNvcHkgInswfSIgdG8gInsxfSIuCi0KLWRpYWxvZy5GYWlsZWREZWxldGUudGl0bGUgPSBEZWxldGUgRmlsZXMgRXJyb3IKLWRpYWxvZy5GYWlsZWREZWxldGUuZGVzY3JpcHRpb24gPSBBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHRyeWluZyB0byBkZWxldGUgInswfSIuCi0KLXByb2dyZXNzRGlhbG9nLmNhbmNlbEJ1dHRvbi50ZXh0ID0gQ2FuY2VsCi1wcm9ncmVzc0RpYWxvZy5Db3B5LnRpdGxlID0gQ29weSBGaWxlcwotcHJvZ3Jlc3NEaWFsb2cuQ29weS5kZXNjcmlwdGlvbiA9IENvcHlpbmcgZmlsZXMuCi1wcm9ncmVzc0RpYWxvZy5Db3B5Lm9wZXJhdGlvbiA9IENvcHlpbmcuLi4gezB9Ci1wcm9ncmVzc0RpYWxvZy5Nb3ZlLnRpdGxlID0gTW92ZSBGaWxlcwotcHJvZ3Jlc3NEaWFsb2cuTW92ZS5kZXNjcmlwdGlvbiA9IE1vdmluZyBmaWxlcy4KLXByb2dyZXNzRGlhbG9nLkRlbGV0ZS5vcGVyYXRpb24gPSBEZWxldGluZy4uLiB7MH0KLQotc2ltdWxhdGUuQ29weUZyb21Uby50ZXh0ID0gU2ltdWxhdGVkIGNvcHkgZnJvbSAiezB9IiB0byAiezF9Ii4KLXNpbXVsYXRlLkRpcmVjdG9yaWVzQ3JlYXRlZC50ZXh0ID0gU2ltdWxhdGVkIGRpcmVjdG9yaWVzIGNyZWF0ZWQgZm9yICJ7MH0iLgotc2ltdWxhdGUuRGVsZXRlLnRleHQgPSBTaW11bGF0ZWQgZGVsZXRlIG9mICJ7MH0iLgotCi1lcnJvci5GYWlsZWRMYXVuY2gubWVzc2FnZSA9IENvdWxkIG5vdCBsYXVuY2ggInswfSIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfZ3JhcGhpY3MucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfZ3JhcGhpY3MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTYyNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2dyYXBoaWNzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BZHZhbmNlZEdyYXBoaWNzPUFkdmFuY2VkIEdyYXBoaWNzCi1TV1RHcmFwaGljcz1TV1QgR3JhcGhpY3MKLVdhcm5pbmc9V2FybmluZwotTGliTm90Rm91bmQ9R3JhcGhpY3MgbGlicmFyeSBub3QgZm91bmQuCi1TZXR0aW5ncz1TZXR0aW5ncwotUGxheT1QbGF5Ci1QYXVzZT1QYXVzZQotQmFja2dyb3VuZD1CYWNrZ3JvdW5kCi1Eb3VibGVCdWZmZXI9RG91YmxlIEJ1ZmZlcgotV2hpdGU9V2hpdGUKLUJsYWNrPUJsYWNrCi1SZWQ9UmVkCi1HcmVlbj1HcmVlbgotQmx1ZT1CbHVlCi1DdXN0b21Db2xvcj1DdXN0b20gQ29sb3IKLUFuaW1hdGlvbj1BbmltYXRpb24KLVN0YXJQb2x5Z29uPVN0YXIgUG9seWdvbgotTGluZT1MaW5lCi1CbGFja0hvbGU9QmxhY2sgSG9sZQotRmlsbFJ1bGU9RmlsbCBSdWxlOgotUG9seWdvbnM9UG9seWdvbnMKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaGVsbG93b3JsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19oZWxsb3dvcmxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NDBhMTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19oZWxsb3dvcmxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1IZWxsb193b3JsZCA9IEhlbGxvIFdvcmxkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19ob3ZlcmhlbHAucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaG92ZXJoZWxwLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1Y2E2M2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19ob3ZlcmhlbHAucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyA9IFVuYWJsZSB0byBsb2FkIHJlc291cmNlcyA6IHswfQotCi1Ub29sSXRlbS50ZXh0ID0gVG9vbEl0ZW0gezB9Ci1Ub29sSXRlbS50b29sdGlwID0gVG9vbHRpcCBmb3IgezB9LiBUcnkgRjEgb24gbWUuCi1Ub29sSXRlbS5oZWxwID0gSGVscCB0ZXh0IGZvciB7MH0uCi0KLVRhYmxlSXRlbS50ZXh0ID0gVGFibGVJdGVtIHswfQotVGFibGVJdGVtLnRvb2x0aXAgPSBUb29sdGlwIGZvciB7MH0uIFRyeSBGMSBvbiBtZS4KLVRhYmxlSXRlbS5oZWxwID0gSGVscCB0ZXh0IGZvciB7MH0uCi0KLVRyZWVJdGVtLnRleHQgPSBUcmVlSXRlbSB7MH0KLVRyZWVJdGVtLnRvb2x0aXAgPSBUb29sdGlwIGZvciB7MH0uIFRyeSBGMSBvbiBtZS4KLVRyZWVJdGVtLmhlbHAgPSBIZWxwIHRleHQgZm9yIHswfS4KLQotSGVsbG8udGV4dCA9IEhlbGxvCi1IZWxsby50b29sdGlwID0gR3JlZXRpbmdzIQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19pbWFnZXMucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaW1hZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YmRjOGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19pbWFnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1JbWFnZV9hbmFseXplciAJCQkJPSBJbWFnZSBBbmFseXplcgotTm9uZSAJCQkJCQk9IE5vbmUKLVdoaXRlIAkJCQkJCT0gV2hpdGUKLUJsYWNrIAkJCQkJCT0gQmxhY2sKLVJlZCAJCQkJCQk9IFJlZAotR3JlZW4gCQkJCQkJPSBHcmVlbgotQmx1ZSAJCQkJCQk9IEJsdWUKLVhfc2NhbGUgCQkJCQk9IFggU2NhbGUKLVlfc2NhbGUgCQkJCQk9IFkgU2NhbGUKLUFscGhhX0sgCQkJCQk9IEFscGhhLUsKLURpc3BsYXkgCQkJCQk9IERpc3BsYXkKLUluY3JlbWVudGFsIAkJCQk9IEluY3JlbWVudGFsCi1UcmFuc3BhcmVudCAJCQkJPSBUcmFuc3BhcmVudAotVHJhbnNwYXJlbnRfbGMgCQkJCT0gdHJhbnNwYXJlbnQKLU1hc2sgCQkJCQkJPSBNYXNrCi1CYWNrZ3JvdW5kIAkJCQkJPSBCYWNrZ3JvdW5kCi1BbmltYXRpb24gCQkJCQk9IEFuaW1hdGlvbgotUHJldmlvdXMgCQkJCQk9IDwgJlByZXZpb3VzCi1OZXh0IAkJCQkJCT0gJk5leHQgPgotQW5pbWF0ZSAJCQkJCT0gJkFuaW1hdGUKLVR5cGVfaW5pdGlhbCAJCQkJPSBUeXBlOgotVHlwZV9zdHJpbmcgCQkJCT0gVHlwZTogezB9Ci1UeXBlX2luZGV4IAkJCQkJPSBUeXBlOiB7MH0gW3sxLG51bWJlcixpbnRlZ2VyfSBvZiB7MixudW1iZXIsaW50ZWdlcn1dCi1TaXplX2luaXRpYWwgCQkJCT0gU2l6ZToKLVNpemVfdmFsdWUgCQkJCQk9IFNpemU6IHswLG51bWJlcixpbnRlZ2VyfSB4IHsxLG51bWJlcixpbnRlZ2VyfQotRGVwdGhfaW5pdGlhbCAJCQkJPSBEZXB0aDoKLURlcHRoX3ZhbHVlIAkJCQk9IERlcHRoOiB7MH0KLVRyYW5zcGFyZW50X3BpeGVsX2luaXRpYWwgCT0gVHJhbnNwYXJlbnQgcGl4ZWw6Ci1UcmFuc3BhcmVudF9waXhlbF92YWx1ZQkJPSBUcmFuc3BhcmVudCBwaXhlbDogezB9Ci1UaW1lX3RvX2xvYWRfaW5pdGlhbCAJCT0gVGltZSB0byBsb2FkOgotVGltZV90b19sb2FkX3ZhbHVlCQkJPSBUaW1lIHRvIGxvYWQ6IHswfSBtcwotQW5pbWF0aW9uX3NpemVfaW5pdGlhbCAJCT0gQW5pbWF0aW9uIHNpemU6Ci1BbmltYXRpb25fc2l6ZV92YWx1ZSAJCT0gQW5pbWF0aW9uIHNpemU6IHswLG51bWJlcixpbnRlZ2VyfSB4IHsxLG51bWJlcixpbnRlZ2VyfQotQmFja2dyb3VuZF9waXhlbF9pbml0aWFsIAk9IEJhY2tncm91bmQgcGl4ZWw6Ci1CYWNrZ3JvdW5kX3BpeGVsX3ZhbHVlIAkJPSBCYWNrZ3JvdW5kIHBpeGVsOiB7MH0KLUltYWdlX2xvY2F0aW9uX2luaXRpYWwgCQk9IEltYWdlIGxvY2F0aW9uOgotSW1hZ2VfbG9jYXRpb25fdmFsdWUgCQk9IEltYWdlIGxvY2F0aW9uOiAoezAsbnVtYmVyLGludGVnZXJ9LCB7MSxudW1iZXIsaW50ZWdlcn0pCi1EaXNwb3NhbF9pbml0aWFsIAkJCT0gRGlzcG9zYWw6Ci1EaXNwb3NhbF92YWx1ZSAJCQkJPSBEaXNwb3NhbDogezAsbnVtYmVyLGludGVnZXJ9ICh7MX0pCi1EZWxheV9pbml0aWFsIAkJCQk9IERlbGF5OgotRGVsYXlfdmFsdWUgCQkJCT0gRGVsYXk6IHswLG51bWJlcixpbnRlZ2VyfSBtcyAodXNpbmcgezEsbnVtYmVyLGludGVnZXJ9IG1zKQotRGVsYXlfdXNlZCAJCQkJCT0gRGVsYXk6IHswLG51bWJlcixpbnRlZ2VyfSBtcwotUmVwZWF0c19pbml0aWFsIAkJCT0gUmVwZWF0czoKLVJlcGVhdHNfdmFsdWUgCQkJCT0gUmVwZWF0czogezAsbnVtYmVyLGludGVnZXJ9Ci1SZXBlYXRzX2ZvcmV2ZXIgCQkJPSBSZXBlYXRzOiB7MCxudW1iZXIsaW50ZWdlcn0gKGZvcmV2ZXIpCi1QYWxldHRlX2luaXRpYWwgCQkJPSBQYWxldHRlOgotUGFsZXR0ZV9kaXJlY3QgCQkJCT0gUGFsZXR0ZTogRGlyZWN0Ci1QYWxldHRlX3ZhbHVlIAkJCQk9IFBhbGV0dGUgc2l6ZTogezAsbnVtYmVyLGludGVnZXJ9Ci1QaXhlbF9kYXRhX2luaXRpYWwgCQkJPSBQaXhlbCBkYXRhOgotUGl4ZWxfZGF0YV92YWx1ZSAJCQk9IFBpeGVsIGRhdGE6ICBCeXRlcyBwZXIgbGluZTogezAsbnVtYmVyLGludGVnZXJ9ICBcCi0JCQkJCQkJICBTY2FubGluZSBwYWQ6IHsxLG51bWJlcixpbnRlZ2VyfSB7Mn0KLUZpbGUgCQkJCQkJPSAmRmlsZQotT3BlbkZpbGUgCQkJCQk9ICZPcGVuIEZpbGUuLi5cdEN0cmwrTwotT3BlblVSTAkJCQkJCT0gT3BlbiAmVVJMLi4uXHRDdHJsK1UKLVJlb3BlbiAJCQkJCQk9ICZSZW9wZW4KLVNhdmUgCQkJCQkJPSAmU2F2ZVx0Q3RybCtTCi1TYXZlX2FzIAkJCQkJPSBTYXZlICZBcy4uLgotU2F2ZV9tYXNrX2FzIAkJCQk9IFNhdmUgJk1hc2sgQXMuLi4KLVByaW50IAkJCQkJCT0gJlByaW50XHRDdHJsK1AKLUV4aXQgCQkJCQkJPSBFJnhpdAotQWxwaGEgCQkJCQkJPSBBbHBoYQotT3BlblVSTERpYWxvZwkJCQk9IE9wZW4gVVJMCi1FbnRlclVSTAkJCQkJPSBFbnRlciB0aGUgVVJMIGZvciBhbiBpbWFnZSAoYm1wLCBnaWYsIGljbywganBnLCBqcGVnLCBwbmcpOgotQWxsX2ltYWdlcyAJCQkJCT0gQWxsIEltYWdlIEZpbGVzCi1Mb2FkaW5nX2xjIAkJCQkJPSBsb2FkaW5nCi1TYXZpbmdfbGMgCQkJCQk9IHNhdmluZwotVW5rbm93bl9leHRlbnNpb24gCQkJPSBVbmtub3duIGZpbGUgZXh0ZW5zaW9uOiB7MH1cblBsZWFzZSB1c2UgYm1wLCBnaWYsIGljbywgXAotCQkJCQkJCSAganBnLCBqcGVnLCBvciBwbmcuCi1PdmVyd3JpdGUgCQkJCQk9IE92ZXJ3cml0ZSB7MH0/Ci1TYXZlX2FsbAkJCQkJPSBTYXZlIGFsbCB7MH0gaW1hZ2VzIGludG8gYSBtdWx0aS1pbWFnZSBmaWxlPwotQW5hbHl6ZXJfb24gCQkJCT0gSW1hZ2UgQW5hbHl6ZXIgb246IHswfQotUmVsb2FkaW5nX2xjIAkJCQk9IHJlbG9hZGluZwotQ29sb3JfYXQgCQkJCQk9IEltYWdlIGNvbG9yIGF0ICh7MCxudW1iZXIsaW50ZWdlcn0sIHsxLG51bWJlcixpbnRlZ2VyfSkgXAotCQkJCQkJCSAgLSBwaXhlbCB7MixudW1iZXIsaW50ZWdlcn0gWzB4ezN9XSAtIGlzIHs0fSBbMHh7NX1dIHs2fQotUkdCCQkJCQkJCT0gUkdCICd7J3swfSwgezF9LCB7Mn0nfScKLVJHQkEJCQkJCQk9IFJHQkEgJ3snezB9LCB7MX0sIHsyfSwgezN9J30nCi1Db2xvcl9hdF90cmFuc3BhcmVudAkJPSAodHJhbnNwYXJlbnQpCi1DcmVhdGluZ19pbWFnZSAJCQkJPSBDcmVhdGluZyBpbWFnZSAjIHswLG51bWJlcixpbnRlZ2VyfSBmcm9tIAotT0sJCQkJCQkJPSBPSwotQ2FuY2VsCQkJCQkJPSBDYW5jZWwKLVN0b3AgCQkJCQkJPSAmU3RvcAotQ3JlYXRpbmdfZnJvbSAJCQkJPSBDcmVhdGluZyBpbWFnZSByZWFkIGZyb20KLVBhbGV0dGVfZGlyZWN0IAkJCQk9IFBhbGV0dGU6IERpcmVjdAotUGFsZXR0ZV9zaXplIAkJCQk9IFBhbGV0dGUgc2l6ZTogezAsbnVtYmVyLGludGVnZXJ9Ci1CeXRlc19wZXJfbGluZSAJCQkJPSBCeXRlcyBwZXIgbGluZToKLVNjYW5saW5lX3BhZCAJCQkJPSBTY2FubGluZSBwYWQ6Ci1QcmludGluZ19lcnJvcgkJCQk9IFByaW50aW5nIGVycm9yOiAKLUVycm9yIAkJCQkJCT0gRXJyb3IgezB9IGZpbGVcbnsxfVxuXG4KLVBpeGVsc19wZXJfYnl0ZSAJCQk9IHBpeGVscyBwZXIgYnl0ZQotQnl0ZV9wZXJfcGl4ZWwgCQkJCT0gYnl0ZSBwZXIgcGl4ZWwKLUJ5dGVzX3Blcl9waXhlbCAJCQk9IGJ5dGVzIHBlciBwaXhlbAotVW5zdXBwb3J0ZWRfbGMgCQkJCT0gdW5zdXBwb3J0ZWQKLU5vbmVfbGMgCQkJCQk9IG5vbmUKLUJhY2tncm91bmRfbGMgCQkJCT0gYmFja2dyb3VuZAotUHJldmlvdXNfbGMgCQkJCT0gcHJldmlvdXMKLVVuc3BlY2lmaWVkX2xjIAkJCQk9IHVuc3BlY2lmaWVkCi1Vbmtub3duX2FjIAkJCQkJPSBVTktOT1dOCi1Gb3JldmVyX2xjIAkJCQkJPSBmb3JldmVyCi1EZXB0aF9pbmZvIAkJCQkJPSBEZXB0aDogezAsbnVtYmVyLGludGVnZXJ9IC0tIHsxfQotT25lX2J5dGUgCQkJCQk9IDEgYnl0ZSBwZXIgcGl4ZWwKLU11bHRpX2J5dGVzIAkJCQk9IHswLG51bWJlcixpbnRlZ2VyfSBieXRlcyBwZXIgcGl4ZWwKLU11bHRpX3BpeGVscyAJCQkJPSB7MCxudW1iZXIsaW50ZWdlcn0gcGl4ZWxzIHBlciBieXRlIHsxfQotTWF4X2xlbmd0aF9zdHJpbmcgCQkJPSBUcmFuc3BhcmVudCBwaXhlbDogLTEgKG5vbmUpCi1TYXZlX2FzX3R5cGUJCQkJPSBTYXZlIEFzIEJNUCBUeXBlLi4uCi1TYXZlX2FzX3R5cGVfbGFiZWwJCQk9IFNlbGVjdCB0aGUgdHlwZSBvZiBCTVAgdG8gc2F2ZSBhczoKLVNhdmVfYXNfdHlwZV9ub19jb21wcmVzcwk9IE5vIENvbXByZXNzaW9uCi1TYXZlX2FzX3R5cGVfcmxlX2NvbXByZXNzCT0gUkxFIENvbXByZXNzaW9uCi1TYXZlX2FzX3R5cGVfb3MyCQkJPSBPUy8yIEJNUApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19qYXZhdmlld2VyLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2phdmF2aWV3ZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhZmM3My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2phdmF2aWV3ZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLU9wZW5fbWVudWl0ZW09Jk9wZW4uLi5cdEN0cmwrTwotRXhpdF9tZW51aXRlbT1FJnhpdAotRmlsZV9tZW51aXRlbT0mRmlsZQotV2luZG93X3RpdGxlPVNXVCBKYXZhIFZpZXdlcgotRXJyX2ZpbGVfbm9fZXhpc3Q9RmlsZSB7MH0gZG9lcyBub3QgZXhpc3QuCi1FcnJfZmlsZV9pbz1JTyBlcnJvciByZWFkaW5nIGZpbGU6XG57MH0KLUVycl9maWxlX25vdF9mb3VuZD1GaWxlIG5vdCBmb3VuZDpcbnswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfbGF5b3V0LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2xheW91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2E5YzgwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfbGF5b3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi13aW5kb3cudGl0bGUgPSBTV1QgTGF5b3V0cwotCi1BZGQJCQkJCT0gJkFkZAotRGVsZXRlCSAJCQk9ICZEZWxldGUKLUNsZWFyCQkJCT0gJkNsZWFyCi1DaGlsZHJlbgkJCT0gQ2hpbGRyZW4KLVR5cGUJCQkJPSBUeXBlCi1MYXlvdXQJCQkJPSBMYXlvdXQKLVByZWZlcnJlZF9TaXplCQk9IFByZWZlcnJlZCBTaXplCi1Db2RlCQkJCT0gQyZvZGUKLUdlbmVyYXRlZF9Db2RlCQk9IEdlbmVyYXRlZCBDb2RlCi1QYXJhbWV0ZXJzCQkJPSBQYXJhbWV0ZXJzCi1Qcm9wZXJ0aWVzCQkJPSBQcm9wZXJ0aWVzCi1NYXJnaW5zCQkJCT0gTWFyZ2lucwotTWFyZ2luc19TcGFjaW5nCQk9IE1hcmdpbnMgYW5kIFNwYWNpbmcKLUNvbHVtbnMJCQkJPSBDb2x1bW5zCi1BdHRhY2hfRWRpdAkJCT0gRWRpdAotTGVmdF9BdHRhY2htZW50CQk9IEVkaXQgTGVmdCBBdHRhY2htZW50Ci1SaWdodF9BdHRhY2htZW50CT0gRWRpdCBSaWdodCBBdHRhY2htZW50Ci1Ub3BfQXR0YWNobWVudAkJPSBFZGl0IFRvcCBBdHRhY2htZW50Ci1Cb3R0b21fQXR0YWNobWVudAk9IEVkaXQgQm90dG9tIEF0dGFjaG1lbnQKLVBvc2l0aW9uCQkJPSBQb3NpdGlvbgotQ29udHJvbAkJCQk9IENvbnRyb2wKLU9mZnNldAkJCQk9IE9mZnNldCBbKy8tXQotSXRlbQkJCQk9IEl0ZW0gezB9Ci1Db21ib19JbmRleAkJCT0gQ29tYm8gezB9Ci1Hcm91cF9JbmRleAkJCT0gR3JvdXAgezB9Ci1MYWJlbF9JbmRleAkJCT0gTGFiZWwgezB9Ci1CdXR0b25fSW5kZXgJCT0gQnV0dG9uIHswfQotU3R5bGVkVGV4dF9JbmRleAk9IFN0eWxlZFRleHQgezB9Ci1UZXh0X0luZGV4CQkJPSBUZXh0IHswfQotT0sJCQkJCT0gT0sKLUNhbmNlbAkJCQk9IENhbmNlbAotRWRpdAkJCQk9ICZFZGl0Ci1TZWxlY3RfQWxsCQkJPSBTZWxlY3QgJkFsbFx0Q3RybCtBCi1Db3B5CQkJCT0gJkNvcHlcdEN0cmwrQwotRXhpdAkJCQk9IEUmeGl0Ci1OYW1lX1RpdGxlCQkJPSBFbnRlciBOYW1lcwotTmFtZV9MYWJlbAkJCT0gRW50ZXIgbmFtZXMgZm9yIHlvdXIgY29udHJvbHMKLUludmFsaWRfTmFtZSAJCT0gSW52YWxpZCBOYW1lIC0gUGxlYXNlIGVudGVyIHZhbGlkIHZhcmlhYmxlIG5hbWVzIGZvciB5b3VyIGNvbnRyb2xzCi1EZWZhdWx0CQkJCT0gRGVmYXVsdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfcGFpbnQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfcGFpbnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJlY2VjNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX3BhaW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzID0gVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzCi13aW5kb3cudGl0bGUgPSBQYWludAotCi1tZW51LlRvb2xzLmxhYmVsID0gVG9vbHMKLW1lbnUuT3B0aW9ucy5sYWJlbCA9IE9wdGlvbnMKLQotdG9vbC5QZW5jaWwubGFiZWwgPSBQZW5jaWwKLXRvb2wuUGVuY2lsLnRvb2x0aXAgPSBQZW5jaWwgdG9vbAotdG9vbC5QZW5jaWwuaW1hZ2UgPSB0b29sX3BlbmNpbC5naWYKLXRvb2wuUGVuY2lsLmRlc2NyaXB0aW9uID0gU2VsZWN0cyB0aGUgUGVuY2lsIHRvb2wuCi0KLXRvb2wuQWlyYnJ1c2gubGFiZWwgPSBBaXJicnVzaAotdG9vbC5BaXJicnVzaC50b29sdGlwID0gQWlyYnJ1c2ggdG9vbAotdG9vbC5BaXJicnVzaC5pbWFnZSA9IHRvb2xfYWlyYnJ1c2guZ2lmCi10b29sLkFpcmJydXNoLmRlc2NyaXB0aW9uID0gU2VsZWN0cyB0aGUgQWlyYnJ1c2ggdG9vbC4KLQotdG9vbC5MaW5lLmxhYmVsID0gTGluZQotdG9vbC5MaW5lLnRvb2x0aXAgPSBMaW5lIHRvb2wKLXRvb2wuTGluZS5pbWFnZSA9IHRvb2xfbGluZS5naWYKLXRvb2wuTGluZS5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgdGhlIExpbmUgdG9vbC4KLQotdG9vbC5Qb2x5TGluZS5sYWJlbCA9IFBvbHlnb24KLXRvb2wuUG9seUxpbmUudG9vbHRpcCA9IFBvbHlnb24gdG9vbAotdG9vbC5Qb2x5TGluZS5pbWFnZSA9IHRvb2xfcG9seWxpbmUuZ2lmCi10b29sLlBvbHlMaW5lLmRlc2NyaXB0aW9uID0gU2VsZWN0cyB0aGUgUG9seUxpbmUgdG9vbC4KLQotdG9vbC5SZWN0YW5nbGUubGFiZWwgPSBSZWN0YW5nbGUKLXRvb2wuUmVjdGFuZ2xlLnRvb2x0aXAgPSBSZWN0YW5nbGUgdG9vbAotdG9vbC5SZWN0YW5nbGUuaW1hZ2UgPSB0b29sX3JlY3RhbmdsZS5naWYKLXRvb2wuUmVjdGFuZ2xlLmRlc2NyaXB0aW9uID0gU2VsZWN0cyB0aGUgUmVjdGFuZ2xlIHRvb2wuCi0KLXRvb2wuRWxsaXBzZS5sYWJlbCA9IEVsbGlwc2UKLXRvb2wuRWxsaXBzZS50b29sdGlwID0gRWxsaXBzZSB0b29sCi10b29sLkVsbGlwc2UuaW1hZ2UgPSB0b29sX2VsbGlwc2UuZ2lmCi10b29sLkVsbGlwc2UuZGVzY3JpcHRpb24gPSBTZWxlY3RzIHRoZSBFbGxpcHNlIHRvb2wuCi0KLXRvb2wuUm91bmRlZFJlY3RhbmdsZS5sYWJlbCA9IFJvdW5kZWQgUmVjdGFuZ2xlCi10b29sLlJvdW5kZWRSZWN0YW5nbGUudG9vbHRpcCA9IFJvdW5kZWQgUmVjdGFuZ2xlIHRvb2wKLXRvb2wuUm91bmRlZFJlY3RhbmdsZS5pbWFnZSA9IHRvb2xfcm91bmRlZHJlY3RhbmdsZS5naWYKLXRvb2wuUm91bmRlZFJlY3RhbmdsZS5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgdGhlIFJvdW5kZWQgUmVjdGFuZ2xlIHRvb2wuCi0KLXRvb2wuVGV4dC5sYWJlbCA9IFRleHQKLXRvb2wuVGV4dC50b29sdGlwID0gVGV4dCB0b29sCi10b29sLlRleHQuaW1hZ2UgPSB0b29sX3RleHQuZ2lmCi10b29sLlRleHQuZGVzY3JpcHRpb24gPSBTZWxlY3RzIHRoZSBUZXh0IHRvb2wuCi10b29sLlRleHQuc2V0dGluZ3MuZGVmYXVsdHRleHQgPSBIZWxsbyEKLXRvb2wuVGV4dC5kaWFsb2cudGl0bGUgPSBUZXh0IFRvb2wgU2V0dGluZ3MKLXRvb2wuVGV4dC5kaWFsb2cubWVzc2FnZSA9IFBsZWFzZSBlbnRlciB0aGUgbmV3IHRleHQgc3RyaW5nIHRvIGJlIHBhaW50ZWQuCi0KLXRvb2wuTnVsbC5sYWJlbCA9IDxub25lPgotCi1maWxsLk5vbmUubGFiZWwgPSBObyBGaWxsCi1maWxsLk5vbmUudG9vbHRpcCA9IE5vIGZpbGwgbW9kZQotZmlsbC5Ob25lLmltYWdlID0gZmlsbF9ub25lLmdpZgotZmlsbC5Ob25lLmRlc2NyaXB0aW9uID0gU2VsZWN0cyBObyBGaWxsIG1vZGUuCi0KLWZpbGwuT3V0bGluZS5sYWJlbCA9IE91dGxpbmUgRmlsbAotZmlsbC5PdXRsaW5lLnRvb2x0aXAgPSBPdXRsaW5lIGZpbGwgbW9kZQotZmlsbC5PdXRsaW5lLmltYWdlID0gZmlsbF9vdXRsaW5lLmdpZgotZmlsbC5PdXRsaW5lLmRlc2NyaXB0aW9uID0gU2VsZWN0cyBPdXRsaW5lIEZpbGwgbW9kZS4KLQotZmlsbC5Tb2xpZC5sYWJlbCA9IFNvbGlkIEZpbGwKLWZpbGwuU29saWQudG9vbHRpcCA9IFNvbGlkIGZpbGwgbW9kZQotZmlsbC5Tb2xpZC5pbWFnZSA9IGZpbGxfc29saWQuZ2lmCi1maWxsLlNvbGlkLmRlc2NyaXB0aW9uID0gU2VsZWN0cyBTb2xpZCBGaWxsIG1vZGUuCi0KLWxpbmVzdHlsZS5Tb2xpZC5sYWJlbCA9IFNvbGlkIExpbmUKLWxpbmVzdHlsZS5Tb2xpZC50b29sdGlwID0gU29saWQgbGluZSBzdHlsZQotbGluZXN0eWxlLlNvbGlkLmltYWdlID0gbGluZXN0eWxlX3NvbGlkLmdpZgotbGluZXN0eWxlLlNvbGlkLmRlc2NyaXB0aW9uID0gU2VsZWN0IFNvbGlkIExpbmUgc3R5bGUuCi0KLWxpbmVzdHlsZS5Eb3QubGFiZWwgPSBEb3R0ZWQgTGluZQotbGluZXN0eWxlLkRvdC50b29sdGlwID0gRG90dGVkIGxpbmUgc3R5bGUKLWxpbmVzdHlsZS5Eb3QuaW1hZ2UgPSBsaW5lc3R5bGVfZG90LmdpZgotbGluZXN0eWxlLkRvdC5kZXNjcmlwdGlvbiA9IFNlbGVjdCBEb3R0ZWQgTGluZSBzdHlsZS4KLQotbGluZXN0eWxlLkRhc2gubGFiZWwgPSBEYXNoZWQgTGluZQotbGluZXN0eWxlLkRhc2gudG9vbHRpcCA9IERhc2hlZCBsaW5lIHN0eWxlCi1saW5lc3R5bGUuRGFzaC5pbWFnZSA9IGxpbmVzdHlsZV9kYXNoLmdpZgotbGluZXN0eWxlLkRhc2guZGVzY3JpcHRpb24gPSBTZWxlY3QgRGFzaGVkIExpbmUgc3R5bGUuCi0KLWxpbmVzdHlsZS5EYXNoRG90LmxhYmVsID0gRGFzaC1Eb3QgTGluZQotbGluZXN0eWxlLkRhc2hEb3QudG9vbHRpcCA9IERhc2gtRG90IGxpbmUgc3R5bGUKLWxpbmVzdHlsZS5EYXNoRG90LmltYWdlID0gbGluZXN0eWxlX2Rhc2hkb3QuZ2lmCi1saW5lc3R5bGUuRGFzaERvdC5kZXNjcmlwdGlvbiA9IFNlbGVjdCBEYXNoLURvdCBMaW5lIHN0eWxlLgotCi1vcHRpb25zLkZvbnQubGFiZWwgPSBUZXh0IFRvb2wgRm9udAotb3B0aW9ucy5Gb250LnRvb2x0aXAgPSBTZWxlY3QgVGV4dCBUb29sIGZvbnQKLW9wdGlvbnMuRm9udC5pbWFnZSA9IG9wdGlvbnNfZm9udC5naWYKLW9wdGlvbnMuRm9udC5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgVGV4dCBUb29sIGZvbnQuCi1vcHRpb25zLkZvbnQuZGlhbG9nLnRpdGxlID0gVGV4dCBUb29sIEZvbnQKLQotc2V0dGluZ3MuQWlyYnJ1c2hSYWRpdXMudGV4dCA9IEFpcmJydXNoIFJhZGl1cwotc2V0dGluZ3MuQWlyYnJ1c2hJbnRlbnNpdHkudGV4dCA9IEFpcmJydXNoIEludGVuc2l0eQotCi1zZXNzaW9uLk51bGwubWVzc2FnZSA9IFNlbGVjdCBhIHRvb2wuLi4KLXNlc3Npb24uQ29udGludW91c1BhaW50Lm1lc3NhZ2UgPSBDbGljayBhbmQgZHJhZyB0byBkcmF3Li4uCi1zZXNzaW9uLkRyYWdJbnRlcmFjdGl2ZVBhaW50Lm1lc3NhZ2UgPSBDbGljayBhbmQgZHJhZyB0byBwcmV2aWV3LCByZWxlYXNlIHRvIGRyYXcsIHJpZ2h0LWNsaWNrIHRvIGNhbmNlbC4uLgotc2Vzc2lvbi5TZWdtZW50ZWRJbnRlcmFjdGl2ZVBhaW50Lm1lc3NhZ2UuYW5jaG9yTW9kZSA9IENsaWNrIHRvIHNldCBhbmNob3IuLi4KLXNlc3Npb24uU2VnbWVudGVkSW50ZXJhY3RpdmVQYWludC5tZXNzYWdlLmludGVyYWN0aXZlTW9kZSA9IENsaWNrIHRvIGRyYXcsIGRvdWJsZS1jbGljayB0byBjbG9zZSBmaWd1cmUsIHJpZ2h0LWNsaWNrIHRvIGNhbmNlbC4uLgotc2Vzc2lvbi5UZXh0Lm1lc3NhZ2UgPSBDbGljayB0byBkcmF3IHRleHQsIHJpZ2h0LWNsaWNrIHRvIGVkaXQgdGV4dC4uLgotCi1zdGF0dXMuQ29vcmQuZm9ybWF0ID0gKHswfSwgezF9KQotc3RhdHVzLkNvb3JkUmFuZ2UuZm9ybWF0ID0gKHswfSwgezF9KSAtICh7Mn0sIHszfSkKLXN0YXR1cy5CYXIuZm9ybWF0ID0gezB9IDogezF9ICAgezJ9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX3RleHRlZGl0b3IucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfdGV4dGVkaXRvci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2VkNTM3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfdGV4dGVkaXRvci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRXhpdF9tZW51aXRlbT1FJnhpdAotQ3V0X21lbnVpdGVtPUN1JnRcdEN0cmwrWAotQ29weV9tZW51aXRlbT0mQ29weVx0Q3RybCtDCi1QYXN0ZV9tZW51aXRlbT0mUGFzdGVcdEN0cmwrVgotV2luZG93X3RpdGxlPVNXVCBUZXh0IEVkaXRvcgotRm9udF9tZW51aXRlbT1TZXQgJkZvbnQuLi4KLUVkaXRfbWVudWl0ZW09JkVkaXQKLUZpbGVfbWVudWl0ZW09JkZpbGUKLUJvbGQ9Qm9sZAotSXRhbGljPUl0YWxpYwotVW5kZXJsaW5lPVVuZGVybGluZQotU3RyaWtlb3V0PVN0cmlrZW91dApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvaW1wb3J0LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjc5MzdlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvaW1wb3J0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBlcnNpc3QgcHJvamVjdCBzZXR0aW5ncyBmb3IgbGF0ZXIgaW1wb3J0IAotbmF0dXJlcyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU7IG9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmUKLWJ1aWxkZXJzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyCi12YXIuRUNMSVBTRV9QTFVHSU5TID0gPDxFQ0xJUFNFX1BMVUdJTlM+Pgotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hZGRyZXNzYm9vay9BZGRyZXNzQm9vay5qYXZhJUFkZHJlc3NCb29rID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NvbnRyb2xFeGFtcGxlLmphdmElQ29udHJvbEV4YW1wbGUgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9GaWxlVmlld2VyLmphdmElRmlsZVZpZXdlciA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQxLmphdmElSGVsbG9Xb3JsZDEgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkMi5qYXZhJUhlbGxvV29ybGQyID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDMuamF2YSVIZWxsb1dvcmxkMyA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQ0LmphdmElSGVsbG9Xb3JsZDQgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkNS5qYXZhJUhlbGxvV29ybGQ1ID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hvdmVyaGVscC9Ib3ZlckhlbHAuamF2YSVIb3ZlckhlbHAgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaW1hZ2VhbmFseXplci9JbWFnZUFuYWx5emVyLmphdmElSW1hZ2VBbmFseXplciA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9qYXZhdmlld2VyL0phdmFWaWV3ZXIuamF2YSVKYXZhVmlld2VyID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvVGV4dEVkaXRvci5qYXZhJVRleHRFZGl0b3IgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hZGRyZXNzYm9vay9BZGRyZXNzQm9vay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5N2U2OWEyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5hZGRyZXNzYm9vazsKLQotCi0vKiBJbXBvcnRzICovCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEFkZHJlc3NCb29rRXhhbXBsZSBpcyBhbiBleGFtcGxlIHRoYXQgdXNlcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3Q8L2NvZGU+IAotICogbGlicmFyaWVzIHRvIGltcGxlbWVudCBhIHNpbXBsZSBhZGRyZXNzIGJvb2suICBUaGlzIGFwcGxpY2F0aW9uIGhhcyAKLSAqIHNhdmUsIGxvYWQsIHNvcnRpbmcsIGFuZCBzZWFyY2hpbmcgZnVuY3Rpb25zIGNvbW1vbgotICogdG8gYmFzaWMgYWRkcmVzcyBib29rcy4KLSAqLwotcHVibGljIGNsYXNzIEFkZHJlc3NCb29rIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc0FkZHJlc3NCb29rID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19hZGRyZXNzYm9vayIpOwotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQlwcml2YXRlIFNlYXJjaERpYWxvZyBzZWFyY2hEaWFsb2c7Ci0JCi0JcHJpdmF0ZSBGaWxlIGZpbGU7Ci0JcHJpdmF0ZSBib29sZWFuIGlzTW9kaWZpZWQ7Ci0JCi0JcHJpdmF0ZSBTdHJpbmdbXSBjb3B5QnVmZmVyOwotCi0JcHJpdmF0ZSBpbnQgbGFzdFNvcnRDb2x1bW49IC0xOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJTUlURVIgPSAiXHQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNvbHVtbk5hbWVzID0ge3Jlc0FkZHJlc3NCb29rLmdldFN0cmluZygiTGFzdF9uYW1lIiksCi0JCQkJCQkJCQkJCQkgcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJGaXJzdF9uYW1lIiksCi0JCQkJCQkJCQkJCQkgcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJCdXNpbmVzc19waG9uZSIpLAotCQkJCQkJCQkJCQkJIHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiSG9tZV9waG9uZSIpLAotCQkJCQkJCQkJCQkJIHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRW1haWwiKSwKLQkJCQkJCQkJCQkJCSByZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkZheCIpfTsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUFkZHJlc3NCb29rIGFwcGxpY2F0aW9uID0gbmV3IEFkZHJlc3NCb29rKCk7Ci0JU2hlbGwgc2hlbGwgPSBhcHBsaWNhdGlvbi5vcGVuKGRpc3BsYXkpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci1wdWJsaWMgU2hlbGwgb3BlbihEaXNwbGF5IGRpc3BsYXkpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0Jc2hlbGwuYWRkU2hlbGxMaXN0ZW5lcihuZXcgU2hlbGxBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBzaGVsbENsb3NlZChTaGVsbEV2ZW50IGUpIHsKLQkJCWUuZG9pdCA9IGNsb3NlQWRkcmVzc0Jvb2soKTsKLQkJfQotCX0pOwotCQotCWNyZWF0ZU1lbnVCYXIoKTsKLQotCXNlYXJjaERpYWxvZyA9IG5ldyBTZWFyY2hEaWFsb2coc2hlbGwpOwotCXNlYXJjaERpYWxvZy5zZXRTZWFyY2hBcmVhTmFtZXMoY29sdW1uTmFtZXMpOwotCXNlYXJjaERpYWxvZy5zZXRTZWFyY2hBcmVhTGFiZWwocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJDb2x1bW4iKSk7Ci0Jc2VhcmNoRGlhbG9nLmFkZEZpbmRMaXN0ZW5lcihuZXcgRmluZExpc3RlbmVyICgpIHsKLQkJcHVibGljIGJvb2xlYW4gZmluZCgpIHsKLQkJCXJldHVybiBmaW5kRW50cnkoKTsKLQkJfQotCX0pOwotCQkJCQkKLQl0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7CQotCXRhYmxlLnNldE1lbnUoY3JlYXRlUG9wVXBNZW51KCkpOwkKLQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoaXRlbXMubGVuZ3RoID4gMCkgZWRpdEVudHJ5KGl0ZW1zWzBdKTsKLQkJfQotCX0pOwotCWZvcihpbnQgaSA9IDA7IGkgPCBjb2x1bW5OYW1lcy5sZW5ndGg7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoY29sdW1uTmFtZXNbaV0pOwotCQljb2x1bW4uc2V0V2lkdGgoMTUwKTsKLQkJZmluYWwgaW50IGNvbHVtbkluZGV4ID0gaTsKLQkJY29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc29ydChjb2x1bW5JbmRleCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCW5ld0FkZHJlc3NCb29rKCk7Ci0KLQlzaGVsbC5zZXRTaXplKHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0JcmV0dXJuIHNoZWxsOwotfQotCi1wcml2YXRlIGJvb2xlYW4gY2xvc2VBZGRyZXNzQm9vaygpIHsKLQlpZihpc01vZGlmaWVkKSB7Ci0JCS8vYXNrIHVzZXIgaWYgdGhleSB3YW50IHRvIHNhdmUgY3VycmVudCBhZGRyZXNzIGJvb2sKLQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fV0FSTklORyB8IFNXVC5ZRVMgfCBTV1QuTk8gfCBTV1QuQ0FOQ0VMKTsKLQkJYm94LnNldFRleHQoc2hlbGwuZ2V0VGV4dCgpKTsKLQkJYm94LnNldE1lc3NhZ2UocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJDbG9zZV9zYXZlIikpOwotCQotCQlpbnQgY2hvaWNlID0gYm94Lm9wZW4oKTsKLQkJaWYoY2hvaWNlID09IFNXVC5DQU5DRUwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmKGNob2ljZSA9PSBTV1QuWUVTKSB7Ci0JCQlpZiAoIXNhdmUoKSkgcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQkKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKyspIHsKLQkJaXRlbXNbaV0uZGlzcG9zZSgpOwotCX0KLQkKLQlyZXR1cm4gdHJ1ZTsKLX0KLS8qKgotICogQ3JlYXRlcyB0aGUgbWVudSBhdCB0aGUgdG9wIG9mIHRoZSBzaGVsbCB3aGVyZSBtb3N0Ci0gKiBvZiB0aGUgcHJvZ3JhbXMgZnVuY3Rpb25hbGl0eSBpcyBhY2Nlc3NlZC4KLSAqCi0gKiBAcmV0dXJuCQlUaGUgPGNvZGU+TWVudTwvY29kZT4gd2lkZ2V0IHRoYXQgd2FzIGNyZWF0ZWQKLSAqLwotcHJpdmF0ZSBNZW51IGNyZWF0ZU1lbnVCYXIoKSB7Ci0JTWVudSBtZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCi0JLy9jcmVhdGUgZWFjaCBoZWFkZXIgYW5kIHN1Yk1lbnUgZm9yIHRoZSBtZW51QmFyCi0JY3JlYXRlRmlsZU1lbnUobWVudUJhcik7Ci0JY3JlYXRlRWRpdE1lbnUobWVudUJhcik7Ci0JY3JlYXRlU2VhcmNoTWVudShtZW51QmFyKTsKLQljcmVhdGVIZWxwTWVudShtZW51QmFyKTsKLQkKLQlyZXR1cm4gbWVudUJhcjsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyBhbiBlbmNvZGVkIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gYSBTdHJpbmcgYXJyYXkgcmVwcmVzZW50aW5nIGEgdGFibGUgZW50cnkuCi0gKi8KLXByaXZhdGUgU3RyaW5nW10gZGVjb2RlTGluZShTdHJpbmcgbGluZSkgewotCWlmKGxpbmUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCi0JU3RyaW5nW10gcGFyc2VkTGluZSA9IG5ldyBTdHJpbmdbdGFibGUuZ2V0Q29sdW1uQ291bnQoKV07Ci0JZm9yKGludCBpID0gMDsgaSA8IHBhcnNlZExpbmUubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCWludCBpbmRleCA9IGxpbmUuaW5kZXhPZihERUxJTUlURVIpOwotCQlpZiAoaW5kZXggPiAtMSkgewotCQkJcGFyc2VkTGluZVtpXSA9IGxpbmUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCWxpbmUgPSBsaW5lLnN1YnN0cmluZyhpbmRleCArIERFTElNSVRFUi5sZW5ndGgoKSwgbGluZS5sZW5ndGgoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlpZiAobGluZS5pbmRleE9mKERFTElNSVRFUikgIT0gLTEpIHJldHVybiBudWxsOwotCQotCXBhcnNlZExpbmVbcGFyc2VkTGluZS5sZW5ndGggLSAxXSA9IGxpbmU7Ci0KLQlyZXR1cm4gcGFyc2VkTGluZTsKLX0KLXByaXZhdGUgdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIG1zZykgewotCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SKTsKLQlib3guc2V0TWVzc2FnZShtc2cpOwotCWJveC5vcGVuKCk7Ci19Ci1wcml2YXRlIHZvaWQgZWRpdEVudHJ5KFRhYmxlSXRlbSBpdGVtKSB7Ci0JRGF0YUVudHJ5RGlhbG9nIGRpYWxvZyA9IG5ldyBEYXRhRW50cnlEaWFsb2coc2hlbGwpOwotCWRpYWxvZy5zZXRMYWJlbHMoY29sdW1uTmFtZXMpOwotCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbdGFibGUuZ2V0Q29sdW1uQ291bnQoKV07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJdmFsdWVzW2ldID0gaXRlbS5nZXRUZXh0KGkpOwotCX0KLQlkaWFsb2cuc2V0VmFsdWVzKHZhbHVlcyk7Ci0JdmFsdWVzID0gZGlhbG9nLm9wZW4oKTsKLQlpZiAodmFsdWVzICE9IG51bGwpIHsKLQkJaXRlbS5zZXRUZXh0KHZhbHVlcyk7Ci0JCWlzTW9kaWZpZWQgPSB0cnVlOwotCX0KLX0KLXByaXZhdGUgU3RyaW5nIGVuY29kZUxpbmUoU3RyaW5nW10gdGFibGVJdGVtcykgewotCVN0cmluZyBsaW5lID0gIiI7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZUl0ZW1zLmxlbmd0aCAtIDE7IGkrKykgewotCQlsaW5lICs9IHRhYmxlSXRlbXNbaV0gKyBERUxJTUlURVI7Ci0JfQotCWxpbmUgKz0gdGFibGVJdGVtc1t0YWJsZUl0ZW1zLmxlbmd0aCAtIDFdICsgIlxuIjsKLQkKLQlyZXR1cm4gbGluZTsKLX0KLXByaXZhdGUgYm9vbGVhbiBmaW5kRW50cnkoKSB7Ci0JQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKHNoZWxsLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9XQUlUKTsKLQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCi0JYm9vbGVhbiBtYXRjaENhc2UgPSBzZWFyY2hEaWFsb2cuZ2V0TWF0Y2hDYXNlKCk7Ci0JYm9vbGVhbiBtYXRjaFdvcmQgPSBzZWFyY2hEaWFsb2cuZ2V0TWF0Y2hXb3JkKCk7Ci0JU3RyaW5nIHNlYXJjaFN0cmluZyA9IHNlYXJjaERpYWxvZy5nZXRTZWFyY2hTdHJpbmcoKTsKLQlpbnQgY29sdW1uID0gc2VhcmNoRGlhbG9nLmdldFNlbGVjdGVkU2VhcmNoQXJlYSgpOwotCQotCXNlYXJjaFN0cmluZyA9IG1hdGNoQ2FzZSA/IHNlYXJjaFN0cmluZyA6IHNlYXJjaFN0cmluZy50b0xvd2VyQ2FzZSgpOwotCQotCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQlpZiAoc2VhcmNoRGlhbG9nLmdldFNlYXJjaERvd24oKSkgewotCQlmb3IoaW50IGkgPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpICsgMTsgaSA8IHRhYmxlLmdldEl0ZW1Db3VudCgpOyBpKyspIHsKLQkJCWlmIChmb3VuZCA9IGZpbmRNYXRjaChzZWFyY2hTdHJpbmcsIHRhYmxlLmdldEl0ZW0oaSksIGNvbHVtbiwgbWF0Y2hXb3JkLCBtYXRjaENhc2UpKXsKLQkJCQl0YWJsZS5zZXRTZWxlY3Rpb24oaSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlmb3IoaW50IGkgPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCWlmIChmb3VuZCA9IGZpbmRNYXRjaChzZWFyY2hTdHJpbmcsIHRhYmxlLmdldEl0ZW0oaSksIGNvbHVtbiwgbWF0Y2hXb3JkLCBtYXRjaENhc2UpKXsKLQkJCQl0YWJsZS5zZXRTZWxlY3Rpb24oaSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0Jc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotCWlmICh3YWl0Q3Vyc29yICE9IG51bGwpCi0JCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQkKLQlyZXR1cm4gZm91bmQ7Ci19Ci1wcml2YXRlIGJvb2xlYW4gZmluZE1hdGNoKFN0cmluZyBzZWFyY2hTdHJpbmcsIFRhYmxlSXRlbSBpdGVtLCBpbnQgY29sdW1uLCBib29sZWFuIG1hdGNoV29yZCwgYm9vbGVhbiBtYXRjaENhc2UpIHsKLQkKLQlTdHJpbmcgdGFibGVUZXh0ID0gbWF0Y2hDYXNlID8gaXRlbS5nZXRUZXh0KGNvbHVtbikgOiBpdGVtLmdldFRleHQoY29sdW1uKS50b0xvd2VyQ2FzZSgpOwotCWlmIChtYXRjaFdvcmQpIHsKLQkJaWYgKHRhYmxlVGV4dCAhPSBudWxsICYmIHRhYmxlVGV4dC5lcXVhbHMoc2VhcmNoU3RyaW5nKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JfSBlbHNlIHsKLQkJaWYodGFibGVUZXh0IT0gbnVsbCAmJiB0YWJsZVRleHQuaW5kZXhPZihzZWFyY2hTdHJpbmcpICE9IC0xKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci1wcml2YXRlIHZvaWQgbmV3QWRkcmVzc0Jvb2soKSB7CQotCXNoZWxsLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJUaXRsZV9iYXIiKSArIHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiTmV3X3RpdGxlIikpOwotCWZpbGUgPSBudWxsOwotCWlzTW9kaWZpZWQgPSBmYWxzZTsKLX0KLXByaXZhdGUgdm9pZCBuZXdFbnRyeSgpIHsKLQlEYXRhRW50cnlEaWFsb2cgZGlhbG9nID0gbmV3IERhdGFFbnRyeURpYWxvZyhzaGVsbCk7Ci0JZGlhbG9nLnNldExhYmVscyhjb2x1bW5OYW1lcyk7Ci0JU3RyaW5nW10gZGF0YSA9IGRpYWxvZy5vcGVuKCk7Ci0JaWYgKGRhdGEgIT0gbnVsbCkgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KGRhdGEpOwotCQlpc01vZGlmaWVkID0gdHJ1ZTsKLQl9Ci19Ci0KLXByaXZhdGUgdm9pZCBvcGVuQWRkcmVzc0Jvb2soKSB7CQotCUZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0KLQlmaWxlRGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsiKi5hZHI7IiwgIiouKiJ9KTsKLQlmaWxlRGlhbG9nLnNldEZpbHRlck5hbWVzKG5ldyBTdHJpbmdbXSB7cmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJCb29rX2ZpbHRlcl9uYW1lIikgKyAiICgqLmFkcikiLCAKLQkJCQkJCQkJCQkJcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJBbGxfZmlsdGVyX25hbWUiKSArICIgKCouKikifSk7Ci0JU3RyaW5nIG5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLQotCWlmKG5hbWUgPT0gbnVsbCkgcmV0dXJuOwotCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5hbWUpOwotCWlmICghZmlsZS5leGlzdHMoKSkgewotCQlkaXNwbGF5RXJyb3IocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJGaWxlIikrZmlsZS5nZXROYW1lKCkrIiAiK3Jlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRG9lc19ub3RfZXhpc3QiKSk7IAotCQlyZXR1cm47Ci0JfQotCQotCUN1cnNvciB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihzaGVsbC5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfV0FJVCk7Ci0Jc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQotCUZpbGVSZWFkZXIgZmlsZVJlYWRlciA9IG51bGw7Ci0JQnVmZmVyZWRSZWFkZXIgYnVmZmVyZWRSZWFkZXIgPSBudWxsOwotCVN0cmluZ1tdIGRhdGEgPSBuZXcgU3RyaW5nWzBdOwotCXRyeSB7Ci0JCWZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJYnVmZmVyZWRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZmlsZVJlYWRlcik7Ci0JCVN0cmluZyBuZXh0TGluZSA9IGJ1ZmZlcmVkUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXdoaWxlIChuZXh0TGluZSAhPSBudWxsKXsKLQkJCVN0cmluZ1tdIG5ld0RhdGEgPSBuZXcgU3RyaW5nW2RhdGEubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIG5ld0RhdGEsIDAsIGRhdGEubGVuZ3RoKTsKLQkJCW5ld0RhdGFbZGF0YS5sZW5ndGhdID0gbmV4dExpbmU7Ci0JCQlkYXRhID0gbmV3RGF0YTsKLQkJCW5leHRMaW5lID0gYnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkJfQotCX0gY2F0Y2goRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJZGlzcGxheUVycm9yKHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRmlsZV9ub3RfZm91bmQiKSArICJcbiIgKyBmaWxlLmdldE5hbWUoKSk7Ci0JCXJldHVybjsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlICkgewotCQlkaXNwbGF5RXJyb3IocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJJT19lcnJvcl9yZWFkIikgKyAiXG4iICsgZmlsZS5nZXROYW1lKCkpOwotCQlyZXR1cm47Ci0JfSBmaW5hbGx5IHsJCi0JCQotCQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0JCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQotCQlpZihmaWxlUmVhZGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmlsZVJlYWRlci5jbG9zZSgpOwotCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZGlzcGxheUVycm9yKHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiSU9fZXJyb3JfY2xvc2UiKSArICJcbiIgKyBmaWxlLmdldE5hbWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCQotCVN0cmluZ1tdW10gdGFibGVJbmZvID0gbmV3IFN0cmluZ1tkYXRhLmxlbmd0aF1bdGFibGUuZ2V0Q29sdW1uQ291bnQoKV07Ci0JaW50IHdyaXRlSW5kZXggPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQlTdHJpbmdbXSBsaW5lID0gZGVjb2RlTGluZShkYXRhW2ldKTsKLQkJaWYgKGxpbmUgIT0gbnVsbCkgdGFibGVJbmZvW3dyaXRlSW5kZXgrK10gPSBsaW5lOwotCX0KLQlpZiAod3JpdGVJbmRleCAhPSBkYXRhLmxlbmd0aCkgewotCQlTdHJpbmdbXVtdIHJlc3VsdCA9IG5ldyBTdHJpbmdbd3JpdGVJbmRleF1bdGFibGUuZ2V0Q29sdW1uQ291bnQoKV07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGFibGVJbmZvLCAwLCByZXN1bHQsIDAsIHdyaXRlSW5kZXgpOwotCQl0YWJsZUluZm8gPSByZXN1bHQ7Ci0JfQotCUFycmF5cy5zb3J0KHRhYmxlSW5mbywgbmV3IFJvd0NvbXBhcmF0b3IoMCkpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZUluZm8ubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCh0YWJsZUluZm9baV0pOwotCX0KLQlzaGVsbC5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiVGl0bGVfYmFyIikrZmlsZURpYWxvZy5nZXRGaWxlTmFtZSgpKTsKLQlpc01vZGlmaWVkID0gZmFsc2U7Ci0JdGhpcy5maWxlID0gZmlsZTsKLX0KLXByaXZhdGUgYm9vbGVhbiBzYXZlKCkgewotCWlmKGZpbGUgPT0gbnVsbCkgcmV0dXJuIHNhdmVBcygpOwotCQotCUN1cnNvciB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihzaGVsbC5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfV0FJVCk7Ci0Jc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQotCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQlTdHJpbmdbXSBsaW5lcyA9IG5ldyBTdHJpbmdbaXRlbXMubGVuZ3RoXTsKLQlmb3IoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJU3RyaW5nW10gaXRlbVRleHQgPSBuZXcgU3RyaW5nW3RhYmxlLmdldENvbHVtbkNvdW50KCldOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGl0ZW1UZXh0Lmxlbmd0aDsgaisrKSB7Ci0JCQlpdGVtVGV4dFtqXSA9IGl0ZW1zW2ldLmdldFRleHQoaik7Ci0JCX0KLQkJbGluZXNbaV0gPSBlbmNvZGVMaW5lKGl0ZW1UZXh0KTsKLQl9Ci0JCQotCUZpbGVXcml0ZXIgZmlsZVdyaXRlciA9IG51bGw7Ci0JdHJ5IHsgCi0JCWZpbGVXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcihmaWxlLmdldEFic29sdXRlUGF0aCgpLCBmYWxzZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbGVXcml0ZXIud3JpdGUobGluZXNbaV0pOwotCQl9Ci0JfSBjYXRjaChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQlkaXNwbGF5RXJyb3IocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJGaWxlX25vdF9mb3VuZCIpICsgIlxuIiArIGZpbGUuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0gY2F0Y2goSU9FeGNlcHRpb24gZSApIHsKLQkJZGlzcGxheUVycm9yKHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiSU9fZXJyb3Jfd3JpdGUiKSArICJcbiIgKyBmaWxlLmdldE5hbWUoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9IGZpbmFsbHkgewotCQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0JCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQkKLQkJaWYoZmlsZVdyaXRlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZpbGVXcml0ZXIuY2xvc2UoKTsKLQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJCWRpc3BsYXlFcnJvcihyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIklPX2Vycm9yX2Nsb3NlIikgKyAiXG4iICsgZmlsZS5nZXROYW1lKCkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCXNoZWxsLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJUaXRsZV9iYXIiKStmaWxlLmdldE5hbWUoKSk7Ci0JaXNNb2RpZmllZCA9IGZhbHNlOwotCXJldHVybiB0cnVlOwotfQotcHJpdmF0ZSBib29sZWFuIHNhdmVBcygpIHsKLQkJCi0JRmlsZURpYWxvZyBzYXZlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5TQVZFKTsKLQlzYXZlRGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsiKi5hZHI7IiwgICIqLioifSk7Ci0Jc2F2ZURpYWxvZy5zZXRGaWx0ZXJOYW1lcyhuZXcgU3RyaW5nW10geyJBZGRyZXNzIEJvb2tzICgqLmFkcikiLCAiQWxsIEZpbGVzICJ9KTsKLQkKLQlzYXZlRGlhbG9nLm9wZW4oKTsKLQlTdHJpbmcgbmFtZSA9IHNhdmVEaWFsb2cuZ2V0RmlsZU5hbWUoKTsKLQkJCi0JaWYobmFtZS5lcXVhbHMoIiIpKSByZXR1cm4gZmFsc2U7Ci0KLQlpZihuYW1lLmluZGV4T2YoIi5hZHIiKSAhPSBuYW1lLmxlbmd0aCgpIC0gNCkgewotCQluYW1lICs9ICIuYWRyIjsKLQl9Ci0KLQlGaWxlIGZpbGUgPSBuZXcgRmlsZShzYXZlRGlhbG9nLmdldEZpbHRlclBhdGgoKSwgbmFtZSk7Ci0JaWYoZmlsZS5leGlzdHMoKSkgewotCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9XQVJOSU5HIHwgU1dULllFUyB8IFNXVC5OTyk7Ci0JCWJveC5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiU2F2ZV9hc190aXRsZSIpKTsKLQkJYm94LnNldE1lc3NhZ2UocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJGaWxlIikgKyBmaWxlLmdldE5hbWUoKSsiICIrcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJRdWVyeV9vdmVyd3JpdGUiKSk7Ci0JCWlmKGJveC5vcGVuKCkgIT0gU1dULllFUykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCXRoaXMuZmlsZSA9IGZpbGU7Ci0JcmV0dXJuIHNhdmUoKTsJCi19Ci1wcml2YXRlIHZvaWQgc29ydChpbnQgY29sdW1uKSB7Ci0JaWYodGFibGUuZ2V0SXRlbUNvdW50KCkgPD0gMSkgcmV0dXJuOwotCi0JVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotCVN0cmluZ1tdW10gZGF0YSA9IG5ldyBTdHJpbmdbaXRlbXMubGVuZ3RoXVt0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQlmb3IoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJZm9yKGludCBqID0gMDsgaiA8IHRhYmxlLmdldENvbHVtbkNvdW50KCk7IGorKykgewotCQkJZGF0YVtpXVtqXSA9IGl0ZW1zW2ldLmdldFRleHQoaik7Ci0JCX0KLQl9Ci0JCi0JQXJyYXlzLnNvcnQoZGF0YSwgbmV3IFJvd0NvbXBhcmF0b3IoY29sdW1uKSk7Ci0JCi0JaWYgKGxhc3RTb3J0Q29sdW1uICE9IGNvbHVtbikgewotCQl0YWJsZS5zZXRTb3J0Q29sdW1uKHRhYmxlLmdldENvbHVtbihjb2x1bW4pKTsKLQkJdGFibGUuc2V0U29ydERpcmVjdGlvbihTV1QuRE9XTik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJaXRlbXNbaV0uc2V0VGV4dChkYXRhW2ldKTsKLQkJfQotCQlsYXN0U29ydENvbHVtbiA9IGNvbHVtbjsKLQl9IGVsc2UgewotCQkvLyByZXZlcnNlIG9yZGVyIGlmIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBzZWxlY3RlZCBhZ2FpbgotCQl0YWJsZS5zZXRTb3J0RGlyZWN0aW9uKFNXVC5VUCk7Ci0JCWludCBqID0gZGF0YS5sZW5ndGggLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJaXRlbXNbaV0uc2V0VGV4dChkYXRhW2otLV0pOwotCQl9Ci0JCWxhc3RTb3J0Q29sdW1uID0gLTE7Ci0JfQotCQotfQotLyoqCi0gKiBDcmVhdGVzIGFsbCB0aGUgaXRlbXMgbG9jYXRlZCBpbiB0aGUgRmlsZSBzdWJtZW51IGFuZAotICogYXNzb2NpYXRlIGFsbCB0aGUgbWVudSBpdGVtcyB3aXRoIHRoZWlyIGFwcHJvcHJpYXRlCi0gKiBmdW5jdGlvbnMuCi0gKgotICogQHBhcmFtCW1lbnVCYXIgTWVudQotICoJCQkJdGhlIDxjb2RlPk1lbnU8L2NvZGU+IHRoYXQgZmlsZSBjb250YWluCi0gKgkJCQl0aGUgRmlsZSBzdWJtZW51LgotICovCi1wcml2YXRlIHZvaWQgY3JlYXRlRmlsZU1lbnUoTWVudSBtZW51QmFyKSB7Ci0JLy9GaWxlIG1lbnUuCi0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRmlsZV9tZW51X3RpdGxlIikpOwotCU1lbnUgbWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQlpdGVtLnNldE1lbnUobWVudSk7Ci0JLyoqIAotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBoYW5kbGUgZW5hYmxpbmcgYW5kIGRpc2FibGluZyAKLQkgKiBzb21lIGl0ZW1zIGluIHRoZSBFZGl0IHN1Ym1lbnUuCi0JICovCi0JbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCU1lbnUgbWVudSA9IChNZW51KWUud2lkZ2V0OwotCQkJTWVudUl0ZW1bXSBpdGVtcyA9IG1lbnUuZ2V0SXRlbXMoKTsKLQkJCWl0ZW1zWzFdLnNldEVuYWJsZWQodGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSAhPSAwKTsgLy8gZWRpdCBjb250YWN0Ci0JCQlpdGVtc1s1XS5zZXRFbmFibGVkKChmaWxlICE9IG51bGwpICYmIGlzTW9kaWZpZWQpOyAvLyBzYXZlCi0JCQlpdGVtc1s2XS5zZXRFbmFibGVkKHRhYmxlLmdldEl0ZW1Db3VudCgpICE9IDApOyAvLyBzYXZlIGFzCi0JCX0KLQl9KTsKLQotCi0JLy9GaWxlIC0+IE5ldyBDb250YWN0Ci0JTWVudUl0ZW0gc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiTmV3X2NvbnRhY3QiKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdOJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJbmV3RW50cnkoKTsKLQkJfQotCX0pOwotCXN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkVkaXRfY29udGFjdCIpKTsKLQlzdWJJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ0UnKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQllZGl0RW50cnkoaXRlbXNbMF0pOwotCQl9Ci0JfSk7Ci0KLQkKLQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCi0JLy9GaWxlIC0+IE5ldyBBZGRyZXNzIEJvb2sKLQlzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJOZXdfYWRkcmVzc19ib29rIikpOwotCXN1Ykl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnQicpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWlmIChjbG9zZUFkZHJlc3NCb29rKCkpIHsKLQkJCQluZXdBZGRyZXNzQm9vaygpOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQkvL0ZpbGUgLT4gT3BlbgotCXN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIk9wZW5fYWRkcmVzc19ib29rIikpOwotCXN1Ykl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnTycpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWlmIChjbG9zZUFkZHJlc3NCb29rKCkpIHsKLQkJCQlvcGVuQWRkcmVzc0Jvb2soKTsKLQkJCX0KLQkJfQotCX0pOwotCi0JLy9GaWxlIC0+IFNhdmUuCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiU2F2ZV9hZGRyZXNzX2Jvb2siKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdTJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc2F2ZSgpOwotCQl9Ci0JfSk7Ci0JCi0JLy9GaWxlIC0+IFNhdmUgQXMuCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiU2F2ZV9ib29rX2FzIikpOwotCXN1Ykl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnQScpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXNhdmVBcygpOwotCQl9Ci0JfSk7Ci0KLQkJCi0JbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQotCS8vRmlsZSAtPiBFeGl0LgotCXN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkV4aXQiKSk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc2hlbGwuY2xvc2UoKTsKLQkJfQotCX0pOwotfQotCi0vKioKLSAqIENyZWF0ZXMgYWxsIHRoZSBpdGVtcyBsb2NhdGVkIGluIHRoZSBFZGl0IHN1Ym1lbnUgYW5kCi0gKiBhc3NvY2lhdGUgYWxsIHRoZSBtZW51IGl0ZW1zIHdpdGggdGhlaXIgYXBwcm9wcmlhdGUKLSAqIGZ1bmN0aW9ucy4KLSAqCi0gKiBAcGFyYW0JbWVudUJhciBNZW51Ci0gKgkJCQl0aGUgPGNvZGU+TWVudTwvY29kZT4gdGhhdCBmaWxlIGNvbnRhaW4KLSAqCQkJCXRoZSBFZGl0IHN1Ym1lbnUuCi0gKgotICogQHNlZQkjY3JlYXRlU29ydE1lbnUoKQotICovCi1wcml2YXRlIE1lbnVJdGVtIGNyZWF0ZUVkaXRNZW51KE1lbnUgbWVudUJhcikgewotCS8vRWRpdCBtZW51LgotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkVkaXRfbWVudV90aXRsZSIpKTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JaXRlbS5zZXRNZW51KG1lbnUpOwotCQotCS8qKiAKLQkgKiBBZGQgYSBsaXN0ZW5lciB0byBoYW5kbGUgZW5hYmxpbmcgYW5kIGRpc2FibGluZyAKLQkgKiBzb21lIGl0ZW1zIGluIHRoZSBFZGl0IHN1Ym1lbnUuCi0JICovCi0JbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCU1lbnUgbWVudSA9IChNZW51KWUud2lkZ2V0OwotCQkJTWVudUl0ZW1bXSBpdGVtcyA9IG1lbnUuZ2V0SXRlbXMoKTsKLQkJCWludCBjb3VudCA9IHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCk7Ci0JCQlpdGVtc1swXS5zZXRFbmFibGVkKGNvdW50ICE9IDApOyAvLyBlZGl0Ci0JCQlpdGVtc1sxXS5zZXRFbmFibGVkKGNvdW50ICE9IDApOyAvLyBjb3B5Ci0JCQlpdGVtc1syXS5zZXRFbmFibGVkKGNvcHlCdWZmZXIgIT0gbnVsbCk7IC8vIHBhc3RlCi0JCQlpdGVtc1szXS5zZXRFbmFibGVkKGNvdW50ICE9IDApOyAvLyBkZWxldGUKLQkJCWl0ZW1zWzVdLnNldEVuYWJsZWQodGFibGUuZ2V0SXRlbUNvdW50KCkgIT0gMCk7IC8vIHNvcnQKLQkJfQotCX0pOwotCQotCS8vRWRpdCAtPiBFZGl0Ci0JTWVudUl0ZW0gc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0FTQ0FERSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRWRpdCIpKTsKLQlzdWJJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ0UnKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQllZGl0RW50cnkoaXRlbXNbMF0pOwotCQl9Ci0JfSk7Ci0KLQkvL0VkaXQgLT4gQ29weQotCXN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkNvcHkiKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdDJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkJY29weUJ1ZmZlciA9IG5ldyBTdHJpbmdbdGFibGUuZ2V0Q29sdW1uQ291bnQoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvcHlCdWZmZXIubGVuZ3RoOyBpKyspIHsKLQkJCQljb3B5QnVmZmVyW2ldID0gaXRlbXNbMF0uZ2V0VGV4dChpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCS8vRWRpdCAtPiBQYXN0ZQotCXN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlBhc3RlIikpOwotCXN1Ykl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnVicpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWlmIChjb3B5QnVmZmVyID09IG51bGwpIHJldHVybjsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KGNvcHlCdWZmZXIpOwotCQkJaXNNb2RpZmllZCA9IHRydWU7Ci0JCX0KLQl9KTsKLQkKLQkvL0VkaXQgLT4gRGVsZXRlCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGVsZXRlIikpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHJldHVybjsKLQkJCWl0ZW1zWzBdLmRpc3Bvc2UoKTsKLQkJCWlzTW9kaWZpZWQgPSB0cnVlOwkJfQotCX0pOwotCQotCW5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkKLQkvL0VkaXQgLT4gU29ydChDYXNjYWRlKQotCXN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNBU0NBREUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlNvcnQiKSk7Ci0JTWVudSBzdWJtZW51ID0gY3JlYXRlU29ydE1lbnUoKTsKLQlzdWJJdGVtLnNldE1lbnUoc3VibWVudSk7Ci0JCi0JcmV0dXJuIGl0ZW07Ci0JCi19Ci0KLS8qKgotICogQ3JlYXRlcyBhbGwgdGhlIGl0ZW1zIGxvY2F0ZWQgaW4gdGhlIFNvcnQgY2FzY2FkaW5nIHN1Ym1lbnUgYW5kCi0gKiBhc3NvY2lhdGUgYWxsIHRoZSBtZW51IGl0ZW1zIHdpdGggdGhlaXIgYXBwcm9wcmlhdGUKLSAqIGZ1bmN0aW9ucy4KLSAqCi0gKiBAcmV0dXJuCU1lbnUKLSAqCQkJVGhlIGNhc2NhZGluZyBtZW51IHdpdGggYWxsIHRoZSBzb3J0IG1lbnUgaXRlbXMgb24gaXQuCi0gKi8KLXByaXZhdGUgTWVudSBjcmVhdGVTb3J0TWVudSgpIHsKLQlNZW51IHN1Ym1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JTWVudUl0ZW0gc3ViaXRlbTsKLQlmb3IoaW50IGkgPSAwOyBpIDwgY29sdW1uTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJc3ViaXRlbSA9IG5ldyBNZW51SXRlbSAoc3VibWVudSwgU1dULk5PTkUpOwotCQlzdWJpdGVtLnNldFRleHQoY29sdW1uTmFtZXMgW2ldKTsKLQkJZmluYWwgaW50IGNvbHVtbiA9IGk7Ci0JCXN1Yml0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc29ydChjb2x1bW4pOwotCQkJfQotCQl9KTsKLQotCX0KLQkKLQlyZXR1cm4gc3VibWVudTsKLX0KLQotLyoqCi0gKiBDcmVhdGVzIGFsbCB0aGUgaXRlbXMgbG9jYXRlZCBpbiB0aGUgU2VhcmNoIHN1Ym1lbnUgYW5kCi0gKiBhc3NvY2lhdGUgYWxsIHRoZSBtZW51IGl0ZW1zIHdpdGggdGhlaXIgYXBwcm9wcmlhdGUKLSAqIGZ1bmN0aW9ucy4KLSAqCi0gKiBAcGFyYW0JbWVudUJhcglNZW51Ci0gKgkJCQl0aGUgPGNvZGU+TWVudTwvY29kZT4gdGhhdCBmaWxlIGNvbnRhaW4KLSAqCQkJCXRoZSBTZWFyY2ggc3VibWVudS4KLSAqLwotcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlYXJjaE1lbnUoTWVudSBtZW51QmFyKSB7Ci0JLy9TZWFyY2ggbWVudS4KLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQlpdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJTZWFyY2hfbWVudV90aXRsZSIpKTsKLQlNZW51IHNlYXJjaE1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JaXRlbS5zZXRNZW51KHNlYXJjaE1lbnUpOwotCi0JLy9TZWFyY2ggLT4gRmluZC4uLgotCWl0ZW0gPSBuZXcgTWVudUl0ZW0oc2VhcmNoTWVudSwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkZpbmQiKSk7Ci0JaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdGJyk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc2VhcmNoRGlhbG9nLnNldE1hdGNoQ2FzZShmYWxzZSk7Ci0JCQlzZWFyY2hEaWFsb2cuc2V0TWF0Y2hXb3JkKGZhbHNlKTsKLQkJCXNlYXJjaERpYWxvZy5zZXRTZWFyY2hEb3duKHRydWUpOwotCQkJc2VhcmNoRGlhbG9nLnNldFNlYXJjaFN0cmluZygiIik7Ci0JCQlzZWFyY2hEaWFsb2cuc2V0U2VsZWN0ZWRTZWFyY2hBcmVhKDApOwotCQkJc2VhcmNoRGlhbG9nLm9wZW4oKTsKLQkJfQotCX0pOwotCi0JLy9TZWFyY2ggLT4gRmluZCBOZXh0Ci0JaXRlbSA9IG5ldyBNZW51SXRlbShzZWFyY2hNZW51LCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRmluZF9uZXh0IikpOwotCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULkYzKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzZWFyY2hEaWFsb2cub3BlbigpOwotCQl9Ci0JfSk7Ci19Ci0KLS8qKiAKLSAqIENyZWF0ZXMgYWxsIGl0ZW1zIGxvY2F0ZWQgaW4gdGhlIHBvcHVwIG1lbnUgYW5kIGFzc29jaWF0ZXMKLSAqIGFsbCB0aGUgbWVudSBpdGVtcyB3aXRoIHRoZWlyIGFwcHJvcHJpYXRlIGZ1bmN0aW9ucy4KLSAqCi0gKiBAcmV0dXJuCU1lbnUKLSAqCQkJVGhlIGNyZWF0ZWQgcG9wdXAgbWVudS4KLSAqLwotcHJpdmF0ZSBNZW51IGNyZWF0ZVBvcFVwTWVudSgpIHsKLQlNZW51IHBvcFVwTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuUE9QX1VQKTsKLQotCS8qKiAKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gaGFuZGxlIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgCi0JICogc29tZSBpdGVtcyBpbiB0aGUgRWRpdCBzdWJtZW51LgotCSAqLwotCXBvcFVwTWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCU1lbnUgbWVudSA9IChNZW51KWUud2lkZ2V0OwotCQkJTWVudUl0ZW1bXSBpdGVtcyA9IG1lbnUuZ2V0SXRlbXMoKTsKLQkJCWludCBjb3VudCA9IHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCk7Ci0JCQlpdGVtc1syXS5zZXRFbmFibGVkKGNvdW50ICE9IDApOyAvLyBlZGl0Ci0JCQlpdGVtc1szXS5zZXRFbmFibGVkKGNvdW50ICE9IDApOyAvLyBjb3B5Ci0JCQlpdGVtc1s0XS5zZXRFbmFibGVkKGNvcHlCdWZmZXIgIT0gbnVsbCk7IC8vIHBhc3RlCi0JCQlpdGVtc1s1XS5zZXRFbmFibGVkKGNvdW50ICE9IDApOyAvLyBkZWxldGUKLQkJCWl0ZW1zWzddLnNldEVuYWJsZWQodGFibGUuZ2V0SXRlbUNvdW50KCkgIT0gMCk7IC8vIGZpbmQKLQkJfQotCX0pOwotCi0JLy9OZXcKLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKHBvcFVwTWVudSwgU1dULkNBU0NBREUpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlBvcF91cF9uZXciKSk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJbmV3RW50cnkoKTsKLQkJfQotCX0pOwotCQotCW5ldyBNZW51SXRlbShwb3BVcE1lbnUsIFNXVC5TRVBBUkFUT1IpOwkKLQkKLQkvL0VkaXQKLQlpdGVtID0gbmV3IE1lbnVJdGVtKHBvcFVwTWVudSwgU1dULkNBU0NBREUpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlBvcF91cF9lZGl0IikpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHJldHVybjsKLQkJCWVkaXRFbnRyeShpdGVtc1swXSk7Ci0JCX0KLQl9KTsKLQotCS8vQ29weQotCWl0ZW0gPSBuZXcgTWVudUl0ZW0ocG9wVXBNZW51LCBTV1QuQ0FTQ0FERSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiUG9wX3VwX2NvcHkiKSk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkJY29weUJ1ZmZlciA9IG5ldyBTdHJpbmdbdGFibGUuZ2V0Q29sdW1uQ291bnQoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvcHlCdWZmZXIubGVuZ3RoOyBpKyspIHsKLQkJCQljb3B5QnVmZmVyW2ldID0gaXRlbXNbMF0uZ2V0VGV4dChpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCS8vUGFzdGUKLQlpdGVtID0gbmV3IE1lbnVJdGVtKHBvcFVwTWVudSwgU1dULkNBU0NBREUpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlBvcF91cF9wYXN0ZSIpKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpZiAoY29weUJ1ZmZlciA9PSBudWxsKSByZXR1cm47Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dChjb3B5QnVmZmVyKTsKLQkJCWlzTW9kaWZpZWQgPSB0cnVlOwotCQl9Ci0JfSk7Ci0JCi0JLy9EZWxldGUKLQlpdGVtID0gbmV3IE1lbnVJdGVtKHBvcFVwTWVudSwgU1dULkNBU0NBREUpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlBvcF91cF9kZWxldGUiKSk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkJaXRlbXNbMF0uZGlzcG9zZSgpOwotCQkJaXNNb2RpZmllZCA9IHRydWU7Ci0JCX0KLQl9KTsKLQkKLQluZXcgTWVudUl0ZW0ocG9wVXBNZW51LCBTV1QuU0VQQVJBVE9SKTsJCi0JCi0JLy9GaW5kLi4uCi0JaXRlbSA9IG5ldyBNZW51SXRlbShwb3BVcE1lbnUsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJQb3BfdXBfZmluZCIpKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzZWFyY2hEaWFsb2cub3BlbigpOwotCQl9Ci0JfSk7Ci0KLQlyZXR1cm4gcG9wVXBNZW51OwotfQotCi0vKioKLSAqIENyZWF0ZXMgYWxsIHRoZSBpdGVtcyBsb2NhdGVkIGluIHRoZSBIZWxwIHN1Ym1lbnUgYW5kCi0gKiBhc3NvY2lhdGUgYWxsIHRoZSBtZW51IGl0ZW1zIHdpdGggdGhlaXIgYXBwcm9wcmlhdGUKLSAqIGZ1bmN0aW9ucy4KLSAqCi0gKiBAcGFyYW0JbWVudUJhcglNZW51Ci0gKgkJCQl0aGUgPGNvZGU+TWVudTwvY29kZT4gdGhhdCBmaWxlIGNvbnRhaW4KLSAqCQkJCXRoZSBIZWxwIHN1Ym1lbnUuCi0gKi8KLXByaXZhdGUgdm9pZCBjcmVhdGVIZWxwTWVudShNZW51IG1lbnVCYXIpIHsKLQkKLQkvL0hlbHAgTWVudQotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkhlbHBfbWVudV90aXRsZSIpKTsJCi0JTWVudSBtZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCWl0ZW0uc2V0TWVudShtZW51KTsKLQkKLQkvL0hlbHAgLT4gQWJvdXQgVGV4dCBFZGl0b3IKLQlNZW51SXRlbSBzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJBYm91dCIpKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlib3guc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkFib3V0XzEiKSArIHNoZWxsLmdldFRleHQoKSk7Ci0JCQlib3guc2V0TWVzc2FnZShzaGVsbC5nZXRUZXh0KCkgKyByZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkFib3V0XzIiKSk7Ci0JCQlib3gub3BlbigpOwkJCi0JCX0KLQl9KTsKLX0KLQotLyoqCi0gKiBUbyBjb21wYXJlIGVudHJpZXMgKHJvd3MpIGJ5IHRoZSBnaXZlbiBjb2x1bW4KLSAqLwotcHJpdmF0ZSBjbGFzcyBSb3dDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JcHJpdmF0ZSBpbnQgY29sdW1uOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBSb3dDb21wYXJhdG9yIGdpdmVuIHRoZSBjb2x1bW4gaW5kZXgKLQkgKiBAcGFyYW0gY29sIFRoZSBpbmRleCAoc3RhcnRpbmcgYXQgemVybykgb2YgdGhlIGNvbHVtbgotCSAqLwotCXB1YmxpYyBSb3dDb21wYXJhdG9yKGludCBjb2wpIHsKLQkJY29sdW1uID0gY29sOwotCX0KLQkKLQkvKioKLQkgKiBDb21wYXJlcyB0d28gcm93cyAodHlwZSBTdHJpbmdbXSkgdXNpbmcgdGhlIHNwZWNpZmllZAotCSAqIGNvbHVtbiBlbnRyeS4KLQkgKiBAcGFyYW0gb2JqMSBGaXJzdCByb3cgdG8gY29tcGFyZQotCSAqIEBwYXJhbSBvYmoyIFNlY29uZCByb3cgdG8gY29tcGFyZQotCSAqIEByZXR1cm4gbmVnYXRpdmUgaWYgb2JqMSBsZXNzIHRoYW4gb2JqMiwgcG9zaXRpdmUgaWYKLQkgKiAJCQlvYmoxIGdyZWF0ZXIgdGhhbiBvYmoyLCBhbmQgemVybyBpZiBlcXVhbC4KLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyKSB7Ci0JCVN0cmluZ1tdIHJvdzEgPSAoU3RyaW5nW10pb2JqMTsKLQkJU3RyaW5nW10gcm93MiA9IChTdHJpbmdbXSlvYmoyOwotCQkKLQkJcmV0dXJuIHJvdzFbY29sdW1uXS5jb21wYXJlVG8ocm93Mltjb2x1bW5dKTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hZGRyZXNzYm9vay9EYXRhRW50cnlEaWFsb2cuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0RhdGFFbnRyeURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYmYzNGM0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0RhdGFFbnRyeURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWRkcmVzc2Jvb2s7Ci0KLQotLyogSW1wb3J0cyAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogRGF0YUVudHJ5RGlhbG9nIGNsYXNzIHVzZXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0PC9jb2RlPiAKLSAqIGxpYnJhcmllcyB0byBpbXBsZW1lbnQgYSBkaWFsb2cgdGhhdCBhY2NlcHRzIGJhc2ljIHBlcnNvbmFsIGluZm9ybWF0aW9uIHRoYXQKLSAqIGlzIGFkZGVkIHRvIGEgPGNvZGU+VGFibGU8L2NvZGU+IHdpZGdldCBvciBlZGl0cyBhIDxjb2RlPlRhYmxlSXRlbTwvY29kZT4gZW50cnkgCi0gKiB0byByZXByZXNlbnQgdGhlIGVudGVyZWQgZGF0YS4KLSAqLwotcHVibGljIGNsYXNzIERhdGFFbnRyeURpYWxvZyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNBZGRyZXNzQm9vayA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfYWRkcmVzc2Jvb2siKTsKLQkKLQlTaGVsbCBzaGVsbDsKLQlTdHJpbmdbXSB2YWx1ZXM7Ci0JU3RyaW5nW10gbGFiZWxzOwotCQotcHVibGljIERhdGFFbnRyeURpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbChwYXJlbnQsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5QUklNQVJZX01PREFMKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7CQkKLX0KLQotcHJpdmF0ZSB2b2lkIGFkZFRleHRMaXN0ZW5lcihmaW5hbCBUZXh0IHRleHQpIHsKLQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKXsKLQkJCUludGVnZXIgaW5kZXggPSAoSW50ZWdlcikodGV4dC5nZXREYXRhKCJpbmRleCIpKTsKLQkJCXZhbHVlc1tpbmRleC5pbnRWYWx1ZSgpXSA9IHRleHQuZ2V0VGV4dCgpOwotCQl9Ci0JfSk7Ci19Ci1wcml2YXRlIHZvaWQgY3JlYXRlQ29udHJvbEJ1dHRvbnMoKSB7Ci0JQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpKTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQlCdXR0b24gb2tCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCW9rQnV0dG9uLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJPSyIpKTsKLQlva0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc2hlbGwuY2xvc2UoKTsKLQkJfQotCX0pOwotCQotCUJ1dHRvbiBjYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCWNhbmNlbEJ1dHRvbi5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiQ2FuY2VsIikpOwotCWNhbmNlbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJdmFsdWVzID0gbnVsbDsKLQkJCXNoZWxsLmNsb3NlKCk7Ci0JCX0KLQl9KTsKLQkKLQlzaGVsbC5zZXREZWZhdWx0QnV0dG9uKG9rQnV0dG9uKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVRleHRXaWRnZXRzKCkgewotCWlmIChsYWJlbHMgPT0gbnVsbCkgcmV0dXJuOwotCQotCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCUdyaWRMYXlvdXQgbGF5b3V0PSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCi0JaWYgKHZhbHVlcyA9PSBudWxsKQotCQl2YWx1ZXMgPSBuZXcgU3RyaW5nW2xhYmVscy5sZW5ndGhdOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgaSsrKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULlJJR0hUKTsKLQkJbGFiZWwuc2V0VGV4dChsYWJlbHNbaV0pOwkKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDAwOwotCQl0ZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlpZiAodmFsdWVzW2ldICE9IG51bGwpIHsKLQkJCXRleHQuc2V0VGV4dCh2YWx1ZXNbaV0pOwotCQl9Ci0JCXRleHQuc2V0RGF0YSgiaW5kZXgiLCBuZXcgSW50ZWdlcihpKSk7Ci0JCWFkZFRleHRMaXN0ZW5lcih0ZXh0KTsJCi0JfQotfQotCi1wdWJsaWMgU3RyaW5nW10gZ2V0TGFiZWxzKCkgewotCXJldHVybiBsYWJlbHM7Ci19Ci1wdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCXJldHVybiBzaGVsbC5nZXRUZXh0KCk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXRzIGluIHRoZSBkaWFsb2cgaW4gYSAKLSAqIDxjb2RlPlN0cmluZzwvY29kZT4gYXJyYXkuCi0gKgotICogQHJldHVybglTdHJpbmdbXQkKLSAqCQkJVGhlIGNvbnRlbnRzIG9mIHRoZSB0ZXh0IHdpZGdldHMgb2YgdGhlIGRpYWxvZy4KLSAqCQkJTWF5IHJldHVybiBudWxsIGlmIGFsbCB0ZXh0IHdpZGdldHMgYXJlIGVtcHR5LgotICovIAotcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKLQlyZXR1cm4gdmFsdWVzOwotfQotLyoqIAotICogT3BlbnMgdGhlIGRpYWxvZyBpbiB0aGUgZ2l2ZW4gc3RhdGUuICBTZXRzIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldCBjb250ZW50cyAKLSAqIGFuZCBkaWFsb2cgYmVoYXZpb3VyIGFjY29yZGluZ2x5LgotICoKLSAqIEBwYXJhbSAJZGlhbG9nU3RhdGUJaW50Ci0gKgkJCQkJVGhlIHN0YXRlIHRoZSBkaWFsb2cgc2hvdWxkIGJlIG9wZW5lZCBpbi4KLSAqLwotcHVibGljIFN0cmluZ1tdIG9wZW4oKSB7Ci0JY3JlYXRlVGV4dFdpZGdldHMoKTsKLQljcmVhdGVDb250cm9sQnV0dG9ucygpOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0JRGlzcGxheSBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSgpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JCi0JcmV0dXJuIGdldFZhbHVlcygpOwotfQotcHVibGljIHZvaWQgc2V0TGFiZWxzKFN0cmluZ1tdIGxhYmVscykgewotCXRoaXMubGFiZWxzID0gbGFiZWxzOwotfQotcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0Jc2hlbGwuc2V0VGV4dCh0aXRsZSk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIHZhbHVlcyBvZiB0aGUgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0cyBvZiB0aGUgZGlhbG9nIHRvCi0gKiB0aGUgdmFsdWVzIHN1cHBsaWVkIGluIHRoZSBwYXJhbWV0ZXIgYXJyYXkuCi0gKgotICogQHBhcmFtCWl0ZW1JbmZvCVN0cmluZ1tdCi0gKiAJCQkJCQlUaGUgdmFsdWVzIHRvIHdoaWNoIHRoZSBkaWFsb2cgY29udGVudHMgd2lsbCBiZSBzZXQuCi0gKi8KLXB1YmxpYyB2b2lkIHNldFZhbHVlcyhTdHJpbmdbXSBpdGVtSW5mbykgewotCWlmIChsYWJlbHMgPT0gbnVsbCkgcmV0dXJuOwotCQotCWlmICh2YWx1ZXMgPT0gbnVsbCkKLQkJdmFsdWVzID0gbmV3IFN0cmluZ1tsYWJlbHMubGVuZ3RoXTsKLQotCWludCBudW1JdGVtcyA9IE1hdGgubWluKHZhbHVlcy5sZW5ndGgsIGl0ZW1JbmZvLmxlbmd0aCk7Ci0JZm9yKGludCBpID0gMDsgaSA8IG51bUl0ZW1zOyBpKyspIHsKLQkJdmFsdWVzW2ldID0gaXRlbUluZm9baV07Ci0JfQkKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0ZpbmRMaXN0ZW5lci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svRmluZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3MzI1MDUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svRmluZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmFkZHJlc3Nib29rOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRmluZExpc3RlbmVyIHsKLQotcHVibGljIGJvb2xlYW4gZmluZCgpOwotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hZGRyZXNzYm9vay9TZWFyY2hEaWFsb2cuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL1NlYXJjaERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNGI2NmUyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL1NlYXJjaERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWRkcmVzc2Jvb2s7Ci0KLQotLyogSW1wb3J0cyAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogU2VhcmNoRGlhbG9nIGlzIGEgc2ltcGxlIGNsYXNzIHRoYXQgdXNlcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3Q8L2NvZGU+IAotICogbGlicmFyaWVzIHRvIGltcGxlbWVudCBhIGJhc2ljIHNlYXJjaCBkaWFsb2cuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hEaWFsb2cgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzQWRkcmVzc0Jvb2sgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2FkZHJlc3Nib29rIik7Ci0KLQlTaGVsbCBzaGVsbDsKLQlUZXh0IHNlYXJjaFRleHQ7Ci0JQ29tYm8gc2VhcmNoQXJlYTsKLQlMYWJlbCBzZWFyY2hBcmVhTGFiZWw7Ci0JQnV0dG9uIG1hdGNoQ2FzZTsKLQlCdXR0b24gbWF0Y2hXb3JkOwotCUJ1dHRvbiBmaW5kQnV0dG9uOwotCUJ1dHRvbiBkb3duOwotCUZpbmRMaXN0ZW5lciBmaW5kSGFuZGxlcjsKLQotLyoqCi0gKiBDbGFzcyBjb25zdHJ1Y3RvciB0aGF0IHNldHMgdGhlIHBhcmVudCBzaGVsbCBhbmQgdGhlIHRhYmxlIHdpZGdldCB0aGF0Ci0gKiB0aGUgZGlhbG9nIHdpbGwgc2VhcmNoLgotICoKLSAqIEBwYXJhbSBwYXJlbnQJU2hlbGwgCi0gKgkJCVRoZSBzaGVsbCB0aGF0IGlzIHRoZSBwYXJlbnQgb2YgdGhlIGRpYWxvZy4KLSAqLwotcHVibGljIFNlYXJjaERpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbChwYXJlbnQsIFNXVC5DTE9TRSB8IFNXVC5CT1JERVIgfCBTV1QuVElUTEUpOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0Jc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0Jc2hlbGwuc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlNlYXJjaF9kaWFsb2dfdGl0bGUiKSk7Ci0Jc2hlbGwuYWRkU2hlbGxMaXN0ZW5lcihuZXcgU2hlbGxBZGFwdGVyKCl7Ci0JCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkgewotCQkJLy8gZG9uJ3QgZGlzcG9zZSBvZiB0aGUgc2hlbGwsIGp1c3QgaGlkZSBpdCBmb3IgbGF0ZXIgdXNlCi0JCQllLmRvaXQgPSBmYWxzZTsKLQkJCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JfSk7Ci0JCQotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTEVGVCk7Ci0JbGFiZWwuc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkRpYWxvZ19maW5kX3doYXQiKSk7CQotCXNlYXJjaFRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUik7Ci0JR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlncmlkRGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0Jc2VhcmNoVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQlzZWFyY2hUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlib29sZWFuIGVuYWJsZUZpbmQgPSAoc2VhcmNoVGV4dC5nZXRDaGFyQ291bnQoKSAhPSAwKTsKLQkJCWZpbmRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVGaW5kKTsKLQkJfQotCX0pOwotCi0Jc2VhcmNoQXJlYUxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTEVGVCk7Ci0Jc2VhcmNoQXJlYSA9IG5ldyBDb21ibyhzaGVsbCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZ3JpZERhdGEud2lkdGhIaW50ID0gMjAwOwotCXNlYXJjaEFyZWEuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCi0JbWF0Y2hDYXNlID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULkNIRUNLKTsKLQltYXRjaENhc2Uuc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkRpYWxvZ19tYXRjaF9jYXNlIikpOwotCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCW1hdGNoQ2FzZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkKLQltYXRjaFdvcmQgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuQ0hFQ0spOwotCW1hdGNoV29yZC5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGlhbG9nX21hdGNoX3dvcmQiKSk7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JbWF0Y2hXb3JkLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQotCUdyb3VwIGRpcmVjdGlvbiA9IG5ldyBHcm91cChzaGVsbCwgU1dULk5PTkUpOwotCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCWRpcmVjdGlvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQlkaXJlY3Rpb24uc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7CQotCWRpcmVjdGlvbi5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGlhbG9nX2RpcmVjdGlvbiIpKTsKLQkKLQlCdXR0b24gdXAgPSBuZXcgQnV0dG9uKGRpcmVjdGlvbiwgU1dULlJBRElPKTsKLQl1cC5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGlhbG9nX2Rpcl91cCIpKTsKLQl1cC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkKLQlkb3duID0gbmV3IEJ1dHRvbihkaXJlY3Rpb24sIFNXVC5SQURJTyk7Ci0JZG93bi5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGlhbG9nX2Rpcl9kb3duIikpOwotCWRvd24uc2V0U2VsZWN0aW9uKHRydWUpOwotCi0JQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQotCWZpbmRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCWZpbmRCdXR0b24uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkRpYWxvZ19maW5kIikpOwotCWZpbmRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQlmaW5kQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCWZpbmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWlmICghZmluZEhhbmRsZXIuZmluZCgpKXsKLQkJCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9JTkZPUk1BVElPTiB8IFNXVC5PSyB8IFNXVC5QUklNQVJZX01PREFMKTsKLQkJCQlib3guc2V0VGV4dChzaGVsbC5nZXRUZXh0KCkpOwotCQkJCWJveC5zZXRNZXNzYWdlKHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiQ2Fubm90X2ZpbmQiKSArICJcIiIgKyBzZWFyY2hUZXh0LmdldFRleHQoKSArICJcIiIpOwotCQkJCWJveC5vcGVuKCk7CQotCQkJfQkJCi0JCX0KLQl9KTsKLQkJCQotCUJ1dHRvbiBjYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCWNhbmNlbEJ1dHRvbi5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiQ2FuY2VsIikpOwotCWNhbmNlbEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCWNhbmNlbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQl9KTsKLQkKLQlzaGVsbC5wYWNrKCk7Ci19Ci1wdWJsaWMgU3RyaW5nIGdldFNlYXJjaEFyZWFMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQlyZXR1cm4gc2VhcmNoQXJlYUxhYmVsLmdldFRleHQoKTsKLX0KLQotcHVibGljIFN0cmluZ1tdIGdldHNlYXJjaEFyZWFOYW1lcygpIHsKLQlyZXR1cm4gc2VhcmNoQXJlYS5nZXRJdGVtcygpOwotfQotcHVibGljIGJvb2xlYW4gZ2V0TWF0Y2hDYXNlKCkgewotCXJldHVybiBtYXRjaENhc2UuZ2V0U2VsZWN0aW9uKCk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBnZXRNYXRjaFdvcmQoKSB7Ci0JcmV0dXJuIG1hdGNoV29yZC5nZXRTZWxlY3Rpb24oKTsKLX0KLXB1YmxpYyBTdHJpbmcgZ2V0U2VhcmNoU3RyaW5nKCkgewotCXJldHVybiBzZWFyY2hUZXh0LmdldFRleHQoKTsKLX0KLXB1YmxpYyBib29sZWFuIGdldFNlYXJjaERvd24oKXsKLQlyZXR1cm4gZG93bi5nZXRTZWxlY3Rpb24oKTsKLX0KLXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRTZWFyY2hBcmVhKCkgewotCXJldHVybiBzZWFyY2hBcmVhLmdldFNlbGVjdGlvbkluZGV4KCk7Ci19Ci1wdWJsaWMgdm9pZCBvcGVuKCkgewotCWlmIChzaGVsbC5pc1Zpc2libGUoKSkgewotCQlzaGVsbC5zZXRGb2N1cygpOwotCX0gZWxzZSB7Ci0JCXNoZWxsLm9wZW4oKTsKLQl9Ci0Jc2VhcmNoVGV4dC5zZXRGb2N1cygpOwotfQotcHVibGljIHZvaWQgc2V0U2VhcmNoQXJlYU5hbWVzKFN0cmluZ1tdIG5hbWVzKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQlzZWFyY2hBcmVhLmFkZChuYW1lc1tpXSk7Ci0JfQotCXNlYXJjaEFyZWEuc2VsZWN0KDApOwotfQotcHVibGljIHZvaWQgc2V0U2VhcmNoQXJlYUxhYmVsKFN0cmluZyBsYWJlbCkgewotCXNlYXJjaEFyZWFMYWJlbC5zZXRUZXh0KGxhYmVsKTsKLX0KLXB1YmxpYyB2b2lkIHNldE1hdGNoQ2FzZShib29sZWFuIG1hdGNoKSB7Ci0JbWF0Y2hDYXNlLnNldFNlbGVjdGlvbihtYXRjaCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRNYXRjaFdvcmQoYm9vbGVhbiBtYXRjaCkgewotCW1hdGNoV29yZC5zZXRTZWxlY3Rpb24obWF0Y2gpOwotfQotcHVibGljIHZvaWQgc2V0U2VhcmNoRG93bihib29sZWFuIHNlYXJjaERvd24pewotCWRvd24uc2V0U2VsZWN0aW9uKHNlYXJjaERvd24pOwotfQotcHVibGljIHZvaWQgc2V0U2VhcmNoU3RyaW5nKFN0cmluZyBzZWFyY2hTdHJpbmcpIHsKLQlzZWFyY2hUZXh0LnNldFRleHQoc2VhcmNoU3RyaW5nKTsKLX0KLQotcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRTZWFyY2hBcmVhKGludCBpbmRleCkgewotCXNlYXJjaEFyZWEuc2VsZWN0KGluZGV4KTsKLX0KLXB1YmxpYyB2b2lkIGFkZEZpbmRMaXN0ZW5lcihGaW5kTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl0aGlzLmZpbmRIYW5kbGVyID0gbGlzdGVuZXI7CQotfQotcHVibGljIHZvaWQgcmVtb3ZlRmluZExpc3RlbmVyKEZpbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotCXRoaXMuZmluZEhhbmRsZXIgPSBudWxsOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvQnJvd3NlckV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL0Jyb3dzZXJFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYTdiY2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvQnJvd3NlckV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXJFeGFtcGxlIHsKLQlzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2Jyb3dzZXIiKTsKLQlpbnQgaW5kZXg7Ci0JYm9vbGVhbiBidXN5OwotCUltYWdlIGltYWdlc1tdOwotCUltYWdlIGljb24gPSBudWxsOwotCWJvb2xlYW4gdGl0bGUgPSBmYWxzZTsKLQlDb21wb3NpdGUgcGFyZW50OwotCVRleHQgbG9jYXRpb25CYXI7Ci0JQnJvd3NlciBicm93c2VyOwotCVRvb2xCYXIgdG9vbGJhcjsKLQlDYW52YXMgY2FudmFzOwotCVRvb2xJdGVtIGl0ZW1CYWNrLCBpdGVtRm9yd2FyZDsKLQlMYWJlbCBzdGF0dXM7Ci0JUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NCYXI7Ci0JU1dURXJyb3IgZXJyb3IgPSBudWxsOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIGltYWdlTG9jYXRpb25zID0gewotCQkJImVjbGlwc2UwMS5ibXAiLCAiZWNsaXBzZTAyLmJtcCIsICJlY2xpcHNlMDMuYm1wIiwgImVjbGlwc2UwNC5ibXAiLCAiZWNsaXBzZTA1LmJtcCIsCi0JCQkiZWNsaXBzZTA2LmJtcCIsICJlY2xpcHNlMDcuYm1wIiwgImVjbGlwc2UwOC5ibXAiLCAiZWNsaXBzZTA5LmJtcCIsICJlY2xpcHNlMTAuYm1wIiwKLQkJCSJlY2xpcHNlMTEuYm1wIiwgImVjbGlwc2UxMi5ibXAiLH07Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBpY29uTG9jYXRpb24gPSAiZG9jdW1lbnQuZ2lmIjsKLQkJCi0JcHVibGljIEJyb3dzZXJFeGFtcGxlKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gdG9wKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCWVycm9yID0gZTsKLQkJCS8qIEJyb3dzZXIgd2lkZ2V0IGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgKi8KLQkJCXBhcmVudC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5DRU5URVIgfCBTV1QuV1JBUCk7Ci0JCQlsYWJlbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJCcm93c2VyTm90Q3JlYXRlZCIpKTsKLQkJCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW5pdFJlc291cmNlcygpOwotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCQlicm93c2VyLnNldERhdGEoIm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZS5Ccm93c2VyQXBwbGljYXRpb24iLCB0aGlzKTsKLQkJYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJCQlpZiAoaWNvbiAhPSBudWxsKSBzaGVsbC5zZXRJbWFnZShpY29uKTsKLQkJCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQkJQnJvd3NlckV4YW1wbGUgYXBwID0gbmV3IEJyb3dzZXJFeGFtcGxlKHNoZWxsLCBmYWxzZSk7Ci0JCQkJYXBwLnNldFNoZWxsRGVjb3JhdGlvbihpY29uLCB0cnVlKTsKLQkJCQlldmVudC5icm93c2VyID0gYXBwLmdldEJyb3dzZXIoKTsKLQkJCX0KLQkJfSk7Ci0JCWlmICh0b3ApIHsKLQkJCWJyb3dzZXIuc2V0VXJsKGdldFJlc291cmNlU3RyaW5nKCJTdGFydHVwIikpOwotCQkJc2hvdyhmYWxzZSwgbnVsbCwgbnVsbCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlicm93c2VyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihuZXcgVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZSkgewotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBzaG93KFdpbmRvd0V2ZW50IGUpIHsKLQkJCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZS53aWRnZXQ7Ci0JCQkJCUJyb3dzZXJFeGFtcGxlIGFwcCA9IChCcm93c2VyRXhhbXBsZSlicm93c2VyLmdldERhdGEoIm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZS5Ccm93c2VyQXBwbGljYXRpb24iKTsKLQkJCQkJYXBwLnNob3codHJ1ZSwgZS5sb2NhdGlvbiwgZS5zaXplLCBlLmFkZHJlc3NCYXIsIGUubWVudUJhciwgZS5zdGF0dXNCYXIsIGUudG9vbEJhcik7Ci0JCQkJfQotCQkJfSk7Ci0JCQlicm93c2VyLmFkZENsb3NlV2luZG93TGlzdGVuZXIobmV3IENsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgY2xvc2UoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCQlTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhcgotCSAqIGluc3RhbmNlIG9mIHRoZSBCcm93c2VyQXBwbGljYXRpb24uCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZyZWVSZXNvdXJjZXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0JCi0JcHVibGljIFNXVEVycm9yIGdldEVycm9yKCkgeyByZXR1cm4gZXJyb3I7IH0KLQkKLQlwdWJsaWMgQnJvd3NlciBnZXRCcm93c2VyKCkgeyByZXR1cm4gYnJvd3NlcjsgfQotCQotCXB1YmxpYyB2b2lkIHNldFNoZWxsRGVjb3JhdGlvbihJbWFnZSBpY29uLCBib29sZWFuIHRpdGxlKSB7Ci0JCXRoaXMuaWNvbiA9IGljb247Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQl9Ci0JCi0Jdm9pZCBzaG93KGJvb2xlYW4gb3duZWQsIFBvaW50IGxvY2F0aW9uLCBQb2ludCBzaXplLCBib29sZWFuIGFkZHJlc3NCYXIsIGJvb2xlYW4gbWVudUJhciwgYm9vbGVhbiBzdGF0dXNCYXIsIGJvb2xlYW4gdG9vbEJhcikgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJaWYgKG93bmVkKSB7Ci0JCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgc2hlbGwuc2V0TG9jYXRpb24obG9jYXRpb24pOwotCQkJaWYgKHNpemUgIT0gbnVsbCkgc2hlbGwuc2V0U2l6ZShzaGVsbC5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSkpOwotCQl9Ci0JCUZvcm1EYXRhIGRhdGEgPSBudWxsOwotCQlpZiAodG9vbEJhcikgewotCQkJdG9vbGJhciA9IG5ldyBUb29sQmFyKHBhcmVudCwgU1dULk5PTkUpOwotCQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JCQl0b29sYmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlpdGVtQmFjayA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCQlpdGVtQmFjay5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJCYWNrIikpOwotCQkJaXRlbUZvcndhcmQgPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQkJaXRlbUZvcndhcmQuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiRm9yd2FyZCIpKTsKLQkJCWZpbmFsIFRvb2xJdGVtIGl0ZW1TdG9wID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJCWl0ZW1TdG9wLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlN0b3AiKSk7Ci0JCQlmaW5hbCBUb29sSXRlbSBpdGVtUmVmcmVzaCA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCQlpdGVtUmVmcmVzaC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJSZWZyZXNoIikpOwotCQkJZmluYWwgVG9vbEl0ZW0gaXRlbUdvID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJCWl0ZW1Hby5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJHbyIpKTsKLQkJCQotCQkJaXRlbUJhY2suc2V0RW5hYmxlZChicm93c2VyLmlzQmFja0VuYWJsZWQoKSk7Ci0JCQlpdGVtRm9yd2FyZC5zZXRFbmFibGVkKGJyb3dzZXIuaXNGb3J3YXJkRW5hYmxlZCgpKTsKLQkJCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCVRvb2xJdGVtIGl0ZW0gPSAoVG9vbEl0ZW0pZXZlbnQud2lkZ2V0OwotCQkJCQlpZiAoaXRlbSA9PSBpdGVtQmFjaykgYnJvd3Nlci5iYWNrKCk7IAotCQkJCQllbHNlIGlmIChpdGVtID09IGl0ZW1Gb3J3YXJkKSBicm93c2VyLmZvcndhcmQoKTsKLQkJCQkJZWxzZSBpZiAoaXRlbSA9PSBpdGVtU3RvcCkgYnJvd3Nlci5zdG9wKCk7Ci0JCQkJCWVsc2UgaWYgKGl0ZW0gPT0gaXRlbVJlZnJlc2gpIGJyb3dzZXIucmVmcmVzaCgpOwotCQkJCQllbHNlIGlmIChpdGVtID09IGl0ZW1HbykgYnJvd3Nlci5zZXRVcmwobG9jYXRpb25CYXIuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9OwotCQkJaXRlbUJhY2suYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQkJaXRlbUZvcndhcmQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQkJaXRlbVN0b3AuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQkJaXRlbVJlZnJlc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQkJaXRlbUdvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQotCQkJY2FudmFzID0gbmV3IENhbnZhcyhwYXJlbnQsIFNXVC5OT19CQUNLR1JPVU5EKTsKLQkJCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWRhdGEud2lkdGggPSAyNDsKLQkJCWRhdGEuaGVpZ2h0ID0gMjQ7Ci0JCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQkJCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNSk7Ci0JCQljYW52YXMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJZmluYWwgUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZXNbMF0uZ2V0Qm91bmRzKCk7Ci0JCQljYW52YXMuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlQb2ludCBwdCA9ICgoQ2FudmFzKWUud2lkZ2V0KS5nZXRTaXplKCk7Ci0JCQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlc1tpbmRleF0sIDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCAwLCAwLCBwdC54LCBwdC55KTsJCQkKLQkJCQl9Ci0JCQl9KTsKLQkJCWNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlicm93c2VyLnNldFVybChnZXRSZXNvdXJjZVN0cmluZygiU3RhcnR1cCIpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gcGFyZW50LmdldERpc3BsYXkoKTsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChjYW52YXMuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCWlmIChidXN5KSB7Ci0JCQkJCQlpbmRleCsrOwotCQkJCQkJaWYgKGluZGV4ID09IGltYWdlcy5sZW5ndGgpIGluZGV4ID0gMDsKLQkJCQkJCWNhbnZhcy5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCQlkaXNwbGF5LnRpbWVyRXhlYygxNTAsIHRoaXMpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWlmIChhZGRyZXNzQmFyKSB7Ci0JCQlsb2NhdGlvbkJhciA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlpZiAodG9vbGJhciAhPSBudWxsKSB7Ci0JCQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodG9vbGJhciwgMCwgU1dULlRPUCk7Ci0JCQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHRvb2xiYXIsIDUsIFNXVC5SSUdIVCk7Ci0JCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChjYW52YXMsIC01LCBTV1QuREVGQVVMVCk7CQkJCi0JCQl9IGVsc2UgewotCQkJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQkJCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CQkJCi0JCQl9Ci0JCQlsb2NhdGlvbkJhci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJbG9jYXRpb25CYXIuYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCWJyb3dzZXIuc2V0VXJsKGxvY2F0aW9uQmFyLmdldFRleHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKHN0YXR1c0JhcikgewotCQkJc3RhdHVzID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQkJcHJvZ3Jlc3NCYXIgPSBuZXcgUHJvZ3Jlc3NCYXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQkKLQkJCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQkJCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHJvZ3Jlc3NCYXIsIDAsIFNXVC5ERUZBVUxUKTsKLQkJCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCQkJc3RhdHVzLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNSk7Ci0JCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQkJCXByb2dyZXNzQmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJCWJyb3dzZXIuYWRkU3RhdHVzVGV4dExpc3RlbmVyKG5ldyBTdGF0dXNUZXh0TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJCQkJc3RhdHVzLnNldFRleHQoZXZlbnQudGV4dCk7CQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0KLQkJQ29udHJvbCBhYm92ZUJyb3dzZXIgPSB0b29sQmFyID8gKENvbnRyb2wpY2FudmFzIDogKGFkZHJlc3NCYXIgPyAoQ29udHJvbClsb2NhdGlvbkJhciA6IG51bGwpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBhYm92ZUJyb3dzZXIgIT0gbnVsbCA/IG5ldyBGb3JtQXR0YWNobWVudChhYm92ZUJyb3dzZXIsIDUsIFNXVC5ERUZBVUxUKSA6IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IHN0YXR1cyAhPSBudWxsID8gbmV3IEZvcm1BdHRhY2htZW50KHN0YXR1cywgLTUsIFNXVC5ERUZBVUxUKSA6IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlicm93c2VyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJaWYgKHN0YXR1c0JhciB8fCB0b29sQmFyKSB7Ci0JCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChldmVudC50b3RhbCA9PSAwKSByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQlpbnQgcmF0aW8gPSBldmVudC5jdXJyZW50ICogMTAwIC8gZXZlbnQudG90YWw7Ci0JCQkJCWlmIChwcm9ncmVzc0JhciAhPSBudWxsKSBwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24ocmF0aW8pOwotCQkJCQlidXN5ID0gZXZlbnQuY3VycmVudCAhPSBldmVudC50b3RhbDsKLQkJCQkJaWYgKCFidXN5KSB7Ci0JCQkJCQlpbmRleCA9IDA7Ci0JCQkJCQlpZiAoY2FudmFzICE9IG51bGwpIGNhbnZhcy5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCQlpZiAocHJvZ3Jlc3NCYXIgIT0gbnVsbCkgcHJvZ3Jlc3NCYXIuc2V0U2VsZWN0aW9uKDApOwotCQkJCQlidXN5ID0gZmFsc2U7Ci0JCQkJCWluZGV4ID0gMDsKLQkJCQkJaWYgKGNhbnZhcyAhPSBudWxsKSB7Ci0JCQkJCQlpdGVtQmFjay5zZXRFbmFibGVkKGJyb3dzZXIuaXNCYWNrRW5hYmxlZCgpKTsKLQkJCQkJCWl0ZW1Gb3J3YXJkLnNldEVuYWJsZWQoYnJvd3Nlci5pc0ZvcndhcmRFbmFibGVkKCkpOwotCQkJCQkJY2FudmFzLnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGFkZHJlc3NCYXIgfHwgc3RhdHVzQmFyIHx8IHRvb2xCYXIpIHsKLQkJCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJYnVzeSA9IHRydWU7Ci0JCQkJCWlmIChldmVudC50b3AgJiYgbG9jYXRpb25CYXIgIT0gbnVsbCkgbG9jYXRpb25CYXIuc2V0VGV4dChldmVudC5sb2NhdGlvbik7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAodGl0bGUpIHsKLQkJCWJyb3dzZXIuYWRkVGl0bGVMaXN0ZW5lcihuZXcgVGl0bGVMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFRpdGxlRXZlbnQgZXZlbnQpIHsKLQkJCQkJc2hlbGwuc2V0VGV4dChldmVudC50aXRsZSsiIC0gIitnZXRSZXNvdXJjZVN0cmluZygid2luZG93LnRpdGxlIikpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0JCWlmIChvd25lZCkgc2hlbGwub3BlbigpOwotCX0KLQotCS8qKgotCSAqIEdyYWJzIGlucHV0IGZvY3VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZvY3VzKCkgewotCQlpZiAobG9jYXRpb25CYXIgIT0gbnVsbCkgbG9jYXRpb25CYXIuc2V0Rm9jdXMoKTsKLQkJZWxzZSBpZiAoYnJvd3NlciAhPSBudWxsKSBicm93c2VyLnNldEZvY3VzKCk7Ci0JCWVsc2UgcGFyZW50LnNldEZvY3VzKCk7Ci0JfQotCQotCS8qKgotCSAqIEZyZWVzIHRoZSByZXNvdXJjZXMKLQkgKi8KLQl2b2lkIGZyZWVSZXNvdXJjZXMoKSB7Ci0JCWlmIChpbWFnZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyArK2kpIHsKLQkJCQlmaW5hbCBJbWFnZSBpbWFnZSA9IGltYWdlc1tpXTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQkJaW1hZ2VzID0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyB0aGUgcmVzb3VyY2VzCi0JICovCi0Jdm9pZCBpbml0UmVzb3VyY2VzKCkgewotCQlmaW5hbCBDbGFzcyBjbGF6eiA9IHRoaXMuZ2V0Q2xhc3MoKTsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGltYWdlcyA9PSBudWxsKSB7Ci0JCQkJCWltYWdlcyA9IG5ldyBJbWFnZVtpbWFnZUxvY2F0aW9ucy5sZW5ndGhdOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlTG9jYXRpb25zLmxlbmd0aDsgKytpKSB7Ci0JCQkJCQlJbnB1dFN0cmVhbSBzb3VyY2VTdHJlYW0gPSBjbGF6ei5nZXRSZXNvdXJjZUFzU3RyZWFtKGltYWdlTG9jYXRpb25zW2ldKTsKLQkJCQkJCUltYWdlRGF0YSBzb3VyY2UgPSBuZXcgSW1hZ2VEYXRhKHNvdXJjZVN0cmVhbSk7Ci0JCQkJCQlJbWFnZURhdGEgbWFzayA9IHNvdXJjZS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JCQkJCQlpbWFnZXNbaV0gPSBuZXcgSW1hZ2UobnVsbCwgc291cmNlLCBtYXNrKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJc291cmNlU3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UgKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCX0KLQkJfQotCQlTdHJpbmcgZXJyb3IgPSAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgPyBnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzIikgOiAiVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzIjsKLQkJZnJlZVJlc291cmNlcygpOwotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlcnJvcik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXNoZWxsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIndpbmRvdy50aXRsZSIpKTsKLQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gQnJvd3NlckV4YW1wbGUuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShpY29uTG9jYXRpb24pOwotCQlJbWFnZSBpY29uID0gbmV3IEltYWdlKGRpc3BsYXksIHN0cmVhbSk7Ci0JCXNoZWxsLnNldEltYWdlKGljb24pOwotCQl0cnkgewotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJQnJvd3NlckV4YW1wbGUgYXBwID0gbmV3IEJyb3dzZXJFeGFtcGxlKHNoZWxsLCB0cnVlKTsKLQkJYXBwLnNldFNoZWxsRGVjb3JhdGlvbihpY29uLCB0cnVlKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlpY29uLmRpc3Bvc2UoKTsKLQkJYXBwLmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZG9jdW1lbnQuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZG9jdW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVlMjIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2RvY3VtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwMS5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDEuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzExNmU2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwMS5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDIuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTAyLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiMDRlZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDIuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTAzLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwMy5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYzdiMTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTAzLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNC5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTQwNjU0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDUuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA1LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U0NWE5OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDUuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA2LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNi5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYTg4OGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA2LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNy5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDcuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGUyMjIyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNy5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDguYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA4LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFhYzI5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDguYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA5LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwOS5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MWY4MzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA5LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UxMC5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMTAuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWU3OWIyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UxMC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMTEuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTExLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBjMjRhNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMTEuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTEyLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UxMi5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYWU3MWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTEyLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9DbGlwYm9hcmRFeGFtcGxlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jbGlwYm9hcmQvQ2xpcGJvYXJkRXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmZkYzc2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9DbGlwYm9hcmRFeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jbGlwYm9hcmQ7Ci0gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBDbGlwYm9hcmRFeGFtcGxlIHsKLQotCUNsaXBib2FyZCBjbGlwYm9hcmQ7Ci0JU2hlbGwgc2hlbGw7Ci0JVGV4dCBjb3B5VGV4dDsKLQlUZXh0IHBhc3RlVGV4dDsKLQlUZXh0IGNvcHlSdGZUZXh0OwotCVRleHQgcGFzdGVSdGZUZXh0OwotCVRleHQgY29weUh0bWxUZXh0OwotCVRleHQgcGFzdGVIdG1sVGV4dDsKLQlUYWJsZSBjb3B5RmlsZVRhYmxlOwotCVRhYmxlIHBhc3RlRmlsZVRhYmxlOwotCVRleHQgdGV4dDsKLQlDb21ibyBjb21ibzsKLQlTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0JTGFiZWwgc3RhdHVzOwotCXN0YXRpYyBmaW5hbCBpbnQgU0laRSA9IDYwOwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCW5ldyBDbGlwYm9hcmRFeGFtcGxlKCkub3BlbihkaXNwbGF5KTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLXB1YmxpYyB2b2lkIG9wZW4oRGlzcGxheSBkaXNwbGF5KSB7Ci0JY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChkaXNwbGF5KTsKLQlzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiU1dUIENsaXBib2FyZCIpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkKLQlTY3JvbGxlZENvbXBvc2l0ZSBzYyA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShzaGVsbCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShzYywgU1dULk5PTkUpOwotCXNjLnNldENvbnRlbnQocGFyZW50KTsKLQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkKLQlHcm91cCBjb3B5R3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29weUdyb3VwLnNldFRleHQoIkNvcHkgRnJvbToiKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JY29weUdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JY29weUdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQotCUdyb3VwIHBhc3RlR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JcGFzdGVHcm91cC5zZXRUZXh0KCJQYXN0ZSBUbzoiKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JcGFzdGVHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCXBhc3RlR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCi0JR3JvdXAgY29udHJvbEdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbnRyb2xHcm91cC5zZXRUZXh0KCJDb250cm9sIEFQSToiKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JY29udHJvbEdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JY29udHJvbEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCg1LCBmYWxzZSkpOwotCQotCUdyb3VwIHR5cGVzR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JdHlwZXNHcm91cC5zZXRUZXh0KCJBdmFpbGFibGUgVHlwZXMiKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JdHlwZXNHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCXR5cGVzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0Jc3RhdHVzID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCWRhdGEuaGVpZ2h0SGludCA9IDYwOwotCXN0YXR1cy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWNyZWF0ZVRleHRUcmFuc2Zlcihjb3B5R3JvdXAsIHBhc3RlR3JvdXApOwotCWNyZWF0ZVJURlRyYW5zZmVyKGNvcHlHcm91cCwgcGFzdGVHcm91cCk7Ci0JY3JlYXRlSFRNTFRyYW5zZmVyKGNvcHlHcm91cCwgcGFzdGVHcm91cCk7Ci0JY3JlYXRlRmlsZVRyYW5zZmVyKGNvcHlHcm91cCwgcGFzdGVHcm91cCk7Ci0JY3JlYXRlTXlUcmFuc2Zlcihjb3B5R3JvdXAsIHBhc3RlR3JvdXApOwotCWNyZWF0ZUNvbnRyb2xUcmFuc2Zlcihjb250cm9sR3JvdXApOwotCWNyZWF0ZUF2YWlsYWJsZVR5cGVzKHR5cGVzR3JvdXApOwotCQotCXNjLnNldE1pblNpemUocGFyZW50LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOwotCXNjLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0Jc2Muc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0JCi0JUG9pbnQgc2l6ZSA9IHNoZWxsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JUmVjdGFuZ2xlIG1vbml0b3JBcmVhID0gc2hlbGwuZ2V0TW9uaXRvcigpLmdldENsaWVudEFyZWEoKTsKLQlzaGVsbC5zZXRTaXplKE1hdGgubWluKHNpemUueCwgbW9uaXRvckFyZWEud2lkdGggLSAyMCksIE1hdGgubWluKHNpemUueSwgbW9uaXRvckFyZWEuaGVpZ2h0IC0gMjApKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci19Ci12b2lkIGNyZWF0ZVRleHRUcmFuc2ZlcihDb21wb3NpdGUgY29weVBhcmVudCwgQ29tcG9zaXRlIHBhc3RlUGFyZW50KSB7Ci0JCi0JLy8gVGV4dFRyYW5zZmVyCi0JTGFiZWwgbCA9IG5ldyBMYWJlbChjb3B5UGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJUZXh0VHJhbnNmZXI6Iik7IC8vJE5PTi1OTFMtMSQKLQljb3B5VGV4dCA9IG5ldyBUZXh0KGNvcHlQYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWNvcHlUZXh0LnNldFRleHQoInNvbWVcbnBsYWluXG50ZXh0Iik7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU0laRTsKLQljb3B5VGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjb3B5UGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDb3B5Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3RyaW5nIGRhdGEgPSBjb3B5VGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7Ci0JCQkJY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBPYmplY3RbXSB7ZGF0YX0sIG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCQkJfSBlbHNlIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgibm90aGluZyB0byBjb3B5Iik7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlsID0gbmV3IExhYmVsKHBhc3RlUGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJUZXh0VHJhbnNmZXI6Iik7IC8vJE5PTi1OTFMtMSQKLQlwYXN0ZVRleHQgPSBuZXcgVGV4dChwYXN0ZVBhcmVudCwgU1dULlJFQURfT05MWSB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBkYXRhLndpZHRoSGludCA9IFNJWkU7Ci0JcGFzdGVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFzdGVQYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlBhc3RlIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3RyaW5nIGRhdGEgPSAoU3RyaW5nKWNsaXBib2FyZC5nZXRDb250ZW50cyhUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIiIpOwotCQkJCXBhc3RlVGV4dC5zZXRUZXh0KCJiZWdpbiBwYXN0ZT4iK2RhdGErIjxlbmQgcGFzdGUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gcGFzdGUiKTsKLQkJCX0KLQkJfQotCX0pOwotfQotdm9pZCBjcmVhdGVSVEZUcmFuc2ZlcihDb21wb3NpdGUgY29weVBhcmVudCwgQ29tcG9zaXRlIHBhc3RlUGFyZW50KXsKLQkvLwlSVEYgVHJhbnNmZXIKLQlMYWJlbCBsID0gbmV3IExhYmVsKGNvcHlQYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIlJURlRyYW5zZmVyOiIpOyAvLyROT04tTkxTLTEkCi0JY29weVJ0ZlRleHQgPSBuZXcgVGV4dChjb3B5UGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQljb3B5UnRmVGV4dC5zZXRUZXh0KCJzb21lXG5ydGZcbnRleHQiKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCWNvcHlSdGZUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKGNvcHlQYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkNvcHkiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgZGF0YSA9IGNvcHlSdGZUZXh0LmdldFRleHQoKTsKLQkJCWlmIChkYXRhLmxlbmd0aCgpID4gMCkgewotCQkJCXN0YXR1cy5zZXRUZXh0KCIiKTsKLQkJCQlkYXRhID0gIntcXHJ0ZjF7XFxjb2xvcnRibDtcXHJlZDI1NVxcZ3JlZW4wXFxibHVlMDt9XFx1YzFcXGJcXGkgIiArIGRhdGEgKyAifSI7Ci0JCQkJY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBPYmplY3RbXSB7ZGF0YX0sIG5ldyBUcmFuc2ZlcltdIHtSVEZUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXR1cy5zZXRUZXh0KCJub3RoaW5nIHRvIGNvcHkiKTsKLQkJCX0KLQkJfQotCX0pOwotCSAgCi0JbCA9IG5ldyBMYWJlbChwYXN0ZVBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiUlRGVHJhbnNmZXI6Iik7IC8vJE5PTi1OTFMtMSQKLQlwYXN0ZVJ0ZlRleHQgPSBuZXcgVGV4dChwYXN0ZVBhcmVudCwgU1dULlJFQURfT05MWSB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBkYXRhLndpZHRoSGludCA9IFNJWkU7Ci0JcGFzdGVSdGZUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFzdGVQYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlBhc3RlIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3RyaW5nIGRhdGEgPSAoU3RyaW5nKWNsaXBib2FyZC5nZXRDb250ZW50cyhSVEZUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7Ci0JCQkJcGFzdGVSdGZUZXh0LnNldFRleHQoInN0YXJ0IHBhc3RlPiIrZGF0YSsiPGVuZCBwYXN0ZSIpOwotCQkJfSBlbHNlIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgibm90aGluZyB0byBwYXN0ZSIpOwotCQkJfQotCQl9Ci0JfSk7Ci19Ci12b2lkIGNyZWF0ZUhUTUxUcmFuc2ZlcihDb21wb3NpdGUgY29weVBhcmVudCwgQ29tcG9zaXRlIHBhc3RlUGFyZW50KXsKLQkvLwlIVE1MIFRyYW5zZmVyCi0JTGFiZWwgbCA9IG5ldyBMYWJlbChjb3B5UGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJIVE1MVHJhbnNmZXI6Iik7IC8vJE5PTi1OTFMtMSQKLQljb3B5SHRtbFRleHQgPSBuZXcgVGV4dChjb3B5UGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQljb3B5SHRtbFRleHQuc2V0VGV4dCgiPGI+SGVsbG8gV29ybGQ8L2I+Iik7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU0laRTsKLQljb3B5SHRtbFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oY29weVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ29weSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBkYXRhID0gY29weUh0bWxUZXh0LmdldFRleHQoKTsKLQkJCWlmIChkYXRhLmxlbmd0aCgpID4gMCkgewotCQkJCXN0YXR1cy5zZXRUZXh0KCIiKTsKLQkJCQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IE9iamVjdFtdIHtkYXRhfSwgbmV3IFRyYW5zZmVyW10ge0hUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXR1cy5zZXRUZXh0KCJub3RoaW5nIHRvIGNvcHkiKTsKLQkJCX0KLQkJfQotCX0pOwotCSAgCi0JbCA9IG5ldyBMYWJlbChwYXN0ZVBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiSFRNTFRyYW5zZmVyOiIpOyAvLyROT04tTkxTLTEkCi0JcGFzdGVIdG1sVGV4dCA9IG5ldyBUZXh0KHBhc3RlUGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU0laRTsKLQlwYXN0ZUh0bWxUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFzdGVQYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlBhc3RlIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3RyaW5nIGRhdGEgPSAoU3RyaW5nKWNsaXBib2FyZC5nZXRDb250ZW50cyhIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIiIpOwotCQkJCXBhc3RlSHRtbFRleHQuc2V0VGV4dCgic3RhcnQgcGFzdGU+IitkYXRhKyI8ZW5kIHBhc3RlIik7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXR1cy5zZXRUZXh0KCJub3RoaW5nIHRvIHBhc3RlIik7Ci0JCQl9Ci0JCX0KLQl9KTsKLX0KLXZvaWQgY3JlYXRlRmlsZVRyYW5zZmVyKENvbXBvc2l0ZSBjb3B5UGFyZW50LCBDb21wb3NpdGUgcGFzdGVQYXJlbnQpewotCS8vRmlsZSBUcmFuc2ZlcgotCUxhYmVsIGwgPSBuZXcgTGFiZWwoY29weVBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiRmlsZVRyYW5zZmVyOiIpOyAvLyROT04tTkxTLTEkCi0JCi0JQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKGNvcHlQYXJlbnQsIFNXVC5OT05FKTsKLQljLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQljLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JY29weUZpbGVUYWJsZSA9IG5ldyBUYWJsZShjLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCWNvcHlGaWxlVGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oYywgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiU2VsZWN0IGZpbGUocykiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTiB8IFNXVC5NVUxUSSk7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoKCkgPiAwKXsKLQkJCQkvL2NvcHlGaWxlVGFibGUucmVtb3ZlQWxsKCk7Ci0JCQkJU3RyaW5nIHNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKTsKLQkJCQlTdHJpbmcgcGF0aCA9IGRpYWxvZy5nZXRGaWx0ZXJQYXRoKCk7Ci0JCQkJU3RyaW5nW10gbmFtZXMgPSBkaWFsb2cuZ2V0RmlsZU5hbWVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29weUZpbGVUYWJsZSwgU1dULk5PTkUpOwotCQkJCQlpdGVtLnNldFRleHQocGF0aCtzZXBhcmF0b3IrbmFtZXNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCWIgPSBuZXcgQnV0dG9uKGMsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlNlbGVjdCBkaXJlY3RvcnkiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzaGVsbCwgU1dULk9QRU4pOwotCQkJU3RyaW5nIHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0Lmxlbmd0aCgpID4gMCl7Ci0JCQkJLy9jb3B5RmlsZVRhYmxlLnJlbW92ZUFsbCgpOwotCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShjb3B5RmlsZVRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJaXRlbS5zZXRUZXh0KHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQliID0gbmV3IEJ1dHRvbihjb3B5UGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDb3B5Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSBjb3B5RmlsZVRhYmxlLmdldEl0ZW1zKCk7Ci0JCQlpZiAoaXRlbXMubGVuZ3RoID4gMCl7Ci0JCQkJc3RhdHVzLnNldFRleHQoIiIpOwotCQkJCVN0cmluZ1tdIGRhdGEgPSBuZXcgU3RyaW5nW2l0ZW1zLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWRhdGFbaV0gPSBpdGVtc1tpXS5nZXRUZXh0KCk7Ci0JCQkJfQotCQkJCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10ge2RhdGF9LCBuZXcgVHJhbnNmZXJbXSB7RmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gY29weSIpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JbCA9IG5ldyBMYWJlbChwYXN0ZVBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiRmlsZVRyYW5zZmVyOiIpOyAvLyROT04tTkxTLTEkCi0JcGFzdGVGaWxlVGFibGUgPSBuZXcgVGFibGUocGFzdGVQYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBkYXRhLndpZHRoSGludCA9IFNJWkU7Ci0JcGFzdGVGaWxlVGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQliID0gbmV3IEJ1dHRvbihwYXN0ZVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUGFzdGUiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmdbXSBkYXRhID0gKFN0cmluZ1tdKWNsaXBib2FyZC5nZXRDb250ZW50cyhGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoID4gMCkgewotCQkJCXN0YXR1cy5zZXRUZXh0KCIiKTsKLQkJCQlwYXN0ZUZpbGVUYWJsZS5yZW1vdmVBbGwoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLQkJCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHBhc3RlRmlsZVRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJCWl0ZW0uc2V0VGV4dChkYXRhW2ldKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXN0YXR1cy5zZXRUZXh0KCJub3RoaW5nIHRvIHBhc3RlIik7Ci0JCQl9Ci0JCX0KLQl9KTsJIAotfQotdm9pZCBjcmVhdGVNeVRyYW5zZmVyKENvbXBvc2l0ZSBjb3B5UGFyZW50LCBDb21wb3NpdGUgcGFzdGVQYXJlbnQpewotCS8vCU15VHlwZSBUcmFuc2ZlcgotCS8vIFRPRE8KLX0KLXZvaWQgY3JlYXRlQ29udHJvbFRyYW5zZmVyKENvbXBvc2l0ZSBwYXJlbnQpewotCUxhYmVsIGwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJUZXh0OiIpOwotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkN1dCIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXRleHQuY3V0KCk7Ci0JCX0KLQl9KTsKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkNvcHkiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl0ZXh0LmNvcHkoKTsKLQkJfQotCX0pOwotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUGFzdGUiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl0ZXh0LnBhc3RlKCk7Ci0JCX0KLQl9KTsKLQl0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiQ29tYm86Iik7Ci0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDdXQiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQljb21iby5jdXQoKTsKLQkJfQotCX0pOwotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ29weSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWNvbWJvLmNvcHkoKTsKLQkJfQotCX0pOwotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUGFzdGUiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQljb21iby5wYXN0ZSgpOwotCQl9Ci0JfSk7Ci0JY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1tdIHsiSXRlbSAxIiwgIkl0ZW0gMiIsICJJdGVtIDMiLCAiQSBsb25nZXIgSXRlbSJ9KTsKLQkKLQlsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiU3R5bGVkVGV4dDoiKTsKLQlsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDb3B5Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc3R5bGVkVGV4dC5jb3B5KCk7Ci0JCX0KLQl9KTsKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlBhc3RlIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc3R5bGVkVGV4dC5wYXN0ZSgpOwotCQl9Ci0JfSk7Ci0Jc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU0laRTsKLQlzdHlsZWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci19Ci12b2lkIGNyZWF0ZUF2YWlsYWJsZVR5cGVzKENvbXBvc2l0ZSBwYXJlbnQpewotCWZpbmFsIExpc3QgbGlzdCA9IG5ldyBMaXN0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCWRhdGEuaGVpZ2h0SGludCA9IDEwMDsKLQlsaXN0LnNldExheW91dERhdGEoZGF0YSk7Ci0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiR2V0IEF2YWlsYWJsZSBUeXBlcyIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWxpc3QucmVtb3ZlQWxsKCk7Ci0JCQlTdHJpbmdbXSBuYW1lcyA9IGNsaXBib2FyZC5nZXRBdmFpbGFibGVUeXBlTmFtZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlsaXN0LmFkZChuYW1lc1tpXSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jbGlwYm9hcmQvTXlUeXBlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jbGlwYm9hcmQvTXlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0Y2RmY2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY2xpcGJvYXJkL015VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jbGlwYm9hcmQ7Ci0KLXB1YmxpYyBjbGFzcyBNeVR5cGUgewotCVN0cmluZyBmaXJzdE5hbWU7Ci0JU3RyaW5nIGxhc3ROYW1lOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY2xpcGJvYXJkL015VHlwZVRyYW5zZmVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jbGlwYm9hcmQvTXlUeXBlVHJhbnNmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQwOWUzZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jbGlwYm9hcmQvTXlUeXBlVHJhbnNmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNsaXBib2FyZDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci0KLXB1YmxpYyBjbGFzcyBNeVR5cGVUcmFuc2ZlciBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVlUWVBFTkFNRSA9ICJuYW1lX2xpc3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1ZVFlQRUlEID0gcmVnaXN0ZXJUeXBlKE1ZVFlQRU5BTUUpOwotCXByaXZhdGUgc3RhdGljIE15VHlwZVRyYW5zZmVyIF9pbnN0YW5jZSA9IG5ldyBNeVR5cGVUcmFuc2ZlcigpOwotCQotcHVibGljIHN0YXRpYyBNeVR5cGVUcmFuc2ZlciBnZXRJbnN0YW5jZSAoKSB7Ci0JcmV0dXJuIF9pbnN0YW5jZTsKLX0KLXB1YmxpYyB2b2lkIGphdmFUb05hdGl2ZSAoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCWlmICghY2hlY2tNeVR5cGUob2JqZWN0KSB8fCAhaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyRGF0YSkpIHsKLQkJRE5ELmVycm9yKERORC5FUlJPUl9JTlZBTElEX0RBVEEpOwotCX0KLQlNeVR5cGVbXSBteVR5cGVzID0gKE15VHlwZVtdKSBvYmplY3Q7CQotCXRyeSB7Ci0JCS8vIHdyaXRlIGRhdGEgdG8gYSBieXRlIGFycmF5IGFuZCB0aGVuIGFzayBzdXBlciB0byBjb252ZXJ0IHRvIHBNZWRpdW0KLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJRGF0YU91dHB1dFN0cmVhbSB3cml0ZU91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG91dCk7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBteVR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgIGkrKyl7Ci0JCQlieXRlW10gYnVmZmVyID0gbXlUeXBlc1tpXS5maXJzdE5hbWUuZ2V0Qnl0ZXMoKTsKLQkJCXdyaXRlT3V0LndyaXRlSW50KGJ1ZmZlci5sZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGUoYnVmZmVyKTsKLQkJCWJ1ZmZlciA9IG15VHlwZXNbaV0uZmlyc3ROYW1lLmdldEJ5dGVzKCk7Ci0JCQl3cml0ZU91dC53cml0ZUludChidWZmZXIubGVuZ3RoKTsKLQkJCXdyaXRlT3V0LndyaXRlKGJ1ZmZlcik7Ci0JCX0KLQkJYnl0ZVtdIGJ1ZmZlciA9IG91dC50b0J5dGVBcnJheSgpOwotCQl3cml0ZU91dC5jbG9zZSgpOwotCQlzdXBlci5qYXZhVG9OYXRpdmUoYnVmZmVyLCB0cmFuc2ZlckRhdGEpOwkKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JfQotfQotcHVibGljIE9iamVjdCBuYXRpdmVUb0phdmEoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSl7CQotCWlmIChpc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSkgewotCQkKLQkJYnl0ZVtdIGJ1ZmZlciA9IChieXRlW10pc3VwZXIubmF0aXZlVG9KYXZhKHRyYW5zZmVyRGF0YSk7Ci0JCWlmIChidWZmZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQotCQlNeVR5cGVbXSBteURhdGEgPSBuZXcgTXlUeXBlWzBdOwotCQl0cnkgewotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyKTsKLQkJCURhdGFJbnB1dFN0cmVhbSByZWFkSW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKGluKTsKLQkJCXdoaWxlKHJlYWRJbi5hdmFpbGFibGUoKSA+IDIwKSB7Ci0JCQkJTXlUeXBlIGRhdHVtID0gbmV3IE15VHlwZSgpOwotCQkJCWludCBzaXplID0gcmVhZEluLnJlYWRJbnQoKTsKLQkJCQlieXRlW10gbmFtZSA9IG5ldyBieXRlW3NpemVdOwotCQkJCXJlYWRJbi5yZWFkKG5hbWUpOwotCQkJCWRhdHVtLmZpcnN0TmFtZSA9IG5ldyBTdHJpbmcobmFtZSk7Ci0JCQkJc2l6ZSA9IHJlYWRJbi5yZWFkSW50KCk7Ci0JCQkJbmFtZSA9IG5ldyBieXRlW3NpemVdOwotCQkJCXJlYWRJbi5yZWFkKG5hbWUpOwotCQkJCWRhdHVtLmxhc3ROYW1lID0gbmV3IFN0cmluZyhuYW1lKTsKLQkJCQlNeVR5cGVbXSBuZXdNeURhdGEgPSBuZXcgTXlUeXBlW215RGF0YS5sZW5ndGggKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KG15RGF0YSwgMCwgbmV3TXlEYXRhLCAwLCBteURhdGEubGVuZ3RoKTsKLQkJCQluZXdNeURhdGFbbXlEYXRhLmxlbmd0aF0gPSBkYXR1bTsKLQkJCQlteURhdGEgPSBuZXdNeURhdGE7Ci0JCQl9Ci0JCQlyZWFkSW4uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBteURhdGE7Ci0JfQotCi0JcmV0dXJuIG51bGw7Ci19Ci1wcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZU5hbWVzKCl7Ci0JcmV0dXJuIG5ldyBTdHJpbmdbXXtNWVRZUEVOQU1FfTsKLX0KLXByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCl7Ci0JcmV0dXJuIG5ldyBpbnRbXSB7TVlUWVBFSUR9OwotfQotYm9vbGVhbiBjaGVja015VHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JaWYgKG9iamVjdCA9PSBudWxsIHx8ICEob2JqZWN0IGluc3RhbmNlb2YgTXlUeXBlW10pIHx8ICgoTXlUeXBlW10pb2JqZWN0KS5sZW5ndGggPT0gMCkgcmV0dXJuIGZhbHNlOwotCU15VHlwZVtdIG15VHlwZXMgPSAoTXlUeXBlW10pb2JqZWN0OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbXlUeXBlcy5sZW5ndGg7IGkrKykgewotCQlpZiAobXlUeXBlc1tpXSA9PSBudWxsIHx8IAotCQkJbXlUeXBlc1tpXS5maXJzdE5hbWUgPT0gbnVsbCB8fCAKLQkJCW15VHlwZXNbaV0uZmlyc3ROYW1lLmxlbmd0aCgpID09IDAgfHwKLQkJCW15VHlwZXNbaV0ubGFzdE5hbWUgPT0gbnVsbCB8fAotCQkJbXlUeXBlc1tpXS5sYXN0TmFtZS5sZW5ndGgoKSA9PSAwKSByZXR1cm4gZmFsc2U7Ci0JfQotCXJldHVybiB0cnVlOwotfQotcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoT2JqZWN0IG9iamVjdCkgewotCXJldHVybiBjaGVja015VHlwZShvYmplY3QpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQWxpZ25hYmxlVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9BbGlnbmFibGVUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWMxOTFmZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9BbGlnbmFibGVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotLyoqCi0gKiA8Y29kZT5BbGlnbmFibGVUYWI8L2NvZGU+IGlzIHRoZSBhYnN0cmFjdAotICogc3VwZXJjbGFzcyBvZiBleGFtcGxlIGNvbnRyb2xzIHRoYXQgY2FuIGJlCi0gKiBhbGlnbmVkLgotICovCi1hYnN0cmFjdCBjbGFzcyBBbGlnbmFibGVUYWIgZXh0ZW5kcyBUYWIgewotCi0JLyogQWxpZ25tZW50IENvbnRyb2xzICovCi0JQnV0dG9uIGxlZnRCdXR0b24sIHJpZ2h0QnV0dG9uLCBjZW50ZXJCdXR0b247Ci0KLQkvKiBBbGlnbm1lbnQgR3JvdXAgKi8KLQlHcm91cCBhbGlnbm1lbnRHcm91cDsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlBbGlnbmFibGVUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiBncm91cC4gCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCWFsaWdubWVudEdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJYWxpZ25tZW50R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWFsaWdubWVudEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfAotCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlhbGlnbm1lbnRHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQWxpZ25tZW50IikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGNvbnRyb2xzICovCi0JCWxlZnRCdXR0b24gPSBuZXcgQnV0dG9uIChhbGlnbm1lbnRHcm91cCwgU1dULlJBRElPKTsKLQkJbGVmdEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGVmdCIpKTsKLQkJY2VudGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoYWxpZ25tZW50R3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNlbnRlckJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDZW50ZXIiKSk7Ci0JCXJpZ2h0QnV0dG9uID0gbmV3IEJ1dHRvbiAoYWxpZ25tZW50R3JvdXAsIFNXVC5SQURJTyk7Ci0JCXJpZ2h0QnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSaWdodCIpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmICghKChCdXR0b24pIGV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uICgpKSByZXR1cm47Ci0JCQkJc2V0RXhhbXBsZVdpZGdldEFsaWdubWVudCAoKTsKLQkJCX0KLQkJfTsKLQkJbGVmdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQljZW50ZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJcmlnaHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIHNldEV4YW1wbGVXaWRnZXRBbGlnbm1lbnQgKCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCWlmIChjb250cm9scy5sZW5ndGggIT0gMCkgewotCQkJbGVmdEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb250cm9scyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuTEVGVCkgIT0gMCk7Ci0JCQljZW50ZXJCdXR0b24uc2V0U2VsZWN0aW9uICgoY29udHJvbHMgWzBdLmdldFN0eWxlICgpICYgU1dULkNFTlRFUikgIT0gMCk7Ci0JCQlyaWdodEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb250cm9scyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuUklHSFQpICE9IDApOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQnV0dG9uVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9CdXR0b25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTRlNmRkNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9CdXR0b25UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLS8qKgotICogPGNvZGU+QnV0dG9uVGFiPC9jb2RlPiBpcyB0aGUgY2xhc3MgdGhhdAotICogZGVtb25zdHJhdGVzIFNXVCBidXR0b25zLgotICovCi1jbGFzcyBCdXR0b25UYWIgZXh0ZW5kcyBBbGlnbmFibGVUYWIgewotCi0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlCdXR0b24gYnV0dG9uMSwgYnV0dG9uMiwgYnV0dG9uMywgYnV0dG9uNCwgYnV0dG9uNSwgYnV0dG9uNiwgYnV0dG9uNywgYnV0dG9uOCwgYnV0dG9uOTsKLQlHcm91cCB0ZXh0QnV0dG9uR3JvdXAsIGltYWdlQnV0dG9uR3JvdXAsIGltYWdldGV4dEJ1dHRvbkdyb3VwOwotCi0JLyogQWxpZ25tZW50IHdpZGdldHMgYWRkZWQgdG8gdGhlICJDb250cm9sIiBncm91cCAqLwotCUJ1dHRvbiB1cEJ1dHRvbiwgZG93bkJ1dHRvbjsKLQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gcHVzaEJ1dHRvbiwgY2hlY2tCdXR0b24sIHJhZGlvQnV0dG9uLCB0b2dnbGVCdXR0b24sIGFycm93QnV0dG9uLCBmbGF0QnV0dG9uOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlCdXR0b25UYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgZ3JvdXAuIAotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbEdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbEdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGNvbnRyb2xzICovCi0JCXVwQnV0dG9uID0gbmV3IEJ1dHRvbiAoYWxpZ25tZW50R3JvdXAsIFNXVC5SQURJTyk7Ci0JCXVwQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJVcCIpKTsKLQkJZG93bkJ1dHRvbiA9IG5ldyBCdXR0b24gKGFsaWdubWVudEdyb3VwLCBTV1QuUkFESU8pOwotCQlkb3duQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEb3duIikpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoISgoQnV0dG9uKSBldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbigpKSByZXR1cm47Ci0JCQkJc2V0RXhhbXBsZVdpZGdldEFsaWdubWVudCAoKTsKLQkJCX0KLQkJfTsKLQkJdXBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlkb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRleHQgYnV0dG9ucyAqLwotCQl0ZXh0QnV0dG9uR3JvdXAgPSBuZXcgR3JvdXAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQl0ZXh0QnV0dG9uR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQl0ZXh0QnV0dG9uR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJdGV4dEJ1dHRvbkdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUZXh0X0J1dHRvbnMiKSk7Ci0JCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgaW1hZ2UgYnV0dG9ucyAqLwotCQlpbWFnZUJ1dHRvbkdyb3VwID0gbmV3IEdyb3VwKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaW1hZ2VCdXR0b25Hcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWltYWdlQnV0dG9uR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJaW1hZ2VCdXR0b25Hcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2VfQnV0dG9ucyIpKTsKLQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGltYWdlIGFuZCB0ZXh0IGJ1dHRvbnMgKi8KLQkJaW1hZ2V0ZXh0QnV0dG9uR3JvdXAgPSBuZXcgR3JvdXAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlpbWFnZXRleHRCdXR0b25Hcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWltYWdldGV4dEJ1dHRvbkdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWltYWdldGV4dEJ1dHRvbkdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbWFnZV9UZXh0X0J1dHRvbnMiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChwdXNoQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuUFVTSDsKLQkJaWYgKGNoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuQ0hFQ0s7Ci0JCWlmIChyYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlJBRElPOwotCQlpZiAodG9nZ2xlQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuVE9HR0xFOwotCQlpZiAoZmxhdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkZMQVQ7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmIChsZWZ0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuTEVGVDsKLQkJaWYgKHJpZ2h0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuUklHSFQ7Ci0JCWlmIChhcnJvd0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJc3R5bGUgfD0gU1dULkFSUk9XOyAKLQkJCWlmICh1cEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlVQOwotCQkJaWYgKGRvd25CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5ET1dOOwotCQl9IGVsc2UgewotCQkJaWYgKGNlbnRlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkNFTlRFUjsJCQkKLQkJfQotCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQlidXR0b24xID0gbmV3IEJ1dHRvbih0ZXh0QnV0dG9uR3JvdXAsIHN0eWxlKTsKLQkJYnV0dG9uMS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPbmUiKSk7Ci0JCWJ1dHRvbjIgPSBuZXcgQnV0dG9uKHRleHRCdXR0b25Hcm91cCwgc3R5bGUpOwotCQlidXR0b24yLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlR3byIpKTsKLQkJYnV0dG9uMyA9IG5ldyBCdXR0b24odGV4dEJ1dHRvbkdyb3VwLCBzdHlsZSk7Ci0JCWJ1dHRvbjMuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGhyZWUiKSk7Ci0JCWJ1dHRvbjQgPSBuZXcgQnV0dG9uKGltYWdlQnV0dG9uR3JvdXAsIHN0eWxlKTsKLQkJYnV0dG9uNC5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJYnV0dG9uNSA9IG5ldyBCdXR0b24oaW1hZ2VCdXR0b25Hcm91cCwgc3R5bGUpOwotCQlidXR0b241LnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJYnV0dG9uNiA9IG5ldyBCdXR0b24oaW1hZ2VCdXR0b25Hcm91cCwgc3R5bGUpOwotCQlidXR0b242LnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaVRhcmdldF0pOwotCQlidXR0b243ID0gbmV3IEJ1dHRvbihpbWFnZXRleHRCdXR0b25Hcm91cCwgc3R5bGUpOwotCQlidXR0b243LnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk9uZSIpKTsKLQkJYnV0dG9uNy5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJYnV0dG9uOCA9IG5ldyBCdXR0b24oaW1hZ2V0ZXh0QnV0dG9uR3JvdXAsIHN0eWxlKTsKLQkJYnV0dG9uOC5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUd28iKSk7Ci0JCWJ1dHRvbjguc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlidXR0b245ID0gbmV3IEJ1dHRvbihpbWFnZXRleHRCdXR0b25Hcm91cCwgc3R5bGUpOwotCQlidXR0b245LnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRocmVlIikpOwotCQlidXR0b245LnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaVRhcmdldF0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXB1c2hCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlwdXNoQnV0dG9uLnNldFRleHQoIlNXVC5QVVNIIik7Ci0JCWNoZWNrQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJY2hlY2tCdXR0b24uc2V0VGV4dCAoIlNXVC5DSEVDSyIpOwotCQlyYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXJhZGlvQnV0dG9uLnNldFRleHQgKCJTV1QuUkFESU8iKTsKLQkJdG9nZ2xlQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJdG9nZ2xlQnV0dG9uLnNldFRleHQgKCJTV1QuVE9HR0xFIik7Ci0JCWFycm93QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJYXJyb3dCdXR0b24uc2V0VGV4dCAoIlNXVC5BUlJPVyIpOwotCQlmbGF0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJZmxhdEJ1dHRvbi5zZXRUZXh0ICgiU1dULkZMQVQiKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbXSB7YnV0dG9uMSwgYnV0dG9uMiwgYnV0dG9uMywgYnV0dG9uNCwgYnV0dG9uNSwgYnV0dG9uNiwgYnV0dG9uNywgYnV0dG9uOCwgYnV0dG9uOX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiU2VsZWN0aW9uIiwgIlRleHQiLCAiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJCdXR0b24iOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldEFsaWdubWVudCAoKSB7Ci0JCWludCBhbGlnbm1lbnQgPSAwOwotCQlpZiAobGVmdEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5MRUZUOwotCQlpZiAoY2VudGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJaWYgKHJpZ2h0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULlJJR0hUOwotCQlpZiAodXBCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBhbGlnbm1lbnQgPSBTV1QuVVA7Ci0JCWlmIChkb3duQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULkRPV047Ci0JCWJ1dHRvbjEuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlidXR0b24yLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJYnV0dG9uMy5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JCWJ1dHRvbjQuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlidXR0b241LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJYnV0dG9uNi5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JCWJ1dHRvbjcuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlidXR0b244LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJYnV0dG9uOS5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJaWYgKGFycm93QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJdXBCdXR0b24uc2V0RW5hYmxlZCAodHJ1ZSk7Ci0JCQljZW50ZXJCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQkJZG93bkJ1dHRvbi5zZXRFbmFibGVkICh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXVwQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJCWNlbnRlckJ1dHRvbi5zZXRFbmFibGVkICh0cnVlKTsKLQkJCWRvd25CdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQl9Ci0JCXVwQnV0dG9uLnNldFNlbGVjdGlvbiAoKGJ1dHRvbjEuZ2V0U3R5bGUgKCkgJiBTV1QuVVApICE9IDApOwotCQlkb3duQnV0dG9uLnNldFNlbGVjdGlvbiAoKGJ1dHRvbjEuZ2V0U3R5bGUgKCkgJiBTV1QuRE9XTikgIT0gMCk7Ci0JCXB1c2hCdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5QVVNIKSAhPSAwKTsKLQkJY2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5DSEVDSykgIT0gMCk7Ci0JCXJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbiAoKGJ1dHRvbjEuZ2V0U3R5bGUgKCkgJiBTV1QuUkFESU8pICE9IDApOwotCQl0b2dnbGVCdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5UT0dHTEUpICE9IDApOwotCQlhcnJvd0J1dHRvbi5zZXRTZWxlY3Rpb24gKChidXR0b24xLmdldFN0eWxlICgpICYgU1dULkFSUk9XKSAhPSAwKTsKLQkJZmxhdEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChidXR0b24xLmdldFN0eWxlICgpICYgU1dULkZMQVQpICE9IDApOwotCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NDb21ib1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ0NvbWJvVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYmQ0N2MuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ0NvbWJvVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1jbGFzcyBDQ29tYm9UYWIgZXh0ZW5kcyBUYWIgewotCi0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlDQ29tYm8gY29tYm8xOwotCUdyb3VwIGNvbWJvR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBmbGF0QnV0dG9uLCByZWFkT25seUJ1dHRvbjsKLQkKLQlzdGF0aWMgU3RyaW5nIFtdIExpc3REYXRhID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMCIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8xIiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzIiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMyIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV80IiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzUiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNiIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV83IiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzgiKX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQ0NvbWJvVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBjb21ibyBib3ggKi8KLQkJY29tYm9Hcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNvbWJvR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWNvbWJvR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJY29tYm9Hcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VzdG9tX0NvbWJvIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGZsYXRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRkxBVDsKLQkJaWYgKHJlYWRPbmx5QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlJFQURfT05MWTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQljb21ibzEgPSBuZXcgQ0NvbWJvIChjb21ib0dyb3VwLCBzdHlsZSk7Ci0JCWNvbWJvMS5zZXRJdGVtcyAoTGlzdERhdGEpOwotCQlpZiAoTGlzdERhdGEubGVuZ3RoID49IDMpIHsKLQkJCWNvbWJvMS5zZXRUZXh0KExpc3REYXRhIFsyXSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJcmVhZE9ubHlCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyZWFkT25seUJ1dHRvbi5zZXRUZXh0ICgiU1dULlJFQURfT05MWSIpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQkJZmxhdEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZsYXRCdXR0b24uc2V0VGV4dCAoIlNXVC5GTEFUIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbXSB7Y29tYm8xfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJFZGl0YWJsZSIsICJJdGVtcyIsICJTZWxlY3Rpb24iLCAiVGV4dCIsICJUZXh0TGltaXQiLCAiVG9vbFRpcFRleHQiLCAiVmlzaWJsZUl0ZW1Db3VudCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkNDb21ibyI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJZmxhdEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb21ibzEuZ2V0U3R5bGUgKCkgJiBTV1QuRkxBVCkgIT0gMCk7Ci0JCXJlYWRPbmx5QnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvbWJvMS5nZXRTdHlsZSAoKSAmIFNXVC5SRUFEX09OTFkpICE9IDApOwotCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgoY29tYm8xLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ0xhYmVsVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DTGFiZWxUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYwZTE3MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DTGFiZWxUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBDTGFiZWxUYWIgZXh0ZW5kcyBBbGlnbmFibGVUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JQ0xhYmVsIGxhYmVsMSwgbGFiZWwyLCBsYWJlbDM7Ci0JR3JvdXAgdGV4dExhYmVsR3JvdXA7Ci0KLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHNoYWRvd0luQnV0dG9uLCBzaGFkb3dPdXRCdXR0b24sIHNoYWRvd05vbmVCdXR0b247Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUNMYWJlbFRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdGV4dCBsYWJlbHMgKi8KLQkJdGV4dExhYmVsR3JvdXAgPSBuZXcgR3JvdXAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQl0ZXh0TGFiZWxHcm91cC5zZXRMYXlvdXQgKGdyaWRMYXlvdXQpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQl0ZXh0TGFiZWxHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0ZXh0TGFiZWxHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VzdG9tX0xhYmVscyIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChzaGFkb3dJbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfSU47Ci0JCWlmIChzaGFkb3dOb25lQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19OT05FOwotCQlpZiAoc2hhZG93T3V0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19PVVQ7Ci0JCWlmIChsZWZ0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkxFRlQ7Ci0JCWlmIChjZW50ZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQ0VOVEVSOwotCQlpZiAocmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUklHSFQ7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWxhYmVsMSA9IG5ldyBDTGFiZWwgKHRleHRMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsMS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPbmUiKSk7Ci0JCWxhYmVsMS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWxhYmVsMiA9IG5ldyBDTGFiZWwgKHRleHRMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsMi5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWxhYmVsMyA9IG5ldyBDTGFiZWwgKHRleHRMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsMy5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJFeGFtcGxlX3N0cmluZyIpICsgIlxuIiArIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPbmVfVHdvX1RocmVlIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlzaGFkb3dOb25lQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19OT05FIik7Ci0JCXNoYWRvd0luQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93SW5CdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfSU4iKTsKLQkJc2hhZG93T3V0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX09VVCIpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKChldmVudC53aWRnZXQuZ2V0U3R5bGUoKSAmIFNXVC5SQURJTykgIT0gMCkgewotCQkJCQlpZiAoISgoQnV0dG9uKSBldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbiAoKSkgcmV0dXJuOwotCQkJCX0KLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9OwotCQlzaGFkb3dJbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzaGFkb3dPdXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCUNvbnRyb2wgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2wgW10ge2xhYmVsMSwgbGFiZWwyLCBsYWJlbDN9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlRleHQiLCAiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJDTGFiZWwiOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldEFsaWdubWVudCAoKSB7Ci0JCWludCBhbGlnbm1lbnQgPSAwOwotCQlpZiAobGVmdEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5MRUZUOwotCQlpZiAoY2VudGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJaWYgKHJpZ2h0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULlJJR0hUOwotCQlsYWJlbDEuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlsYWJlbDIuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlsYWJlbDMuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWxlZnRCdXR0b24uc2V0U2VsZWN0aW9uICgobGFiZWwxLmdldFN0eWxlICgpICYgU1dULkxFRlQpICE9IDApOwotCQljZW50ZXJCdXR0b24uc2V0U2VsZWN0aW9uICgobGFiZWwxLmdldFN0eWxlICgpICYgU1dULkNFTlRFUikgIT0gMCk7Ci0JCXJpZ2h0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5SSUdIVCkgIT0gMCk7Ci0JCXNoYWRvd0luQnV0dG9uLnNldFNlbGVjdGlvbiAoKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5TSEFET1dfSU4pICE9IDApOwotCQlzaGFkb3dPdXRCdXR0b24uc2V0U2VsZWN0aW9uICgobGFiZWwxLmdldFN0eWxlICgpICYgU1dULlNIQURPV19PVVQpICE9IDApOwotCQlzaGFkb3dOb25lQnV0dG9uLnNldFNlbGVjdGlvbiAoKGxhYmVsMS5nZXRTdHlsZSAoKSAmIChTV1QuU0hBRE9XX0lOIHwgU1dULlNIQURPV19PVVQpKSA9PSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DVGFiRm9sZGVyVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DVGFiRm9sZGVyVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMDNmODUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ1RhYkZvbGRlclRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIENUYWJGb2xkZXJUYWIgZXh0ZW5kcyBUYWIgewotCWludCBsYXN0U2VsZWN0ZWRUYWIgPSAwOwotCQotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JQ1RhYkZvbGRlciB0YWJGb2xkZXIxOwotCUdyb3VwIHRhYkZvbGRlckdyb3VwLCBpdGVtR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiB0b3BCdXR0b24sIGJvdHRvbUJ1dHRvbiwgZmxhdEJ1dHRvbiwgY2xvc2VCdXR0b247Ci0KLQlzdGF0aWMgU3RyaW5nIFtdIENUYWJJdGVtczEgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNUYWJJdGVtMV8wIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNUYWJJdGVtMV8xIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNUYWJJdGVtMV8yIil9OwotCi0JLyogQ29udHJvbHMgYW5kIHJlc291cmNlcyBhZGRlZCB0byB0aGUgIkZvbnRzIiBncm91cCAqLwotCUJ1dHRvbiBmb3JlZ3JvdW5kU2VsZWN0aW9uQnV0dG9uLCBiYWNrZ3JvdW5kU2VsZWN0aW9uQnV0dG9uLCBpdGVtRm9udEJ1dHRvbjsKLQlJbWFnZSBmb3JlZ3JvdW5kU2VsZWN0aW9uSW1hZ2UsIGJhY2tncm91bmRTZWxlY3Rpb25JbWFnZTsKLQlDb2xvciBmb3JlZ3JvdW5kU2VsZWN0aW9uQ29sb3IsIGJhY2tncm91bmRTZWxlY3Rpb25Db2xvcjsKLQlGb250IGl0ZW1Gb250OwotCQotCS8qIE90aGVyIHdpZGdldHMgYWRkZWQgdG8gdGhlICJPdGhlciIgZ3JvdXAgKi8KLQlCdXR0b24gc2ltcGxlVGFiQnV0dG9uLCBzaW5nbGVUYWJCdXR0b24sIGltYWdlQnV0dG9uLCBzaG93TWluQnV0dG9uLCBzaG93TWF4QnV0dG9uLCB1bnNlbGVjdGVkQ2xvc2VCdXR0b24sIHVuc2VsZWN0ZWRJbWFnZUJ1dHRvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlDVGFiRm9sZGVyVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkZvbnRzIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbG9yR3JvdXAgKCkgewotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCWNvbG9yR3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNvbG9yR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMiwgZmFsc2UpKTsKLQkJY29sb3JHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJY29sb3JHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNvbG9ycyIpKTsKLQkJCi0JCW5ldyBMYWJlbCAoY29sb3JHcm91cCwgU1dULk5PTkUpLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiRm9yZWdyb3VuZF9Db2xvciIpKTsKLQkJZm9yZWdyb3VuZEJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbG9yR3JvdXAsIFNXVC5QVVNIKTsKLQkJCi0JCW5ldyBMYWJlbCAoY29sb3JHcm91cCwgU1dULk5PTkUpLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQmFja2dyb3VuZF9Db2xvciIpKTsKLQkJYmFja2dyb3VuZEJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbG9yR3JvdXAsIFNXVC5QVVNIKTsKLQkJCi0JCW5ldyBMYWJlbCAoY29sb3JHcm91cCwgU1dULk5PTkUpLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU2VsZWN0aW9uX0ZvcmVncm91bmRfQ29sb3IiKSk7Ci0JCWZvcmVncm91bmRTZWxlY3Rpb25CdXR0b24gPSBuZXcgQnV0dG9uIChjb2xvckdyb3VwLCBTV1QuUFVTSCk7Ci0JCQotCQluZXcgTGFiZWwgKGNvbG9yR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlNlbGVjdGlvbl9CYWNrZ3JvdW5kX0NvbG9yIikpOwotCQliYWNrZ3JvdW5kU2VsZWN0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbiAoY29sb3JHcm91cCwgU1dULlBVU0gpOwotCQkKLQkJZm9udEJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbG9yR3JvdXAsIFNXVC5QVVNIKTsKLQkJZm9udEJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGb250IikpOwotCQlmb250QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAyLCAxKSk7Ci0JCi0JCWl0ZW1Gb250QnV0dG9uID0gbmV3IEJ1dHRvbiAoY29sb3JHcm91cCwgU1dULlBVU0gpOwotCQlpdGVtRm9udEJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJdGVtX0ZvbnQiKSk7Ci0JCWl0ZW1Gb250QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAyLCAxKSk7Ci0JCQotCQlCdXR0b24gZGVmYXVsdHNCdXR0b24gPSBuZXcgQnV0dG9uIChjb2xvckdyb3VwLCBTV1QuUFVTSCk7Ci0JCWRlZmF1bHRzQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlZmF1bHRzIikpOwotCi0JCVNoZWxsIHNoZWxsID0gY29udHJvbEdyb3VwLmdldFNoZWxsICgpOwotCQlmaW5hbCBDb2xvckRpYWxvZyBjb2xvckRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyAoc2hlbGwpOwotCQlmaW5hbCBGb250RGlhbG9nIGZvbnREaWFsb2cgPSBuZXcgRm9udERpYWxvZyAoc2hlbGwpOwotCi0JCS8qIENyZWF0ZSBpbWFnZXMgdG8gZGlzcGxheSBjdXJyZW50IGNvbG9ycyAqLwotCQlpbnQgaW1hZ2VTaXplID0gMTI7Ci0JCURpc3BsYXkgZGlzcGxheSA9IHNoZWxsLmdldERpc3BsYXkgKCk7Ci0JCWZvcmVncm91bmRJbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgaW1hZ2VTaXplLCBpbWFnZVNpemUpOwotCQliYWNrZ3JvdW5kSW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIGltYWdlU2l6ZSwgaW1hZ2VTaXplKTsKLQkJZm9yZWdyb3VuZFNlbGVjdGlvbkltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBpbWFnZVNpemUsIGltYWdlU2l6ZSk7Ci0JCWJhY2tncm91bmRTZWxlY3Rpb25JbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgaW1hZ2VTaXplLCBpbWFnZVNpemUpOwotCi0JCS8qIEFkZCBsaXN0ZW5lcnMgdG8gc2V0IHRoZSBjb2xvcnMgYW5kIGZvbnQgKi8KLQkJZm9yZWdyb3VuZEJ1dHRvbi5zZXRJbWFnZShmb3JlZ3JvdW5kSW1hZ2UpOyAvLyBzZXRzIHRoZSBzaXplIG9mIHRoZSBidXR0b24KLQkJZm9yZWdyb3VuZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sb3Igb2xkQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7Ci0JCQkJaWYgKG9sZENvbG9yID09IG51bGwpIHsKLQkJCQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQkJCQlpZiAoY29udHJvbHMubGVuZ3RoID4gMCkgb2xkQ29sb3IgPSBjb250cm9scyBbMF0uZ2V0Rm9yZWdyb3VuZCAoKTsKLQkJCQl9Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIGNvbG9yRGlhbG9nLnNldFJHQihvbGRDb2xvci5nZXRSR0IoKSk7IC8vIHNlZWQgZGlhbG9nIHdpdGggY3VycmVudCBjb2xvcgotCQkJCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7IC8vIHNhdmUgb2xkIGZvcmVncm91bmQgY29sb3IgdG8gZGlzcG9zZSB3aGVuIGRvbmUKLQkJCQlmb3JlZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IgKGV2ZW50LmRpc3BsYXksIHJnYik7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldEZvcmVncm91bmQgKCk7Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCX0pOwotCQliYWNrZ3JvdW5kQnV0dG9uLnNldEltYWdlKGJhY2tncm91bmRJbWFnZSk7IC8vIHNldHMgdGhlIHNpemUgb2YgdGhlIGJ1dHRvbgotCQliYWNrZ3JvdW5kQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xvciBvbGRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKLQkJCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgewotCQkJCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCQkJCWlmIChjb250cm9scy5sZW5ndGggPiAwKSBvbGRDb2xvciA9IGNvbnRyb2xzIFswXS5nZXRCYWNrZ3JvdW5kICgpOyAvLyBzZWVkIGRpYWxvZyB3aXRoIGN1cnJlbnQgY29sb3IKLQkJCQl9Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIGNvbG9yRGlhbG9nLnNldFJHQihvbGRDb2xvci5nZXRSR0IoKSk7Ci0JCQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJCQlvbGRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsgLy8gc2F2ZSBvbGQgYmFja2dyb3VuZCBjb2xvciB0byBkaXNwb3NlIHdoZW4gZG9uZQotCQkJCWJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZXZlbnQuZGlzcGxheSwgcmdiKTsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0QmFja2dyb3VuZCAoKTsKLQkJCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCWZvcmVncm91bmRTZWxlY3Rpb25CdXR0b24uc2V0SW1hZ2UoZm9yZWdyb3VuZFNlbGVjdGlvbkltYWdlKTsgLy8gc2V0cyB0aGUgc2l6ZSBvZiB0aGUgYnV0dG9uCi0JCWZvcmVncm91bmRTZWxlY3Rpb25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbG9yIG9sZENvbG9yID0gZm9yZWdyb3VuZFNlbGVjdGlvbkNvbG9yOwotCQkJCWlmIChvbGRDb2xvciA9PSBudWxsKSB7Ci0JCQkJCUNvbnRyb2wgW10gY29udHJvbHMgPSBnZXRFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCQkJaWYgKGNvbnRyb2xzLmxlbmd0aCA+IDApIG9sZENvbG9yID0gY29udHJvbHMgWzBdLmdldEZvcmVncm91bmQgKCk7Ci0JCQkJfQotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBjb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOyAvLyBzZWVkIGRpYWxvZyB3aXRoIGN1cnJlbnQgY29sb3IKLQkJCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJCW9sZENvbG9yID0gZm9yZWdyb3VuZFNlbGVjdGlvbkNvbG9yOyAvLyBzYXZlIG9sZCBmb3JlZ3JvdW5kIGNvbG9yIHRvIGRpc3Bvc2Ugd2hlbiBkb25lCi0JCQkJZm9yZWdyb3VuZFNlbGVjdGlvbkNvbG9yID0gbmV3IENvbG9yIChldmVudC5kaXNwbGF5LCByZ2IpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRGb3JlZ3JvdW5kICgpOwotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQkJfQotCQl9KTsKLQkJYmFja2dyb3VuZFNlbGVjdGlvbkJ1dHRvbi5zZXRJbWFnZShiYWNrZ3JvdW5kU2VsZWN0aW9uSW1hZ2UpOyAvLyBzZXRzIHRoZSBzaXplIG9mIHRoZSBidXR0b24KLQkJYmFja2dyb3VuZFNlbGVjdGlvbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sb3Igb2xkQ29sb3IgPSBiYWNrZ3JvdW5kU2VsZWN0aW9uQ29sb3I7Ci0JCQkJaWYgKG9sZENvbG9yID09IG51bGwpIHsKLQkJCQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQkJCQlpZiAoY29udHJvbHMubGVuZ3RoID4gMCkgb2xkQ29sb3IgPSBjb250cm9scyBbMF0uZ2V0QmFja2dyb3VuZCAoKTsgLy8gc2VlZCBkaWFsb2cgd2l0aCBjdXJyZW50IGNvbG9yCi0JCQkJfQotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBjb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkQ29sb3IgPSBiYWNrZ3JvdW5kU2VsZWN0aW9uQ29sb3I7IC8vIHNhdmUgb2xkIGJhY2tncm91bmQgY29sb3IgdG8gZGlzcG9zZSB3aGVuIGRvbmUKLQkJCQliYWNrZ3JvdW5kU2VsZWN0aW9uQ29sb3IgPSBuZXcgQ29sb3IgKGV2ZW50LmRpc3BsYXksIHJnYik7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldEJhY2tncm91bmQgKCk7Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCX0pOwotCQlmb250QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUZvbnQgb2xkRm9udCA9IGZvbnQ7Ci0JCQkJaWYgKG9sZEZvbnQgPT0gbnVsbCkgewotCQkJCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCQkJCWlmIChjb250cm9scy5sZW5ndGggPiAwKSBvbGRGb250ID0gY29udHJvbHMgWzBdLmdldEZvbnQgKCk7Ci0JCQkJfQotCQkJCWlmIChvbGRGb250ICE9IG51bGwpIGZvbnREaWFsb2cuc2V0Rm9udExpc3Qob2xkRm9udC5nZXRGb250RGF0YSgpKTsgLy8gc2VlZCBkaWFsb2cgd2l0aCBjdXJyZW50IGZvbnQKLQkJCQlGb250RGF0YSBmb250RGF0YSA9IGZvbnREaWFsb2cub3BlbiAoKTsKLQkJCQlpZiAoZm9udERhdGEgPT0gbnVsbCkgcmV0dXJuOwotCQkJCW9sZEZvbnQgPSBmb250OyAvLyBkaXNwb3NlIG9sZCBmb250IHdoZW4gZG9uZQotCQkJCWZvbnQgPSBuZXcgRm9udCAoZXZlbnQuZGlzcGxheSwgZm9udERhdGEpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRGb250ICgpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJCWlmIChvbGRGb250ICE9IG51bGwpIG9sZEZvbnQuZGlzcG9zZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCi0KLQkJLyogQWRkIGxpc3RlbmVycyB0byBzZXQgdGhlIGNvbG9ycyBhbmQgZm9udCAqLwotCQlpdGVtRm9udEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlGb250IG9sZEZvbnQgPSBpdGVtRm9udDsKLQkJCQlpZiAob2xkRm9udCA9PSBudWxsKSBvbGRGb250ID0gdGFiRm9sZGVyMS5nZXRJdGVtICgwKS5nZXRGb250ICgpOwotCQkJCWZvbnREaWFsb2cuc2V0Rm9udExpc3Qob2xkRm9udC5nZXRGb250RGF0YSgpKTsKLQkJCQlGb250RGF0YSBmb250RGF0YSA9IGZvbnREaWFsb2cub3BlbiAoKTsKLQkJCQlpZiAoZm9udERhdGEgPT0gbnVsbCkgcmV0dXJuOwotCQkJCW9sZEZvbnQgPSBpdGVtRm9udDsKLQkJCQlpdGVtRm9udCA9IG5ldyBGb250IChldmVudC5kaXNwbGF5LCBmb250RGF0YSk7Ci0JCQkJc2V0SXRlbUZvbnQgKCk7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgb2xkRm9udC5kaXNwb3NlICgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWRlZmF1bHRzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVzZXRDb2xvcnNBbmRGb250cyAoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCWlmIChmb3JlZ3JvdW5kSW1hZ2UgIT0gbnVsbCkgZm9yZWdyb3VuZEltYWdlLmRpc3Bvc2UoKTsKLQkJCQlpZiAoYmFja2dyb3VuZEltYWdlICE9IG51bGwpIGJhY2tncm91bmRJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJaWYgKGZvcmVncm91bmRDb2xvciAhPSBudWxsKSBmb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJCWlmIChiYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgYmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoZm9udCAhPSBudWxsKSBmb250LmRpc3Bvc2UoKTsKLQkJCQlmb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwotCQkJCWJhY2tncm91bmRDb2xvciA9IG51bGw7Ci0JCQkJZm9udCA9IG51bGw7CQkJCQotCQkJCWlmIChmb3JlZ3JvdW5kU2VsZWN0aW9uSW1hZ2UgIT0gbnVsbCkgZm9yZWdyb3VuZFNlbGVjdGlvbkltYWdlLmRpc3Bvc2UoKTsKLQkJCQlpZiAoYmFja2dyb3VuZFNlbGVjdGlvbkltYWdlICE9IG51bGwpIGJhY2tncm91bmRTZWxlY3Rpb25JbWFnZS5kaXNwb3NlKCk7Ci0JCQkJaWYgKGZvcmVncm91bmRTZWxlY3Rpb25Db2xvciAhPSBudWxsKSBmb3JlZ3JvdW5kU2VsZWN0aW9uQ29sb3IuZGlzcG9zZSgpOwotCQkJCWlmIChiYWNrZ3JvdW5kU2VsZWN0aW9uQ29sb3IgIT0gbnVsbCkgYmFja2dyb3VuZFNlbGVjdGlvbkNvbG9yLmRpc3Bvc2UoKTsKLQkJCQlmb3JlZ3JvdW5kU2VsZWN0aW9uQ29sb3IgPSBudWxsOwotCQkJCWJhY2tncm91bmRTZWxlY3Rpb25Db2xvciA9IG51bGw7Ci0JCQkJaWYgKGl0ZW1Gb250ICE9IG51bGwpIGl0ZW1Gb250LmRpc3Bvc2UoKTsKLQkJCQlpdGVtRm9udCA9IG51bGw7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJPdGhlciIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVPdGhlckdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlT3RoZXJHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIGRpc3BsYXkgY29udHJvbHMgc3BlY2lmaWMgdG8gdGhpcyBleGFtcGxlICovCi0JCXNpbXBsZVRhYkJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNpbXBsZVRhYkJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU2V0X1NpbXBsZV9UYWJzIikpOwotCQlzaW1wbGVUYWJCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlzaW1wbGVUYWJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFNpbXBsZVRhYnMoKTsKLQkJCX0KLQkJfSk7Ci0JCQkJCi0JCXNpbmdsZVRhYkJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNpbmdsZVRhYkJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU2V0X1NpbmdsZV9UYWJzIikpOwotCQlzaW5nbGVUYWJCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJc2luZ2xlVGFiQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRTaW5nbGVUYWJzKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hvd01pbkJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNob3dNaW5CdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNldF9NaW5fVmlzaWJsZSIpKTsKLQkJc2hvd01pbkJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlzaG93TWluQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRNaW5pbWl6ZVZpc2libGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzaG93TWF4QnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJc2hvd01heEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU2V0X01heF9WaXNpYmxlIikpOwotCQlzaG93TWF4QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCXNob3dNYXhCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldE1heGltaXplVmlzaWJsZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJaW1hZ2VCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNldF9JbWFnZSIpKTsKLQkJaW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldEltYWdlcygpOwotCQkJfQotCQl9KTsKLQkJCi0JCXVuc2VsZWN0ZWRJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXVuc2VsZWN0ZWRJbWFnZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU2V0X1Vuc2VsZWN0ZWRfSW1hZ2VfVmlzaWJsZSIpKTsKLQkJdW5zZWxlY3RlZEltYWdlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJdW5zZWxlY3RlZEltYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRVbnNlbGVjdGVkSW1hZ2VWaXNpYmxlKCk7Ci0JCQl9Ci0JCX0pOwotCQl1bnNlbGVjdGVkQ2xvc2VCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQl1bnNlbGVjdGVkQ2xvc2VCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNldF9VbnNlbGVjdGVkX0Nsb3NlX1Zpc2libGUiKSk7Ci0JCXVuc2VsZWN0ZWRDbG9zZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXVuc2VsZWN0ZWRDbG9zZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0VW5zZWxlY3RlZENsb3NlVmlzaWJsZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIENUYWJGb2xkZXIgKi8KLQkJdGFiRm9sZGVyR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQl0YWJGb2xkZXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJdGFiRm9sZGVyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJdGFiRm9sZGVyR3JvdXAuc2V0VGV4dCAoIkNUYWJGb2xkZXIiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmICh0b3BCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuVE9QOwotCQlpZiAoYm90dG9tQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPVFRPTTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmIChmbGF0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkZMQVQ7Ci0JCWlmIChjbG9zZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5DTE9TRTsKLQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQl0YWJGb2xkZXIxID0gbmV3IENUYWJGb2xkZXIgKHRhYkZvbGRlckdyb3VwLCBzdHlsZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgQ1RhYkl0ZW1zMS5sZW5ndGg7IGkrKykgewotCQkJQ1RhYkl0ZW0gaXRlbSA9IG5ldyBDVGFiSXRlbSh0YWJGb2xkZXIxLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQoQ1RhYkl0ZW1zMVtpXSk7Ci0JCQlUZXh0IHRleHQgPSBuZXcgVGV4dCh0YWJGb2xkZXIxLCBTV1QuUkVBRF9PTkxZKTsKLQkJCXRleHQuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ1RhYkl0ZW1fY29udGVudCIpICsgIjogIiArIGkpOwotCQkJaXRlbS5zZXRDb250cm9sKHRleHQpOwotCQl9Ci0JCXRhYkZvbGRlcjEuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlsYXN0U2VsZWN0ZWRUYWIgPSB0YWJGb2xkZXIxLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQl9Ci0JCX0pOwotCQl0YWJGb2xkZXIxLnNldFNlbGVjdGlvbihsYXN0U2VsZWN0ZWRUYWIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQl0b3BCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQl0b3BCdXR0b24uc2V0VGV4dCAoIlNXVC5UT1AiKTsKLQkJdG9wQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYm90dG9tQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJYm90dG9tQnV0dG9uLnNldFRleHQgKCJTV1QuQk9UVE9NIik7Ci0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRUZXh0ICgiU1dULkJPUkRFUiIpOwotCQlmbGF0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJZmxhdEJ1dHRvbi5zZXRUZXh0ICgiU1dULkZMQVQiKTsKLQkJY2xvc2VCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQljbG9zZUJ1dHRvbi5zZXRUZXh0ICgiU1dULkNMT1NFIik7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoKGV2ZW50LndpZGdldC5nZXRTdHlsZSgpICYgU1dULlJBRElPKSAhPSAwKSB7Ci0JCQkJCWlmICghKChCdXR0b24pIGV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uICgpKSByZXR1cm47Ci0JCQkJfQotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX07Ci0JCXRvcEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlib3R0b21CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJYm9yZGVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWZsYXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJY2xvc2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBjdXN0b20gZXZlbnQgbmFtZXMuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGN1c3RvbSBldmVudCBuYW1lcwotCSAqLwotCVN0cmluZyBbXSBnZXRDdXN0b21FdmVudE5hbWVzICgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10geyJDVGFiRm9sZGVyRXZlbnQifTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zLCBpZiBhbnkuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGV4YW1wbGUgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMKLQkgKi8KLQlJdGVtIFtdIGdldEV4YW1wbGVXaWRnZXRJdGVtcyAoKSB7Ci0JCXJldHVybiB0YWJGb2xkZXIxLmdldEl0ZW1zKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbXSB7dGFiRm9sZGVyMX07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkNUYWJGb2xkZXIiOwotCX0KLQotCS8qKgotCSAqIEhvb2tzIHRoZSBjdXN0b20gbGlzdGVuZXIgc3BlY2lmaWVkIGJ5IGV2ZW50TmFtZS4KLQkgKi8KLQl2b2lkIGhvb2tDdXN0b21MaXN0ZW5lciAoZmluYWwgU3RyaW5nIGV2ZW50TmFtZSkgewotCQlpZiAoZXZlbnROYW1lID09ICJDVGFiRm9sZGVyRXZlbnQiKSB7Ci0JCQl0YWJGb2xkZXIxLmFkZENUYWJGb2xkZXIyTGlzdGVuZXIgKG5ldyBDVGFiRm9sZGVyMkFkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIGNsb3NlIChDVGFiRm9sZGVyRXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudE5hbWUsIGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3IsIGJhY2tncm91bmQgY29sb3IsIGFuZCBmb250Ci0JICogb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzIHRvIHRoZWlyIGRlZmF1bHQgc2V0dGluZ3MuCi0JICogQWxzbyBzZXRzIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIE5vZGUgMQotCSAqIFRyZWVJdGVtcyB0byBkZWZhdWx0IHNldHRpbmdzLgotCSAqLwotCXZvaWQgcmVzZXRDb2xvcnNBbmRGb250cyAoKSB7Ci0JCUNvbG9yIG9sZENvbG9yID0gZm9yZWdyb3VuZFNlbGVjdGlvbkNvbG9yOwotCQlmb3JlZ3JvdW5kU2VsZWN0aW9uQ29sb3IgPSBudWxsOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlvbGRDb2xvciA9IGJhY2tncm91bmRTZWxlY3Rpb25Db2xvcjsKLQkJYmFja2dyb3VuZFNlbGVjdGlvbkNvbG9yID0gbnVsbDsKLQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UoKTsKLQkJRm9udCBvbGRGb250ID0gaXRlbUZvbnQ7Ci0JCWl0ZW1Gb250ID0gbnVsbDsKLQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgb2xkRm9udC5kaXNwb3NlKCk7Ci0JCXN1cGVyLnJlc2V0Q29sb3JzQW5kRm9udHMgKCk7Ci0JfQotCQotCXZvaWQgc2V0RXhhbXBsZVdpZGdldEZvcmVncm91bmQgKCkgewotCQlpZiAoZm9yZWdyb3VuZFNlbGVjdGlvbkJ1dHRvbiA9PSBudWxsIHx8IHRhYkZvbGRlcjEgPT0gbnVsbCkgcmV0dXJuOwotCQl0YWJGb2xkZXIxLnNldFNlbGVjdGlvbkZvcmVncm91bmQoZm9yZWdyb3VuZFNlbGVjdGlvbkNvbG9yKTsKLQkJLy8gU2V0IHRoZSBmb3JlZ3JvdW5kIGJ1dHRvbidzIGNvbG9yIHRvIG1hdGNoIHRoZSBjb2xvciBqdXN0IHNldC4KLQkJQ29sb3IgY29sb3IgPSBmb3JlZ3JvdW5kU2VsZWN0aW9uQ29sb3I7Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IHRhYkZvbGRlcjEuZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCAoKTsKLQkJZHJhd0ltYWdlIChmb3JlZ3JvdW5kU2VsZWN0aW9uSW1hZ2UsIGNvbG9yKTsKLQkJZm9yZWdyb3VuZFNlbGVjdGlvbkJ1dHRvbi5zZXRJbWFnZSAoZm9yZWdyb3VuZFNlbGVjdGlvbkltYWdlKTsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldEZvcmVncm91bmQoKTsKLQl9Ci0JCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0QmFja2dyb3VuZCAoKSB7Ci0JCWlmIChiYWNrZ3JvdW5kU2VsZWN0aW9uQnV0dG9uID09IG51bGwgfHwgdGFiRm9sZGVyMSA9PSBudWxsKSByZXR1cm47Ci0JCXRhYkZvbGRlcjEuc2V0U2VsZWN0aW9uQmFja2dyb3VuZChiYWNrZ3JvdW5kU2VsZWN0aW9uQ29sb3IpOwotCQkvLyBTZXQgdGhlIGJhY2tncm91bmQgYnV0dG9uJ3MgY29sb3IgdG8gbWF0Y2ggdGhlIGNvbG9yIGp1c3Qgc2V0LgotCQlDb2xvciBjb2xvciA9IGJhY2tncm91bmRTZWxlY3Rpb25Db2xvcjsKLQkJaWYgKGNvbG9yID09IG51bGwpIGNvbG9yID0gdGFiRm9sZGVyMS5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kICgpOwotCQlkcmF3SW1hZ2UgKGJhY2tncm91bmRTZWxlY3Rpb25JbWFnZSwgY29sb3IpOwotCQliYWNrZ3JvdW5kU2VsZWN0aW9uQnV0dG9uLnNldEltYWdlIChiYWNrZ3JvdW5kU2VsZWN0aW9uSW1hZ2UpOwotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0QmFja2dyb3VuZCgpOwotCX0KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRGb250ICgpIHsKLQkJaWYgKGluc3RhbmNlLnN0YXJ0dXApIHJldHVybjsKLQkJaWYgKGl0ZW1Gb250QnV0dG9uID09IG51bGwpIHJldHVybjsgLy8gbm8gZm9udCBidXR0b24gb24gdGhpcyB0YWIKLQkJQ1RhYkl0ZW1bXSBpdGVtcyA9IHRhYkZvbGRlcjEuZ2V0SXRlbXMoKTsKLQkJaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHsKLQkJCWl0ZW1zWzBdLnNldEZvbnQoaXRlbUZvbnQpOwotCQl9Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRGb250KCk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSgpOwotCQlzZXRTaW1wbGVUYWJzKCk7Ci0JCXNldFNpbmdsZVRhYnMoKTsKLQkJc2V0SW1hZ2VzKCk7Ci0JCXNldE1pbmltaXplVmlzaWJsZSgpOwotCQlzZXRNYXhpbWl6ZVZpc2libGUoKTsKLQkJc2V0VW5zZWxlY3RlZENsb3NlVmlzaWJsZSgpOwotCQlzZXRVbnNlbGVjdGVkSW1hZ2VWaXNpYmxlKCk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHNoYXBlIHRoYXQgdGhlIENUYWJGb2xkZXIgd2lsbCB1c2UgdG8gcmVuZGVyIGl0c2VsZi4gCi0JICovCi0Jdm9pZCBzZXRTaW1wbGVUYWJzICgpIHsKLQkJdGFiRm9sZGVyMS5zZXRTaW1wbGUgKHNpbXBsZVRhYkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBudW1iZXIgb2YgdGFicyB0aGF0IHRoZSBDVGFiRm9sZGVyIHNob3VsZCBkaXNwbGF5LgotCSAqLwotCXZvaWQgc2V0U2luZ2xlVGFicyAoKSB7Ci0JCXRhYkZvbGRlcjEuc2V0U2luZ2xlIChzaW5nbGVUYWJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJc2V0RXhhbXBsZVdpZGdldFNpemUoKTsKLQl9Ci0JLyoqCi0JICogU2V0cyBhbiBpbWFnZSBpbnRvIGVhY2ggaXRlbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRJbWFnZXMgKCkgewotCQlib29sZWFuIHNldEltYWdlID0gaW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQlDVGFiSXRlbSBpdGVtc1tdID0gdGFiRm9sZGVyMS5nZXRJdGVtcyAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHNldEltYWdlKSB7Ci0JCQkJaXRlbXNbaV0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQkJfSBlbHNlIHsKLQkJCQlpdGVtc1tpXS5zZXRJbWFnZSAobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIG1pbmltaXplIGJ1dHRvbgotCSAqLwotCXZvaWQgc2V0TWluaW1pemVWaXNpYmxlICgpIHsKLQkJdGFiRm9sZGVyMS5zZXRNaW5pbWl6ZVZpc2libGUoc2hvd01pbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSgpOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBtYXhpbWl6ZSBidXR0b24KLQkgKi8KLQl2b2lkIHNldE1heGltaXplVmlzaWJsZSAoKSB7Ci0JCXRhYkZvbGRlcjEuc2V0TWF4aW1pemVWaXNpYmxlKHNob3dNYXhCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJc2V0RXhhbXBsZVdpZGdldFNpemUoKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgY2xvc2UgYnV0dG9uIG9uIHVuc2VsZWN0ZWQgdGFicwotCSAqLwotCXZvaWQgc2V0VW5zZWxlY3RlZENsb3NlVmlzaWJsZSAoKSB7Ci0JCXRhYkZvbGRlcjEuc2V0VW5zZWxlY3RlZENsb3NlVmlzaWJsZSh1bnNlbGVjdGVkQ2xvc2VCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJc2V0RXhhbXBsZVdpZGdldFNpemUoKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgaW1hZ2Ugb24gdW5zZWxlY3RlZCB0YWJzCi0JICovCi0Jdm9pZCBzZXRVbnNlbGVjdGVkSW1hZ2VWaXNpYmxlICgpIHsKLQkJdGFiRm9sZGVyMS5zZXRVbnNlbGVjdGVkSW1hZ2VWaXNpYmxlKHVuc2VsZWN0ZWRJbWFnZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSgpOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBmb250IG9mIENUYWJJdGVtIDAuCi0JICovCi0Jdm9pZCBzZXRJdGVtRm9udCAoKSB7Ci0JCWlmIChpbnN0YW5jZS5zdGFydHVwKSByZXR1cm47Ci0JCXRhYkZvbGRlcjEuZ2V0SXRlbSAoMCkuc2V0Rm9udCAoaXRlbUZvbnQpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NhbnZhc1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ2FudmFzVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NmExMDQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ2FudmFzVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1jbGFzcyBDYW52YXNUYWIgZXh0ZW5kcyBUYWIgewotCXN0YXRpYyBpbnQgY29sb3JzIFtdID0gewotCQlTV1QuQ09MT1JfUkVELAotCQlTV1QuQ09MT1JfR1JFRU4sCi0JCVNXVC5DT0xPUl9CTFVFLAotCQlTV1QuQ09MT1JfTUFHRU5UQSwKLQkJU1dULkNPTE9SX1lFTExPVywKLQkJU1dULkNPTE9SX0NZQU4sCi0JCVNXVC5DT0xPUl9EQVJLX1JFRCwKLQkJU1dULkNPTE9SX0RBUktfR1JFRU4sCi0JCVNXVC5DT0xPUl9EQVJLX0JMVUUsCi0JCVNXVC5DT0xPUl9EQVJLX01BR0VOVEEsCi0JCVNXVC5DT0xPUl9EQVJLX1lFTExPVywKLQkJU1dULkNPTE9SX0RBUktfQ1lBTgotCX07Ci0JCi0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlDYW52YXMgY2FudmFzOwotCUdyb3VwIGNhbnZhc0dyb3VwOwotCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBob3Jpem9udGFsQnV0dG9uLCB2ZXJ0aWNhbEJ1dHRvbiwgbm9CYWNrZ3JvdW5kQnV0dG9uLCBub0ZvY3VzQnV0dG9uLCAKLQlub01lcmdlUGFpbnRzQnV0dG9uLCBub1JlZHJhd1Jlc2l6ZUJ1dHRvbiwgZG91YmxlQnVmZmVyZWRCdXR0b247Ci0KLQkvKiBPdGhlciB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiT3RoZXIiIGdyb3VwICovCi0JQnV0dG9uIGNhcmV0QnV0dG9uLCBmaWxsRGFtYWdlQnV0dG9uOwotCi0JaW50IHBhaW50Q291bnQ7Ci0JaW50IGN4LCBjeTsKLQlpbnQgbWF4WCwgbWF4WTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQ2FudmFzVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiT3RoZXIiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlT3RoZXJHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZU90aGVyR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSBkaXNwbGF5IGNvbnRyb2xzIHNwZWNpZmljIHRvIHRoaXMgZXhhbXBsZSAqLwotCQljYXJldEJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNhcmV0QnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDYXJldCIpKTsKLQkJZmlsbERhbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZpbGxEYW1hZ2VCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGxEYW1hZ2UiKSk7Ci0JCQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJY2FyZXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldENhcmV0ICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBjYW52YXMgd2lkZ2V0ICovCi0JCWNhbnZhc0dyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJY2FudmFzR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWNhbnZhc0dyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWNhbnZhc0dyb3VwLnNldFRleHQgKCJDYW52YXMiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhfU0NST0xMOwotCQlpZiAodmVydGljYWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuVl9TQ1JPTEw7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAobm9CYWNrZ3JvdW5kQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk5PX0JBQ0tHUk9VTkQ7Ci0JCWlmIChub0ZvY3VzQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk5PX0ZPQ1VTOwotCQlpZiAobm9NZXJnZVBhaW50c0J1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5OT19NRVJHRV9QQUlOVFM7Ci0JCWlmIChub1JlZHJhd1Jlc2l6ZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5OT19SRURSQVdfUkVTSVpFOwotCQlpZiAoZG91YmxlQnVmZmVyZWRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRE9VQkxFX0JVRkZFUkVEOwotCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXBhaW50Q291bnQgPSAwOyBjeCA9IDA7IGN5ID0gMDsKLQkJY2FudmFzID0gbmV3IENhbnZhcyAoY2FudmFzR3JvdXAsIHN0eWxlKTsKLQkJY2FudmFzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJCXBhaW50Q291bnQrKzsKLQkJCQlHQyBnYyA9IGUuZ2M7Ci0JCQkJaWYgKGZpbGxEYW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQkJCUNvbG9yIGNvbG9yID0gZS5kaXNwbGF5LmdldFN5c3RlbUNvbG9yIChjb2xvcnMgW3BhaW50Q291bnQgJSBjb2xvcnMubGVuZ3RoXSk7Ci0JCQkJCWdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQkJCQlnYy5maWxsUmVjdGFuZ2xlKGUueCwgZS55LCBlLndpZHRoLCBlLmhlaWdodCk7Ci0JCQkJfQotCQkJCVBvaW50IHNpemUgPSBjYW52YXMuZ2V0U2l6ZSAoKTsKLQkJCQlnYy5kcmF3QXJjKGN4ICsgMSwgY3kgKyAxLCBzaXplLnggLSAyLCBzaXplLnkgLSAyLCAwLCAzNjApOwotCQkJCWdjLmRyYXdSZWN0YW5nbGUoY3ggKyAoc2l6ZS54IC0gMTApIC8gMiwgY3kgKyAoc2l6ZS55IC0gMTApIC8gMiwgMTAsIDEwKTsKLQkJCX0KLQkJfSk7Ci0JCWNhbnZhcy5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7Ci0JCQkJUG9pbnQgc2l6ZSA9IGNhbnZhcy5nZXRTaXplICgpOwotCQkJCW1heFggPSBzaXplLnggKiAzIC8gMjsgbWF4WSA9IHNpemUueSAqIDMgLyAyOwotCQkJCXJlc2l6ZVNjcm9sbEJhcnMgKCk7Ci0JCQl9Ci0JCX0pOwotCQlTY3JvbGxCYXIgYmFyID0gY2FudmFzLmdldEhvcml6b250YWxCYXIoKTsKLQkJaWYgKGJhciAhPSBudWxsKSB7Ci0JCQliYXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJc2Nyb2xsSG9yaXpvbnRhbCAoKFNjcm9sbEJhcilldmVudC53aWRnZXQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWJhciA9IGNhbnZhcy5nZXRWZXJ0aWNhbEJhcigpOwotCQlpZiAoYmFyICE9IG51bGwpIHsKLQkJCWJhci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlzY3JvbGxWZXJ0aWNhbCAoKFNjcm9sbEJhcilldmVudC53aWRnZXQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlob3Jpem9udGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkhfU0NST0xMIik7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl2ZXJ0aWNhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFRleHQgKCJTV1QuVl9TQ1JPTEwiKTsKLQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQkJbm9CYWNrZ3JvdW5kQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9CYWNrZ3JvdW5kQnV0dG9uLnNldFRleHQgKCJTV1QuTk9fQkFDS0dST1VORCIpOwotCQlub0ZvY3VzQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9Gb2N1c0J1dHRvbi5zZXRUZXh0ICgiU1dULk5PX0ZPQ1VTIik7Ci0JCW5vTWVyZ2VQYWludHNCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlub01lcmdlUGFpbnRzQnV0dG9uLnNldFRleHQgKCJTV1QuTk9fTUVSR0VfUEFJTlRTIik7Ci0JCW5vUmVkcmF3UmVzaXplQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9SZWRyYXdSZXNpemVCdXR0b24uc2V0VGV4dCAoIlNXVC5OT19SRURSQVdfUkVTSVpFIik7Ci0JCWRvdWJsZUJ1ZmZlcmVkQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJZG91YmxlQnVmZmVyZWRCdXR0b24uc2V0VGV4dCAoIlNXVC5ET1VCTEVfQlVGRkVSRUQiKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlIGZvciB0aGUgdGFiIGZvbGRlcgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlIChUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcik7Ci0KLQkJLyoKLQkJICogQWRkIGEgcmVzaXplIGxpc3RlbmVyIHRvIHRoZSB0YWJGb2xkZXJQYWdlIHNvIHRoYXQKLQkJICogaWYgdGhlIHVzZXIgdHlwZXMgaW50byB0aGUgZXhhbXBsZSB3aWRnZXQgdG8gY2hhbmdlCi0JCSAqIGl0cyBwcmVmZXJyZWQgc2l6ZSwgYW5kIHRoZW4gcmVzaXplcyB0aGUgc2hlbGwsIHdlCi0JCSAqIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZSBjb3JyZWN0bHkuCi0JCSAqLwotCQl0YWJGb2xkZXJQYWdlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiB0YWJGb2xkZXJQYWdlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbXSB7Y2FudmFzfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkNhbnZhcyI7Ci0JfQotCQotCS8qKgotCSAqIFJlc2l6ZXMgdGhlIG1heGltdW0gYW5kIHRodW1iIG9mIGJvdGggc2Nyb2xsYmFycy4KLQkgKi8KLQl2b2lkIHJlc2l6ZVNjcm9sbEJhcnMgKCkgewotCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IGNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCVNjcm9sbEJhciBiYXIgPSBjYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlpZiAoYmFyICE9IG51bGwpIHsKLQkJCWJhci5zZXRNYXhpbXVtKG1heFgpOwotCQkJYmFyLnNldFRodW1iKGNsaWVudEFyZWEud2lkdGgpOwotCQkJYmFyLnNldFBhZ2VJbmNyZW1lbnQoY2xpZW50QXJlYS53aWR0aCk7Ci0JCX0KLQkJYmFyID0gY2FudmFzLmdldFZlcnRpY2FsQmFyKCk7Ci0JCWlmIChiYXIgIT0gbnVsbCkgewotCQkJYmFyLnNldE1heGltdW0obWF4WSk7Ci0JCQliYXIuc2V0VGh1bWIoY2xpZW50QXJlYS5oZWlnaHQpOwotCQkJYmFyLnNldFBhZ2VJbmNyZW1lbnQoY2xpZW50QXJlYS5oZWlnaHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2Nyb2xscyB0aGUgY2FudmFzIGhvcml6b250YWxseS4KLQkgKiAKLQkgKiBAcGFyYW0gc2Nyb2xsQmFyCi0JICovCi0Jdm9pZCBzY3JvbGxIb3Jpem9udGFsIChTY3JvbGxCYXIgc2Nyb2xsQmFyKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBjYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQlpbnQgeCA9IC1zY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICh4ICsgbWF4WCA8IGJvdW5kcy53aWR0aCkgewotCQkJeCA9IGJvdW5kcy53aWR0aCAtIG1heFg7Ci0JCX0KLQkJY2FudmFzLnNjcm9sbCh4LCBjeSwgY3gsIGN5LCBtYXhYLCBtYXhZLCBmYWxzZSk7Ci0JCWN4ID0geDsKLQl9Ci0KLQkvKioKLQkgKiBTY3JvbGxzIHRoZSBjYW52YXMgdmVydGljYWxseS4KLQkgKiAKLQkgKiBAcGFyYW0gc2Nyb2xsQmFyCi0JICovCi0Jdm9pZCBzY3JvbGxWZXJ0aWNhbCAoU2Nyb2xsQmFyIHNjcm9sbEJhcikgewotCQlSZWN0YW5nbGUgYm91bmRzID0gY2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJaW50IHkgPSAtc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoeSArIG1heFkgPCBib3VuZHMuaGVpZ2h0KSB7Ci0JCQl5ID0gYm91bmRzLmhlaWdodCAtIG1heFk7Ci0JCX0KLQkJY2FudmFzLnNjcm9sbChjeCwgeSwgY3gsIGN5LCBtYXhYLCBtYXhZLCBmYWxzZSk7Ci0JCWN5ID0geTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIG9yIGNsZWFycyB0aGUgY2FyZXQgaW4gdGhlICJFeGFtcGxlIiB3aWRnZXQuCi0JICovCi0Jdm9pZCBzZXRDYXJldCAoKSB7Ci0JCUNhcmV0IG9sZENhcmV0ID0gY2FudmFzLmdldENhcmV0ICgpOwotCQlpZiAoY2FyZXRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlDYXJldCBuZXdDYXJldCA9IG5ldyBDYXJldChjYW52YXMsIFNXVC5OT05FKTsKLQkJCUZvbnQgZm9udCA9IGNhbnZhcy5nZXRGb250KCk7Ci0JCQluZXdDYXJldC5zZXRGb250KGZvbnQpOwotCQkJR0MgZ2MgPSBuZXcgR0MoY2FudmFzKTsKLQkJCWdjLnNldEZvbnQoZm9udCk7Ci0JCQluZXdDYXJldC5zZXRCb3VuZHMoMSwgMSwgMSwgZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKSk7Ci0JCQlnYy5kaXNwb3NlKCk7Ci0JCQljYW52YXMuc2V0Q2FyZXQgKG5ld0NhcmV0KTsKLQkJCWNhbnZhcy5zZXRGb2N1cygpOwotCQl9IGVsc2UgewotCQkJY2FudmFzLnNldENhcmV0IChudWxsKTsKLQkJfQotCQlpZiAob2xkQ2FyZXQgIT0gbnVsbCkgb2xkQ2FyZXQuZGlzcG9zZSAoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNhbnZhcy5nZXRTdHlsZSAoKSAmIFNXVC5IX1NDUk9MTCkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNhbnZhcy5nZXRTdHlsZSAoKSAmIFNXVC5WX1NDUk9MTCkgIT0gMCk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjYW52YXMuZ2V0U3R5bGUgKCkgJiBTV1QuQk9SREVSKSAhPSAwKTsKLQkJbm9CYWNrZ3JvdW5kQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNhbnZhcy5nZXRTdHlsZSAoKSAmIFNXVC5OT19CQUNLR1JPVU5EKSAhPSAwKTsKLQkJbm9Gb2N1c0J1dHRvbi5zZXRTZWxlY3Rpb24gKChjYW52YXMuZ2V0U3R5bGUgKCkgJiBTV1QuTk9fRk9DVVMpICE9IDApOwotCQlub01lcmdlUGFpbnRzQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNhbnZhcy5nZXRTdHlsZSAoKSAmIFNXVC5OT19NRVJHRV9QQUlOVFMpICE9IDApOwotCQlub1JlZHJhd1Jlc2l6ZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjYW52YXMuZ2V0U3R5bGUgKCkgJiBTV1QuTk9fUkVEUkFXX1JFU0laRSkgIT0gMCk7Ci0JCWRvdWJsZUJ1ZmZlcmVkQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNhbnZhcy5nZXRTdHlsZSAoKSAmIFNXVC5ET1VCTEVfQlVGRkVSRUQpICE9IDApOwotCQlzZXRDYXJldCAoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Db21ib1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29tYm9UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmZiNmIyNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Db21ib1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotY2xhc3MgQ29tYm9UYWIgZXh0ZW5kcyBUYWIgewotCi0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlDb21ibyBjb21ibzE7Ci0JR3JvdXAgY29tYm9Hcm91cDsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIGRyb3BEb3duQnV0dG9uLCByZWFkT25seUJ1dHRvbiwgc2ltcGxlQnV0dG9uOwotCQotCXN0YXRpYyBTdHJpbmcgW10gTGlzdERhdGEgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8wIiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzEiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfMiIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8zIiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzQiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfNSIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF82IiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzciKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfOCIpfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlDb21ib1RhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgY29tYm8gYm94ICovCi0JCWNvbWJvR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQljb21ib0dyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQljb21ib0dyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWNvbWJvR3JvdXAuc2V0VGV4dCAoIkNvbWJvIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoZHJvcERvd25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRFJPUF9ET1dOOwotCQlpZiAocmVhZE9ubHlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUkVBRF9PTkxZOwotCQlpZiAoc2ltcGxlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNJTVBMRTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWNvbWJvMSA9IG5ldyBDb21ibyAoY29tYm9Hcm91cCwgc3R5bGUpOwotCQljb21ibzEuc2V0SXRlbXMgKExpc3REYXRhKTsKLQkJaWYgKExpc3REYXRhLmxlbmd0aCA+PSAzKSB7Ci0JCQljb21ibzEuc2V0VGV4dChMaXN0RGF0YSBbMl0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYiBmb2xkZXIgcGFnZS4KLQkgKgotCSAqIEBwYXJhbSB0YWJGb2xkZXIgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyCi0JICogQHJldHVybiB0aGUgbmV3IHBhZ2UgZm9yIHRoZSB0YWIgZm9sZGVyCi0JICovCi0JQ29tcG9zaXRlIGNyZWF0ZVRhYkZvbGRlclBhZ2UgKFRhYkZvbGRlciB0YWJGb2xkZXIpIHsKLQkJc3VwZXIuY3JlYXRlVGFiRm9sZGVyUGFnZSAodGFiRm9sZGVyKTsKLQotCQkvKgotCQkgKiBBZGQgYSByZXNpemUgbGlzdGVuZXIgdG8gdGhlIHRhYkZvbGRlclBhZ2Ugc28gdGhhdAotCQkgKiBpZiB0aGUgdXNlciB0eXBlcyBpbnRvIHRoZSBleGFtcGxlIHdpZGdldCB0byBjaGFuZ2UKLQkJICogaXRzIHByZWZlcnJlZCBzaXplLCBhbmQgdGhlbiByZXNpemVzIHRoZSBzaGVsbCwgd2UKLQkJICogcmVjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBzaXplIGNvcnJlY3RseS4KLQkJICovCi0JCXRhYkZvbGRlclBhZ2UuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIHRhYkZvbGRlclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJZHJvcERvd25CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlkcm9wRG93bkJ1dHRvbi5zZXRUZXh0ICgiU1dULkRST1BfRE9XTiIpOwotCQlzaW1wbGVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaW1wbGVCdXR0b24uc2V0VGV4dCgiU1dULlNJTVBMRSIpOwotCQlyZWFkT25seUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJlYWRPbmx5QnV0dG9uLnNldFRleHQgKCJTV1QuUkVBRF9PTkxZIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbXSB7Y29tYm8xfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJJdGVtcyIsICJPcmllbnRhdGlvbiIsICJTZWxlY3Rpb24iLCAiVGV4dCIsICJUZXh0TGltaXQiLCAiVG9vbFRpcFRleHQiLCAiVmlzaWJsZUl0ZW1Db3VudCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkNvbWJvIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlkcm9wRG93bkJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb21ibzEuZ2V0U3R5bGUgKCkgJiBTV1QuRFJPUF9ET1dOKSAhPSAwKTsKLQkJc2ltcGxlQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvbWJvMS5nZXRTdHlsZSAoKSAmIFNXVC5TSU1QTEUpICE9IDApOwotCQlyZWFkT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb21ibzEuZ2V0U3R5bGUgKCkgJiBTV1QuUkVBRF9PTkxZKSAhPSAwKTsKLQkJcmVhZE9ubHlCdXR0b24uc2V0RW5hYmxlZCghc2ltcGxlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Db250cm9sRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29udHJvbEV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNlNjE4Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Db250cm9sRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgQ29udHJvbEV4YW1wbGUgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0KLQkJUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19jb250cm9sIik7Ci0JcHJpdmF0ZSBTaGVsbFRhYiBzaGVsbFRhYjsKLQlwcml2YXRlIFRhYkZvbGRlciB0YWJGb2xkZXI7Ci0JSW1hZ2UgaW1hZ2VzW107Ci0KLQlzdGF0aWMgZmluYWwgaW50IGNpQ2xvc2VkRm9sZGVyID0gMCwgY2lPcGVuRm9sZGVyID0gMSwgY2lUYXJnZXQgPSAyOwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpbWFnZUxvY2F0aW9ucyA9IHsKLQkJImNsb3NlZEZvbGRlci5naWYiLAotCQkib3BlbkZvbGRlci5naWYiLAotCQkidGFyZ2V0LmdpZiIgfTsKLQotCWJvb2xlYW4gc3RhcnR1cCA9IHRydWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgQ29udHJvbEV4YW1wbGUgZW1iZWRkZWQgaW5zaWRlCi0JICogdGhlIHN1cHBsaWVkIHBhcmVudCBDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgY29udGFpbmVyIG9mIHRoZSBleGFtcGxlCi0JICovCi0JcHVibGljIENvbnRyb2xFeGFtcGxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdFJlc291cmNlcygpOwotCQl0YWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyIChwYXJlbnQsIFNXVC5OT05FKTsKLQkJVGFiIFtdIHRhYnMgPSBjcmVhdGVUYWJzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTx0YWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbSAodGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCSAgICBpdGVtLnNldFRleHQgKHRhYnMgW2ldLmdldFRhYlRleHQgKCkpOwotCQkgICAgaXRlbS5zZXRDb250cm9sICh0YWJzIFtpXS5jcmVhdGVUYWJGb2xkZXJQYWdlICh0YWJGb2xkZXIpKTsKLQkJICAgIGl0ZW0uc2V0RGF0YSAodGFicyBbaV0pOwotCQl9Ci0JCXN0YXJ0dXAgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXJzIHRoZSBzZXQgb2YgZXhhbXBsZSBUYWJzCi0JICovCi0JVGFiW10gY3JlYXRlVGFicygpIHsKLQkJcmV0dXJuIG5ldyBUYWIgW10gewotCQkJbmV3IEJ1dHRvblRhYiAodGhpcyksCi0JCQluZXcgQ2FudmFzVGFiICh0aGlzKSwKLQkJCW5ldyBDb21ib1RhYiAodGhpcyksCi0JCQluZXcgQ29vbEJhclRhYiAodGhpcyksCi0JCQluZXcgRGlhbG9nVGFiICh0aGlzKSwKLQkJCW5ldyBHcm91cFRhYiAodGhpcyksCi0JCQluZXcgTGFiZWxUYWIgKHRoaXMpLAotCQkJbmV3IExpbmtUYWIgKHRoaXMpLAotCQkJbmV3IExpc3RUYWIgKHRoaXMpLAotCQkJbmV3IE1lbnVUYWIgKHRoaXMpLAotCQkJbmV3IFByb2dyZXNzQmFyVGFiICh0aGlzKSwKLQkJCW5ldyBTYXNoVGFiICh0aGlzKSwKLQkJCXNoZWxsVGFiID0gbmV3IFNoZWxsVGFiKHRoaXMpLAotCQkJbmV3IFNsaWRlclRhYiAodGhpcyksCi0JCQluZXcgU3Bpbm5lclRhYiAodGhpcyksCi0JCQluZXcgVGFiRm9sZGVyVGFiICh0aGlzKSwKLQkJCW5ldyBUYWJsZVRhYiAodGhpcyksCi0JCQluZXcgVGV4dFRhYiAodGhpcyksCi0JCQluZXcgVG9vbEJhclRhYiAodGhpcyksCi0JCQluZXcgVHJlZVRhYiAodGhpcyksCi0JCX07Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyCi0JICogaW5zdGFuY2Ugb2YgdGhlIENvbnRyb2xFeGFtcGxlLgotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvKgotCQkgKiBEZXN0cm95IGFueSBzaGVsbHMgdGhhdCBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQKLQkJICogYnkgdGhlIFNoZWxscyB0YWIuICBXaGVuIGEgc2hlbGwgaXMgZGlzcG9zZWQsCi0JCSAqIGFsbCBjaGlsZCBzaGVsbHMgYXJlIGFsc28gZGlzcG9zZWQuICBUaGVyZWZvcmUKLQkJICogaXQgaXMgbmVjZXNzYXJ5IHRvIGNoZWNrIGZvciBkaXNwb3NlZCBzaGVsbHMKLQkJICogaW4gdGhlIHNoZWxscyBsaXN0IHRvIGF2b2lkIGRpc3Bvc2luZyBhIHNoZWxsCi0JCSAqIHR3aWNlLgotCQkgKi8KLQkJaWYgKHNoZWxsVGFiICE9IG51bGwpIHNoZWxsVGFiLmNsb3NlQWxsU2hlbGxzICgpOwotCQlzaGVsbFRhYiA9IG51bGw7Ci0JCXRhYkZvbGRlciA9IG51bGw7Ci0JCWZyZWVSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBGcmVlcyB0aGUgcmVzb3VyY2VzCi0JICovCi0Jdm9pZCBmcmVlUmVzb3VyY2VzKCkgewotCQlpZiAoaW1hZ2VzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbaV07Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWltYWdlcyA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBhbmQgYmluZHMgaXQKLQkgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLAotCSAqIHJldHVybiB0aGUga2V5LgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFJlc291cmNlU3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSByZXNvdXJjZXMKLQkgKi8KLQl2b2lkIGluaXRSZXNvdXJjZXMoKSB7Ci0JCWZpbmFsIENsYXNzIGNsYXp6ID0gQ29udHJvbEV4YW1wbGUuY2xhc3M7Ci0JCWlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbWFnZXMgPT0gbnVsbCkgewotCQkJCQlpbWFnZXMgPSBuZXcgSW1hZ2VbaW1hZ2VMb2NhdGlvbnMubGVuZ3RoXTsKLQkJCQkJCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VMb2NhdGlvbnMubGVuZ3RoOyArK2kpIHsKLQkJCQkJCUlucHV0U3RyZWFtIHNvdXJjZVN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0oaW1hZ2VMb2NhdGlvbnNbaV0pOwotCQkJCQkJSW1hZ2VEYXRhIHNvdXJjZSA9IG5ldyBJbWFnZURhdGEoc291cmNlU3RyZWFtKTsKLQkJCQkJCUltYWdlRGF0YSBtYXNrID0gc291cmNlLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCQkJCWltYWdlc1tpXSA9IG5ldyBJbWFnZShudWxsLCBzb3VyY2UsIG1hc2spOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzb3VyY2VTdHJlYW0uY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGVycm9yID0gKHJlc291cmNlQnVuZGxlICE9IG51bGwpID8KLQkJCWdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMiKSA6Ci0JCQkiVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzIjsKLQkJZnJlZVJlc291cmNlcygpOwotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlcnJvcik7Ci0JfQotCi0JLyoqCi0JICogSW52b2tlcyBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUNvbnRyb2xFeGFtcGxlIGluc3RhbmNlID0gbmV3IENvbnRyb2xFeGFtcGxlKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygid2luZG93LnRpdGxlIikpOwotCQlzZXRTaGVsbFNpemUoZGlzcGxheSwgc2hlbGwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghIHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCEgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWluc3RhbmNlLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogR3JhYnMgaW5wdXQgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXRhYkZvbGRlci5zZXRGb2N1cygpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBzaGVsbCB0byBpdCdzICJwYWNrZWQiIHNpemUsCi0JICogdW5sZXNzIHRoYXQgbWFrZXMgaXQgYmlnZ2VyIHRoYW4gdGhlIGRpc3BsYXksCi0JICogaW4gd2hpY2ggY2FzZSBzZXQgaXQgdG8gOS8xMCBvZiBkaXNwbGF5IHNpemUuCi0JICovCi0Jc3RhdGljIHZvaWQgc2V0U2hlbGxTaXplIChEaXNwbGF5IGRpc3BsYXksIFNoZWxsIHNoZWxsKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBkaXNwbGF5LmdldEJvdW5kcygpOwotCQlQb2ludCBzaXplID0gc2hlbGwuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWlmIChzaXplLnggPiBib3VuZHMud2lkdGgpIHNpemUueCA9IGJvdW5kcy53aWR0aCAqIDkgLyAxMDsKLQkJaWYgKHNpemUueSA+IGJvdW5kcy5oZWlnaHQpIHNpemUueSA9IGJvdW5kcy5oZWlnaHQgKiA5IC8gMTA7Ci0JCXNoZWxsLnNldFNpemUgKHNpemUpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29vbEJhclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29vbEJhclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTU4MDhjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0Nvb2xCYXJUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBDb29sQmFyVGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwIHRoYXQgY29udGFpbnMgdGhlbSAqLwotCUNvb2xCYXIgY29vbEJhcjsKLQlDb29sSXRlbSBwdXNoSXRlbSwgZHJvcERvd25JdGVtLCByYWRpb0l0ZW0sIGNoZWNrSXRlbSwgdGV4dEl0ZW07Ci0JR3JvdXAgY29vbEJhckdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gaG9yaXpvbnRhbEJ1dHRvbiwgdmVydGljYWxCdXR0b247Ci0JQnV0dG9uIGRyb3BEb3duQnV0dG9uLCBmbGF0QnV0dG9uOwotCi0JLyogT3RoZXIgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIk90aGVyIiBncm91cCAqLwotCUJ1dHRvbiBsb2NrZWRCdXR0b247Ci0JCi0JUG9pbnRbXSBzaXplczsKLQlpbnRbXSB3cmFwSW5kaWNlczsKLQlpbnRbXSBvcmRlcjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQ29vbEJhclRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJPdGhlciIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVPdGhlckdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlT3RoZXJHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIGRpc3BsYXkgY29udHJvbHMgc3BlY2lmaWMgdG8gdGhpcyBleGFtcGxlICovCi0JCWxvY2tlZEJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWxvY2tlZEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTG9ja2VkIikpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlsb2NrZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldExvY2tlZCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJY29vbEJhckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJY29vbEJhckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQljb29sQmFyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJY29vbEJhckdyb3VwLnNldFRleHQgKCJDb29sQmFyIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKSwgaXRlbVN0eWxlID0gMDsKLQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQsIGl0ZW0sIGFuZCBpdGVtIHRvb2xCYXIgc3R5bGVzICovCi0JCWludCB0b29sQmFyU3R5bGUgPSBTV1QuRkxBVDsKLQkJYm9vbGVhbiB2ZXJ0aWNhbCA9IGZhbHNlOwotCQlpZiAoaG9yaXpvbnRhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCXN0eWxlIHw9IFNXVC5IT1JJWk9OVEFMOwotCQkJdG9vbEJhclN0eWxlIHw9IFNXVC5IT1JJWk9OVEFMOwotCQl9Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCXN0eWxlIHw9IFNXVC5WRVJUSUNBTDsKLQkJCXRvb2xCYXJTdHlsZSB8PSBTV1QuVkVSVElDQUw7Ci0JCQl2ZXJ0aWNhbCA9IHRydWU7Ci0JCX0KLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKGZsYXRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5GTEFUOwotCQlpZiAoZHJvcERvd25CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW1TdHlsZSB8PSBTV1QuRFJPUF9ET1dOOwotCQotCQkvKgotCQkqIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzLgotCQkqLwotCQljb29sQmFyID0gbmV3IENvb2xCYXIgKGNvb2xCYXJHcm91cCwgc3R5bGUpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBwdXNoIGJ1dHRvbiB0b29sYmFyIGNvb2wgaXRlbSAqLwotCQlUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhciAoY29vbEJhciwgdG9vbEJhclN0eWxlKTsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUFVTSCIpOwkJCi0JCXB1c2hJdGVtID0gbmV3IENvb2xJdGVtIChjb29sQmFyLCBpdGVtU3R5bGUpOwotCQlwdXNoSXRlbS5zZXRDb250cm9sICh0b29sQmFyKTsKLQkJcHVzaEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBDb29sSXRlbVNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJCQotCQkvKiBDcmVhdGUgdGhlIGRyb3Bkb3duIHRvb2xiYXIgY29vbCBpdGVtICovCi0JCXRvb2xCYXIgPSBuZXcgVG9vbEJhciAoY29vbEJhciwgdG9vbEJhclN0eWxlKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5EUk9QX0RPV04iKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5EUk9QX0RPV04iKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCWRyb3BEb3duSXRlbSA9IG5ldyBDb29sSXRlbSAoY29vbEJhciwgaXRlbVN0eWxlKTsKLQkJZHJvcERvd25JdGVtLnNldENvbnRyb2wgKHRvb2xCYXIpOwotCQlkcm9wRG93bkl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBDb29sSXRlbVNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0JCS8qIENyZWF0ZSB0aGUgcmFkaW8gYnV0dG9uIHRvb2xiYXIgY29vbCBpdGVtICovCi0JCXRvb2xCYXIgPSBuZXcgVG9vbEJhciAoY29vbEJhciwgdG9vbEJhclN0eWxlKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUkFESU8iKTsKLQkJcmFkaW9JdGVtID0gbmV3IENvb2xJdGVtIChjb29sQmFyLCBpdGVtU3R5bGUpOwotCQlyYWRpb0l0ZW0uc2V0Q29udHJvbCAodG9vbEJhcik7Ci0JCXJhZGlvSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IENvb2xJdGVtU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGNoZWNrIGJ1dHRvbiB0b29sYmFyIGNvb2wgaXRlbSAqLwotCQl0b29sQmFyID0gbmV3IFRvb2xCYXIgKGNvb2xCYXIsIHRvb2xCYXJTdHlsZSk7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULkNIRUNLIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaVRhcmdldF0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULkNIRUNLIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5DSEVDSyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuQ0hFQ0spOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5DSEVDSyIpOwotCQljaGVja0l0ZW0gPSBuZXcgQ29vbEl0ZW0gKGNvb2xCYXIsIGl0ZW1TdHlsZSk7Ci0JCWNoZWNrSXRlbS5zZXRDb250cm9sICh0b29sQmFyKTsKLQkJY2hlY2tJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgQ29vbEl0ZW1TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgdGV4dCBjb29sIGl0ZW0gKi8KLQkJaWYgKCF2ZXJ0aWNhbCkgewotCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQgKGNvb2xCYXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLQkJCXRleHRJdGVtID0gbmV3IENvb2xJdGVtIChjb29sQmFyLCBpdGVtU3R5bGUpOwotCQkJdGV4dEl0ZW0uc2V0Q29udHJvbCAodGV4dCk7Ci0JCQl0ZXh0SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IENvb2xJdGVtU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQlQb2ludCB0ZXh0U2l6ZSA9IHRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCXRleHRTaXplID0gdGV4dEl0ZW0uY29tcHV0ZVNpemUodGV4dFNpemUueCwgdGV4dFNpemUueSk7Ci0JCQl0ZXh0SXRlbS5zZXRNaW5pbXVtU2l6ZSh0ZXh0U2l6ZSk7Ci0JCQl0ZXh0SXRlbS5zZXRQcmVmZXJyZWRTaXplKHRleHRTaXplKTsKLQkJCXRleHRJdGVtLnNldFNpemUodGV4dFNpemUpOwotCQl9Ci0KLQkJLyogU2V0IHRoZSBzaXplcyBhZnRlciBhZGRpbmcgYWxsIGNvb2wgaXRlbXMgKi8KLQkJQ29vbEl0ZW1bXSBjb29sSXRlbXMgPSBjb29sQmFyLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29vbEl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb29sSXRlbSBjb29sSXRlbSA9IGNvb2xJdGVtc1tpXTsKLQkJCUNvbnRyb2wgY29udHJvbCA9IGNvb2xJdGVtLmdldENvbnRyb2woKTsKLQkJCVBvaW50IHNpemUgPSBjb250cm9sLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQlQb2ludCBjb29sU2l6ZSA9IGNvb2xJdGVtLmNvbXB1dGVTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJCWlmIChjb250cm9sIGluc3RhbmNlb2YgVG9vbEJhcikgewotCQkJCVRvb2xCYXIgYmFyID0gKFRvb2xCYXIpY29udHJvbDsKLQkJCQlpZiAoYmFyLmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJCQlpZiAodmVydGljYWwpIHsKLQkJCQkJCXNpemUueSA9IGJhci5nZXRJdGVtKDApLmdldEJvdW5kcygpLmhlaWdodDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXNpemUueCA9IGJhci5nZXRJdGVtKDApLmdldFdpZHRoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljb29sSXRlbS5zZXRNaW5pbXVtU2l6ZShzaXplKTsKLQkJCWNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUoY29vbFNpemUpOwotCQkJY29vbEl0ZW0uc2V0U2l6ZShjb29sU2l6ZSk7Ci0JCX0KLQkJCi0JCS8qIElmIHdlIGhhdmUgc2F2ZWQgc3RhdGUsIHJlc3RvcmUgaXQgKi8KLQkJaWYgKG9yZGVyICE9IG51bGwgJiYgb3JkZXIubGVuZ3RoID09IGNvb2xCYXIuZ2V0SXRlbUNvdW50KCkpIHsKLQkJCWNvb2xCYXIuc2V0SXRlbUxheW91dChvcmRlciwgd3JhcEluZGljZXMsIHNpemVzKTsKLQkJfSBlbHNlIHsKLQkJCWNvb2xCYXIuc2V0V3JhcEluZGljZXMobmV3IGludFtdIHsxLCAzfSk7Ci0JCX0KLQkJCi0JCS8qIEFkZCBhIGxpc3RlbmVyIHRvIHJlc2l6ZSB0aGUgZ3JvdXAgYm94IHRvIG1hdGNoIHRoZSBjb29sYmFyICovCi0JCWNvb2xCYXIuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlleGFtcGxlR3JvdXAubGF5b3V0KCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJaG9yaXpvbnRhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0VGV4dCAoIlNXVC5IT1JJWk9OVEFMIik7Ci0JCXZlcnRpY2FsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJdmVydGljYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5WRVJUSUNBTCIpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQkJZmxhdEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZsYXRCdXR0b24uc2V0VGV4dCAoIlNXVC5GTEFUIik7Ci0JCUdyb3VwIGl0ZW1Hcm91cCA9IG5ldyBHcm91cChzdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWl0ZW1Hcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJaXRlbUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlpdGVtR3JvdXAuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSXRlbV9TdHlsZXMiKSk7Ci0JCWRyb3BEb3duQnV0dG9uID0gbmV3IEJ1dHRvbiAoaXRlbUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlkcm9wRG93bkJ1dHRvbi5zZXRUZXh0ICgiU1dULkRST1BfRE9XTiIpOwotCQlkcm9wRG93bkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCS8qIHN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgdG9vbGJhciBpZiBhcHBsaWNhYmxlICovCi0JCWlmIChjb29sQmFyICE9IG51bGwpIHsKLQkJCXNpemVzID0gY29vbEJhci5nZXRJdGVtU2l6ZXMoKTsKLQkJCXdyYXBJbmRpY2VzID0gY29vbEJhci5nZXRXcmFwSW5kaWNlcygpOwotCQkJb3JkZXIgPSBjb29sQmFyLmdldEl0ZW1PcmRlcigpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2VFeGFtcGxlV2lkZ2V0cygpOwkKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMsIGlmIGFueS4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZXhhbXBsZSB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcwotCSAqLwotCUl0ZW0gW10gZ2V0RXhhbXBsZVdpZGdldEl0ZW1zICgpIHsKLQkJcmV0dXJuIGNvb2xCYXIuZ2V0SXRlbXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sIFtdIHtjb29sQmFyfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkNvb2xCYXIiOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uICgoY29vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5IT1JJWk9OVEFMKSAhPSAwKTsKLQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uICgoY29vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5WRVJUSUNBTCkgIT0gMCk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb29sQmFyLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JCWZsYXRCdXR0b24uc2V0U2VsZWN0aW9uICgoY29vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5GTEFUKSAhPSAwKTsKLQkJZHJvcERvd25CdXR0b24uc2V0U2VsZWN0aW9uICgoY29vbEJhci5nZXRJdGVtKDApLmdldFN0eWxlICgpICYgU1dULkRST1BfRE9XTikgIT0gMCk7Ci0JCXNldFdpZGdldExvY2tlZCAoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgaGVhZGVyIHZpc2libGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0TG9ja2VkICgpIHsKLQkJY29vbEJhci5zZXRMb2NrZWQgKGxvY2tlZEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBMaXN0ZW5zIHRvIHdpZGdldFNlbGVjdGVkKCkgZXZlbnRzIG9uIFNXVC5EUk9QX0RPV04gdHlwZSBUb29sSXRlbXMKLQkgKiBhbmQgb3BlbnMvY2xvc2VzIGEgbWVudSB3aGVuIGFwcHJvcHJpYXRlLgotCSAqLwotCWNsYXNzIERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIHsKLQkJcHJpdmF0ZSBNZW51IG1lbnUgPSBudWxsOwotCQlwcml2YXRlIGJvb2xlYW4gdmlzaWJsZSA9IGZhbHNlOwotCQkKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCS8vIENyZWF0ZSB0aGUgbWVudSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBjcmVhdGVkCi0JCQlpZiAobWVudSA9PSBudWxsKSB7Ci0JCQkJLy8gTGF6eSBjcmVhdGUgdGhlIG1lbnUuCi0JCQkJU2hlbGwgc2hlbGwgPSB0YWJGb2xkZXJQYWdlLmdldFNoZWxsKCk7Ci0JCQkJbWVudSA9IG5ldyBNZW51KHNoZWxsKTsKLQkJCQltZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIG1lbnVIaWRkZW4oTWVudUV2ZW50IGUpIHsKLQkJCQkJCXZpc2libGUgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgOTsgKytpKSB7Ci0JCQkJCWZpbmFsIFN0cmluZyB0ZXh0ID0gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRyb3BEb3duRGF0YV8iICsgaSk7Ci0JCQkJCWlmICh0ZXh0Lmxlbmd0aCgpICE9IDApIHsKLQkJCQkJCU1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQkJCQkJCW1lbnVJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCQkvKgotCQkJCQkJICogQWRkIGEgbWVudSBzZWxlY3Rpb24gbGlzdGVuZXIgc28gdGhhdCB0aGUgbWVudSBpcyBoaWRkZW4KLQkJCQkJCSAqIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhbiBpdGVtIGZyb20gdGhlIGRyb3AgZG93biBtZW51LgotCQkJCQkJICovCi0JCQkJCQltZW51SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJCXNldE1lbnVWaXNpYmxlKGZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLyoqCi0JCQkgKiBBIHNlbGVjdGlvbiBldmVudCB3aWxsIGJlIGZpcmVkIHdoZW4gYSBkcm9wIGRvd24gdG9vbAotCQkJICogaXRlbSBpcyBzZWxlY3RlZCBpbiB0aGUgbWFpbiBhcmVhIGFuZCBpbiB0aGUgZHJvcAotCQkJICogZG93biBhcnJvdy4gIEV4YW1pbmUgdGhlIGV2ZW50IGRldGFpbCB0byBkZXRlcm1pbmUKLQkJCSAqIHdoZXJlIHRoZSB3aWRnZXQgd2FzIHNlbGVjdGVkLgotCQkJICovCQkKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gU1dULkFSUk9XKSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGUgZHJvcCBkb3duIGFycm93IHdhcyBzZWxlY3RlZC4KLQkJCQkgKi8KLQkJCQlpZiAodmlzaWJsZSkgewotCQkJCQkvLyBIaWRlIHRoZSBtZW51IHRvIGdpdmUgdGhlIEFycm93IHRoZSBhcHBlYXJhbmNlIG9mIGJlaW5nIGEgdG9nZ2xlIGJ1dHRvbi4KLQkJCQkJc2V0TWVudVZpc2libGUoZmFsc2UpOwotCQkJCX0gZWxzZSB7CQotCQkJCQkvLyBQb3NpdGlvbiB0aGUgbWVudSBiZWxvdyBhbmQgdmVydGljYWxseSBhbGlnbmVkIHdpdGggdGhlIHRoZSBkcm9wIGRvd24gdG9vbCBidXR0b24uCi0JCQkJCWZpbmFsIFRvb2xJdGVtIHRvb2xJdGVtID0gKFRvb2xJdGVtKSBldmVudC53aWRnZXQ7Ci0JCQkJCWZpbmFsIFRvb2xCYXIgIHRvb2xCYXIgPSB0b29sSXRlbS5nZXRQYXJlbnQoKTsKLQkJCQkJCi0JCQkJCVJlY3RhbmdsZSB0b29sSXRlbUJvdW5kcyA9IHRvb2xJdGVtLmdldEJvdW5kcygpOwotCQkJCQlQb2ludCBwb2ludCA9IHRvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludCh0b29sSXRlbUJvdW5kcy54LCB0b29sSXRlbUJvdW5kcy55KSk7Ci0JCQkJCW1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIHRvb2xJdGVtQm91bmRzLmhlaWdodCk7Ci0JCQkJCXNldE1lbnVWaXNpYmxlKHRydWUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBNYWluIGFyZWEgb2YgZHJvcCBkb3duIHRvb2wgaXRlbSBzZWxlY3RlZC4KLQkJCQkgKiBBbiBhcHBsaWNhdGlvbiB3b3VsZCBpbnZva2UgdGhlIGNvZGUgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIGZvciB0aGUgdG9vbCBpdGVtLgotCQkJCSAqLwotCQkJfQotCQl9Ci0JCXByaXZhdGUgdm9pZCBzZXRNZW51VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJCW1lbnUuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJCXRoaXMudmlzaWJsZSA9IHZpc2libGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMaXN0ZW5zIHRvIHdpZGdldFNlbGVjdGVkKCkgZXZlbnRzIG9uIFNXVC5EUk9QX0RPV04gdHlwZSBDb29sSXRlbXMKLQkgKiBhbmQgb3BlbnMvY2xvc2VzIGEgbWVudSB3aGVuIGFwcHJvcHJpYXRlLgotCSAqLwotCWNsYXNzIENvb2xJdGVtU2VsZWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIHsKLQkJcHJpdmF0ZSBNZW51IG1lbnUgPSBudWxsOwotCQkKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCS8qKgotCQkJICogQSBzZWxlY3Rpb24gZXZlbnQgd2lsbCBiZSBmaXJlZCB3aGVuIHRoZSBjb29sIGl0ZW0KLQkJCSAqIGlzIHNlbGVjdGVkIGJ5IGl0cyBncmlwcGVyIG9yIGlmIHRoZSBkcm9wIGRvd24gYXJyb3cKLQkJCSAqIChvciAnY2hldnJvbicpIGlzIHNlbGVjdGVkLiBFeGFtaW5lIHRoZSBldmVudCBkZXRhaWwKLQkJCSAqIHRvIGRldGVybWluZSB3aGVyZSB0aGUgd2lkZ2V0IHdhcyBzZWxlY3RlZC4KLQkJCSAqLwotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQVJST1cpIHsKLQkJCQkvKiBJZiB0aGUgcG9wdXAgbWVudSBpcyBhbHJlYWR5IHVwIChpLmUuIHVzZXIgcHJlc3NlZCBhcnJvdyB0d2ljZSksCi0JCQkJICogdGhlbiBkaXNwb3NlIGl0LgotCQkJCSAqLwotCQkJCWlmIChtZW51ICE9IG51bGwpIHsKLQkJCQkJbWVudS5kaXNwb3NlKCk7Ci0JCQkJCW1lbnUgPSBudWxsOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJCS8qIEdldCB0aGUgY29vbCBpdGVtIGFuZCBjb252ZXJ0IGl0cyBib3VuZHMgdG8gZGlzcGxheSBjb29yZGluYXRlcy4gKi8KLQkJCQlDb29sSXRlbSBjb29sSXRlbSA9IChDb29sSXRlbSkgZXZlbnQud2lkZ2V0OwotCQkJCVJlY3RhbmdsZSBpdGVtQm91bmRzID0gY29vbEl0ZW0uZ2V0Qm91bmRzICgpOwotCQkJCWl0ZW1Cb3VuZHMud2lkdGggPSBldmVudC54IC0gaXRlbUJvdW5kcy54OwotCQkJCVBvaW50IHB0ID0gY29vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50IChpdGVtQm91bmRzLngsIGl0ZW1Cb3VuZHMueSkpOwotCQkJCWl0ZW1Cb3VuZHMueCA9IHB0Lng7Ci0JCQkJaXRlbUJvdW5kcy55ID0gcHQueTsKLQkJCQkKLQkJCQkvKiBHZXQgdGhlIHRvb2xiYXIgZnJvbSB0aGUgY29vbCBpdGVtLiAqLwotCQkJCVRvb2xCYXIgdG9vbEJhciA9IChUb29sQmFyKSBjb29sSXRlbS5nZXRDb250cm9sICgpOwotCQkJCVRvb2xJdGVtW10gdG9vbHMgPSB0b29sQmFyLmdldEl0ZW1zICgpOwotCQkJCWludCB0b29sQ291bnQgPSB0b29scy5sZW5ndGg7Ci0JCQkJCQkJCQotCQkJCS8qIENvbnZlcnQgdGhlIGJvdW5kcyBvZiBlYWNoIHRvb2wgaXRlbSB0byBkaXNwbGF5IGNvb3JkaW5hdGVzLAotCQkJCSAqIGFuZCBkZXRlcm1pbmUgd2hpY2ggb25lcyBhcmUgcGFzdCB0aGUgYm91bmRzIG9mIHRoZSBjb29sIGl0ZW0uCi0JCQkJICovCi0JCQkJaW50IGkgPSAwOwotCQkJCXdoaWxlIChpIDwgdG9vbENvdW50KSB7Ci0JCQkJCVJlY3RhbmdsZSB0b29sQm91bmRzID0gdG9vbHNbaV0uZ2V0Qm91bmRzICgpOwotCQkJCQlwdCA9IHRvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludCh0b29sQm91bmRzLngsIHRvb2xCb3VuZHMueSkpOwotCQkJCQl0b29sQm91bmRzLnggPSBwdC54OwotCQkJCQl0b29sQm91bmRzLnkgPSBwdC55OwotCQkJICAJCVJlY3RhbmdsZSBpbnRlcnNlY3Rpb24gPSBpdGVtQm91bmRzLmludGVyc2VjdGlvbiAodG9vbEJvdW5kcyk7Ci0JCQkgIAkJaWYgKCFpbnRlcnNlY3Rpb24uZXF1YWxzICh0b29sQm91bmRzKSkgYnJlYWs7Ci0JCQkgIAkJaSsrOwotCQkJCX0KLQkJCQkKLQkJCQkvKiBDcmVhdGUgYSBwb3AtdXAgbWVudSB3aXRoIGl0ZW1zIGZvciBlYWNoIG9mIHRoZSBoaWRkZW4gYnV0dG9ucy4gKi8KLQkJCQltZW51ID0gbmV3IE1lbnUgKGNvb2xCYXIpOwotCQkJCWZvciAoaW50IGogPSBpOyBqIDwgdG9vbENvdW50OyBqKyspIHsKLQkJCQkJVG9vbEl0ZW0gdG9vbCA9IHRvb2xzW2pdOwotCQkJCQlJbWFnZSBpbWFnZSA9IHRvb2wuZ2V0SW1hZ2UoKTsKLQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCW5ldyBNZW51SXRlbSAobWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoKHRvb2wuZ2V0U3R5bGUoKSAmIFNXVC5EUk9QX0RPV04pICE9IDApIHsKLQkJCQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULkNBU0NBREUpOwotCQkJCQkJCW1lbnVJdGVtLnNldEltYWdlKGltYWdlKTsKLQkJCQkJCQlTdHJpbmcgdGV4dCA9IHRvb2wuZ2V0VG9vbFRpcFRleHQoKTsKLQkJCQkJCQlpZiAodGV4dCAhPSBudWxsKSBtZW51SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQkJCU1lbnUgbSA9IG5ldyBNZW51KG1lbnUpOwotCQkJCQkJCW1lbnVJdGVtLnNldE1lbnUobSk7Ci0JCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCA5OyArK2spIHsKLQkJCQkJCQkJdGV4dCA9IENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEcm9wRG93bkRhdGFfIiArIGspOwotCQkJCQkJCQlpZiAodGV4dC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCQkJCQlNZW51SXRlbSBtaSA9IG5ldyBNZW51SXRlbShtLCBTV1QuTk9ORSk7Ci0JCQkJCQkJCQltaS5zZXRUZXh0KHRleHQpOwotCQkJCQkJCQkJLyogQXBwbGljYXRpb24gY29kZSB0byBwZXJmb3JtIHRoZSBhY3Rpb24gZm9yIHRoZSBzdWJtZW51IGl0ZW0gd291bGQgZ28gaGVyZS4gKi8KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCW5ldyBNZW51SXRlbShtLCBTV1QuU0VQQVJBVE9SKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5OT05FKTsKLQkJCQkJCQltZW51SXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCQkJCQkJU3RyaW5nIHRleHQgPSB0b29sLmdldFRvb2xUaXBUZXh0KCk7Ci0JCQkJCQkJaWYgKHRleHQgIT0gbnVsbCkgbWVudUl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJCX0KLQkJCQkJCS8qIEFwcGxpY2F0aW9uIGNvZGUgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIGZvciB0aGUgbWVudSBpdGVtIHdvdWxkIGdvIGhlcmUuICovCi0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLyogRGlzcGxheSB0aGUgcG9wLXVwIG1lbnUgYXQgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBhcnJvdyBidXR0b24uCi0JCQkJICogRGlzcG9zZSB0aGUgbWVudSB3aGVuIHRoZSB1c2VyIGlzIGRvbmUgd2l0aCBpdC4KLQkJCQkgKi8KLQkJCQlwdCA9IGNvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JCQkJbWVudS5zZXRMb2NhdGlvbiAocHQueCwgcHQueSk7Ci0JCQkJbWVudS5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCQlEaXNwbGF5IGRpc3BsYXkgPSBjb29sQmFyLmdldERpc3BsYXkgKCk7Ci0JCQkJd2hpbGUgKG1lbnUgIT0gbnVsbCAmJiAhbWVudS5pc0Rpc3Bvc2VkKCkgJiYgbWVudS5pc1Zpc2libGUgKCkpIHsKLQkJCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJCQl9Ci0JCQkJaWYgKG1lbnUgIT0gbnVsbCkgewotCQkJCQltZW51LmRpc3Bvc2UgKCk7Ci0JCQkJCW1lbnUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0N1c3RvbUNvbnRyb2xFeGFtcGxlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DdXN0b21Db250cm9sRXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzhhZGNhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0N1c3RvbUNvbnRyb2xFeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnRyb2xFeGFtcGxlIGV4dGVuZHMgQ29udHJvbEV4YW1wbGUgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIEN1c3RvbUNvbnRyb2xFeGFtcGxlIGVtYmVkZGVkCi0JICogaW5zaWRlIHRoZSBzdXBwbGllZCBwYXJlbnQgQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIGNvbnRhaW5lciBvZiB0aGUgZXhhbXBsZQotCSAqLwotCXB1YmxpYyBDdXN0b21Db250cm9sRXhhbXBsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyIChwYXJlbnQpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXJzIHRoZSBzZXQgb2YgZXhhbXBsZSBUYWJzCi0JICovCi0JVGFiW10gY3JlYXRlVGFicygpIHsKLQkJcmV0dXJuIG5ldyBUYWIgW10gewotCQkJbmV3IENDb21ib1RhYiAodGhpcyksCi0JCQluZXcgQ0xhYmVsVGFiICh0aGlzKSwKLQkJCW5ldyBDVGFiRm9sZGVyVGFiICh0aGlzKSwKLQkJCW5ldyBTYXNoRm9ybVRhYiAodGhpcyksCi0JCQluZXcgU3R5bGVkVGV4dFRhYiAodGhpcyksCi0JCX07Ci0JfQotCQotCS8qKgotCSAqIEludm9rZXMgYXMgYSBzdGFuZGFsb25lIHByb2dyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlDdXN0b21Db250cm9sRXhhbXBsZSBpbnN0YW5jZSA9IG5ldyBDdXN0b21Db250cm9sRXhhbXBsZShzaGVsbCk7Ci0JCXNoZWxsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoImN1c3RvbS53aW5kb3cudGl0bGUiKSk7Ci0JCXNldFNoZWxsU2l6ZShkaXNwbGF5LCBzaGVsbCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCEgc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoISBkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaW5zdGFuY2UuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0RpYWxvZ1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvRGlhbG9nVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3YzE0OTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvRGlhbG9nVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBEaWFsb2dUYWIgZXh0ZW5kcyBUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JR3JvdXAgZGlhbG9nU3R5bGVHcm91cCwgcmVzdWx0R3JvdXA7Ci0JVGV4dCB0ZXh0V2lkZ2V0OwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlDb21ibyBkaWFsb2dDb21ibzsKLQlCdXR0b24gY3JlYXRlQnV0dG9uOwotCUJ1dHRvbiBva0J1dHRvbiwgY2FuY2VsQnV0dG9uOwotCUJ1dHRvbiB5ZXNCdXR0b24sIG5vQnV0dG9uOwotCUJ1dHRvbiByZXRyeUJ1dHRvbjsKLQlCdXR0b24gYWJvcnRCdXR0b24sIGlnbm9yZUJ1dHRvbjsKLQlCdXR0b24gaWNvbkVycm9yQnV0dG9uLCBpY29uSW5mb3JtYXRpb25CdXR0b24sIGljb25RdWVzdGlvbkJ1dHRvbjsKLQlCdXR0b24gaWNvbldhcm5pbmdCdXR0b24sIGljb25Xb3JraW5nQnV0dG9uOwotCUJ1dHRvbiBwcmltYXJ5TW9kYWxCdXR0b24sIGFwcGxpY2F0aW9uTW9kYWxCdXR0b24sIHN5c3RlbU1vZGFsQnV0dG9uOwotCUJ1dHRvbiBzYXZlQnV0dG9uLCBvcGVuQnV0dG9uLCBtdWx0aUJ1dHRvbjsKLQotCXN0YXRpYyBTdHJpbmcgW10gRmlsdGVyRXh0ZW5zaW9ucwk9IHsiKi50eHQiLCAiKi5iYXQiLCAiKi5kb2MiLCAiKiJ9OwotCXN0YXRpYyBTdHJpbmcgW10gRmlsdGVyTmFtZXMJCT0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWx0ZXJOYW1lXzAiKSwKLQkJCQkJCQkJCQkgICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsdGVyTmFtZV8xIiksCi0JCQkJCQkJCQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbHRlck5hbWVfMiIpLAotCQkJCQkJCQkJCSAgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWx0ZXJOYW1lXzMiKX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JRGlhbG9nVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgYSBidXR0b24gc3R5bGUgc2VsZWN0aW9uIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIGV2ZW50IHRoZSBzZWxlY3Rpb24gZXZlbnQKLQkgKi8KLQl2b2lkIGJ1dHRvblN0eWxlU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJLyoKLQkJICogT25seSBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZiBidXR0b24gc3R5bGVzIGFyZQotCQkgKiBzdXBwb3J0ZWQgZm9yIHZhcmlvdXMgZGlhbG9ncy4gIE1ha2Ugc3VyZSB0aGUKLQkJICogY29udHJvbCB3aWRnZXQgcmVmbGVjdHMgb25seSB2YWxpZCBjb21iaW5hdGlvbnMuCi0JCSAqLwotCQlib29sZWFuIG9rID0gb2tCdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQlib29sZWFuIGNhbmNlbCA9IGNhbmNlbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCk7Ci0JCWJvb2xlYW4geWVzID0geWVzQnV0dG9uLmdldFNlbGVjdGlvbiAoKTsKLQkJYm9vbGVhbiBubyA9IG5vQnV0dG9uLmdldFNlbGVjdGlvbiAoKTsKLQkJYm9vbGVhbiBhYm9ydCA9IGFib3J0QnV0dG9uLmdldFNlbGVjdGlvbiAoKTsKLQkJYm9vbGVhbiByZXRyeSA9IHJldHJ5QnV0dG9uLmdldFNlbGVjdGlvbiAoKTsKLQkJYm9vbGVhbiBpZ25vcmUgPSBpZ25vcmVCdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQkKLQkJb2tCdXR0b24uc2V0RW5hYmxlZCAoISh5ZXMgfHwgbm8gfHwgcmV0cnkgfHwgYWJvcnQgfHwgaWdub3JlKSk7Ci0JCWNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkICghKGFib3J0IHx8IGlnbm9yZSB8fCAoeWVzICE9IG5vKSkpOwotCQl5ZXNCdXR0b24uc2V0RW5hYmxlZCAoIShvayB8fCByZXRyeSB8fCBhYm9ydCB8fCBpZ25vcmUgfHwgKGNhbmNlbCAmJiAheWVzICYmICFubykpKTsKLQkJbm9CdXR0b24uc2V0RW5hYmxlZCAoIShvayB8fCByZXRyeSB8fCBhYm9ydCB8fCBpZ25vcmUgfHwgKGNhbmNlbCAmJiAheWVzICYmICFubykpKTsKLQkJcmV0cnlCdXR0b24uc2V0RW5hYmxlZCAoIShvayB8fCB5ZXMgfHwgbm8pKTsKLQkJYWJvcnRCdXR0b24uc2V0RW5hYmxlZCAoIShvayB8fCBjYW5jZWwgfHwgeWVzIHx8IG5vKSk7Ci0JCWlnbm9yZUJ1dHRvbi5zZXRFbmFibGVkICghKG9rIHx8IGNhbmNlbCB8fCB5ZXMgfHwgbm8pKTsKLQkJCi0JCWNyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkICgKLQkJCQkhKG9rIHx8IGNhbmNlbCB8fCB5ZXMgfHwgbm8gfHwgcmV0cnkgfHwgYWJvcnQgfHwgaWdub3JlKSB8fAotCQkJCW9rIHx8Ci0JCQkJKG9rICYmIGNhbmNlbCkgfHwKLQkJCQkoeWVzICYmIG5vKSB8fAotCQkJCSh5ZXMgJiYgbm8gJiYgY2FuY2VsKSB8fAotCQkJCShyZXRyeSAmJiBjYW5jZWwpIHx8Ci0JCQkJKGFib3J0ICYmIHJldHJ5ICYmIGlnbm9yZSkpOwotCQkKLQotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgdGhlIGNyZWF0ZSBidXR0b24gc2VsZWN0aW9uIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIGV2ZW50IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQKLQkgKi8KLQl2b2lkIGNyZWF0ZUJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCi0JCS8qIENvbXB1dGUgdGhlIGFwcHJvcHJpYXRlIGRpYWxvZyBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKG9rQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgb2tCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuT0s7Ci0JCWlmIChjYW5jZWxCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBjYW5jZWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQ0FOQ0VMOwotCQlpZiAoeWVzQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgeWVzQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULllFUzsKLQkJaWYgKG5vQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgbm9CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTk87Ci0JCWlmIChyZXRyeUJ1dHRvbi5nZXRFbmFibGVkICgpICYmIHJldHJ5QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlJFVFJZOwotCQlpZiAoYWJvcnRCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBhYm9ydEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5BQk9SVDsKLQkJaWYgKGlnbm9yZUJ1dHRvbi5nZXRFbmFibGVkICgpICYmIGlnbm9yZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5JR05PUkU7Ci0JCWlmIChpY29uRXJyb3JCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBpY29uRXJyb3JCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSUNPTl9FUlJPUjsKLQkJaWYgKGljb25JbmZvcm1hdGlvbkJ1dHRvbi5nZXRFbmFibGVkICgpICYmIGljb25JbmZvcm1hdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5JQ09OX0lORk9STUFUSU9OOwotCQlpZiAoaWNvblF1ZXN0aW9uQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgaWNvblF1ZXN0aW9uQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULklDT05fUVVFU1RJT047Ci0JCWlmIChpY29uV2FybmluZ0J1dHRvbi5nZXRFbmFibGVkICgpICYmIGljb25XYXJuaW5nQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULklDT05fV0FSTklORzsKLQkJaWYgKGljb25Xb3JraW5nQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgaWNvbldvcmtpbmdCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSUNPTl9XT1JLSU5HOwotCQlpZiAocHJpbWFyeU1vZGFsQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgcHJpbWFyeU1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlBSSU1BUllfTU9EQUw7Ci0JCWlmIChhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgYXBwbGljYXRpb25Nb2RhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5BUFBMSUNBVElPTl9NT0RBTDsKLQkJaWYgKHN5c3RlbU1vZGFsQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgc3lzdGVtTW9kYWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU1lTVEVNX01PREFMOwotCQlpZiAoc2F2ZUJ1dHRvbi5nZXRFbmFibGVkICgpICYmIHNhdmVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU0FWRTsKLQkJaWYgKG9wZW5CdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBvcGVuQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk9QRU47Ci0JCWlmIChtdWx0aUJ1dHRvbi5nZXRFbmFibGVkICgpICYmIG11bHRpQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk1VTFRJOwotCQotCQkvKiBPcGVuIHRoZSBhcHByb3ByaWF0ZSBkaWFsb2cgdHlwZSAqLwotCQlTdHJpbmcgbmFtZSA9IGRpYWxvZ0NvbWJvLmdldFRleHQgKCk7Ci0JCVNoZWxsIHNoZWxsID0gdGFiRm9sZGVyUGFnZS5nZXRTaGVsbCAoKTsKLQkJCi0JCWlmIChuYW1lLmVxdWFscyAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbG9yRGlhbG9nIikpKSB7Ci0JCQlDb2xvckRpYWxvZyBkaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2cgKHNoZWxsICxzdHlsZSk7Ci0JCQlkaWFsb2cuc2V0UkdCIChuZXcgUkdCICgxMDAsIDEwMCwgMTAwKSk7Ci0JCQlkaWFsb2cuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIikpOwotCQkJUkdCIHJlc3VsdCA9IGRpYWxvZy5vcGVuICgpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDb2xvckRpYWxvZyIpICsgVGV4dC5ERUxJTUlURVIpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiIiArIHJlc3VsdH0pICsgVGV4dC5ERUxJTUlURVIgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChuYW1lLmVxdWFscyAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRpcmVjdG9yeURpYWxvZyIpKSkgewotCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cgKHNoZWxsLCBzdHlsZSk7Ci0JCQlkaWFsb2cuc2V0TWVzc2FnZSAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkV4YW1wbGVfc3RyaW5nIikpOwotCQkJZGlhbG9nLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUaXRsZSIpKTsKLQkJCVN0cmluZyByZXN1bHQgPSBkaWFsb2cub3BlbiAoKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGlyZWN0b3J5RGlhbG9nIikgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyIiICsgcmVzdWx0fSkgKyBUZXh0LkRFTElNSVRFUiArIFRleHQuREVMSU1JVEVSKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKG5hbWUuZXF1YWxzIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsZURpYWxvZyIpKSkgewotCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyAoc2hlbGwsIHN0eWxlKTsKLQkJCWRpYWxvZy5zZXRGaWxlTmFtZSAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInJlYWRtZV90eHQiKSk7Ci0JCQlkaWFsb2cuc2V0RmlsdGVyTmFtZXMgKEZpbHRlck5hbWVzKTsKLQkJCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zIChGaWx0ZXJFeHRlbnNpb25zKTsKLQkJCWRpYWxvZy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiKSk7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsZURpYWxvZyIpICsgVGV4dC5ERUxJTUlURVIpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiIiArIHJlc3VsdH0pICsgVGV4dC5ERUxJTUlURVIgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChuYW1lLmVxdWFscyAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZvbnREaWFsb2ciKSkpIHsKLQkJCUZvbnREaWFsb2cgZGlhbG9nID0gbmV3IEZvbnREaWFsb2cgKHNoZWxsLCBzdHlsZSk7Ci0JCQlkaWFsb2cuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIikpOwotCQkJRm9udERhdGEgcmVzdWx0ID0gZGlhbG9nLm9wZW4gKCk7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZvbnREaWFsb2ciKSArIFRleHQuREVMSU1JVEVSKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IiIgKyByZXN1bHR9KSArIFRleHQuREVMSU1JVEVSICsgVGV4dC5ERUxJTUlURVIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAobmFtZS5lcXVhbHMgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQcmludERpYWxvZyIpKSkgewotCQkJUHJpbnREaWFsb2cgZGlhbG9nID0gbmV3IFByaW50RGlhbG9nIChzaGVsbCwgc3R5bGUpOwotCQkJZGlhbG9nLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIikpOwotCQkJUHJpbnRlckRhdGEgcmVzdWx0ID0gZGlhbG9nLm9wZW4gKCk7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlByaW50RGlhbG9nIikgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyIiICsgcmVzdWx0fSkgKyBUZXh0LkRFTElNSVRFUiArIFRleHQuREVMSU1JVEVSKTsKLQkJCXJldHVybjsKLQkJfQotCQotCQlpZiAobmFtZS5lcXVhbHMoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lc3NhZ2VCb3giKSkpIHsKLQkJCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3ggKHNoZWxsLCBzdHlsZSk7Ci0JCQlkaWFsb2cuc2V0TWVzc2FnZSAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkV4YW1wbGVfc3RyaW5nIikpOwotCQkJZGlhbG9nLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUaXRsZSIpKTsKLQkJCWludCByZXN1bHQgPSBkaWFsb2cub3BlbiAoKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVzc2FnZUJveCIpICsgVGV4dC5ERUxJTUlURVIpOwotCQkJLyoKLQkJCSAqIFRoZSByZXN1bHRpbmcgaW50ZWdlciBkZXBlbmRzIG9uIHRoZSBvcmlnaW5hbAotCQkJICogZGlhbG9nIHN0eWxlLiAgRGVjb2RlIHRoZSByZXN1bHQgYW5kIGRpc3BsYXkgaXQuCi0JCQkgKi8KLQkJCXN3aXRjaCAocmVzdWx0KSB7Ci0JCQkJY2FzZSBTV1QuT0s6Ci0JCQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IlNXVC5PSyJ9KSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULllFUzoKLQkJCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiU1dULllFUyJ9KSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk5POgotCQkJCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyJTV1QuTk8ifSkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5DQU5DRUw6Ci0JCQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IlNXVC5DQU5DRUwifSkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5BQk9SVDogCi0JCQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IlNXVC5BQk9SVCJ9KSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULlJFVFJZOgotCQkJCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyJTV1QuUkVUUlkifSkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5JR05PUkU6Ci0JCQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IlNXVC5JR05PUkUifSkpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQl0ZXh0V2lkZ2V0LmFwcGVuZChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IiIgKyByZXN1bHR9KSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJdGV4dFdpZGdldC5hcHBlbmQgKFRleHQuREVMSU1JVEVSICsgVGV4dC5ERUxJTUlURVIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiBncm91cC4gCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sR3JvdXAgKCkgewotCQkvKgotCQkgKiBDcmVhdGUgdGhlICJDb250cm9sIiBncm91cC4gIFRoaXMgaXMgdGhlIGdyb3VwIG9uIHRoZQotCQkgKiByaWdodCBoYWxmIG9mIGVhY2ggZXhhbXBsZSB0YWIuICBJdCBjb25zaXN0cyBvZiB0aGUKLQkJICogc3R5bGUgZ3JvdXAsIHRoZSBkaXNwbGF5IGdyb3VwIGFuZCB0aGUgc2l6ZSBncm91cC4KLQkJICovCQkJCi0JCWNvbnRyb2xHcm91cCA9IG5ldyBHcm91cCAodGFiRm9sZGVyUGFnZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQ9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQljb250cm9sR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlncmlkTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJY29udHJvbEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXJhbWV0ZXJzIikpOwotCQkKLQkJLyoKLQkJICogQ3JlYXRlIGEgZ3JvdXAgdG8gaG9sZCB0aGUgZGlhbG9nIHN0eWxlIGNvbWJvIGJveCBhbmQKLQkJICogY3JlYXRlIGRpYWxvZyBidXR0b24uCi0JCSAqLwotCQlkaWFsb2dTdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJZGlhbG9nU3R5bGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkaWFsb2dTdHlsZUdyb3VwLnNldExheW91dERhdGEgKGdyaWREYXRhKTsKLQkJZGlhbG9nU3R5bGVHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGlhbG9nX1R5cGUiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgY29tYm8gKi8KLQkJU3RyaW5nIFtdIHN0cmluZ3MgPSB7Ci0JCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ29sb3JEaWFsb2ciKSwgCi0JCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGlyZWN0b3J5RGlhbG9nIiksCi0JCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsZURpYWxvZyIpLAotCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZvbnREaWFsb2ciKSwKLQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQcmludERpYWxvZyIpLAotCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lc3NhZ2VCb3giKSwKLQkJfTsKLQkJZGlhbG9nQ29tYm8gPSBuZXcgQ29tYm8gKGRpYWxvZ1N0eWxlR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQlkaWFsb2dDb21iby5zZXRJdGVtcyAoc3RyaW5ncyk7Ci0JCWRpYWxvZ0NvbWJvLnNldFRleHQgKHN0cmluZ3MgWzBdKTsKLQkJZGlhbG9nQ29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudChzdHJpbmdzLmxlbmd0aCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgY3JlYXRlIGRpYWxvZyBidXR0b24gKi8KLQkJY3JlYXRlQnV0dG9uID0gbmV3IEJ1dHRvbihkaWFsb2dTdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNyZWF0ZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3JlYXRlX0RpYWxvZyIpKTsKLQkJY3JlYXRlQnV0dG9uLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHZhcmlvdXMgZGlhbG9nIGJ1dHRvbiBzdHlsZSBjb250cm9scyAqLwotCQlHcm91cCBidXR0b25TdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJYnV0dG9uU3R5bGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJYnV0dG9uU3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJYnV0dG9uU3R5bGVHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQnV0dG9uX1N0eWxlcyIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBidXR0b24gc3R5bGUgYnV0dG9ucyAqLwotCQlva0J1dHRvbiA9IG5ldyBCdXR0b24gKGJ1dHRvblN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW9rQnV0dG9uLnNldFRleHQgKCJTV1QuT0siKTsKLQkJY2FuY2VsQnV0dG9uID0gbmV3IEJ1dHRvbiAoYnV0dG9uU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJY2FuY2VsQnV0dG9uLnNldFRleHQgKCJTV1QuQ0FOQ0VMIik7Ci0JCXllc0J1dHRvbiA9IG5ldyBCdXR0b24gKGJ1dHRvblN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXllc0J1dHRvbi5zZXRUZXh0ICgiU1dULllFUyIpOwotCQlub0J1dHRvbiA9IG5ldyBCdXR0b24gKGJ1dHRvblN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW5vQnV0dG9uLnNldFRleHQgKCJTV1QuTk8iKTsKLQkJcmV0cnlCdXR0b24gPSBuZXcgQnV0dG9uIChidXR0b25TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyZXRyeUJ1dHRvbi5zZXRUZXh0ICgiU1dULlJFVFJZIik7Ci0JCWFib3J0QnV0dG9uID0gbmV3IEJ1dHRvbiAoYnV0dG9uU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYWJvcnRCdXR0b24uc2V0VGV4dCAoIlNXVC5BQk9SVCIpOwotCQlpZ25vcmVCdXR0b24gPSBuZXcgQnV0dG9uIChidXR0b25TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpZ25vcmVCdXR0b24uc2V0VGV4dCAoIlNXVC5JR05PUkUiKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBpY29uIHN0eWxlIGNvbnRyb2xzICovCi0JCUdyb3VwIGljb25TdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJaWNvblN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWljb25TdHlsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlpY29uU3R5bGVHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSWNvbl9TdHlsZXMiKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgaWNvbiBzdHlsZSBidXR0b25zICovCi0JCWljb25FcnJvckJ1dHRvbiA9IG5ldyBCdXR0b24gKGljb25TdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlpY29uRXJyb3JCdXR0b24uc2V0VGV4dCAoIlNXVC5JQ09OX0VSUk9SIik7Ci0JCWljb25JbmZvcm1hdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24gKGljb25TdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlpY29uSW5mb3JtYXRpb25CdXR0b24uc2V0VGV4dCAoIlNXVC5JQ09OX0lORk9STUFUSU9OIik7Ci0JCWljb25RdWVzdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24gKGljb25TdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlpY29uUXVlc3Rpb25CdXR0b24uc2V0VGV4dCAoIlNXVC5JQ09OX1FVRVNUSU9OIik7Ci0JCWljb25XYXJuaW5nQnV0dG9uID0gbmV3IEJ1dHRvbiAoaWNvblN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWljb25XYXJuaW5nQnV0dG9uLnNldFRleHQgKCJTV1QuSUNPTl9XQVJOSU5HIik7Ci0JCWljb25Xb3JraW5nQnV0dG9uID0gbmV3IEJ1dHRvbiAoaWNvblN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWljb25Xb3JraW5nQnV0dG9uLnNldFRleHQgKCJTV1QuSUNPTl9XT1JLSU5HIik7Ci0JCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgbW9kYWwgc3R5bGUgY29udHJvbHMgKi8KLQkJR3JvdXAgbW9kYWxTdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJbW9kYWxTdHlsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQltb2RhbFN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCW1vZGFsU3R5bGVHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTW9kYWxfU3R5bGVzIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIG1vZGFsIHN0eWxlIGJ1dHRvbnMgKi8KLQkJcHJpbWFyeU1vZGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAobW9kYWxTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlwcmltYXJ5TW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5QUklNQVJZX01PREFMIik7Ci0JCWFwcGxpY2F0aW9uTW9kYWxCdXR0b24gPSBuZXcgQnV0dG9uIChtb2RhbFN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWFwcGxpY2F0aW9uTW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5BUFBMSUNBVElPTl9NT0RBTCIpOwotCQlzeXN0ZW1Nb2RhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKG1vZGFsU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc3lzdGVtTW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5TWVNURU1fTU9EQUwiKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBmaWxlIGRpYWxvZyBzdHlsZSBjb250cm9scyAqLwotCQlHcm91cCBmaWxlRGlhbG9nU3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWZpbGVEaWFsb2dTdHlsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlmaWxlRGlhbG9nU3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJZmlsZURpYWxvZ1N0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVfRGlhbG9nX1N0eWxlcyIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBmaWxlIGRpYWxvZyBzdHlsZSBidXR0b25zICovCi0JCW9wZW5CdXR0b24gPSBuZXcgQnV0dG9uKGZpbGVEaWFsb2dTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlvcGVuQnV0dG9uLnNldFRleHQoIlNXVC5PUEVOIik7Ci0JCXNhdmVCdXR0b24gPSBuZXcgQnV0dG9uIChmaWxlRGlhbG9nU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2F2ZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlNBVkUiKTsKLQkJbXVsdGlCdXR0b24gPSBuZXcgQnV0dG9uKGZpbGVEaWFsb2dTdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQltdWx0aUJ1dHRvbi5zZXRUZXh0KCJTV1QuTVVMVEkiKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBvcmllbnRhdGlvbiBncm91cCAqLwotCQlpZiAoUlRMX1NVUFBPUlRfRU5BQkxFKSB7Ci0JCQljcmVhdGVPcmllbnRhdGlvbkdyb3VwKCk7Ci0JCX0KLQkJCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWRpYWxvZ0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlkaWFsb2dTZWxlY3RlZCAoZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJY3JlYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQljcmVhdGVCdXR0b25TZWxlY3RlZCAoZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgYnV0dG9uU3R5bGVMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWJ1dHRvblN0eWxlU2VsZWN0ZWQgKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQkJb2tCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGJ1dHRvblN0eWxlTGlzdGVuZXIpOwotCQljYW5jZWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGJ1dHRvblN0eWxlTGlzdGVuZXIpOwotCQl5ZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGJ1dHRvblN0eWxlTGlzdGVuZXIpOwotCQlub0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoYnV0dG9uU3R5bGVMaXN0ZW5lcik7Ci0JCXJldHJ5QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChidXR0b25TdHlsZUxpc3RlbmVyKTsKLQkJYWJvcnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGJ1dHRvblN0eWxlTGlzdGVuZXIpOwotCQlpZ25vcmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGJ1dHRvblN0eWxlTGlzdGVuZXIpOwotCQotCQkvKiBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIHN0eWxlIGJ1dHRvbnMgKi8KLQkJb2tCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQljYW5jZWxCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQl5ZXNCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlub0J1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCXJldHJ5QnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJYWJvcnRCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlpZ25vcmVCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlpY29uRXJyb3JCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlpY29uSW5mb3JtYXRpb25CdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlpY29uUXVlc3Rpb25CdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlpY29uV2FybmluZ0J1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCWljb25Xb3JraW5nQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJc2F2ZUJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCW9wZW5CdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlvcGVuQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCW11bHRpQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJaWNvbkluZm9ybWF0aW9uQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJZXhhbXBsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCQotCQkvKgotCQkgKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHRleHQgd2lkZ2V0IHRvIGRpc3BsYXkKLQkJICogdGhlIHJlc3VsdHMgcmV0dXJuZWQgYnkgdGhlIGV4YW1wbGUgZGlhbG9ncy4KLQkJICovCi0JCXJlc3VsdEdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJcmVzdWx0R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXJlc3VsdEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXJlc3VsdEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEaWFsb2dfUmVzdWx0IikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJLyoKLQkJICogQ3JlYXRlIGEgbXVsdGkgbGluZWQsIHNjcm9sbGVkIHRleHQgd2lkZ2V0IGZvciBvdXRwdXQuCi0JCSAqLwotCQl0ZXh0V2lkZ2V0ID0gbmV3IFRleHQocmVzdWx0R3JvdXAsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJdGV4dFdpZGdldC5zZXRMYXlvdXREYXRhIChncmlkRGF0YSk7CQotCX0KLQkKLQkvKioKLQkgKiBUaGUgcGxhdGZvcm0gZGlhbG9ncyBkbyBub3QgaGF2ZSBTV1QgbGlzdGVuZXJzLgotCSAqLwotCXZvaWQgY3JlYXRlTGlzdGVuZXJzR3JvdXAgKCkgewotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBhIGRpYWxvZyB0eXBlIGNvbWJvIHNlbGVjdGlvbiBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBldmVudCB0aGUgc2VsZWN0aW9uIGV2ZW50Ci0JICovCi0Jdm9pZCBkaWFsb2dTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkKLQkJLyogRW5hYmxlL0Rpc2FibGUgdGhlIGJ1dHRvbnMgKi8KLQkJU3RyaW5nIG5hbWUgPSBkaWFsb2dDb21iby5nZXRUZXh0ICgpOwotCQlib29sZWFuIGlzTWVzc2FnZUJveCA9IG5hbWUuZXF1YWxzIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVzc2FnZUJveCIpKTsKLQkJYm9vbGVhbiBpc0ZpbGVEaWFsb2cgPSBuYW1lLmVxdWFscyAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVEaWFsb2ciKSk7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCWNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQl5ZXNCdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJbm9CdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJcmV0cnlCdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJYWJvcnRCdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJaWdub3JlQnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCWljb25FcnJvckJ1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQlpY29uSW5mb3JtYXRpb25CdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJaWNvblF1ZXN0aW9uQnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCWljb25XYXJuaW5nQnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCWljb25Xb3JraW5nQnV0dG9uLnNldEVuYWJsZWQgIChpc01lc3NhZ2VCb3gpOwotCQlzYXZlQnV0dG9uLnNldEVuYWJsZWQgKGlzRmlsZURpYWxvZyk7Ci0JCW9wZW5CdXR0b24uc2V0RW5hYmxlZCAoaXNGaWxlRGlhbG9nKTsKLQkJbXVsdGlCdXR0b24uc2V0RW5hYmxlZCAoaXNGaWxlRGlhbG9nKTsKLQkKLQkJLyogVW5zZWxlY3QgdGhlIGJ1dHRvbnMgKi8KLQkJaWYgKCFpc01lc3NhZ2VCb3gpIHsKLQkJCW9rQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJY2FuY2VsQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJeWVzQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJbm9CdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlyZXRyeUJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCWFib3J0QnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJaWdub3JlQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbMF07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkRpYWxvZyI7Ci0JfQotCQotCS8qKgotCSAqIFJlY3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCByZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJaWYgKHRleHRXaWRnZXQgPT0gbnVsbCkgewotCQkJc3VwZXIucmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJfSAKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Hcm91cFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvR3JvdXBUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjNjJlNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Hcm91cFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgR3JvdXBUYWIgZXh0ZW5kcyBUYWIgewotCUJ1dHRvbiB0aXRsZUJ1dHRvbjsKLQkKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUdyb3VwIGdyb3VwMTsKLQlHcm91cCBncm91cEdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gc2hhZG93RXRjaGVkSW5CdXR0b24sIHNoYWRvd0V0Y2hlZE91dEJ1dHRvbiwgc2hhZG93SW5CdXR0b24sIHNoYWRvd091dEJ1dHRvbiwgc2hhZG93Tm9uZUJ1dHRvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlHcm91cFRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJPdGhlciIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVPdGhlckdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlT3RoZXJHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIGRpc3BsYXkgY29udHJvbHMgc3BlY2lmaWMgdG8gdGhpcyBleGFtcGxlICovCi0JCXRpdGxlQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJdGl0bGVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlX1RleHQiKSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCXRpdGxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRUaXRsZVRleHQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIEdyb3VwICovCi0JCWdyb3VwR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlncm91cEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlncm91cEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWdyb3VwR3JvdXAuc2V0VGV4dCAoIkdyb3VwIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoc2hhZG93RXRjaGVkSW5CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU0hBRE9XX0VUQ0hFRF9JTjsKLQkJaWYgKHNoYWRvd0V0Y2hlZE91dEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfRVRDSEVEX09VVDsKLQkJaWYgKHNoYWRvd0luQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19JTjsKLQkJaWYgKHNoYWRvd091dEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfT1VUOwotCQlpZiAoc2hhZG93Tm9uZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfTk9ORTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0KLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJZ3JvdXAxID0gbmV3IEdyb3VwIChncm91cEdyb3VwLCBzdHlsZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXNoYWRvd0V0Y2hlZEluQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93RXRjaGVkSW5CdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfRVRDSEVEX0lOIik7Ci0JCXNoYWRvd0V0Y2hlZEluQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJc2hhZG93RXRjaGVkT3V0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93RXRjaGVkT3V0QnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX0VUQ0hFRF9PVVQiKTsKLQkJc2hhZG93SW5CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dJbkJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19JTiIpOwotCQlzaGFkb3dPdXRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dPdXRCdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfT1VUIik7Ci0JCXNoYWRvd05vbmVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dOb25lQnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX05PTkUiKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoISgoQnV0dG9uKSBldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbiAoKSkgcmV0dXJuOwotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX07Ci0JCXNoYWRvd0V0Y2hlZEluQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXNoYWRvd0V0Y2hlZE91dEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzaGFkb3dJbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzaGFkb3dPdXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCUNvbnRyb2wgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2wgW10ge2dyb3VwMX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJHcm91cCI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGl0bGUgdGV4dCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRUaXRsZVRleHQgKCkgewotCQlpZiAodGl0bGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlncm91cDEuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlX1RleHQiKSk7Ci0JCX0gZWxzZSB7Ci0JCQlncm91cDEuc2V0VGV4dCAoIiIpOwotCQl9Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJc2hhZG93RXRjaGVkSW5CdXR0b24uc2V0U2VsZWN0aW9uICgoZ3JvdXAxLmdldFN0eWxlICgpICYgU1dULlNIQURPV19FVENIRURfSU4pICE9IDApOwotCQlzaGFkb3dFdGNoZWRPdXRCdXR0b24uc2V0U2VsZWN0aW9uICgoZ3JvdXAxLmdldFN0eWxlICgpICYgU1dULlNIQURPV19FVENIRURfT1VUKSAhPSAwKTsKLQkJc2hhZG93SW5CdXR0b24uc2V0U2VsZWN0aW9uICgoZ3JvdXAxLmdldFN0eWxlICgpICYgU1dULlNIQURPV19JTikgIT0gMCk7Ci0JCXNoYWRvd091dEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChncm91cDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX09VVCkgIT0gMCk7Ci0JCXNoYWRvd05vbmVCdXR0b24uc2V0U2VsZWN0aW9uICgoZ3JvdXAxLmdldFN0eWxlICgpICYgU1dULlNIQURPV19OT05FKSAhPSAwKTsKLQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKGdyb3VwMS5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCQlzZXRUaXRsZVRleHQgKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTGFiZWxUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xhYmVsVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExOGNhZWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTGFiZWxUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWNsYXNzIExhYmVsVGFiIGV4dGVuZHMgQWxpZ25hYmxlVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUxhYmVsIGxhYmVsMSwgbGFiZWwyLCBsYWJlbDMsIGxhYmVsNCwgbGFiZWw1LCBsYWJlbDY7Ci0JR3JvdXAgdGV4dExhYmVsR3JvdXAsIGltYWdlTGFiZWxHcm91cDsKLQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gd3JhcEJ1dHRvbiwgc2VwYXJhdG9yQnV0dG9uLCBob3Jpem9udGFsQnV0dG9uLCB2ZXJ0aWNhbEJ1dHRvbiwgc2hhZG93SW5CdXR0b24sIHNoYWRvd091dEJ1dHRvbiwgc2hhZG93Tm9uZUJ1dHRvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JTGFiZWxUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHRleHQgbGFiZWxzICovCi0JCXRleHRMYWJlbEdyb3VwID0gbmV3IEdyb3VwKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJdGV4dExhYmVsR3JvdXAuc2V0TGF5b3V0IChncmlkTGF5b3V0KTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJdGV4dExhYmVsR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJdGV4dExhYmVsR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRleHRfTGFiZWxzIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGltYWdlIGxhYmVscyAqLwotCQlpbWFnZUxhYmVsR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULlNIQURPV19OT05FKTsKLQkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQlpbWFnZUxhYmVsR3JvdXAuc2V0TGF5b3V0IChncmlkTGF5b3V0KTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJaW1hZ2VMYWJlbEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWltYWdlTGFiZWxHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2VfTGFiZWxzIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHdyYXBCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuV1JBUDsKLQkJaWYgKHNlcGFyYXRvckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TRVBBUkFUT1I7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhPUklaT05UQUw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WRVJUSUNBTDsKLQkJaWYgKHNoYWRvd0luQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19JTjsKLQkJaWYgKHNoYWRvd091dEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfT1VUOwotCQlpZiAoc2hhZG93Tm9uZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfTk9ORTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmIChsZWZ0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkxFRlQ7Ci0JCWlmIChjZW50ZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQ0VOVEVSOwotCQlpZiAocmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUklHSFQ7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWxhYmVsMSA9IG5ldyBMYWJlbCAodGV4dExhYmVsR3JvdXAsIHN0eWxlKTsKLQkJbGFiZWwxLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk9uZSIpKTsKLQkJbGFiZWwyID0gbmV3IExhYmVsICh0ZXh0TGFiZWxHcm91cCwgc3R5bGUpOwotCQlsYWJlbDIuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVHdvIikpOwotCQlsYWJlbDMgPSBuZXcgTGFiZWwgKHRleHRMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWlmICh3cmFwQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJbGFiZWwzLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJXcmFwX1RleHQiKSk7Ci0JCX0gZWxzZSB7Ci0JCQlsYWJlbDMuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRocmVlIikpOwotCQl9Ci0JCWxhYmVsNCA9IG5ldyBMYWJlbCAoaW1hZ2VMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsNC5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWxhYmVsNSA9IG5ldyBMYWJlbCAoaW1hZ2VMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsNS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlsYWJlbDYgPSBuZXcgTGFiZWwoaW1hZ2VMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsNi5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXdyYXBCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl3cmFwQnV0dG9uLnNldFRleHQgKCJTV1QuV1JBUCIpOwotCQlzZXBhcmF0b3JCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzZXBhcmF0b3JCdXR0b24uc2V0VGV4dCAoIlNXVC5TRVBBUkFUT1IiKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0VGV4dCAoIlNXVC5IT1JJWk9OVEFMIik7Ci0JCXZlcnRpY2FsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJdmVydGljYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5WRVJUSUNBTCIpOwotCQlHcm91cCBzdHlsZVN1Ykdyb3VwID0gbmV3IEdyb3VwIChzdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXN0eWxlU3ViR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXNoYWRvd0luQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVTdWJHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93SW5CdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfSU4iKTsKLQkJc2hhZG93T3V0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVTdWJHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX09VVCIpOwotCQlzaGFkb3dOb25lQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVTdWJHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19OT05FIik7Ci0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24oc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQoIlNXVC5CT1JERVIiKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmICgoZXZlbnQud2lkZ2V0LmdldFN0eWxlKCkgJiBTV1QuUkFESU8pICE9IDApIHsKLQkJCQkJaWYgKCEoKEJ1dHRvbikgZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24gKCkpIHJldHVybjsKLQkJCQl9Ci0JCQkJcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCX0KLQkJfTsKLQkJc2hhZG93SW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJc2hhZG93T3V0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXNoYWRvd05vbmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sIFtdIHtsYWJlbDEsIGxhYmVsMiwgbGFiZWwzLCBsYWJlbDQsIGxhYmVsNSwgbGFiZWw2fTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJUZXh0IiwgIlRvb2xUaXBUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiTGFiZWwiOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldEFsaWdubWVudCAoKSB7Ci0JCWludCBhbGlnbm1lbnQgPSAwOwotCQlpZiAobGVmdEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5MRUZUOwotCQlpZiAoY2VudGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJaWYgKHJpZ2h0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULlJJR0hUOwotCQlsYWJlbDEuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlsYWJlbDIuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlsYWJlbDMuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlsYWJlbDQuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlsYWJlbDUuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlsYWJlbDYuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWJvb2xlYW4gaXNTZXBhcmF0b3IgPSAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULlNFUEFSQVRPUikgIT0gMDsKLQkJd3JhcEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCFpc1NlcGFyYXRvciAmJiAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULldSQVApICE9IDApOwotCQlsZWZ0QnV0dG9uLnNldFNlbGVjdGlvbiAoIWlzU2VwYXJhdG9yICYmIChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuTEVGVCkgIT0gMCk7Ci0JCWNlbnRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKCFpc1NlcGFyYXRvciAmJiAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULkNFTlRFUikgIT0gMCk7Ci0JCXJpZ2h0QnV0dG9uLnNldFNlbGVjdGlvbiAoIWlzU2VwYXJhdG9yICYmIChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuUklHSFQpICE9IDApOwotCQlzaGFkb3dJbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKGlzU2VwYXJhdG9yICYmIChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX0lOKSAhPSAwKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFNlbGVjdGlvbiAoaXNTZXBhcmF0b3IgJiYgKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5TSEFET1dfT1VUKSAhPSAwKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKGlzU2VwYXJhdG9yICYmIChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX05PTkUpICE9IDApOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFNlbGVjdGlvbiAoaXNTZXBhcmF0b3IgJiYgKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5IT1JJWk9OVEFMKSAhPSAwKTsKLQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uIChpc1NlcGFyYXRvciAmJiAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULlZFUlRJQ0FMKSAhPSAwKTsJCQotCQl3cmFwQnV0dG9uLnNldEVuYWJsZWQgKCFpc1NlcGFyYXRvcik7Ci0JCWxlZnRCdXR0b24uc2V0RW5hYmxlZCAoIWlzU2VwYXJhdG9yKTsKLQkJY2VudGVyQnV0dG9uLnNldEVuYWJsZWQgKCFpc1NlcGFyYXRvcik7Ci0JCXJpZ2h0QnV0dG9uLnNldEVuYWJsZWQgKCFpc1NlcGFyYXRvcik7Ci0JCXNoYWRvd0luQnV0dG9uLnNldEVuYWJsZWQgKGlzU2VwYXJhdG9yKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldEVuYWJsZWQgKGlzU2VwYXJhdG9yKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5zZXRFbmFibGVkIChpc1NlcGFyYXRvcik7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0RW5hYmxlZCAoaXNTZXBhcmF0b3IpOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRFbmFibGVkIChpc1NlcGFyYXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTGlua1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTGlua1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWI5MTgxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xpbmtUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1jbGFzcyBMaW5rVGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUxpbmsgbGluazE7Ci0JR3JvdXAgbGlua0dyb3VwOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlMaW5rVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBsaXN0ICovCi0JCWxpbmtHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpbmtHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJbGlua0dyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWxpbmtHcm91cC5zZXRUZXh0ICgiTGluayIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCQkKLQkJdHJ5IHsKLQkJCWxpbmsxID0gbmV3IExpbmsgKGxpbmtHcm91cCwgc3R5bGUpOwotCQkJbGluazEuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmtUZXh0IikpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQkvLyB0ZW1wb3JhcnkgY29kZSBmb3IgcGhvdG9uCi0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAobGlua0dyb3VwLCBTV1QuQ0VOVEVSIHwgU1dULldSQVApOwotCQkJbGFiZWwuc2V0VGV4dCAoIkxpbmsgd2lkZ2V0IG5vdCBzdXBvcnRlZCIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24oc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLS8vCQkgdGVtcG9yYXJ5IGNvZGUgZm9yIHBob3RvbgotCQlpZiAobGluazEgIT0gbnVsbCkgcmV0dXJuIG5ldyBDb250cm9sIFtdIHtsaW5rMX07Ci0JCXJldHVybiBuZXcgQ29udHJvbFtdIHt9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlRleHQiLCAiVG9vbFRpcFRleHQifTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiTGluayI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9MaXN0VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9MaXN0VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhZDM3ODUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTGlzdFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIExpc3RUYWIgZXh0ZW5kcyBTY3JvbGxhYmxlVGFiIHsKLQotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JTGlzdCBsaXN0MTsKLQlHcm91cCBsaXN0R3JvdXA7Ci0JCi0Jc3RhdGljIFN0cmluZyBbXSBMaXN0RGF0YTEgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8wIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8xIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8yIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8zIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV80IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV81IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV82IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV83IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV84Iil9OwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUxpc3RUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGxpc3QgKi8KLQkJbGlzdEdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJbGlzdEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlsaXN0R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJbGlzdEdyb3VwLnNldFRleHQgKCJMaXN0Iik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoc2luZ2xlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNJTkdMRTsKLQkJaWYgKG11bHRpQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk1VTFRJOwotCQlpZiAoaG9yaXpvbnRhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5IX1NDUk9MTDsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlZfU0NST0xMOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJbGlzdDEgPSBuZXcgTGlzdCAobGlzdEdyb3VwLCBzdHlsZSk7Ci0JCWxpc3QxLnNldEl0ZW1zIChMaXN0RGF0YTEpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCUNvbnRyb2wgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2wgW10ge2xpc3QxfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJJdGVtcyIsICJTZWxlY3Rpb24iLCAiVG9vbFRpcFRleHQiLCAiVG9wSW5kZXgifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJMaXN0IjsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9NZW51VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9NZW51VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1N2Y4MzIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTWVudVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotY2xhc3MgTWVudVRhYiBleHRlbmRzIFRhYiB7CQotCS8qIFdpZGdldHMgYWRkZWQgdG8gdGhlICJNZW51IFN0eWxlIiwgIk1lbnVJdGVtIFN0eWxlIiBhbmQgIk90aGVyIiBncm91cHMgKi8KLQlCdXR0b24gYmFyQnV0dG9uLCBkcm9wRG93bkJ1dHRvbiwgcG9wVXBCdXR0b24sIG5vUmFkaW9Hcm91cEJ1dHRvbiwgbGVmdFRvUmlnaHRCdXR0b24sIHJpZ2h0VG9MZWZ0QnV0dG9uOwotCUJ1dHRvbiBjaGVja0J1dHRvbiwgY2FzY2FkZUJ1dHRvbiwgcHVzaEJ1dHRvbiwgcmFkaW9CdXR0b24sIHNlcGFyYXRvckJ1dHRvbjsKLQlCdXR0b24gaW1hZ2VzQnV0dG9uLCBhY2NlbGVyYXRvcnNCdXR0b24sIG1uZW1vbmljc0J1dHRvbiwgc3ViTWVudUJ1dHRvbiwgc3ViU3ViTWVudUJ1dHRvbjsKLQlCdXR0b24gY3JlYXRlQnV0dG9uLCBjbG9zZUFsbEJ1dHRvbjsKLQlHcm91cCBtZW51SXRlbVN0eWxlR3JvdXA7Ci0KLQkvKiBWYXJpYWJsZXMgdXNlZCB0byB0cmFjayB0aGUgb3BlbiBzaGVsbHMgKi8KLQlpbnQgc2hlbGxDb3VudCA9IDA7Ci0JU2hlbGwgW10gc2hlbGxzID0gbmV3IFNoZWxsIFs0XTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JTWVudVRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ2xvc2UgYWxsIHRoZSBleGFtcGxlIHNoZWxscy4KLQkgKi8KLQl2b2lkIGNsb3NlQWxsU2hlbGxzKCkgewotCQlmb3IgKGludCBpID0gMDsgaTxzaGVsbENvdW50OyBpKyspIHsKLQkJCWlmIChzaGVsbHNbaV0gIT0gbnVsbCAmICFzaGVsbHMgW2ldLmlzRGlzcG9zZWQgKCkpIHsKLQkJCQlzaGVsbHMgW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlzaGVsbENvdW50ID0gMDsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlIHRoZSBDcmVhdGUgYnV0dG9uIHNlbGVjdGlvbiBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBldmVudCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkKLQkJLyoKLQkJICogUmVtZW1iZXIgdGhlIGV4YW1wbGUgc2hlbGxzIHNvIHRoZXkKLQkJICogY2FuIGJlIGRpc3Bvc2VkIGJ5IHRoZSB1c2VyLgotCQkgKi8KLQkJaWYgKHNoZWxsQ291bnQgPj0gc2hlbGxzLmxlbmd0aCkgewotCQkJU2hlbGwgW10gbmV3U2hlbGxzID0gbmV3IFNoZWxsIFtzaGVsbHMubGVuZ3RoICsgNF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5IChzaGVsbHMsIDAsIG5ld1NoZWxscywgMCwgc2hlbGxzLmxlbmd0aCk7Ci0JCQlzaGVsbHMgPSBuZXdTaGVsbHM7Ci0JCX0KLQkKLQkJaW50IG9yaWVudGF0aW9uID0gMDsKLQkJaWYgKGxlZnRUb1JpZ2h0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBvcmllbnRhdGlvbiB8PSBTV1QuTEVGVF9UT19SSUdIVDsKLQkJaWYgKHJpZ2h0VG9MZWZ0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBvcmllbnRhdGlvbiB8PSBTV1QuUklHSFRfVE9fTEVGVDsKLQkJaW50IHJhZGlvQmVoYXZpb3IgPSAwOwotCQlpZiAobm9SYWRpb0dyb3VwQnV0dG9uLmdldFNlbGVjdGlvbigpKSByYWRpb0JlaGF2aW9yIHw9IFNXVC5OT19SQURJT19HUk9VUDsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgc2hlbGwgYW5kIG1lbnUocykgKi8KLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKFNXVC5TSEVMTF9UUklNIHwgb3JpZW50YXRpb24pOwotCQlzaGVsbHMgW3NoZWxsQ291bnRdID0gc2hlbGw7Ci0JCWlmIChiYXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQkvKiBDcmVhdGUgbWVudSBiYXIuICovCi0JCQlNZW51IG1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUiB8IHJhZGlvQmVoYXZpb3IpOwotCQkJc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLQkJCWhvb2tMaXN0ZW5lcnMobWVudUJhcik7Ci0KLQkJCWlmIChkcm9wRG93bkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSAmJiBjYXNjYWRlQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJLyogQ3JlYXRlIGNhc2NhZGUgYnV0dG9uIGFuZCBkcm9wLWRvd24gbWVudSBpbiBtZW51IGJhci4gKi8KLQkJCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJCQlpdGVtLnNldFRleHQoZ2V0TWVudUl0ZW1UZXh0KCJDYXNjYWRlIikpOwotCQkJCWlmIChpbWFnZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW0uc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQkJCWhvb2tMaXN0ZW5lcnMoaXRlbSk7Ci0JCQkJTWVudSBkcm9wRG93bk1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTiB8IHJhZGlvQmVoYXZpb3IpOwotCQkJCWl0ZW0uc2V0TWVudShkcm9wRG93bk1lbnUpOwotCQkJCWhvb2tMaXN0ZW5lcnMoZHJvcERvd25NZW51KTsKLQkKLQkJCQkvKiBDcmVhdGUgdmFyaW91cyBtZW51IGl0ZW1zLCBkZXBlbmRpbmcgb24gc2VsZWN0aW9ucy4gKi8KLQkJCQljcmVhdGVNZW51SXRlbXMoZHJvcERvd25NZW51LCBzdWJNZW51QnV0dG9uLmdldFNlbGVjdGlvbigpLCBzdWJTdWJNZW51QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHBvcFVwQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkvKiBDcmVhdGUgcG9wLXVwIG1lbnUuICovCi0JCQlNZW51IHBvcFVwTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuUE9QX1VQIHwgcmFkaW9CZWhhdmlvcik7Ci0JCQlzaGVsbC5zZXRNZW51KHBvcFVwTWVudSk7Ci0JCQlob29rTGlzdGVuZXJzKHBvcFVwTWVudSk7Ci0KLQkJCS8qIENyZWF0ZSB2YXJpb3VzIG1lbnUgaXRlbXMsIGRlcGVuZGluZyBvbiBzZWxlY3Rpb25zLiAqLwotCQkJY3JlYXRlTWVudUl0ZW1zKHBvcFVwTWVudSwgc3ViTWVudUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSwgc3ViU3ViTWVudUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQkJCi0JCS8qIFNldCB0aGUgc2l6ZSwgdGl0bGUgYW5kIG9wZW4gdGhlIHNoZWxsLiAqLwotCQlzaGVsbC5zZXRTaXplICgzMDAsIDEwMCk7Ci0JCXNoZWxsLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUaXRsZSIpICsgc2hlbGxDb3VudCk7Ci0JCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQkJZS5nYy5kcmF3U3RyaW5nKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQb3B1cE1lbnVIZXJlIiksIDIwLCAyMCk7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5vcGVuICgpOwotCQlzaGVsbENvdW50Kys7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiBncm91cC4gCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sR3JvdXAgKCkgewotCQkvKgotCQkgKiBDcmVhdGUgdGhlICJDb250cm9sIiBncm91cC4gIFRoaXMgaXMgdGhlIGdyb3VwIG9uIHRoZQotCQkgKiByaWdodCBoYWxmIG9mIGVhY2ggZXhhbXBsZSB0YWIuICBGb3IgTWVudVRhYiwgaXQgY29uc2lzdHMgb2YKLQkJICogdGhlIE1lbnUgc3R5bGUgZ3JvdXAsIHRoZSBNZW51SXRlbSBzdHlsZSBncm91cCBhbmQgdGhlICdvdGhlcicgZ3JvdXAuCi0JCSAqLwkJCi0JCWNvbnRyb2xHcm91cCA9IG5ldyBHcm91cCAodGFiRm9sZGVyUGFnZSwgU1dULk5PTkUpOwotCQljb250cm9sR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMiwgdHJ1ZSkpOwotCQljb250cm9sR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGFyYW1ldGVycyIpKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBtZW51IHN0eWxlIGNvbnRyb2xzICovCi0JCXN0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlzdHlsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlzdHlsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlzdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNZW51X1N0eWxlcyIpKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBtZW51IGl0ZW0gc3R5bGUgY29udHJvbHMgKi8KLQkJbWVudUl0ZW1TdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJbWVudUl0ZW1TdHlsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQltZW51SXRlbVN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJbWVudUl0ZW1TdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNZW51SXRlbV9TdHlsZXMiKSk7Ci0KLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSAnb3RoZXInIGNvbnRyb2xzICovCi0JCW90aGVyR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlvdGhlckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlvdGhlckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCW90aGVyR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk90aGVyIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCQotCQkvKiBDcmVhdGUgdGhlIG1lbnUgc3R5bGUgYnV0dG9ucyAqLwotCQliYXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQliYXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CQVIiKTsKLQkJZHJvcERvd25CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlkcm9wRG93bkJ1dHRvbi5zZXRUZXh0ICgiU1dULkRST1BfRE9XTiIpOwotCQlwb3BVcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXBvcFVwQnV0dG9uLnNldFRleHQgKCJTV1QuUE9QX1VQIik7Ci0JCW5vUmFkaW9Hcm91cEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW5vUmFkaW9Hcm91cEJ1dHRvbi5zZXRUZXh0ICgiU1dULk5PX1JBRElPX0dST1VQIik7Ci0JCWxlZnRUb1JpZ2h0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJbGVmdFRvUmlnaHRCdXR0b24uc2V0VGV4dCAoIlNXVC5MRUZUX1RPX1JJR0hUIik7Ci0JCWxlZnRUb1JpZ2h0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJcmlnaHRUb0xlZnRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlyaWdodFRvTGVmdEJ1dHRvbi5zZXRUZXh0ICgiU1dULlJJR0hUX1RPX0xFRlQiKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBtZW51IGl0ZW0gc3R5bGUgYnV0dG9ucyAqLwotCQljYXNjYWRlQnV0dG9uID0gbmV3IEJ1dHRvbiAobWVudUl0ZW1TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQljYXNjYWRlQnV0dG9uLnNldFRleHQgKCJTV1QuQ0FTQ0FERSIpOwotCQljaGVja0J1dHRvbiA9IG5ldyBCdXR0b24gKG1lbnVJdGVtU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCdXR0b24uc2V0VGV4dCAoIlNXVC5DSEVDSyIpOwotCQlwdXNoQnV0dG9uID0gbmV3IEJ1dHRvbiAobWVudUl0ZW1TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlwdXNoQnV0dG9uLnNldFRleHQgKCJTV1QuUFVTSCIpOwotCQlyYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24gKG1lbnVJdGVtU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJcmFkaW9CdXR0b24uc2V0VGV4dCAoIlNXVC5SQURJTyIpOwotCQlzZXBhcmF0b3JCdXR0b24gPSBuZXcgQnV0dG9uIChtZW51SXRlbVN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNlcGFyYXRvckJ1dHRvbi5zZXRUZXh0ICgiU1dULlNFUEFSQVRPUiIpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSAnb3RoZXInIGJ1dHRvbnMgKi8KLQkJaW1hZ2VzQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJaW1hZ2VzQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbWFnZXMiKSk7Ci0JCWFjY2VsZXJhdG9yc0J1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWFjY2VsZXJhdG9yc0J1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQWNjZWxlcmF0b3JzIikpOwotCQltbmVtb25pY3NCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQltbmVtb25pY3NCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1uZW1vbmljcyIpKTsKLQkJc3ViTWVudUJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXN1Yk1lbnVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlN1Yk1lbnUiKSk7Ci0JCXN1YlN1Yk1lbnVCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzdWJTdWJNZW51QnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTdWJTdWJNZW51IikpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSAiY3JlYXRlIiBhbmQgImNsb3NlQWxsIiBidXR0b25zIChhbmQgYSAnZmlsbGVyJyBsYWJlbCB0byBwbGFjZSB0aGVtKSAqLwotCQluZXcgTGFiZWwoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNyZWF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQljcmVhdGVCdXR0b24uc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwotCQljcmVhdGVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNyZWF0ZV9TaGVsbCIpKTsKLQkJY2xvc2VBbGxCdXR0b24gPSBuZXcgQnV0dG9uIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJY2xvc2VBbGxCdXR0b24uc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCQljbG9zZUFsbEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2xvc2VfQWxsX1NoZWxscyIpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJY3JlYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNyZWF0ZUJ1dHRvblNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJY2xvc2VBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY2xvc2VBbGxTaGVsbHMgKCk7Ci0JCQl9Ci0JCX0pOwotCQlzdWJNZW51QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1YlN1Yk1lbnVCdXR0b24uc2V0RW5hYmxlZCAoc3ViTWVudUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQkJfQotCQl9KTsKLQkKLQkJLyogU2V0IHRoZSBkZWZhdWx0IHN0YXRlICovCi0JCWJhckJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQlkcm9wRG93bkJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQlwb3BVcEJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQljYXNjYWRlQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCWNoZWNrQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCXB1c2hCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJcmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJc2VwYXJhdG9yQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCXN1YlN1Yk1lbnVCdXR0b24uc2V0RW5hYmxlZCAoc3ViTWVudUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKiBDcmVhdGUgdmFyaW91cyBtZW51IGl0ZW1zLCBkZXBlbmRpbmcgb24gc2VsZWN0aW9ucy4gKi8KLQl2b2lkIGNyZWF0ZU1lbnVJdGVtcyhNZW51IG1lbnUsIGJvb2xlYW4gY3JlYXRlU3ViTWVudSwgYm9vbGVhbiBjcmVhdGVTdWJTdWJNZW51KSB7Ci0JCU1lbnVJdGVtIGl0ZW07Ci0JCWlmIChwdXNoQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLQkJCWl0ZW0uc2V0VGV4dChnZXRNZW51SXRlbVRleHQoIlB1c2giKSk7Ci0JCQlpZiAoYWNjZWxlcmF0b3JzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgU1dULk1PRDIgKyAnUCcpOwotCQkJaWYgKGltYWdlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgaXRlbS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJCWhvb2tMaXN0ZW5lcnMoaXRlbSk7Ci0JCX0KLQkJCi0JCWlmIChzZXBhcmF0b3JCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCW5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkJfQotCQkKLQkJaWYgKGNoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DSEVDSyk7Ci0JCQlpdGVtLnNldFRleHQoZ2V0TWVudUl0ZW1UZXh0KCJDaGVjayIpKTsKLQkJCWlmIChhY2NlbGVyYXRvcnNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyBTV1QuTU9EMiArICdDJyk7Ci0JCQlpZiAoaW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJCWhvb2tMaXN0ZW5lcnMoaXRlbSk7Ci0JCX0KLQkJCQkKLQkJaWYgKHJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5SQURJTyk7Ci0JCQlpdGVtLnNldFRleHQoZ2V0TWVudUl0ZW1UZXh0KCIxUmFkaW8iKSk7Ci0JCQlpZiAoYWNjZWxlcmF0b3JzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgU1dULk1PRDIgKyAnMScpOwotCQkJaWYgKGltYWdlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgaXRlbS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJCWl0ZW0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJaG9va0xpc3RlbmVycyhpdGVtKTsKLQotCQkJaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUkFESU8pOwotCQkJaXRlbS5zZXRUZXh0KGdldE1lbnVJdGVtVGV4dCgiMlJhZGlvIikpOwotCQkJaWYgKGFjY2VsZXJhdG9yc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArIFNXVC5NT0QyICsgJzInKTsKLQkJCWlmIChpbWFnZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW0uc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCQlob29rTGlzdGVuZXJzKGl0ZW0pOwotCQl9Ci0KLQkJaWYgKGNyZWF0ZVN1Yk1lbnUgJiYgY2FzY2FkZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJLyogQ3JlYXRlIGNhc2NhZGUgYnV0dG9uIGFuZCBkcm9wLWRvd24gbWVudSBmb3IgdGhlIHN1Yi1tZW51LiAqLwotCQkJaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0FTQ0FERSk7Ci0JCQlpdGVtLnNldFRleHQoZ2V0TWVudUl0ZW1UZXh0KCJDYXNjYWRlIikpOwotCQkJaWYgKGltYWdlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgaXRlbS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCQlob29rTGlzdGVuZXJzKGl0ZW0pOwotCQkJTWVudSBzdWJNZW51ID0gbmV3IE1lbnUobWVudS5nZXRTaGVsbCgpLCBTV1QuRFJPUF9ET1dOKTsKLQkJCWl0ZW0uc2V0TWVudShzdWJNZW51KTsKLQkJCWhvb2tMaXN0ZW5lcnMoc3ViTWVudSk7Ci0JCQkKLQkJCWNyZWF0ZU1lbnVJdGVtcyhzdWJNZW51LCBjcmVhdGVTdWJTdWJNZW51LCBmYWxzZSk7Ci0JCX0KLQl9Ci0JCi0JU3RyaW5nIGdldE1lbnVJdGVtVGV4dChTdHJpbmcgaXRlbSkgewotCQlib29sZWFuIGNhc2NhZGUgPSBpdGVtLmVxdWFscygiQ2FzY2FkZSIpOwotCQlib29sZWFuIG1uZW1vbmljID0gbW5lbW9uaWNzQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlib29sZWFuIGFjY2VsZXJhdG9yID0gYWNjZWxlcmF0b3JzQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQljaGFyIGFjY2VsZXJhdG9yS2V5ID0gaXRlbS5jaGFyQXQoMCk7Ci0JCWlmIChtbmVtb25pYyAmJiBhY2NlbGVyYXRvciAmJiAhY2FzY2FkZSkgewotCQkJcmV0dXJuIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKGl0ZW0gKyAiV2l0aE1uZW1vbmljIikgKyAiXHRDdHJsK1NoaWZ0KyIgKyBhY2NlbGVyYXRvcktleTsKLQkJfQotCQlpZiAoYWNjZWxlcmF0b3IgJiYgIWNhc2NhZGUpIHsKLQkJCXJldHVybiBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyhpdGVtKSArICJcdEN0cmwrU2hpZnQrIiArIGFjY2VsZXJhdG9yS2V5OwotCQl9Ci0JCWlmIChtbmVtb25pYykgewotCQkJcmV0dXJuIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKGl0ZW0gKyAiV2l0aE1uZW1vbmljIik7Ci0JCX0KLQkJcmV0dXJuIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKGl0ZW0pOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJNZW51IjsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Qcm9ncmVzc0JhclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvUHJvZ3Jlc3NCYXJUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjc2OWM3OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Qcm9ncmVzc0JhclRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1jbGFzcyBQcm9ncmVzc0JhclRhYiBleHRlbmRzIFJhbmdlVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVByb2dyZXNzQmFyIHByb2dyZXNzQmFyMTsKLQlHcm91cCBwcm9ncmVzc0Jhckdyb3VwOwotCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBzbW9vdGhCdXR0b247Ci0JQnV0dG9uIGluZGV0ZXJtaW5hdGVCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JUHJvZ3Jlc3NCYXJUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgcHJvZ3Jlc3MgYmFyICovCi0JCXByb2dyZXNzQmFyR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlwcm9ncmVzc0Jhckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlwcm9ncmVzc0Jhckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXByb2dyZXNzQmFyR3JvdXAuc2V0VGV4dCAoIlByb2dyZXNzQmFyIik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0KLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoaG9yaXpvbnRhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5IT1JJWk9OVEFMOwotCQlpZiAodmVydGljYWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuVkVSVElDQUw7Ci0JCWlmIChzbW9vdGhCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU01PT1RIOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKGluZGV0ZXJtaW5hdGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSU5ERVRFUk1JTkFURTsKLQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQlwcm9ncmVzc0JhcjEgPSBuZXcgUHJvZ3Jlc3NCYXIgKHByb2dyZXNzQmFyR3JvdXAsIHN0eWxlKTsKLQkJcHJvZ3Jlc3NCYXIxLnNldE1heGltdW0gKDEwMCk7Ci0JCXByb2dyZXNzQmFyMS5zZXRTZWxlY3Rpb24gKDUwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0KLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXNtb290aEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNtb290aEJ1dHRvbi5zZXRUZXh0ICgiU1dULlNNT09USCIpOwotCQlpbmRldGVybWluYXRlQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJaW5kZXRlcm1pbmF0ZUJ1dHRvbi5zZXRUZXh0ICgiU1dULklOREVURVJNSU5BVEUiKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCUNvbnRyb2wgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2wgW10ge3Byb2dyZXNzQmFyMX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlByb2dyZXNzQmFyIjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWlmIChpbmRldGVybWluYXRlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJc2VsZWN0aW9uU2NhbGUuc2V0RW5hYmxlZCAoZmFsc2UpOwotCQkJbWluaW11bVNjYWxlLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJCW1heGltdW1TY2FsZS5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb25TY2FsZS5zZXRFbmFibGVkICh0cnVlKTsKLQkJCW1pbmltdW1TY2FsZS5zZXRFbmFibGVkICh0cnVlKTsKLQkJCW1heGltdW1TY2FsZS5zZXRFbmFibGVkICh0cnVlKTsKLQkJfQotCQltYXhpbXVtU2NhbGUuc2V0TWF4aW11bSAocHJvZ3Jlc3NCYXIxLmdldE1heGltdW0gKCkpOwotCQlzbW9vdGhCdXR0b24uc2V0U2VsZWN0aW9uICgocHJvZ3Jlc3NCYXIxLmdldFN0eWxlICgpICYgU1dULlNNT09USCkgIT0gMCk7Ci0JCWluZGV0ZXJtaW5hdGVCdXR0b24uc2V0U2VsZWN0aW9uICgocHJvZ3Jlc3NCYXIxLmdldFN0eWxlICgpICYgU1dULklOREVURVJNSU5BVEUpICE9IDApOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1heGltdW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0TWF4aW11bSAoKSB7Ci0JCXByb2dyZXNzQmFyMS5zZXRNYXhpbXVtIChtYXhpbXVtU2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQkJdXBkYXRlU2NhbGVzICgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1pbmltaW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0TWluaW11bSAoKSB7Ci0JCXByb2dyZXNzQmFyMS5zZXRNaW5pbXVtIChtaW5pbXVtU2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQkJdXBkYXRlU2NhbGVzICgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGlvbiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRTZWxlY3Rpb24gKCkgewotCQlwcm9ncmVzc0JhcjEuc2V0U2VsZWN0aW9uIChzZWxlY3Rpb25TY2FsZS5nZXRTZWxlY3Rpb24gKCkpOwotCQl1cGRhdGVTY2FsZXMgKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBzY2FsZSB3aWRnZXRzIHRvIHJlZmxlY3QgdGhlIGFjdHVhbCB2YWx1ZSBzZXQgCi0JICogb24gdGhlICJFeGFtcGxlIiB3aWRnZXQuCi0JICovCi0Jdm9pZCB1cGRhdGVTY2FsZXMgKCkgewotCQltaW5pbXVtU2NhbGUuc2V0U2VsZWN0aW9uIChwcm9ncmVzc0JhcjEuZ2V0TWluaW11bSAoKSk7Ci0JCXNlbGVjdGlvblNjYWxlLnNldFNlbGVjdGlvbiAocHJvZ3Jlc3NCYXIxLmdldFNlbGVjdGlvbiAoKSk7Ci0JCW1heGltdW1TY2FsZS5zZXRTZWxlY3Rpb24gKHByb2dyZXNzQmFyMS5nZXRNYXhpbXVtICgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9SYW5nZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvUmFuZ2VUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTVkNGQxNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9SYW5nZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotYWJzdHJhY3QgY2xhc3MgUmFuZ2VUYWIgZXh0ZW5kcyBUYWIgewotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gaG9yaXpvbnRhbEJ1dHRvbiwgdmVydGljYWxCdXR0b247Ci0JYm9vbGVhbiBvcmllbnRhdGlvbkJ1dHRvbnMgPSB0cnVlOwotCi0JLyogU2NhbGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIkNvbnRyb2wiIGdyb3VwICovCi0JU2NhbGUgbWluaW11bVNjYWxlLCBzZWxlY3Rpb25TY2FsZSwgbWF4aW11bVNjYWxlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVJhbmdlVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCQkvKiBDcmVhdGUgY29udHJvbHMgc3BlY2lmaWMgdG8gdGhpcyBleGFtcGxlICovCi0JCWNyZWF0ZU1pbmltdW1Hcm91cCAoKTsKLQkJY3JlYXRlTWF4aW11bUdyb3VwICgpOwotCQljcmVhdGVTZWxlY3Rpb25Hcm91cCAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBtYXhpbXVtCi0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU1heGltdW1Hcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBtYXhpbXVtR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQltYXhpbXVtR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW1heGltdW1Hcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWF4aW11bSIpKTsKLQkJbWF4aW11bUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCi0JCS8qIENyZWF0ZSBhIHNjYWxlIHdpZGdldCAqLwotCQltYXhpbXVtU2NhbGUgPSBuZXcgU2NhbGUgKG1heGltdW1Hcm91cCwgU1dULk5PTkUpOwotCQltYXhpbXVtU2NhbGUuc2V0TWF4aW11bSAoMTAwKTsKLQkJbWF4aW11bVNjYWxlLnNldFNlbGVjdGlvbiAoMTAwKTsKLQkJbWF4aW11bVNjYWxlLnNldFBhZ2VJbmNyZW1lbnQgKDEwKTsKLQkJbWF4aW11bVNjYWxlLnNldEluY3JlbWVudCAoNSk7Ci0JCQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDEwMDsKLQkJbWF4aW11bVNjYWxlLnNldExheW91dERhdGEgKGRhdGEpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQltYXhpbXVtU2NhbGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0TWF4aW11bSAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGdyb3VwIG9mIHdpZGdldHMgdG8gY29udHJvbCB0aGUgbWluaW11bQotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVNaW5pbXVtR3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgbWluaW11bUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJbWluaW11bUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQltaW5pbXVtR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1pbmltdW0iKSk7Ci0JCW1pbmltdW1Hcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQotCQkvKiBDcmVhdGUgYSBzY2FsZSB3aWRnZXQgKi8KLQkJbWluaW11bVNjYWxlID0gbmV3IFNjYWxlIChtaW5pbXVtR3JvdXAsIFNXVC5OT05FKTsKLQkJbWluaW11bVNjYWxlLnNldE1heGltdW0gKDEwMCk7Ci0JCW1pbmltdW1TY2FsZS5zZXRTZWxlY3Rpb24oMCk7Ci0JCW1pbmltdW1TY2FsZS5zZXRQYWdlSW5jcmVtZW50ICgxMCk7Ci0JCW1pbmltdW1TY2FsZS5zZXRJbmNyZW1lbnQgKDUpOwotCQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDEwMDsKLQkJbWluaW11bVNjYWxlLnNldExheW91dERhdGEgKGRhdGEpOwotCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCW1pbmltdW1TY2FsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0TWluaW11bSAoKTsKLQkJCX0KLQkJfSk7Ci0JCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGdyb3VwIG9mIHdpZGdldHMgdG8gY29udHJvbCB0aGUgc2VsZWN0aW9uCi0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVNlbGVjdGlvbkdyb3VwKCkgewotCQotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCUdyb3VwIHNlbGVjdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlzZWxlY3Rpb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXNlbGVjdGlvbkdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlzZWxlY3Rpb25Hcm91cC5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTZWxlY3Rpb24iKSk7Ci0JCi0JCS8qIENyZWF0ZSBhIHNjYWxlIHdpZGdldCAqLwotCQlzZWxlY3Rpb25TY2FsZSA9IG5ldyBTY2FsZSAoc2VsZWN0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJc2VsZWN0aW9uU2NhbGUuc2V0TWF4aW11bSAoMTAwKTsKLQkJc2VsZWN0aW9uU2NhbGUuc2V0U2VsZWN0aW9uICg1MCk7Ci0JCXNlbGVjdGlvblNjYWxlLnNldFBhZ2VJbmNyZW1lbnQgKDEwKTsKLQkJc2VsZWN0aW9uU2NhbGUuc2V0SW5jcmVtZW50ICg1KTsKLQkKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxMDA7Ci0JCXNlbGVjdGlvblNjYWxlLnNldExheW91dERhdGEgKGRhdGEpOwotCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCXNlbGVjdGlvblNjYWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRTZWxlY3Rpb24gKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJaWYgKG9yaWVudGF0aW9uQnV0dG9ucykgewotCQkJaG9yaXpvbnRhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCQlob3Jpem9udGFsQnV0dG9uLnNldFRleHQgKCJTV1QuSE9SSVpPTlRBTCIpOwotCQkJdmVydGljYWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQkJdmVydGljYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5WRVJUSUNBTCIpOwotCQl9Ci0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRUZXh0ICgiU1dULkJPUkRFUiIpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCXNldFdpZGdldE1pbmltdW0gKCk7Ci0JCXNldFdpZGdldE1heGltdW0gKCk7Ci0JCXNldFdpZGdldFNlbGVjdGlvbiAoKTsKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQlpZiAoY29udHJvbHMubGVuZ3RoICE9IDApIHsKLQkJCWlmIChvcmllbnRhdGlvbkJ1dHRvbnMpIHsKLQkJCQlob3Jpem9udGFsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvbnRyb2xzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5IT1JJWk9OVEFMKSAhPSAwKTsKLQkJCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb250cm9scyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuVkVSVElDQUwpICE9IDApOwotCQkJfQotCQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvbnRyb2xzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIG1heGltdW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWFic3RyYWN0IHZvaWQgc2V0V2lkZ2V0TWF4aW11bSAoKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBtaW5pbWltIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIHNldFdpZGdldE1pbmltdW0gKCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0aW9uIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIHNldFdpZGdldFNlbGVjdGlvbiAoKTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Nhc2hGb3JtVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TYXNoRm9ybVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzA4NmFjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Nhc2hGb3JtVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBTYXNoRm9ybVRhYiBleHRlbmRzIFRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlHcm91cCBzYXNoRm9ybUdyb3VwOwotCVNhc2hGb3JtIGZvcm07Ci0JTGlzdCBsaXN0MSwgbGlzdDI7Ci0JVGV4dCB0ZXh0OwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gaG9yaXpvbnRhbEJ1dHRvbiwgdmVydGljYWxCdXR0b24sIHNtb290aEJ1dHRvbjsKLQotCXN0YXRpYyBTdHJpbmcgW10gTGlzdERhdGEwID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfMCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8xIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzIiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfMyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF80IiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfNiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF83Iil9OyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgCi0Jc3RhdGljIFN0cmluZyBbXSBMaXN0RGF0YTEgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8wIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzEiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8zIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzQiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV82IiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzciKX07IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVNhc2hGb3JtVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHNhc2hmb3JtIHdpZGdldCAqLwotCQlzYXNoRm9ybUdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJc2FzaEZvcm1Hcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJc2FzaEZvcm1Hcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlzYXNoRm9ybUdyb3VwLnNldFRleHQgKCJTYXNoRm9ybSIpOwotCX0KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSF9TQ1JPTEw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WX1NDUk9MTDsKLQkJaWYgKHNtb290aEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TTU9PVEg7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQlmb3JtID0gbmV3IFNhc2hGb3JtIChzYXNoRm9ybUdyb3VwLCBzdHlsZSk7Ci0JCWxpc3QxID0gbmV3IExpc3QgKGZvcm0sIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlsaXN0MS5zZXRJdGVtcyAoTGlzdERhdGEwKTsKLQkJbGlzdDIgPSBuZXcgTGlzdCAoZm9ybSwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCWxpc3QyLnNldEl0ZW1zIChMaXN0RGF0YTEpOwotCQl0ZXh0ID0gbmV3IFRleHQgKGZvcm0sIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCQl0ZXh0LnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNdWx0aV9saW5lIikpOyAvLyROT04tTkxTLTEkCi0JCWZvcm0uc2V0V2VpZ2h0cyhuZXcgaW50W10gezEsIDEsIDF9KTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWhvcml6b250YWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFRleHQgKCJTV1QuSE9SSVpPTlRBTCIpOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJdmVydGljYWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULlZFUlRJQ0FMIik7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCXNtb290aEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNtb290aEJ1dHRvbi5zZXRUZXh0ICgiU1dULlNNT09USCIpOwotCQlzbW9vdGhCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sIFtdIHtmb3JtfTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiU2FzaEZvcm0iOyAvLyROT04tTkxTLTEkCi0JfQotCQotCQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uICgoZm9ybS5nZXRTdHlsZSAoKSAmIFNXVC5IX1NDUk9MTCkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGZvcm0uZ2V0U3R5bGUgKCkgJiBTV1QuVl9TQ1JPTEwpICE9IDApOwotCQlzbW9vdGhCdXR0b24uc2V0U2VsZWN0aW9uICgoZm9ybS5nZXRTdHlsZSAoKSAmIFNXVC5TTU9PVEgpICE9IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Nhc2hUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Nhc2hUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjdlOGY0OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TYXNoVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBTYXNoVGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVNhc2ggaFNhc2gsIHZTYXNoOwotCUNvbXBvc2l0ZSBzYXNoQ29tcDsKLQlHcm91cCBzYXNoR3JvdXA7Ci0JTGlzdCBsaXN0MSwgbGlzdDIsIGxpc3QzOwotCVRleHQgdGV4dDsKLQlCdXR0b24gc21vb3RoQnV0dG9uOwotCi0Jc3RhdGljIFN0cmluZyBbXSBMaXN0RGF0YTAgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8wIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8xIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8yIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8zIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF80IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF81IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF82IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF83IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF84Iil9OwotCQkJCQkJCQkgIAotCXN0YXRpYyBTdHJpbmcgW10gTGlzdERhdGExID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMCIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMiIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMyIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNCIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNiIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNyIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfOCIpfTsKLQotCS8qIENvbnN0YW50cyAqLwotCXN0YXRpYyBmaW5hbCBpbnQgU0FTSF9XSURUSCA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBTQVNIX0xJTUlUID0gMjA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JU2FzaFRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJZXhhbXBsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWV4YW1wbGVHcm91cC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHNhc2ggd2lkZ2V0cyAqLwotCQlzYXNoR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlGaWxsTGF5b3V0IGxheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBsYXlvdXQubWFyZ2luV2lkdGggPSA1OwotCQlzYXNoR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNhc2hHcm91cC5zZXRUZXh0ICgiU2FzaCIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkvKgotCQkgKiBDcmVhdGUgdGhlIHBhZ2UuICBUaGlzIGV4YW1wbGUgZG9lcyBub3QgdXNlIGxheW91dHMuCi0JCSAqLwotCQlzYXNoQ29tcCA9IG5ldyBDb21wb3NpdGUoc2FzaEdyb3VwLCBTV1QuQk9SREVSKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBsaXN0IGFuZCB0ZXh0IHdpZGdldHMgKi8KLQkJbGlzdDEgPSBuZXcgTGlzdCAoc2FzaENvbXAsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlsaXN0MS5zZXRJdGVtcyAoTGlzdERhdGEwKTsKLQkJbGlzdDIgPSBuZXcgTGlzdCAoc2FzaENvbXAsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlsaXN0Mi5zZXRJdGVtcyAoTGlzdERhdGExKTsKLQkJdGV4dCA9IG5ldyBUZXh0IChzYXNoQ29tcCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCXRleHQuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk11bHRpX2xpbmUiKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgc2FzaGVzICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoc21vb3RoQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuU01PT1RIOwotCQl2U2FzaCA9IG5ldyBTYXNoIChzYXNoQ29tcCwgU1dULlZFUlRJQ0FMIHwgc3R5bGUpOwotCQloU2FzaCA9IG5ldyBTYXNoIChzYXNoQ29tcCwgU1dULkhPUklaT05UQUwgfCBzdHlsZSk7Ci0JCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQloU2FzaC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSB2U2FzaC5nZXRQYXJlbnQoKS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJZXZlbnQueSA9IE1hdGgubWluIChNYXRoLm1heCAoZXZlbnQueSwgU0FTSF9MSU1JVCksIHJlY3QuaGVpZ2h0IC0gU0FTSF9MSU1JVCk7Ci0JCQkJaWYgKGV2ZW50LmRldGFpbCAhPSBTV1QuRFJBRykgewotCQkJCQloU2FzaC5zZXRCb3VuZHMgKGV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQpOwotCQkJCQlsYXlvdXQgKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJdlNhc2guYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCVJlY3RhbmdsZSByZWN0ID0gdlNhc2guZ2V0UGFyZW50KCkuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCWV2ZW50LnggPSBNYXRoLm1pbiAoTWF0aC5tYXggKGV2ZW50LngsIFNBU0hfTElNSVQpLCByZWN0LndpZHRoIC0gU0FTSF9MSU1JVCk7Ci0JCQkJaWYgKGV2ZW50LmRldGFpbCAhPSBTV1QuRFJBRykgewotCQkJCQl2U2FzaC5zZXRCb3VuZHMgKGV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQpOwotCQkJCQlsYXlvdXQgKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJc2FzaENvbXAuYWRkQ29udHJvbExpc3RlbmVyIChuZXcgQ29udHJvbEFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQgKENvbnRyb2xFdmVudCBldmVudCkgewotCQkJCXJlc2l6ZWQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTaXplIiBncm91cC4gIFRoZSAiU2l6ZSIgZ3JvdXAgY29udGFpbnMKLQkgKiBjb250cm9scyB0aGF0IGFsbG93IHRoZSB1c2VyIHRvIGNoYW5nZSB0aGUgc2l6ZSBvZgotCSAqIHRoZSBleGFtcGxlIHdpZGdldHMuCi0JICovCQotCXZvaWQgY3JlYXRlU2l6ZUdyb3VwICgpIHsJCQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXNtb290aEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNtb290aEJ1dHRvbi5zZXRUZXh0KCJTV1QuU01PT1RIIik7Ci0JfQotCQotCXZvaWQgZGlzcG9zZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJc2FzaENvbXAuZGlzcG9zZSgpOwotCQlzYXNoQ29tcCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sIFtdIHtoU2FzaCwgdlNhc2h9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlRvb2xUaXBUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiU2FzaCI7Ci0JfQotCQotCS8qKgotCSAqIExheW91dCB0aGUgbGlzdCBhbmQgdGV4dCB3aWRnZXRzIGFjY29yZGluZyB0byB0aGUgbmV3Ci0JICogcG9zaXRpb25zIG9mIHRoZSBzYXNoZXMuLmV2ZW50cy5TZWxlY3Rpb25FdmVudAotCSAqLwotCXZvaWQgbGF5b3V0ICgpIHsKLQkJCi0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gc2FzaENvbXAuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJUmVjdGFuZ2xlIGhTYXNoQm91bmRzID0gaFNhc2guZ2V0Qm91bmRzICgpOwotCQlSZWN0YW5nbGUgdlNhc2hCb3VuZHMgPSB2U2FzaC5nZXRCb3VuZHMgKCk7Ci0JCQotCQlsaXN0MS5zZXRCb3VuZHMgKDAsIDAsIHZTYXNoQm91bmRzLngsIGhTYXNoQm91bmRzLnkpOwotCQlsaXN0Mi5zZXRCb3VuZHMgKHZTYXNoQm91bmRzLnggKyB2U2FzaEJvdW5kcy53aWR0aCwgMCwgY2xpZW50QXJlYS53aWR0aCAtICh2U2FzaEJvdW5kcy54ICsgdlNhc2hCb3VuZHMud2lkdGgpLCBoU2FzaEJvdW5kcy55KTsKLQkJdGV4dC5zZXRCb3VuZHMgKDAsIGhTYXNoQm91bmRzLnkgKyBoU2FzaEJvdW5kcy5oZWlnaHQsIGNsaWVudEFyZWEud2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0IC0gKGhTYXNoQm91bmRzLnkgKyBoU2FzaEJvdW5kcy5oZWlnaHQpKTsKLQkKLQkJLyoqCi0JCSogSWYgdGhlIGhvcml6b250YWwgc2FzaCBoYXMgYmVlbiBtb3ZlZCB0aGVuIHRoZSB2ZXJ0aWNhbAotCQkqIHNhc2ggaXMgZWl0aGVyIHRvbyBsb25nIG9yIHRvbyBzaG9ydCBhbmQgaXRzIHNpemUgbXVzdAotCQkqIGJlIGFkanVzdGVkLgotCQkqLwotCQl2U2FzaEJvdW5kcy5oZWlnaHQgPSBoU2FzaEJvdW5kcy55OwotCQl2U2FzaC5zZXRCb3VuZHMgKHZTYXNoQm91bmRzKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKSB7Ci0JCXNhc2hHcm91cC5sYXlvdXQgKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCXNtb290aEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChoU2FzaC5nZXRTdHlsZSAoKSAmIFNXVC5TTU9PVEgpICE9IDApOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgdGhlIHNoZWxsIHJlc2l6ZWQgZXZlbnQuCi0JICovCi0Jdm9pZCByZXNpemVkICgpIHsKLQkKLQkJLyogR2V0IHRoZSBjbGllbnQgYXJlYSBmb3IgdGhlIHNoZWxsICovCi0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gc2FzaENvbXAuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCi0JCS8qCi0JCSogTWFrZSBsaXN0IDEgaGFsZiB0aGUgd2lkdGggYW5kIGhhbGYgdGhlIGhlaWdodCBvZiB0aGUgdGFiIGxlYXZpbmcgcm9vbSBmb3IgdGhlIHNhc2guCi0JCSogUGxhY2UgbGlzdCAxIGluIHRoZSB0b3AgbGVmdCBxdWFkcmFudCBvZiB0aGUgdGFiLgotCQkqLwotCQlSZWN0YW5nbGUgbGlzdDFCb3VuZHMgPSBuZXcgUmVjdGFuZ2xlICgwLCAwLCAoY2xpZW50QXJlYS53aWR0aCAtIFNBU0hfV0lEVEgpIC8gMiwgKGNsaWVudEFyZWEuaGVpZ2h0IC0gU0FTSF9XSURUSCkgLyAyKTsKLQkJbGlzdDEuc2V0Qm91bmRzIChsaXN0MUJvdW5kcyk7Ci0JCi0JCS8qCi0JCSogTWFrZSBsaXN0IDIgaGFsZiB0aGUgd2lkdGggYW5kIGhhbGYgdGhlIGhlaWdodCBvZiB0aGUgdGFiIGxlYXZpbmcgcm9vbSBmb3IgdGhlIHNhc2guCi0JCSogUGxhY2UgbGlzdCAyIGluIHRoZSB0b3AgcmlnaHQgcXVhZHJhbnQgb2YgdGhlIHRhYi4KLQkJKi8KLQkJbGlzdDIuc2V0Qm91bmRzIChsaXN0MUJvdW5kcy53aWR0aCArIFNBU0hfV0lEVEgsIDAsIGNsaWVudEFyZWEud2lkdGggLSAobGlzdDFCb3VuZHMud2lkdGggKyBTQVNIX1dJRFRIKSwgbGlzdDFCb3VuZHMuaGVpZ2h0KTsKLQkKLQkJLyoKLQkJKiBNYWtlIHRoZSB0ZXh0IGFyZWEgdGhlIGZ1bGwgd2lkdGggYW5kIGhhbGYgdGhlIGhlaWdodCBvZiB0aGUgdGFiIGxlYXZpbmcgcm9vbSBmb3IgdGhlIHNhc2guCi0JCSogUGxhY2UgdGhlIHRleHQgYXJlYSBpbiB0aGUgYm90dG9tIGhhbGYgb2YgdGhlIHRhYi4KLQkJKi8KLQkJdGV4dC5zZXRCb3VuZHMgKDAsIGxpc3QxQm91bmRzLmhlaWdodCArIFNBU0hfV0lEVEgsIGNsaWVudEFyZWEud2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0IC0gKGxpc3QxQm91bmRzLmhlaWdodCArIFNBU0hfV0lEVEgpKTsKLQkKLQkJLyogUG9zaXRpb24gdGhlIHNhc2hlcyAqLwotCQl2U2FzaC5zZXRCb3VuZHMgKGxpc3QxQm91bmRzLndpZHRoLCAwLCBTQVNIX1dJRFRILCBsaXN0MUJvdW5kcy5oZWlnaHQpOwotCQloU2FzaC5zZXRCb3VuZHMgKDAsIGxpc3QxQm91bmRzLmhlaWdodCwgY2xpZW50QXJlYS53aWR0aCwgU0FTSF9XSURUSCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2Nyb2xsYWJsZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2Nyb2xsYWJsZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MWJlYzQ1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Njcm9sbGFibGVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWFic3RyYWN0IGNsYXNzIFNjcm9sbGFibGVUYWIgZXh0ZW5kcyBUYWIgewotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8JCi0JQnV0dG9uIHNpbmdsZUJ1dHRvbiwgbXVsdGlCdXR0b24sIGhvcml6b250YWxCdXR0b24sIHZlcnRpY2FsQnV0dG9uLCBib3JkZXJCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JU2Nyb2xsYWJsZVRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJc2luZ2xlQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2luZ2xlQnV0dG9uLnNldFRleHQgKCJTV1QuU0lOR0xFIik7Ci0JCW11bHRpQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJbXVsdGlCdXR0b24uc2V0VGV4dCAoIlNXVC5NVUxUSSIpOwotCQlob3Jpem9udGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkhfU0NST0xMIik7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl2ZXJ0aWNhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFRleHQgKCJTV1QuVl9TQ1JPTEwiKTsKLQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCWlmIChjb250cm9scy5sZW5ndGggIT0gMCl7Ci0JCQlzaW5nbGVCdXR0b24uc2V0U2VsZWN0aW9uICgoY29udHJvbHMgWzBdLmdldFN0eWxlICgpICYgU1dULlNJTkdMRSkgIT0gMCk7Ci0JCQltdWx0aUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb250cm9scyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuTVVMVEkpICE9IDApOwotCQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb250cm9scyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuSF9TQ1JPTEwpICE9IDApOwotCQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uICgoY29udHJvbHMgWzBdLmdldFN0eWxlICgpICYgU1dULlZfU0NST0xMKSAhPSAwKTsKLQkJCWJvcmRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb250cm9scyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuQk9SREVSKSAhPSAwKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NoZWxsVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TaGVsbFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MGY1ZGRhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NoZWxsVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBTaGVsbFRhYiBleHRlbmRzIFRhYiB7CQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXBzLCBhbmQgIk90aGVyIiBncm91cCAqLwotCUJ1dHRvbiBub1BhcmVudEJ1dHRvbiwgcGFyZW50QnV0dG9uOwotCUJ1dHRvbiBub1RyaW1CdXR0b24sIGNsb3NlQnV0dG9uLCB0aXRsZUJ1dHRvbiwgbWluQnV0dG9uLCBtYXhCdXR0b24sIGJvcmRlckJ1dHRvbiwgcmVzaXplQnV0dG9uLCBvblRvcEJ1dHRvbiwgdG9vbEJ1dHRvbjsKLQlCdXR0b24gY3JlYXRlQnV0dG9uLCBjbG9zZUFsbEJ1dHRvbjsKLQlCdXR0b24gbW9kZWxlc3NCdXR0b24sIHByaW1hcnlNb2RhbEJ1dHRvbiwgYXBwbGljYXRpb25Nb2RhbEJ1dHRvbiwgc3lzdGVtTW9kYWxCdXR0b247Ci0JQnV0dG9uIGltYWdlQnV0dG9uOwotCUdyb3VwIHBhcmVudFN0eWxlR3JvdXAsIG1vZGFsU3R5bGVHcm91cDsKLQotCS8qIFZhcmlhYmxlcyB1c2VkIHRvIHRyYWNrIHRoZSBvcGVuIHNoZWxscyAqLwotCWludCBzaGVsbENvdW50ID0gMDsKLQlTaGVsbCBbXSBzaGVsbHMgPSBuZXcgU2hlbGwgWzRdOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlTaGVsbFRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ2xvc2UgYWxsIHRoZSBleGFtcGxlIHNoZWxscy4KLQkgKi8KLQl2b2lkIGNsb3NlQWxsU2hlbGxzKCkgewotCQlmb3IgKGludCBpID0gMDsgaTxzaGVsbENvdW50OyBpKyspIHsKLQkJCWlmIChzaGVsbHNbaV0gIT0gbnVsbCAmICFzaGVsbHMgW2ldLmlzRGlzcG9zZWQgKCkpIHsKLQkJCQlzaGVsbHMgW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlzaGVsbENvdW50ID0gMDsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlIHRoZSBDcmVhdGUgYnV0dG9uIHNlbGVjdGlvbiBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBldmVudCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkKLQkJLyoKLQkJICogUmVtZW1iZXIgdGhlIGV4YW1wbGUgc2hlbGxzIHNvIHRoZXkKLQkJICogY2FuIGJlIGRpc3Bvc2VkIGJ5IHRoZSB1c2VyLgotCQkgKi8KLQkJaWYgKHNoZWxsQ291bnQgPj0gc2hlbGxzLmxlbmd0aCkgewotCQkJU2hlbGwgW10gbmV3U2hlbGxzID0gbmV3IFNoZWxsIFtzaGVsbHMubGVuZ3RoICsgNF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5IChzaGVsbHMsIDAsIG5ld1NoZWxscywgMCwgc2hlbGxzLmxlbmd0aCk7Ci0JCQlzaGVsbHMgPSBuZXdTaGVsbHM7Ci0JCX0KLQkKLQkJLyogQ29tcHV0ZSB0aGUgc2hlbGwgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gU1dULk5PTkU7Ci0JCWlmIChub1RyaW1CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5OT19UUklNOwotCQlpZiAoY2xvc2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5DTE9TRTsKLQkJaWYgKHRpdGxlQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuVElUTEU7Ci0JCWlmIChtaW5CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5NSU47Ci0JCWlmIChtYXhCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5NQVg7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmIChyZXNpemVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5SRVNJWkU7Ci0JCWlmIChvblRvcEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULk9OX1RPUDsKLQkJaWYgKHRvb2xCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5UT09MOwotCQlpZiAobW9kZWxlc3NCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5NT0RFTEVTUzsKLQkJaWYgKHByaW1hcnlNb2RhbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlBSSU1BUllfTU9EQUw7Ci0JCWlmIChhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuQVBQTElDQVRJT05fTU9EQUw7Ci0JCWlmIChzeXN0ZW1Nb2RhbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlNZU1RFTV9NT0RBTDsKLQkKLQkJLyogQ3JlYXRlIHRoZSBzaGVsbCB3aXRoIG9yIHdpdGhvdXQgYSBwYXJlbnQgKi8KLQkJaWYgKG5vUGFyZW50QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJc2hlbGxzIFtzaGVsbENvdW50XSA9IG5ldyBTaGVsbCAoc3R5bGUpOwotCQl9IGVsc2UgewotCQkJU2hlbGwgc2hlbGwgPSB0YWJGb2xkZXJQYWdlLmdldFNoZWxsICgpOwotCQkJc2hlbGxzIFtzaGVsbENvdW50XSA9IG5ldyBTaGVsbCAoc2hlbGwsIHN0eWxlKTsKLQkJfQotCQlmaW5hbCBTaGVsbCBjdXJyZW50U2hlbGwgPSBzaGVsbHMgW3NoZWxsQ291bnRdOwotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjdXJyZW50U2hlbGwsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldEJvdW5kcygyMCwgMjAsIDEyMCwgMzApOwotCQlCdXR0b24gY2xvc2VCdXR0b24gPSBuZXcgQnV0dG9uKGN1cnJlbnRTaGVsbCwgU1dULlBVU0gpOwotCQljbG9zZUJ1dHRvbi5zZXRCb3VuZHMoMTYwLCAyMCwgMTIwLCAzMCk7Ci0JCWNsb3NlQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNsb3NlIikpOwotCQljbG9zZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWN1cnJlbnRTaGVsbC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQotCQkvKiBTZXQgdGhlIHNpemUsIHRpdGxlLCBhbmQgaW1hZ2UsIGFuZCBvcGVuIHRoZSBzaGVsbCAqLwotCQljdXJyZW50U2hlbGwuc2V0U2l6ZSAoMzAwLCAxMDApOwotCQljdXJyZW50U2hlbGwuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIikgKyBzaGVsbENvdW50KTsKLQkJaWYgKGltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpKSBjdXJyZW50U2hlbGwuc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWhvb2tMaXN0ZW5lcnMgKGN1cnJlbnRTaGVsbCk7Ci0JCWN1cnJlbnRTaGVsbC5vcGVuICgpOwotCQlzaGVsbENvdW50Kys7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiBncm91cC4gCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sR3JvdXAgKCkgewotCQkvKgotCQkgKiBDcmVhdGUgdGhlICJDb250cm9sIiBncm91cC4gIFRoaXMgaXMgdGhlIGdyb3VwIG9uIHRoZQotCQkgKiByaWdodCBoYWxmIG9mIGVhY2ggZXhhbXBsZSB0YWIuICBJdCBjb25zaXN0cyBvZiB0aGUKLQkJICogc3R5bGUgZ3JvdXAsIHRoZSAnb3RoZXInIGdyb3VwIGFuZCB0aGUgc2l6ZSBncm91cC4KLQkJICovCQkKLQkJY29udHJvbEdyb3VwID0gbmV3IEdyb3VwICh0YWJGb2xkZXJQYWdlLCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgyLCB0cnVlKSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJY29udHJvbEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXJhbWV0ZXJzIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGRlY29yYXRpb24gc3R5bGUgY29udHJvbHMgKi8KLQkJc3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSwgMSwgMykpOwotCQlzdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEZWNvcmF0aW9uX1N0eWxlcyIpKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBtb2RhbCBzdHlsZSBjb250cm9scyAqLwotCQltb2RhbFN0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQltb2RhbFN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW1vZGFsU3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQltb2RhbFN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1vZGFsX1N0eWxlcyIpKTsJCQotCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgJ290aGVyJyBjb250cm9scyAqLwotCQlvdGhlckdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJb3RoZXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJb3RoZXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJb3RoZXJHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT3RoZXIiKSk7Ci0KLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBwYXJlbnQgc3R5bGUgY29udHJvbHMgKi8KLQkJcGFyZW50U3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXBhcmVudFN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCXBhcmVudFN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQlwYXJlbnRTdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXJlbnQiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgcGFyZW50IHN0eWxlIGJ1dHRvbnMgKi8KLQkJbm9QYXJlbnRCdXR0b24gPSBuZXcgQnV0dG9uIChwYXJlbnRTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlub1BhcmVudEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9fUGFyZW50IikpOwotCQlwYXJlbnRCdXR0b24gPSBuZXcgQnV0dG9uIChwYXJlbnRTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlwYXJlbnRCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhcmVudCIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBkZWNvcmF0aW9uIHN0eWxlIGJ1dHRvbnMgKi8KLQkJbm9UcmltQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9UcmltQnV0dG9uLnNldFRleHQgKCJTV1QuTk9fVFJJTSIpOwotCQljbG9zZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNsb3NlQnV0dG9uLnNldFRleHQgKCJTV1QuQ0xPU0UiKTsKLQkJdGl0bGVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl0aXRsZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlRJVExFIik7Ci0JCW1pbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1pbkJ1dHRvbi5zZXRUZXh0ICgiU1dULk1JTiIpOwotCQltYXhCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQltYXhCdXR0b24uc2V0VGV4dCAoIlNXVC5NQVgiKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JCXJlc2l6ZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJlc2l6ZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlJFU0laRSIpOwotCQlvblRvcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW9uVG9wQnV0dG9uLnNldFRleHQgKCJTV1QuT05fVE9QIik7Ci0JCXRvb2xCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl0b29sQnV0dG9uLnNldFRleHQgKCJTV1QuVE9PTCIpOwotCQotCQkvKiBDcmVhdGUgdGhlIG1vZGFsIHN0eWxlIGJ1dHRvbnMgKi8KLQkJbW9kZWxlc3NCdXR0b24gPSBuZXcgQnV0dG9uIChtb2RhbFN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCW1vZGVsZXNzQnV0dG9uLnNldFRleHQgKCJTV1QuTU9ERUxFU1MiKTsKLQkJcHJpbWFyeU1vZGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAobW9kYWxTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlwcmltYXJ5TW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5QUklNQVJZX01PREFMIik7Ci0JCWFwcGxpY2F0aW9uTW9kYWxCdXR0b24gPSBuZXcgQnV0dG9uIChtb2RhbFN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWFwcGxpY2F0aW9uTW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5BUFBMSUNBVElPTl9NT0RBTCIpOwotCQlzeXN0ZW1Nb2RhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKG1vZGFsU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc3lzdGVtTW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5TWVNURU1fTU9EQUwiKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSAnb3RoZXInIGJ1dHRvbnMgKi8KLQkJaW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpbWFnZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2UiKSk7Ci0KLQkJLyogQ3JlYXRlIHRoZSAiY3JlYXRlIiBhbmQgImNsb3NlQWxsIiBidXR0b25zICovCi0JCWNyZWF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQljcmVhdGVCdXR0b24uc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQljcmVhdGVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNyZWF0ZV9TaGVsbCIpKTsKLQkJY2xvc2VBbGxCdXR0b24gPSBuZXcgQnV0dG9uIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJY2xvc2VBbGxCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNsb3NlX0FsbF9TaGVsbHMiKSk7Ci0JCWNsb3NlQWxsQnV0dG9uLnNldExheW91dERhdGEgKGdyaWREYXRhKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJY3JlYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNyZWF0ZUJ1dHRvblNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJY2xvc2VBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY2xvc2VBbGxTaGVsbHMgKCk7Ci0JCQl9Ci0JCX0pOwotCQlTZWxlY3Rpb25MaXN0ZW5lciBkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJZGVjb3JhdGlvbkJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQkJbm9UcmltQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIpOwotCQljbG9zZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJdGl0bGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGRlY29yYXRpb25CdXR0b25MaXN0ZW5lcik7Ci0JCW1pbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJbWF4QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIpOwotCQlib3JkZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGRlY29yYXRpb25CdXR0b25MaXN0ZW5lcik7Ci0JCXJlc2l6ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJYXBwbGljYXRpb25Nb2RhbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJc3lzdGVtTW9kYWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGRlY29yYXRpb25CdXR0b25MaXN0ZW5lcik7Ci0JCi0JCS8qIFNldCB0aGUgZGVmYXVsdCBzdGF0ZSAqLwotCQlub1BhcmVudEJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQltb2RlbGVzc0J1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgYSBkZWNvcmF0aW9uIGJ1dHRvbiBzZWxlY3Rpb24gZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gZXZlbnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29yYXRpb25CdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQotCQkvKiBNYWtlIHN1cmUgaWYgdGhlIG1vZGFsIHN0eWxlIGlzIFNXVC5BUFBMSUNBVElPTl9NT0RBTCBvciAKLQkJICogU1dULlNZU1RFTV9NT0RBTCB0aGUgc3R5bGUgU1dULkNMT1NFIGlzIGFsc28gc2VsZWN0ZWQuCi0JCSAqIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHRoZSB1c2VyIGNhbiBjbG9zZSB0aGUgc2hlbGwuCi0JCSAqLwotCQlCdXR0b24gd2lkZ2V0ID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQlpZiAod2lkZ2V0ID09IGFwcGxpY2F0aW9uTW9kYWxCdXR0b24gfHwgd2lkZ2V0ID09IHN5c3RlbU1vZGFsQnV0dG9uKSB7Ci0JCQlpZiAod2lkZ2V0LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJY2xvc2VCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJCQlub1RyaW1CdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQl9IAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh3aWRnZXQgPT0gY2xvc2VCdXR0b24pIHsKLQkJCWlmIChhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpIHx8IHN5c3RlbU1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJY2xvc2VCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJCX0KLQkJfQkKLQkJLyoKLQkJICogTWFrZSBzdXJlIGlmIHRoZSBObyBUcmltIGJ1dHRvbiBpcyBzZWxlY3RlZCB0aGVuCi0JCSAqIGFsbCBvdGhlciBkZWNvcmF0aW9uIGJ1dHRvbnMgYXJlIGRlc2VsZWN0ZWQuCi0JCSAqLwotCQlpZiAod2lkZ2V0LmdldFNlbGVjdGlvbigpICYmIHdpZGdldCAhPSBub1RyaW1CdXR0b24pIHsKLQkJCW5vVHJpbUJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAod2lkZ2V0LmdldFNlbGVjdGlvbigpICYmIHdpZGdldCA9PSBub1RyaW1CdXR0b24pIHsKLQkJCWlmIChhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpIHx8IHN5c3RlbU1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJbm9UcmltQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNsb3NlQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJdGl0bGVCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQltaW5CdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQltYXhCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlyZXNpemVCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiU2hlbGwiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NsaWRlclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2xpZGVyVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRkMjA2MmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2xpZGVyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBTbGlkZXJUYWIgZXh0ZW5kcyBSYW5nZVRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlTY2FsZSBzY2FsZTE7Ci0JU2xpZGVyIHNsaWRlcjE7Ci0JR3JvdXAgc2xpZGVyR3JvdXAsIHNjYWxlR3JvdXA7Ci0KLQkvKiBTY2FsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiQ29udHJvbCIgZ3JvdXAgKi8KLQlTY2FsZSBpbmNyZW1lbnRTY2FsZSwgcGFnZUluY3JlbWVudFNjYWxlLCB0aHVtYlNjYWxlOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlTbGlkZXJUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpOwotCQljcmVhdGVUaHVtYkdyb3VwICgpOwotCQljcmVhdGVJbmNyZW1lbnRHcm91cCAoKTsKLQkJY3JlYXRlUGFnZUluY3JlbWVudEdyb3VwICgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHNsaWRlciAqLwotCQlzbGlkZXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXNsaWRlckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlzbGlkZXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlzbGlkZXJHcm91cC5zZXRUZXh0ICgiU2xpZGVyIik7Ci0JCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgc2NhbGUgKi8KLQkJc2NhbGVHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXNjYWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXNjYWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJc2NhbGVHcm91cC5zZXRUZXh0ICgiU2NhbGUiKTsKLQkKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhPUklaT05UQUw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WRVJUSUNBTDsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXNjYWxlMSA9IG5ldyBTY2FsZSAoc2NhbGVHcm91cCwgc3R5bGUpOwotCQlzY2FsZTEuc2V0TWF4aW11bSAoMTAwKTsKLQkJc2NhbGUxLnNldFNlbGVjdGlvbiAoNTApOwotCQlzY2FsZTEuc2V0SW5jcmVtZW50ICg1KTsKLQkJc2NhbGUxLnNldFBhZ2VJbmNyZW1lbnQgKDEwKTsKLQkJc2xpZGVyMSA9IG5ldyBTbGlkZXIoc2xpZGVyR3JvdXAsIHN0eWxlKTsKLQkJc2xpZGVyMS5zZXRNYXhpbXVtICgxMDApOwotCQlzbGlkZXIxLnNldFNlbGVjdGlvbiAoNTApOwotCQlzbGlkZXIxLnNldEluY3JlbWVudCg1KTsKLQkJc2xpZGVyMS5zZXRQYWdlSW5jcmVtZW50ICgxMCk7Ci0JCXNsaWRlcjEuc2V0VGh1bWIgKDEwKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBpbmNyZW1lbnQKLQkgKiBhdHRyaWJ1dGUgb2YgdGhlIGV4YW1wbGUgd2lkZ2V0LgotCSAqLwotCXZvaWQgY3JlYXRlSW5jcmVtZW50R3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgaW5jcmVtZW50R3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlpbmNyZW1lbnRHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJaW5jcmVtZW50R3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkluY3JlbWVudCIpKTsKLQkJaW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBzY2FsZSB3aWRnZXQgKi8KLQkJaW5jcmVtZW50U2NhbGUgPSBuZXcgU2NhbGUgKGluY3JlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWluY3JlbWVudFNjYWxlLnNldE1heGltdW0gKDEwMCk7Ci0JCWluY3JlbWVudFNjYWxlLnNldFNlbGVjdGlvbiAoNSk7Ci0JCWluY3JlbWVudFNjYWxlLnNldFBhZ2VJbmNyZW1lbnQgKDEwKTsKLQkJaW5jcmVtZW50U2NhbGUuc2V0SW5jcmVtZW50ICg1KTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDEwMDsKLQkJaW5jcmVtZW50U2NhbGUuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWluY3JlbWVudFNjYWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewkJCi0JCQkJc2V0V2lkZ2V0SW5jcmVtZW50ICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBwYWdlIGluY3JlbWVudAotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVQYWdlSW5jcmVtZW50R3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgcGFnZUluY3JlbWVudEdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJcGFnZUluY3JlbWVudEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhZ2VfSW5jcmVtZW50IikpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCQotCQkvKiBDcmVhdGUgdGhlIHNjYWxlIHdpZGdldCAqLwotCQlwYWdlSW5jcmVtZW50U2NhbGUgPSBuZXcgU2NhbGUgKHBhZ2VJbmNyZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQlwYWdlSW5jcmVtZW50U2NhbGUuc2V0TWF4aW11bSAoMTAwKTsKLQkJcGFnZUluY3JlbWVudFNjYWxlLnNldFNlbGVjdGlvbiAoMTApOwotCQlwYWdlSW5jcmVtZW50U2NhbGUuc2V0UGFnZUluY3JlbWVudCAoMTApOwotCQlwYWdlSW5jcmVtZW50U2NhbGUuc2V0SW5jcmVtZW50ICg1KTsKLQkKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxMDA7Ci0JCXBhZ2VJbmNyZW1lbnRTY2FsZS5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlwYWdlSW5jcmVtZW50U2NhbGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIHRodW1iCi0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVRodW1iR3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgdGh1bWJHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRodW1iR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXRodW1iR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRodW1iIikpOwotCQl0aHVtYkdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIHNjYWxlIHdpZGdldCAqLwotCQl0aHVtYlNjYWxlID0gbmV3IFNjYWxlICh0aHVtYkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRodW1iU2NhbGUuc2V0TWF4aW11bSAoMTAwKTsKLQkJdGh1bWJTY2FsZS5zZXRTZWxlY3Rpb24gKDEwKTsKLQkJdGh1bWJTY2FsZS5zZXRQYWdlSW5jcmVtZW50ICgxMCk7Ci0JCXRodW1iU2NhbGUuc2V0SW5jcmVtZW50ICg1KTsKLQkKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxMDA7Ci0JCXRodW1iU2NhbGUuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0KLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJdGh1bWJTY2FsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0VGh1bWIgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCUNvbnRyb2wgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2wgW10ge3NjYWxlMSwgc2xpZGVyMX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygiY2FyYm9uIikpIHJldHVybiAiUy9TIjsKLQkJcmV0dXJuICJTbGlkZXIvU2NhbGUiOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCXNldFdpZGdldEluY3JlbWVudCAoKTsKLQkJc2V0V2lkZ2V0UGFnZUluY3JlbWVudCAoKTsKLQkJc2V0V2lkZ2V0VGh1bWIgKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGluY3JlbWVudCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRJbmNyZW1lbnQgKCkgewotCQlzbGlkZXIxLnNldEluY3JlbWVudCAoaW5jcmVtZW50U2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQkJc2NhbGUxLnNldEluY3JlbWVudCAoaW5jcmVtZW50U2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRNYXhpbXVtICgpIHsKLQkJc2xpZGVyMS5zZXRNYXhpbXVtIChtYXhpbXVtU2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQkJc2NhbGUxLnNldE1heGltdW0gKG1heGltdW1TY2FsZS5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBtaW5pbWltIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldE1pbmltdW0gKCkgewotCQlzbGlkZXIxLnNldE1pbmltdW0gKG1pbmltdW1TY2FsZS5nZXRTZWxlY3Rpb24gKCkpOwotCQlzY2FsZTEuc2V0TWluaW11bSAobWluaW11bVNjYWxlLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHBhZ2UgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCkgewotCQlzbGlkZXIxLnNldFBhZ2VJbmNyZW1lbnQgKHBhZ2VJbmNyZW1lbnRTY2FsZS5nZXRTZWxlY3Rpb24gKCkpOwotCQlzY2FsZTEuc2V0UGFnZUluY3JlbWVudCAocGFnZUluY3JlbWVudFNjYWxlLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGlvbiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRTZWxlY3Rpb24gKCkgewotCQlzbGlkZXIxLnNldFNlbGVjdGlvbiAoc2VsZWN0aW9uU2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQkJc2NhbGUxLnNldFNlbGVjdGlvbiAoc2VsZWN0aW9uU2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdGh1bWIgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0VGh1bWIgKCkgewotCQlzbGlkZXIxLnNldFRodW1iICh0aHVtYlNjYWxlLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU3Bpbm5lclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU3Bpbm5lclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWU0Y2Q4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NwaW5uZXJUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIFNwaW5uZXJUYWIgZXh0ZW5kcyBSYW5nZVRhYiB7Ci0KLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVNwaW5uZXIgc3Bpbm5lcjE7Ci0JR3JvdXAgc3Bpbm5lckdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gcmVhZE9ubHlCdXR0b24sIHdyYXBCdXR0b247Ci0JCi0JLyogU2NhbGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIkNvbnRyb2wiIGdyb3VwICovCi0JU2NhbGUgaW5jcmVtZW50U2NhbGUsIHBhZ2VJbmNyZW1lbnRTY2FsZSwgZGlnaXRzU2NhbGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JU3Bpbm5lclRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpOwotCQljcmVhdGVJbmNyZW1lbnRHcm91cCAoKTsKLQkJY3JlYXRlUGFnZUluY3JlbWVudEdyb3VwICgpOwotCQljcmVhdGVEaWdpdHNHcm91cCAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBzcGlubmVyICovCi0JCXNwaW5uZXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXNwaW5uZXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJc3Bpbm5lckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXNwaW5uZXJHcm91cC5zZXRUZXh0ICgiU3Bpbm5lciIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHJlYWRPbmx5QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlJFQURfT05MWTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmICh3cmFwQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULldSQVA7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQlzcGlubmVyMSA9IG5ldyBTcGlubmVyIChzcGlubmVyR3JvdXAsIHN0eWxlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBtYXhpbXVtCi0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU1heGltdW1Hcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlTWF4aW11bUdyb3VwKCk7Ci0JCW1heGltdW1TY2FsZS5zZXRNYXhpbXVtICgxMDAwKTsKLQkJbWF4aW11bVNjYWxlLnNldFBhZ2VJbmNyZW1lbnQgKDEwMCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGdyb3VwIG9mIHdpZGdldHMgdG8gY29udHJvbCB0aGUgc2VsZWN0aW9uCi0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVNlbGVjdGlvbkdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTZWxlY3Rpb25Hcm91cCgpOwotCQlzZWxlY3Rpb25TY2FsZS5zZXRNYXhpbXVtICgxMDAwKTsKLQkJc2VsZWN0aW9uU2NhbGUuc2V0UGFnZUluY3JlbWVudCAoMTAwKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBpbmNyZW1lbnQKLQkgKiBhdHRyaWJ1dGUgb2YgdGhlIGV4YW1wbGUgd2lkZ2V0LgotCSAqLwotCXZvaWQgY3JlYXRlSW5jcmVtZW50R3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgaW5jcmVtZW50R3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlpbmNyZW1lbnRHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJaW5jcmVtZW50R3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkluY3JlbWVudCIpKTsKLQkJaW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBzY2FsZSB3aWRnZXQgKi8KLQkJaW5jcmVtZW50U2NhbGUgPSBuZXcgU2NhbGUgKGluY3JlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWluY3JlbWVudFNjYWxlLnNldE1heGltdW0gKDEwMCk7Ci0JCWluY3JlbWVudFNjYWxlLnNldFNlbGVjdGlvbiAoMSk7Ci0JCWluY3JlbWVudFNjYWxlLnNldFBhZ2VJbmNyZW1lbnQgKDEwKTsKLQkJaW5jcmVtZW50U2NhbGUuc2V0SW5jcmVtZW50ICg1KTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDEwMDsKLQkJaW5jcmVtZW50U2NhbGUuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWluY3JlbWVudFNjYWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewkJCi0JCQkJc2V0V2lkZ2V0SW5jcmVtZW50ICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBwYWdlIGluY3JlbWVudAotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVQYWdlSW5jcmVtZW50R3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgcGFnZUluY3JlbWVudEdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJcGFnZUluY3JlbWVudEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhZ2VfSW5jcmVtZW50IikpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCQotCQkvKiBDcmVhdGUgdGhlIHNjYWxlIHdpZGdldCAqLwotCQlwYWdlSW5jcmVtZW50U2NhbGUgPSBuZXcgU2NhbGUgKHBhZ2VJbmNyZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQlwYWdlSW5jcmVtZW50U2NhbGUuc2V0TWF4aW11bSAoMTAwKTsKLQkJcGFnZUluY3JlbWVudFNjYWxlLnNldFNlbGVjdGlvbiAoMTApOwotCQlwYWdlSW5jcmVtZW50U2NhbGUuc2V0UGFnZUluY3JlbWVudCAoMTApOwotCQlwYWdlSW5jcmVtZW50U2NhbGUuc2V0SW5jcmVtZW50ICg1KTsKLQkKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxMDA7Ci0JCXBhZ2VJbmNyZW1lbnRTY2FsZS5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlwYWdlSW5jcmVtZW50U2NhbGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIGRpZ2l0cwotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVEaWdpdHNHcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBkaWdpdHNHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWRpZ2l0c0dyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlkaWdpdHNHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGlnaXRzIikpOwotCQlkaWdpdHNHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQotCQkvKiBDcmVhdGUgdGhlIHNjYWxlIHdpZGdldCAqLwotCQlkaWdpdHNTY2FsZSA9IG5ldyBTY2FsZSAoZGlnaXRzR3JvdXAsIFNXVC5OT05FKTsKLQkJZGlnaXRzU2NhbGUuc2V0TWF4aW11bSAoOCk7Ci0JCWRpZ2l0c1NjYWxlLnNldFNlbGVjdGlvbiAoMCk7Ci0JCWRpZ2l0c1NjYWxlLnNldFBhZ2VJbmNyZW1lbnQgKDEwKTsKLQkJZGlnaXRzU2NhbGUuc2V0SW5jcmVtZW50ICg1KTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDEwMDsKLQkJZGlnaXRzU2NhbGUuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWRpZ2l0c1NjYWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewkJCi0JCQkJc2V0V2lkZ2V0RGlnaXRzICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFiIGZvbGRlciBwYWdlLgotCSAqCi0JICogQHBhcmFtIHRhYkZvbGRlciBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGFnZSBmb3IgdGhlIHRhYiBmb2xkZXIKLQkgKi8KLQlDb21wb3NpdGUgY3JlYXRlVGFiRm9sZGVyUGFnZSAoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQlzdXBlci5jcmVhdGVUYWJGb2xkZXJQYWdlICh0YWJGb2xkZXIpOwotCi0JCS8qCi0JCSAqIEFkZCBhIHJlc2l6ZSBsaXN0ZW5lciB0byB0aGUgdGFiRm9sZGVyUGFnZSBzbyB0aGF0Ci0JCSAqIGlmIHRoZSB1c2VyIHR5cGVzIGludG8gdGhlIGV4YW1wbGUgd2lkZ2V0IHRvIGNoYW5nZQotCQkgKiBpdHMgcHJlZmVycmVkIHNpemUsIGFuZCB0aGVuIHJlc2l6ZXMgdGhlIHNoZWxsLCB3ZQotCQkgKiByZWNhbGN1bGF0ZSB0aGUgcHJlZmVycmVkIHNpemUgY29ycmVjdGx5LgotCQkgKi8KLQkJdGFiRm9sZGVyUGFnZS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gdGFiRm9sZGVyUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCAoKSB7Ci0JCW9yaWVudGF0aW9uQnV0dG9ucyA9IGZhbHNlOwotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJcmVhZE9ubHlCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyZWFkT25seUJ1dHRvbi5zZXRUZXh0ICgiU1dULlJFQURfT05MWSIpOwotCQl3cmFwQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJd3JhcEJ1dHRvbi5zZXRUZXh0ICgiU1dULldSQVAiKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sIFtdIHtzcGlubmVyMX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJTcGlubmVyIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlyZWFkT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChzcGlubmVyMS5nZXRTdHlsZSAoKSAmIFNXVC5SRUFEX09OTFkpICE9IDApOwotCQl3cmFwQnV0dG9uLnNldFNlbGVjdGlvbiAoKHNwaW5uZXIxLmdldFN0eWxlICgpICYgU1dULldSQVApICE9IDApOwotCQlzZXRXaWRnZXRJbmNyZW1lbnQgKCk7Ci0JCXNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCk7Ci0JCXNldFdpZGdldERpZ2l0cyAoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNyZW1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0SW5jcmVtZW50ICgpIHsKLQkJc3Bpbm5lcjEuc2V0SW5jcmVtZW50IChpbmNyZW1lbnRTY2FsZS5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBtaW5pbWltIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldE1heGltdW0gKCkgewotCQlzcGlubmVyMS5zZXRNYXhpbXVtIChtYXhpbXVtU2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRNaW5pbXVtICgpIHsKLQkJc3Bpbm5lcjEuc2V0TWluaW11bSAobWluaW11bVNjYWxlLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHBhZ2UgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCkgewotCQlzcGlubmVyMS5zZXRQYWdlSW5jcmVtZW50IChwYWdlSW5jcmVtZW50U2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZGlnaXRzIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldERpZ2l0cyAoKSB7Ci0JCXNwaW5uZXIxLnNldERpZ2l0cyAoZGlnaXRzU2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0aW9uIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFNlbGVjdGlvbiAoKSB7Ci0JCXNwaW5uZXIxLnNldFNlbGVjdGlvbiAoc2VsZWN0aW9uU2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU3R5bGVkVGV4dFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU3R5bGVkVGV4dFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2E3ODQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1N0eWxlZFRleHRUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotY2xhc3MgU3R5bGVkVGV4dFRhYiBleHRlbmRzIFNjcm9sbGFibGVUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCUdyb3VwIHN0eWxlZFRleHRHcm91cCwgc3R5bGVkVGV4dFN0eWxlR3JvdXA7Ci0KLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHdyYXBCdXR0b24sIHJlYWRPbmx5QnV0dG9uLCBmdWxsU2VsZWN0aW9uQnV0dG9uOwotCQotCS8qIEJ1dHRvbnMgZm9yIGFkZGluZyBTdHlsZVJhbmdlcyB0byBTdHlsZWRUZXh0ICovCi0JQnV0dG9uIGJvbGRCdXR0b24sIGl0YWxpY0J1dHRvbiwgcmVkQnV0dG9uLCB5ZWxsb3dCdXR0b24sIHVuZGVybGluZUJ1dHRvbiwgc3RyaWtlb3V0QnV0dG9uOwotCUltYWdlIGJvbGRJbWFnZSwgaXRhbGljSW1hZ2UsIHJlZEltYWdlLCB5ZWxsb3dJbWFnZSwgdW5kZXJsaW5lSW1hZ2UsIHN0cmlrZW91dEltYWdlOwotCQotCS8qIFZhcmlhYmxlcyBmb3Igc2F2aW5nIHN0YXRlLiAqLwotCVN0eWxlUmFuZ2VbXSBzdHlsZVJhbmdlczsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlTdHlsZWRUZXh0VGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGJpdG1hcCBpbWFnZS4gCi0JICovCi0JSW1hZ2UgY3JlYXRlQml0bWFwSW1hZ2UgKERpc3BsYXkgZGlzcGxheSwgU3RyaW5nIG5hbWUpIHsKLQkJSW5wdXRTdHJlYW0gc291cmNlU3RyZWFtID0gQ29udHJvbEV4YW1wbGUuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSAobmFtZSArICIuYm1wIik7Ci0JCUlucHV0U3RyZWFtIG1hc2tTdHJlYW0gPSBDb250cm9sRXhhbXBsZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtIChuYW1lICsgIl9tYXNrLmJtcCIpOwotCQlJbWFnZURhdGEgc291cmNlID0gbmV3IEltYWdlRGF0YSAoc291cmNlU3RyZWFtKTsKLQkJSW1hZ2VEYXRhIG1hc2sgPSBuZXcgSW1hZ2VEYXRhIChtYXNrU3RyZWFtKTsKLQkJSW1hZ2UgcmVzdWx0ID0gbmV3IEltYWdlIChkaXNwbGF5LCBzb3VyY2UsIG1hc2spOwotCQl0cnkgewotCQkJc291cmNlU3RyZWFtLmNsb3NlICgpOwotCQkJbWFza1N0cmVhbS5jbG9zZSAoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UgKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbFdpZGdldHMgKCk7Ci0JCQotCQkvKiBBZGQgYSBncm91cCBmb3IgbW9kaWZ5aW5nIHRoZSBTdHlsZWRUZXh0IHdpZGdldCAqLwotCQljcmVhdGVTdHlsZWRUZXh0U3R5bGVHcm91cCAoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHN0eWxlZCB0ZXh0IHdpZGdldCAqLwotCQlzdHlsZWRUZXh0R3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlzdHlsZWRUZXh0R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXN0eWxlZFRleHRHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlzdHlsZWRUZXh0R3JvdXAuc2V0VGV4dCAoIlN0eWxlZFRleHQiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChzaW5nbGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU0lOR0xFOwotCQlpZiAobXVsdGlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTVVMVEk7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhfU0NST0xMOwotCQlpZiAodmVydGljYWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuVl9TQ1JPTEw7Ci0JCWlmICh3cmFwQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULldSQVA7Ci0JCWlmIChyZWFkT25seUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5SRUFEX09OTFk7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAoZnVsbFNlbGVjdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5GVUxMX1NFTEVDVElPTjsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0IChzdHlsZWRUZXh0R3JvdXAsIHN0eWxlKTsKLQkJc3R5bGVkVGV4dC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRXhhbXBsZV9zdHJpbmciKSk7Ci0JCXN0eWxlZFRleHQuYXBwZW5kICgiXG4iKTsKLQkJc3R5bGVkVGV4dC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPbmVfVHdvX1RocmVlIikpOwotCQkKLQkJaWYgKHN0eWxlUmFuZ2VzICE9IG51bGwpIHsKLQkJCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZXMoc3R5bGVSYW5nZXMpOwotCQkJc3R5bGVSYW5nZXMgPSBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQl3cmFwQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJd3JhcEJ1dHRvbi5zZXRUZXh0ICgiU1dULldSQVAiKTsKLQkJcmVhZE9ubHlCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyZWFkT25seUJ1dHRvbi5zZXRUZXh0ICgiU1dULlJFQURfT05MWSIpOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJZnVsbFNlbGVjdGlvbkJ1dHRvbi5zZXRUZXh0ICgiU1dULkZVTExfU0VMRUNUSU9OIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZWRUZXh0IFN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlZFRleHRTdHlsZUdyb3VwICgpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gY29udHJvbEdyb3VwLmdldERpc3BsYXkgKCk7Ci0JCXN0eWxlZFRleHRTdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJc3R5bGVkVGV4dFN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJTdHlsZWRUZXh0X1N0eWxlcyIpKTsKLQkJc3R5bGVkVGV4dFN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCg3LCBmYWxzZSkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3R5bGVkVGV4dFN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCQotCQkvKiBHZXQgaW1hZ2VzICovCi0JCWJvbGRJbWFnZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAiYm9sZCIpOwotCQlpdGFsaWNJbWFnZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAiaXRhbGljIik7Ci0JCXJlZEltYWdlID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJyZWQiKTsKLQkJeWVsbG93SW1hZ2UgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgInllbGxvdyIpOwotCQl1bmRlcmxpbmVJbWFnZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAidW5kZXJsaW5lIik7Ci0JCXN0cmlrZW91dEltYWdlID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJzdHJpa2VvdXQiKTsKLQkJCi0JCS8qIENyZWF0ZSBjb250cm9scyB0byBtb2RpZnkgdGhlIFN0eWxlZFRleHQgKi8KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU3R5bGVkVGV4dF9TdHlsZV9JbnN0cnVjdGlvbnMiKSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDc7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW5ldyBMYWJlbCAoc3R5bGVkVGV4dFN0eWxlR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkJvbGQiKSk7Ci0JCWJvbGRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULlBVU0gpOwotCQlib2xkQnV0dG9uLnNldEltYWdlIChib2xkSW1hZ2UpOwotCQluZXcgTGFiZWwgKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJVbmRlcmxpbmUiKSk7Ci0JCXVuZGVybGluZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCXVuZGVybGluZUJ1dHRvbi5zZXRJbWFnZSAodW5kZXJsaW5lSW1hZ2UpOwotCQluZXcgTGFiZWwgKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCW5ldyBMYWJlbCAoc3R5bGVkVGV4dFN0eWxlR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkZvcmVncm91bmRfU3R5bGUiKSk7Ci0JCXJlZEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCXJlZEJ1dHRvbi5zZXRJbWFnZSAocmVkSW1hZ2UpOwotCQluZXcgTGFiZWwgKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGFsaWMiKSk7Ci0JCWl0YWxpY0J1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCWl0YWxpY0J1dHRvbi5zZXRJbWFnZSAoaXRhbGljSW1hZ2UpOwotCQluZXcgTGFiZWwgKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJTdHJpa2VvdXQiKSk7Ci0JCXN0cmlrZW91dEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCXN0cmlrZW91dEJ1dHRvbi5zZXRJbWFnZSAoc3RyaWtlb3V0SW1hZ2UpOwotCQluZXcgTGFiZWwgKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCW5ldyBMYWJlbCAoc3R5bGVkVGV4dFN0eWxlR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkJhY2tncm91bmRfU3R5bGUiKSk7Ci0JCXllbGxvd0J1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCXllbGxvd0J1dHRvbi5zZXRJbWFnZSAoeWVsbG93SW1hZ2UpOwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzdHlsZUxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlQb2ludCBzZWwgPSBzdHlsZWRUZXh0LmdldFNlbGVjdGlvblJhbmdlKCk7Ci0JCQkJaWYgKChzZWwgPT0gbnVsbCkgfHwgKHNlbC55ID09IDApKSByZXR1cm47Ci0JCQkJU3R5bGVSYW5nZSBzdHlsZTsKLQkJCQlmb3IgKGludCBpID0gc2VsLng7IGk8c2VsLngrc2VsLnk7IGkrKykgewotCQkJCQlTdHlsZVJhbmdlIHJhbmdlID0gc3R5bGVkVGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoaSk7Ci0JCQkJCWlmIChyYW5nZSAhPSBudWxsKSB7Ci0JCQkJCQlzdHlsZSA9IChTdHlsZVJhbmdlKXJhbmdlLmNsb25lKCk7Ci0JCQkJCQlzdHlsZS5zdGFydCA9IGk7Ci0JCQkJCQlzdHlsZS5sZW5ndGggPSAxOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3R5bGUgPSBuZXcgU3R5bGVSYW5nZShpLCAxLCBudWxsLCBudWxsLCBTV1QuTk9STUFMKTsKLQkJCQkJfQotCQkJCQlpZiAoZS53aWRnZXQgPT0gYm9sZEJ1dHRvbikgewotCQkJCQkJc3R5bGUuZm9udFN0eWxlIF49IFNXVC5CT0xEOwotCQkJCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IGl0YWxpY0J1dHRvbikgewotCQkJCQkJc3R5bGUuZm9udFN0eWxlIF49IFNXVC5JVEFMSUM7CQkJCQkJCi0JCQkJCX0gZWxzZSBpZiAoZS53aWRnZXQgPT0gdW5kZXJsaW5lQnV0dG9uKSB7Ci0JCQkJCQlzdHlsZS51bmRlcmxpbmUgPSAhc3R5bGUudW5kZXJsaW5lOwotCQkJCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHN0cmlrZW91dEJ1dHRvbikgewotCQkJCQkJc3R5bGUuc3RyaWtlb3V0ID0gIXN0eWxlLnN0cmlrZW91dDsKLQkJCQkJfQotCQkJCQlzdHlsZWRUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCQkJCX0KLQkJCQlzdHlsZWRUZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbC54ICsgc2VsLnksIDApOwkJCQotCQkJfQotCQl9OwotCQlTZWxlY3Rpb25MaXN0ZW5lciBjb2xvckxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlQb2ludCBzZWwgPSBzdHlsZWRUZXh0LmdldFNlbGVjdGlvblJhbmdlKCk7Ci0JCQkJaWYgKChzZWwgPT0gbnVsbCkgfHwgKHNlbC55ID09IDApKSByZXR1cm47Ci0JCQkJQ29sb3IgZmcgPSBudWxsLCBiZyA9IG51bGw7Ci0JCQkJaWYgKGUud2lkZ2V0ID09IHJlZEJ1dHRvbikgewotCQkJCQlmZyA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCQkJCX0gZWxzZSBpZiAoZS53aWRnZXQgPT0geWVsbG93QnV0dG9uKSB7Ci0JCQkJCWJnID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1lFTExPVyk7Ci0JCQkJfQotCQkJCVN0eWxlUmFuZ2Ugc3R5bGU7Ci0JCQkJZm9yIChpbnQgaSA9IHNlbC54OyBpPHNlbC54K3NlbC55OyBpKyspIHsKLQkJCQkJU3R5bGVSYW5nZSByYW5nZSA9IHN0eWxlZFRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGkpOwotCQkJCQlpZiAocmFuZ2UgIT0gbnVsbCkgewotCQkJCQkJc3R5bGUgPSAoU3R5bGVSYW5nZSlyYW5nZS5jbG9uZSgpOwotCQkJCQkJc3R5bGUuc3RhcnQgPSBpOwotCQkJCQkJc3R5bGUubGVuZ3RoID0gMTsKLQkJCQkJCXN0eWxlLmZvcmVncm91bmQgPSBzdHlsZS5mb3JlZ3JvdW5kICE9IG51bGwgPyBudWxsIDogZmc7Ci0JCQkJCQlzdHlsZS5iYWNrZ3JvdW5kID0gc3R5bGUuYmFja2dyb3VuZCAhPSBudWxsID8gbnVsbCA6IGJnOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3R5bGUgPSBuZXcgU3R5bGVSYW5nZSAoaSwgMSwgZmcsIGJnLCBTV1QuTk9STUFMKTsKLQkJCQkJfQotCQkJCQlzdHlsZWRUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCQkJCX0KLQkJCQlzdHlsZWRUZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbC54ICsgc2VsLnksIDApOwotCQkJfQotCQl9OwotCQlib2xkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHN0eWxlTGlzdGVuZXIpOwotCQlpdGFsaWNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc3R5bGVMaXN0ZW5lcik7Ci0JCXVuZGVybGluZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzdHlsZUxpc3RlbmVyKTsKLQkJc3RyaWtlb3V0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHN0eWxlTGlzdGVuZXIpOwotCQlyZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoY29sb3JMaXN0ZW5lcik7Ci0JCXllbGxvd0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihjb2xvckxpc3RlbmVyKTsKLQkJeWVsbG93QnV0dG9uLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkIChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWJvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJaXRhbGljSW1hZ2UuZGlzcG9zZSgpOwotCQkJCXJlZEltYWdlLmRpc3Bvc2UoKTsKLQkJCQl5ZWxsb3dJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJdW5kZXJsaW5lSW1hZ2UuZGlzcG9zZSgpOwotCQkJCXN0cmlrZW91dEltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYiBmb2xkZXIgcGFnZS4KLQkgKgotCSAqIEBwYXJhbSB0YWJGb2xkZXIgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyCi0JICogQHJldHVybiB0aGUgbmV3IHBhZ2UgZm9yIHRoZSB0YWIgZm9sZGVyCi0JICovCi0JQ29tcG9zaXRlIGNyZWF0ZVRhYkZvbGRlclBhZ2UgKFRhYkZvbGRlciB0YWJGb2xkZXIpIHsKLQkJc3VwZXIuY3JlYXRlVGFiRm9sZGVyUGFnZSAodGFiRm9sZGVyKTsKLQotCQkvKgotCQkgKiBBZGQgYSByZXNpemUgbGlzdGVuZXIgdG8gdGhlIHRhYkZvbGRlclBhZ2Ugc28gdGhhdAotCQkgKiBpZiB0aGUgdXNlciB0eXBlcyBpbnRvIHRoZSBleGFtcGxlIHdpZGdldCB0byBjaGFuZ2UKLQkJICogaXRzIHByZWZlcnJlZCBzaXplLCBhbmQgdGhlbiByZXNpemVzIHRoZSBzaGVsbCwgd2UKLQkJICogcmVjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBzaXplIGNvcnJlY3RseS4KLQkJICovCi0JCXRhYkZvbGRlclBhZ2UuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIHRhYkZvbGRlclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgZGlzcG9zZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJLyogc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBzdHlsZWRUZXh0IGlmIGFwcGxpY2FibGUgKi8KLQkJaWYgKHN0eWxlZFRleHQgIT0gbnVsbCkgewotCQkJc3R5bGVSYW5nZXMgPSBzdHlsZWRUZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZUV4YW1wbGVXaWRnZXRzKCk7CQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbXSB7c3R5bGVkVGV4dH07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiQ2FyZXRPZmZzZXQiLCAiRG91YmxlQ2xpY2tFbmFibGVkIiwgIkVkaXRhYmxlIiwgIkhvcml6b250YWxJbmRleCIsICJIb3Jpem9udGFsUGl4ZWwiLCAiT3JpZW50YXRpb24iLCAiU2VsZWN0aW9uIiwgIlRhYnMiLCAiVGV4dCIsICJUZXh0TGltaXQiLCAiVG9vbFRpcFRleHQiLCAiVG9wSW5kZXgiLCAiVG9wUGl4ZWwiLCAiV29yZFdyYXAifTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJTdHlsZWRUZXh0IjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQl3cmFwQnV0dG9uLnNldFNlbGVjdGlvbiAoKHN0eWxlZFRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuV1JBUCkgIT0gMCk7Ci0JCXJlYWRPbmx5QnV0dG9uLnNldFNlbGVjdGlvbiAoKHN0eWxlZFRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuUkVBRF9PTkxZKSAhPSAwKTsKLQkJZnVsbFNlbGVjdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKChzdHlsZWRUZXh0LmdldFN0eWxlICgpICYgU1dULkZVTExfU0VMRUNUSU9OKSAhPSAwKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRFbmFibGVkICgoc3R5bGVkVGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5NVUxUSSkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldEVuYWJsZWQgKChzdHlsZWRUZXh0LmdldFN0eWxlICgpICYgU1dULk1VTFRJKSAhPSAwKTsKLQkJd3JhcEJ1dHRvbi5zZXRFbmFibGVkICgoc3R5bGVkVGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5NVUxUSSkgIT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWFhODkxZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi0vKioKLSAqIDxjb2RlPlRhYjwvY29kZT4gaXMgdGhlIGFic3RyYWN0IHN1cGVyY2xhc3Mgb2YgZXZlcnkgcGFnZQotICogaW4gdGhlIGV4YW1wbGUncyB0YWIgZm9sZGVyLiAgRWFjaCBwYWdlIGluIHRoZSB0YWIgZm9sZGVyCi0gKiBkZXNjcmliZXMgYSBjb250cm9sLgotICoKLSAqIEEgVGFiIGl0c2VsZiBpcyBub3QgYSBjb250cm9sIGJ1dCBpbnN0ZWFkIHByb3ZpZGVzIGEKLSAqIGhpZXJhcmNoeSB3aXRoIHdoaWNoIHRvIHNoYXJlIGNvZGUgdGhhdCBpcyBjb21tb24gdG8KLSAqIGV2ZXJ5IHBhZ2UgaW4gdGhlIGZvbGRlci4KLSAqCi0gKiBBIHR5cGljYWwgcGFnZSBpbiBhIFRhYiBjb250YWlucyBhIHR3byBjb2x1bW4gY29tcG9zaXRlLgotICogVGhlIGxlZnQgY29sdW1uIGNvbnRhaW5zIHRoZSAiRXhhbXBsZSIgZ3JvdXAuICBUaGUgcmlnaHQKLSAqIGNvbHVtbiBjb250YWlucyAiQ29udHJvbCIgZ3JvdXAuICBUaGUgIkNvbnRyb2wiIGdyb3VwCi0gKiBjb250YWlucyBjb250cm9scyB0aGF0IGFsbG93IHRoZSB1c2VyIHRvIGludGVyYWN0IHdpdGgKLSAqIHRoZSBleGFtcGxlIGNvbnRyb2wuICBUaGUgIkNvbnRyb2wiIGdyb3VwIHR5cGljYWxseQotICogY29udGFpbnMgYSAiU3R5bGUiLCAiT3RoZXIiIGFuZCAiU2l6ZSIgZ3JvdXAuICBTdWJjbGFzc2VzCi0gKiBjYW4gb3ZlcnJpZGUgdGhlc2UgZGVmYXVsdHMgdG8gYXVnbWVudCBhIGdyb3VwIG9yIHN0b3AKLSAqIGEgZ3JvdXAgZnJvbSBiZWluZyBjcmVhdGVkLgotICovCi1hYnN0cmFjdCBjbGFzcyBUYWIgewotCS8qIENvbW1vbiBjb250cm9sIGJ1dHRvbnMgKi8KLQlCdXR0b24gYm9yZGVyQnV0dG9uLCBlbmFibGVkQnV0dG9uLCB2aXNpYmxlQnV0dG9uOwotCUJ1dHRvbiBwcmVmZXJyZWRCdXR0b24sIHRvb1NtYWxsQnV0dG9uLCBzbWFsbEJ1dHRvbiwgbGFyZ2VCdXR0b24sIGZpbGxIQnV0dG9uLCBmaWxsVkJ1dHRvbjsKLQotCS8qIENvbW1vbiBncm91cHMgYW5kIGNvbXBvc2l0ZXMgKi8KLQlDb21wb3NpdGUgdGFiRm9sZGVyUGFnZTsKLQlHcm91cCBleGFtcGxlR3JvdXAsIGNvbnRyb2xHcm91cCwgbGlzdGVuZXJzR3JvdXAsIG90aGVyR3JvdXAsIHNpemVHcm91cCwgc3R5bGVHcm91cCwgY29sb3JHcm91cDsKLQotCS8qIENvbnRyb2xsaW5nIGluc3RhbmNlICovCi0JZmluYWwgQ29udHJvbEV4YW1wbGUgaW5zdGFuY2U7Ci0KLQkvKiBTaXppbmcgY29uc3RhbnRzIGZvciB0aGUgIlNpemUiIGdyb3VwICovCi0Jc3RhdGljIGZpbmFsIGludCBUT09fU01BTExfU0laRQk9IDEwOwotCXN0YXRpYyBmaW5hbCBpbnQgU01BTExfU0laRQkJPSA1MDsKLQlzdGF0aWMgZmluYWwgaW50IExBUkdFX1NJWkUJCT0gMTAwOwotCQotCS8qIFJpZ2h0LXRvLWxlZnQgc3VwcG9ydCAqLwotCXN0YXRpYyBmaW5hbCBib29sZWFuIFJUTF9TVVBQT1JUX0VOQUJMRSA9IGZhbHNlOwotCUdyb3VwIG9yaWVudGF0aW9uR3JvdXA7Ci0JQnV0dG9uIHJ0bEJ1dHRvbiwgbHRyQnV0dG9uLCBkZWZhdWx0T3JpZXRhdGlvbkJ1dHRvbjsKLQotCS8qIENvbnRyb2xzIGFuZCByZXNvdXJjZXMgZm9yIHRoZSAiQ29sb3JzIiBncm91cCAqLwotCUJ1dHRvbiBmb3JlZ3JvdW5kQnV0dG9uLCBiYWNrZ3JvdW5kQnV0dG9uLCBmb250QnV0dG9uOwotCUltYWdlIGZvcmVncm91bmRJbWFnZSwgYmFja2dyb3VuZEltYWdlOwotCUNvbG9yIGZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZENvbG9yOwotCUZvbnQgZm9udDsKLQotCS8qIEV2ZW50IGxvZ2dpbmcgdmFyaWFibGVzIGFuZCBjb250cm9scyAqLwotCVRleHQgZXZlbnRDb25zb2xlOwotCWJvb2xlYW4gbG9nZ2luZyA9IGZhbHNlOwotCWJvb2xlYW4gW10gZXZlbnRzRmlsdGVyOwotCQotCS8qIFNldC9HZXQgQVBJIGNvbnRyb2xzICovCi0JQ29tYm8gbmFtZUNvbWJvOwotCUxhYmVsIHJldHVyblR5cGVMYWJlbDsKLQlCdXR0b24gZ2V0QnV0dG9uLCBzZXRCdXR0b247Ci0JVGV4dCBzZXRUZXh0LCBnZXRUZXh0OwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBbXSBFVkVOVF9OQU1FUyA9IHsKLQkJIk5vbmUiLAotCQkiS2V5RG93biIsICJLZXlVcCIsCi0JCSJNb3VzZURvd24iLCAiTW91c2VVcCIsICJNb3VzZU1vdmUiLCAiTW91c2VFbnRlciIsICJNb3VzZUV4aXQiLCAiTW91c2VEb3VibGVDbGljayIsCi0JCSJQYWludCIsICJNb3ZlIiwgIlJlc2l6ZSIsICJEaXNwb3NlIiwKLQkJIlNlbGVjdGlvbiIsICJEZWZhdWx0U2VsZWN0aW9uIiwKLQkJIkZvY3VzSW4iLCAiRm9jdXNPdXQiLAotCQkiRXhwYW5kIiwgIkNvbGxhcHNlIiwKLQkJIkljb25pZnkiLCAiRGVpY29uaWZ5IiwgIkNsb3NlIiwKLQkJIlNob3ciLCAiSGlkZSIsCi0JCSJNb2RpZnkiLCAiVmVyaWZ5IiwKLQkJIkFjdGl2YXRlIiwgIkRlYWN0aXZhdGUiLAotCQkiSGVscCIsICJEcmFnRGV0ZWN0IiwgIkFybSIsICJUcmF2ZXJzZSIsICJNb3VzZUhvdmVyIiwKLQkJIkhhcmRLZXlEb3duIiwgIkhhcmRLZXlVcCIsCi0JCSJNZW51RGV0ZWN0IiwKLQkJIlNldERhdGEiLAotCQkiTW91c2VXaGVlbCIsCi0vLwkJIlNldHRpbmdzIiwgIC8vIGludGVudGlvbmFsbHkgY29tbWVudGVkIC0gZXZlbnQgb25seSBnb2VzIHRvIERpc3BsYXkKLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQl0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIGdyb3VwLiAgVGhlICJDb250cm9sIiBncm91cAotCSAqIGlzIHR5cGljYWxseSB0aGUgcmlnaHQgaGFuZCBjb2x1bW4gaW4gdGhlIHRhYi4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xHcm91cCAoKSB7Ci0JCi0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgIkNvbnRyb2wiIGdyb3VwLiAgVGhpcyBpcyB0aGUgZ3JvdXAgb24gdGhlCi0JCSAqIHJpZ2h0IGhhbGYgb2YgZWFjaCBleGFtcGxlIHRhYi4gIEl0IGNvbnNpc3RzIG9mIHRoZQotCQkgKiAiU3R5bGUiIGdyb3VwLCB0aGUgIk90aGVyIiBncm91cCBhbmQgdGhlICJTaXplIiBncm91cC4KLQkJICovCQotCQljb250cm9sR3JvdXAgPSBuZXcgR3JvdXAgKHRhYkZvbGRlclBhZ2UsIFNXVC5OT05FKTsKLQkJY29udHJvbEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKDIsIHRydWUpKTsKLQkJY29udHJvbEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSkpOwotCQljb250cm9sR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhcmFtZXRlcnMiKSk7Ci0JCi0JCS8qIENyZWF0ZSBpbmRpdmlkdWFsIGdyb3VwcyBpbnNpZGUgdGhlICJDb250cm9sIiBncm91cCAqLwotCQljcmVhdGVTdHlsZUdyb3VwICgpOwotCQljcmVhdGVPdGhlckdyb3VwICgpOwotCQljcmVhdGVTZXRHZXRHcm91cCgpOwotCQljcmVhdGVTaXplR3JvdXAgKCk7Ci0JCWNyZWF0ZUNvbG9yR3JvdXAgKCk7Ci0JCWlmIChSVExfU1VQUE9SVF9FTkFCTEUpIHsKLQkJCWNyZWF0ZU9yaWVudGF0aW9uR3JvdXAgKCk7Ci0JCX0KLQkKLQkJLyoKLQkJICogRm9yIGVhY2ggQnV0dG9uIGNoaWxkIGluIHRoZSBzdHlsZSBncm91cCwgYWRkIGEgc2VsZWN0aW9uCi0JCSAqIGxpc3RlbmVyIHRoYXQgd2lsbCByZWNyZWF0ZSB0aGUgZXhhbXBsZSBjb250cm9scy4gIElmIHRoZQotCQkgKiBzdHlsZSBncm91cCBidXR0b24gaXMgYSBSQURJTyBidXR0b24sIGVuc3VyZSB0aGF0IHRoZSByYWRpbwotCQkgKiBidXR0b24gaXMgc2VsZWN0ZWQgYmVmb3JlIHJlY3JlYXRpbmcgdGhlIGV4YW1wbGUgY29udHJvbHMuCi0JCSAqIFdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhIFJBRElPIGJ1dHRvbiwgdGhlIGN1cnJlbnQgUkFESU8KLQkJICogYnV0dG9uIGluIHRoZSBncm91cCBpcyBkZXNlbGVjdGVkIGFuZCB0aGUgbmV3IFJBRElPIGJ1dHRvbgotCQkgKiBpcyBzZWxlY3RlZCBhdXRvbWF0aWNhbGx5LiAgVGhlIGxpc3RlbmVycyBhcmUgbm90aWZpZWQgZm9yCi0JCSAqIGJvdGggdGhlc2Ugb3BlcmF0aW9ucyBidXQgdHlwaWNhbGx5IG9ubHkgZG8gd29yayB3aGVuIGEgUkFESU8KLQkJICogYnV0dG9uIGlzIHNlbGVjdGVkLgotCQkgKi8KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoKGV2ZW50LndpZGdldC5nZXRTdHlsZSAoKSAmIFNXVC5SQURJTykgIT0gMCkgewotCQkJCQlpZiAoISgoQnV0dG9uKSBldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbiAoKSkgcmV0dXJuOwotCQkJCX0KLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9OwotCQlDb250cm9sIFtdIGNoaWxkcmVuID0gc3R5bGVHcm91cC5nZXRDaGlsZHJlbiAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW4gW2ldIGluc3RhbmNlb2YgQnV0dG9uKSB7Ci0JCQkJQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGNoaWxkcmVuIFtpXTsKLQkJCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQlpZiAoUlRMX1NVUFBPUlRfRU5BQkxFKSB7Ci0JCQlydGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsgCi0JCQlsdHJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsJCQotCQkJZGVmYXVsdE9yaWV0YXRpb25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBcHBlbmQgdGhlIFNldC9HZXQgQVBJIGNvbnRyb2xzIHRvIHRoZSAiT3RoZXIiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU2V0R2V0R3JvdXAoKSB7Ci0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgYnV0dG9uIHRvIGFjY2VzcyBzZXQvZ2V0IEFQSSBmdW5jdGlvbmFsaXR5LgotCQkgKi8KLQkJZmluYWwgU3RyaW5nIFtdIG1ldGhvZE5hbWVzID0gZ2V0TWV0aG9kTmFtZXMgKCk7Ci0JCWlmIChtZXRob2ROYW1lcyAhPSBudWxsKSB7Ci0JCQlCdXR0b24gc2V0R2V0QnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULlBVU0gpOwotCQkJc2V0R2V0QnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU2V0X0dldCIpKTsKLQkJCXNldEdldEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQlzZXRHZXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJCQlQb2ludCBwdCA9IGJ1dHRvbi5nZXRMb2NhdGlvbigpOwotCQkJCQlwdCA9IGUuZGlzcGxheS5tYXAoYnV0dG9uLCBudWxsLCBwdCk7Ci0JCQkJCWNyZWF0ZVNldEdldERpYWxvZyhwdC54LCBwdC55LCBtZXRob2ROYW1lcyk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYXVnbWVudAotCSAqIHRoZSBzdGFuZGFyZCBjb250cm9scyBjcmVhdGVkIGluIHRoZSAiU3R5bGUiLAotCSAqICJPdGhlciIgYW5kICJTaXplIiBncm91cHMuCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb2xvcnMiIGdyb3VwLiBUaGlzIGlzIHR5cGljYWxseQotCSAqIGEgY2hpbGQgb2YgdGhlICJDb250cm9sIiBncm91cC4gU3ViY2xhc3NlcyBvdmVycmlkZQotCSAqIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSBhbmQgc2V0IHN5c3RlbSBjb2xvcnMuCi0JICovCi0Jdm9pZCBjcmVhdGVDb2xvckdyb3VwICgpIHsKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQljb2xvckdyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQljb2xvckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKDIsIGZhbHNlKSk7Ci0JCWNvbG9yR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWNvbG9yR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDb2xvcnMiKSk7Ci0JCW5ldyBMYWJlbCAoY29sb3JHcm91cCwgU1dULk5PTkUpLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiRm9yZWdyb3VuZF9Db2xvciIpKTsKLQkJZm9yZWdyb3VuZEJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbG9yR3JvdXAsIFNXVC5QVVNIKTsKLQkJbmV3IExhYmVsIChjb2xvckdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJCYWNrZ3JvdW5kX0NvbG9yIikpOwotCQliYWNrZ3JvdW5kQnV0dG9uID0gbmV3IEJ1dHRvbiAoY29sb3JHcm91cCwgU1dULlBVU0gpOwotCQlmb250QnV0dG9uID0gbmV3IEJ1dHRvbiAoY29sb3JHcm91cCwgU1dULlBVU0gpOwotCQlmb250QnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZvbnQiKSk7Ci0JCWZvbnRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlCdXR0b24gZGVmYXVsdHNCdXR0b24gPSBuZXcgQnV0dG9uIChjb2xvckdyb3VwLCBTV1QuUFVTSCk7Ci0JCWRlZmF1bHRzQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlZmF1bHRzIikpOwotCi0JCVNoZWxsIHNoZWxsID0gY29udHJvbEdyb3VwLmdldFNoZWxsICgpOwotCQlmaW5hbCBDb2xvckRpYWxvZyBmb3JlZ3JvdW5kRGlhbG9nID0gbmV3IENvbG9yRGlhbG9nIChzaGVsbCk7Ci0JCWZpbmFsIENvbG9yRGlhbG9nIGJhY2tncm91bmREaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2cgKHNoZWxsKTsKLQkJZmluYWwgRm9udERpYWxvZyBmb250RGlhbG9nID0gbmV3IEZvbnREaWFsb2cgKHNoZWxsKTsKLQotCQkvKiBDcmVhdGUgaW1hZ2VzIHRvIGRpc3BsYXkgY3VycmVudCBjb2xvcnMgKi8KLQkJaW50IGltYWdlU2l6ZSA9IDEyOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5ICgpOwotCQlmb3JlZ3JvdW5kSW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIGltYWdlU2l6ZSwgaW1hZ2VTaXplKTsKLQkJYmFja2dyb3VuZEltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBpbWFnZVNpemUsIGltYWdlU2l6ZSk7CQotCi0JCS8qIEFkZCBsaXN0ZW5lcnMgdG8gc2V0IHRoZSBjb2xvcnMgYW5kIGZvbnQgKi8KLQkJZm9yZWdyb3VuZEJ1dHRvbi5zZXRJbWFnZShmb3JlZ3JvdW5kSW1hZ2UpOyAvLyBzZXRzIHRoZSBzaXplIG9mIHRoZSBidXR0b24KLQkJZm9yZWdyb3VuZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sb3Igb2xkQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7Ci0JCQkJaWYgKG9sZENvbG9yID09IG51bGwpIHsKLQkJCQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQkJCQlpZiAoY29udHJvbHMubGVuZ3RoID4gMCkgb2xkQ29sb3IgPSBjb250cm9scyBbMF0uZ2V0Rm9yZWdyb3VuZCAoKTsKLQkJCQl9Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIGZvcmVncm91bmREaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsgLy8gc2VlZCBkaWFsb2cgd2l0aCBjdXJyZW50IGNvbG9yCi0JCQkJUkdCIHJnYiA9IGZvcmVncm91bmREaWFsb2cub3BlbigpOwotCQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJCW9sZENvbG9yID0gZm9yZWdyb3VuZENvbG9yOyAvLyBzYXZlIG9sZCBmb3JlZ3JvdW5kIGNvbG9yIHRvIGRpc3Bvc2Ugd2hlbiBkb25lCi0JCQkJZm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yIChldmVudC5kaXNwbGF5LCByZ2IpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRGb3JlZ3JvdW5kICgpOwotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQkJfQotCQl9KTsKLQkJYmFja2dyb3VuZEJ1dHRvbi5zZXRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpOyAvLyBzZXRzIHRoZSBzaXplIG9mIHRoZSBidXR0b24KLQkJYmFja2dyb3VuZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sb3Igb2xkQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7Ci0JCQkJaWYgKG9sZENvbG9yID09IG51bGwpIHsKLQkJCQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQkJCQlpZiAoY29udHJvbHMubGVuZ3RoID4gMCkgb2xkQ29sb3IgPSBjb250cm9scyBbMF0uZ2V0QmFja2dyb3VuZCAoKTsgLy8gc2VlZCBkaWFsb2cgd2l0aCBjdXJyZW50IGNvbG9yCi0JCQkJfQotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBiYWNrZ3JvdW5kRGlhbG9nLnNldFJHQihvbGRDb2xvci5nZXRSR0IoKSk7Ci0JCQkJUkdCIHJnYiA9IGJhY2tncm91bmREaWFsb2cub3BlbigpOwotCQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJCW9sZENvbG9yID0gYmFja2dyb3VuZENvbG9yOyAvLyBzYXZlIG9sZCBiYWNrZ3JvdW5kIGNvbG9yIHRvIGRpc3Bvc2Ugd2hlbiBkb25lCi0JCQkJYmFja2dyb3VuZENvbG9yID0gbmV3IENvbG9yIChldmVudC5kaXNwbGF5LCByZ2IpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRCYWNrZ3JvdW5kICgpOwotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQkJfQotCQl9KTsKLQkJZm9udEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlGb250IG9sZEZvbnQgPSBmb250OwotCQkJCWlmIChvbGRGb250ID09IG51bGwpIHsKLQkJCQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQkJCQlpZiAoY29udHJvbHMubGVuZ3RoID4gMCkgb2xkRm9udCA9IGNvbnRyb2xzIFswXS5nZXRGb250ICgpOwotCQkJCX0KLQkJCQlpZiAob2xkRm9udCAhPSBudWxsKSBmb250RGlhbG9nLnNldEZvbnRMaXN0KG9sZEZvbnQuZ2V0Rm9udERhdGEoKSk7IC8vIHNlZWQgZGlhbG9nIHdpdGggY3VycmVudCBmb250Ci0JCQkJRm9udERhdGEgZm9udERhdGEgPSBmb250RGlhbG9nLm9wZW4gKCk7Ci0JCQkJaWYgKGZvbnREYXRhID09IG51bGwpIHJldHVybjsKLQkJCQlvbGRGb250ID0gZm9udDsgLy8gZGlzcG9zZSBvbGQgZm9udCB3aGVuIGRvbmUKLQkJCQlmb250ID0gbmV3IEZvbnQgKGV2ZW50LmRpc3BsYXksIGZvbnREYXRhKTsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0Rm9udCAoKTsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCX0pOwotCQlkZWZhdWx0c0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlc2V0Q29sb3JzQW5kRm9udHMgKCk7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCWlmIChmb3JlZ3JvdW5kSW1hZ2UgIT0gbnVsbCkgZm9yZWdyb3VuZEltYWdlLmRpc3Bvc2UoKTsKLQkJCQlpZiAoYmFja2dyb3VuZEltYWdlICE9IG51bGwpIGJhY2tncm91bmRJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJaWYgKGZvcmVncm91bmRDb2xvciAhPSBudWxsKSBmb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJCWlmIChiYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgYmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoZm9udCAhPSBudWxsKSBmb250LmRpc3Bvc2UoKTsKLQkJCQlmb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwotCQkJCWJhY2tncm91bmRDb2xvciA9IG51bGw7Ci0JCQkJZm9udCA9IG51bGw7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4gIFRoaXMgaXMgdHlwaWNhbGx5Ci0JICogYSBjaGlsZCBvZiB0aGUgIkNvbnRyb2wiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlT3RoZXJHcm91cCAoKSB7Ci0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJb3RoZXJHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW90aGVyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW90aGVyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSkpOwotCQlvdGhlckdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPdGhlciIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBjb250cm9scyAqLwotCQllbmFibGVkQnV0dG9uID0gbmV3IEJ1dHRvbihvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQllbmFibGVkQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkVuYWJsZWQiKSk7Ci0JCXZpc2libGVCdXR0b24gPSBuZXcgQnV0dG9uKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXZpc2libGVCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVmlzaWJsZSIpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJZW5hYmxlZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldEVuYWJsZWQgKCk7Ci0JCQl9Ci0JCX0pOwotCQl2aXNpYmxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0VmlzaWJpbGl0eSAoKTsKLQkJCX0KLQkJfSk7Ci0JCi0JCS8qIFNldCB0aGUgZGVmYXVsdCBzdGF0ZSAqLwotCQllbmFibGVkQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJdmlzaWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZXZlbnQgY29uc29sZSBwb3B1cCBtZW51LgotCSAqLwotCXZvaWQgY3JlYXRlRXZlbnRDb25zb2xlUG9wdXAgKCkgewotCQlNZW51IHBvcHVwID0gbmV3IE1lbnUgKGV2ZW50Q29uc29sZS5nZXRTaGVsbCAoKSwgU1dULlBPUF9VUCk7Ci0JCWV2ZW50Q29uc29sZS5zZXRNZW51IChwb3B1cCk7Ci0KLQkJTWVudUl0ZW0gY3V0ID0gbmV3IE1lbnVJdGVtIChwb3B1cCwgU1dULlBVU0gpOwotCQljdXQuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lbnVJdGVtX0N1dCIpKTsKLQkJY3V0LmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXZlbnRDb25zb2xlLmN1dCAoKTsKLQkJCX0KLQkJfSk7Ci0JCU1lbnVJdGVtIGNvcHkgPSBuZXcgTWVudUl0ZW0gKHBvcHVwLCBTV1QuUFVTSCk7Ci0JCWNvcHkuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lbnVJdGVtX0NvcHkiKSk7Ci0JCWNvcHkuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlldmVudENvbnNvbGUuY29weSAoKTsKLQkJCX0KLQkJfSk7Ci0JCU1lbnVJdGVtIHBhc3RlID0gbmV3IE1lbnVJdGVtIChwb3B1cCwgU1dULlBVU0gpOwotCQlwYXN0ZS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVudUl0ZW1fUGFzdGUiKSk7Ci0JCXBhc3RlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXZlbnRDb25zb2xlLnBhc3RlICgpOwotCQkJfQotCQl9KTsKLQkJbmV3IE1lbnVJdGVtIChwb3B1cCwgU1dULlNFUEFSQVRPUik7Ci0JCU1lbnVJdGVtIHNlbGVjdEFsbCA9IG5ldyBNZW51SXRlbSAocG9wdXAsIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lbnVJdGVtX1NlbGVjdEFsbCIpKTsKLQkJc2VsZWN0QWxsLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXZlbnRDb25zb2xlLnNlbGVjdEFsbCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLiAgVGhlICJFeGFtcGxlIiBncm91cAotCSAqIGlzIHR5cGljYWxseSB0aGUgbGVmdCBoYW5kIGNvbHVtbiBpbiB0aGUgdGFiLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJZXhhbXBsZUdyb3VwID0gbmV3IEdyb3VwICh0YWJGb2xkZXJQYWdlLCBTV1QuTk9ORSk7Ci0JCWV4YW1wbGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJZXhhbXBsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4gb2YgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgcGFydGljdWxhcgotCSAqIGV4YW1wbGUgY29udHJvbC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJLyogRG8gbm90aGluZyAqLwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBvcGVucyB0aGUgIkxpc3RlbmVyIHNlbGVjdGlvbiIgZGlhbG9nLgotCSAqLwotCXZvaWQgY3JlYXRlTGlzdGVuZXJTZWxlY3Rpb25EaWFsb2cgKCkgewotCQlmaW5hbCBTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHRhYkZvbGRlclBhZ2UuZ2V0U2hlbGwgKCksIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCWRpYWxvZy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlNlbGVjdF9MaXN0ZW5lcnMiKSk7Ci0JCWRpYWxvZy5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgyLCBmYWxzZSkpOwotCQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoZGlhbG9nLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkNIRUNLKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLnZlcnRpY2FsU3BhbiA9IDI7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgRVZFTlRfTkFNRVMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCAoRVZFTlRfTkFNRVNbaV0pOwotCQkJaXRlbS5zZXRDaGVja2VkIChldmVudHNGaWx0ZXJbaV0pOwotCQl9Ci0JCWZpbmFsIFN0cmluZyBbXSBjdXN0b21OYW1lcyA9IGdldEN1c3RvbUV2ZW50TmFtZXMgKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzdG9tTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCAoY3VzdG9tTmFtZXNbaV0pOwotCQkJaXRlbS5zZXRDaGVja2VkIChldmVudHNGaWx0ZXJbRVZFTlRfTkFNRVMubGVuZ3RoICsgaV0pOwotCQl9Ci0JCUJ1dHRvbiBzZWxlY3RBbGwgPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJTZWxlY3RfQWxsIikpOwotCQlzZWxlY3RBbGwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCXNlbGVjdEFsbC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IEVWRU5UX05BTUVTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWl0ZW1zW2ldLnNldENoZWNrZWQodHJ1ZSk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzdG9tTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaXRlbXNbRVZFTlRfTkFNRVMubGVuZ3RoICsgaV0uc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlCdXR0b24gZGVzZWxlY3RBbGwgPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQkJZGVzZWxlY3RBbGwuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkRlc2VsZWN0X0FsbCIpKTsKLQkJZGVzZWxlY3RBbGwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCWRlc2VsZWN0QWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgRVZFTlRfTkFNRVMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaXRlbXNbaV0uc2V0Q2hlY2tlZChmYWxzZSk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzdG9tTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaXRlbXNbRVZFTlRfTkFNRVMubGVuZ3RoICsgaV0uc2V0Q2hlY2tlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJbmV3IExhYmVsKGRpYWxvZywgU1dULk5PTkUpOyAvKiBGaWxsZXIgKi8KLQkJQnV0dG9uIG9rID0gbmV3IEJ1dHRvbiAoZGlhbG9nLCBTV1QuUFVTSCk7Ci0JCW9rLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJPSyIpKTsKLQkJZGlhbG9nLnNldERlZmF1bHRCdXR0b24ob2spOwotCQlvay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJb2suYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBFVkVOVF9OQU1FUy5sZW5ndGg7IGkrKykgewotCQkJCQlldmVudHNGaWx0ZXJbaV0gPSBpdGVtc1tpXS5nZXRDaGVja2VkKCk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzdG9tTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZXZlbnRzRmlsdGVyW0VWRU5UX05BTUVTLmxlbmd0aCArIGldID0gaXRlbXNbRVZFTlRfTkFNRVMubGVuZ3RoICsgaV0uZ2V0Q2hlY2tlZCgpOwotCQkJCX0KLQkJCQlkaWFsb2cuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJZGlhbG9nLnBhY2sgKCk7Ci0JCWRpYWxvZy5vcGVuICgpOwotCQl3aGlsZSAoISBkaWFsb2cuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoISBkaWFsb2cuZ2V0RGlzcGxheSgpLnJlYWRBbmREaXNwYXRjaCgpKSBkaWFsb2cuZ2V0RGlzcGxheSgpLnNsZWVwKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiTGlzdGVuZXJzIiBncm91cC4gIFRoZSAiTGlzdGVuZXJzIiBncm91cAotCSAqIGdvZXMgYmVsb3cgdGhlICJFeGFtcGxlIiBhbmQgIkNvbnRyb2wiIGdyb3Vwcy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUxpc3RlbmVyc0dyb3VwICgpIHsKLQkJbGlzdGVuZXJzR3JvdXAgPSBuZXcgR3JvdXAgKHRhYkZvbGRlclBhZ2UsIFNXVC5OT05FKTsKLQkJbGlzdGVuZXJzR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMywgZmFsc2UpKTsKLQkJbGlzdGVuZXJzR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCB0cnVlLCAyLCAxKSk7Ci0JCWxpc3RlbmVyc0dyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiTGlzdGVuZXJzIikpOwotCi0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgYnV0dG9uIHRvIGFjY2VzcyB0aGUgJ0xpc3RlbmVycycgZGlhbG9nLgotCQkgKi8KLQkJQnV0dG9uIGxpc3RlbmVyc0J1dHRvbiA9IG5ldyBCdXR0b24gKGxpc3RlbmVyc0dyb3VwLCBTV1QuUFVTSCk7Ci0JCWxpc3RlbmVyc0J1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlNlbGVjdF9MaXN0ZW5lcnMiKSk7Ci0JCWxpc3RlbmVyc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNyZWF0ZUxpc3RlbmVyU2VsZWN0aW9uRGlhbG9nICgpOwotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLyoKLQkJICogQ3JlYXRlIHRoZSBjaGVja2JveCB0byBhZGQvcmVtb3ZlIGxpc3RlbmVycyB0by9mcm9tIHRoZSBleGFtcGxlIHdpZGdldHMuCi0JCSAqLwotCQlmaW5hbCBCdXR0b24gbGlzdGVuQ2hlY2tib3ggPSBuZXcgQnV0dG9uIChsaXN0ZW5lcnNHcm91cCwgU1dULkNIRUNLKTsKLQkJbGlzdGVuQ2hlY2tib3guc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJMaXN0ZW4iKSk7Ci0JCWxpc3RlbkNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbG9nZ2luZyA9IGxpc3RlbkNoZWNrYm94LmdldFNlbGVjdGlvbiAoKTsKLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9KTsKLQotCQkvKgotCQkgKiBDcmVhdGUgdGhlIGJ1dHRvbiB0byBjbGVhciB0aGUgdGV4dC4KLQkJICovCi0JCUJ1dHRvbiBjbGVhckJ1dHRvbiA9IG5ldyBCdXR0b24gKGxpc3RlbmVyc0dyb3VwLCBTV1QuUFVTSCk7Ci0JCWNsZWFyQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ2xlYXIiKSk7Ci0JCWNsZWFyQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCWNsZWFyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZXZlbnRDb25zb2xlLnNldFRleHQgKCIiKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvKiBJbml0aWFsaXplIHRoZSBldmVudHNGaWx0ZXIgdG8gbG9nIGFsbCBldmVudHMuICovCi0JCWludCBjdXN0b21FdmVudENvdW50ID0gZ2V0Q3VzdG9tRXZlbnROYW1lcyAoKS5sZW5ndGg7Ci0JCWV2ZW50c0ZpbHRlciA9IG5ldyBib29sZWFuIFtFVkVOVF9OQU1FUy5sZW5ndGggKyBjdXN0b21FdmVudENvdW50XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBFVkVOVF9OQU1FUy5sZW5ndGggKyBjdXN0b21FdmVudENvdW50OyBpKyspIHsKLQkJCWV2ZW50c0ZpbHRlciBbaV0gPSB0cnVlOwotCQl9Ci0KLQkJLyogQ3JlYXRlIHRoZSBldmVudCBjb25zb2xlIFRleHQuICovCi0JCWV2ZW50Q29uc29sZSA9IG5ldyBUZXh0IChsaXN0ZW5lcnNHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJZXZlbnRDb25zb2xlLnNldExheW91dERhdGEgKGRhdGEpOwotCQljcmVhdGVFdmVudENvbnNvbGVQb3B1cCAoKTsKLQkJZXZlbnRDb25zb2xlLmFkZEtleUxpc3RlbmVyIChuZXcgS2V5QWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkIChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKChlLmtleUNvZGUgPT0gJ0EnIHx8IGUua2V5Q29kZSA9PSAnYScpICYmIChlLnN0YXRlTWFzayAmIFNXVC5NT0QxKSAhPSAwKSB7Ci0JCQkJCWV2ZW50Q29uc29sZS5zZWxlY3RBbGwgKCk7Ci0JCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQl2b2lkIGNyZWF0ZVNldEdldERpYWxvZyhpbnQgeCwgaW50IHksIFN0cmluZ1tdIG1ldGhvZE5hbWVzKSB7Ci0JCWZpbmFsIFNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbChldmVudENvbnNvbGUuZ2V0U2hlbGwgKCksIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5SRVNJWkUgfCBTV1QuTU9ERUxFU1MpOwotCQlkaWFsb2cuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWRpYWxvZy5zZXRUZXh0KGdldFRhYlRleHQoKSArICIgIiArIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU2V0X0dldCIpKTsKLQkJbmFtZUNvbWJvID0gbmV3IENvbWJvKGRpYWxvZywgU1dULlJFQURfT05MWSk7Ci0JCW5hbWVDb21iby5zZXRJdGVtcyhtZXRob2ROYW1lcyk7Ci0JCW5hbWVDb21iby5zZXRUZXh0KG1ldGhvZE5hbWVzWzBdKTsKLQkJbmFtZUNvbWJvLnNldFZpc2libGVJdGVtQ291bnQobWV0aG9kTmFtZXMubGVuZ3RoKTsKLQkJbmFtZUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJbmFtZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlc2V0TGFiZWxzKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm5UeXBlTGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nLCBTV1QuTk9ORSk7Ci0JCXJldHVyblR5cGVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlKSk7Ci0JCXNldEJ1dHRvbiA9IG5ldyBCdXR0b24oZGlhbG9nLCBTV1QuUFVTSCk7Ci0JCXNldEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlKSk7Ci0JCXNldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXRWYWx1ZSgpOwotCQkJCXNldFRleHQuc2VsZWN0QWxsKCk7Ci0JCQkJc2V0VGV4dC5zZXRGb2N1cygpOwotCQkJfQotCQl9KTsKLQkJc2V0VGV4dCA9IG5ldyBUZXh0KGRpYWxvZywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlzZXRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJZ2V0QnV0dG9uID0gbmV3IEJ1dHRvbihkaWFsb2csIFNXVC5QVVNIKTsKLQkJZ2V0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCBmYWxzZSwgZmFsc2UpKTsKLQkJZ2V0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0pOwotCQlnZXRUZXh0ID0gbmV3IFRleHQoZGlhbG9nLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAyNDA7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDIwMDsKLQkJZ2V0VGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXNldExhYmVscygpOwotCQlkaWFsb2cuc2V0RGVmYXVsdEJ1dHRvbihzZXRCdXR0b24pOwotCQlkaWFsb2cucGFjaygpOwotCQlkaWFsb2cuc2V0TG9jYXRpb24oeCwgeSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCi0Jdm9pZCByZXNldExhYmVscygpIHsKLQkJU3RyaW5nIG1ldGhvZFJvb3QgPSBuYW1lQ29tYm8uZ2V0VGV4dCgpOwotCQlyZXR1cm5UeXBlTGFiZWwuc2V0VGV4dChwYXJhbWV0ZXJJbmZvKG1ldGhvZFJvb3QpKTsKLQkJc2V0QnV0dG9uLnNldFRleHQoc2V0TWV0aG9kTmFtZShtZXRob2RSb290KSk7Ci0JCWdldEJ1dHRvbi5zZXRUZXh0KCJnZXQiICsgbWV0aG9kUm9vdCk7Ci0JCXNldFRleHQuc2V0VGV4dCgiIik7Ci0JCWdldFRleHQuc2V0VGV4dCgiIik7Ci0JCWdldFZhbHVlKCk7Ci0JCXNldFRleHQuc2V0Rm9jdXMoKTsKLQl9Ci0KLQlTdHJpbmcgc2V0TWV0aG9kTmFtZShTdHJpbmcgbWV0aG9kUm9vdCkgewotCQlyZXR1cm4gInNldCIgKyBtZXRob2RSb290OwotCX0KLQotCVN0cmluZyBwYXJhbWV0ZXJJbmZvKFN0cmluZyBtZXRob2RSb290KSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IG51bGw7Ci0JCUNsYXNzIHJldHVyblR5cGUgPSBnZXRSZXR1cm5UeXBlKG1ldGhvZFJvb3QpOwotCQlib29sZWFuIGlzQXJyYXkgPSByZXR1cm5UeXBlLmlzQXJyYXkoKTsKLQkJaWYgKGlzQXJyYXkpIHsKLQkJCXR5cGVOYW1lID0gcmV0dXJuVHlwZS5nZXRDb21wb25lbnRUeXBlKCkuZ2V0TmFtZSgpOwotCQl9IGVsc2UgewotCQkJdHlwZU5hbWUgPSByZXR1cm5UeXBlLmdldE5hbWUoKTsKLQkJfQotCQlTdHJpbmcgdHlwZU5hbWVTdHJpbmcgPSB0eXBlTmFtZTsKLQkJaW50IGluZGV4ID0gdHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGluZGV4ICE9IC0xICYmIGluZGV4KzEgPCB0eXBlTmFtZS5sZW5ndGgoKSkgdHlwZU5hbWVTdHJpbmcgPSB0eXBlTmFtZS5zdWJzdHJpbmcoaW5kZXgrMSk7Ci0JCVN0cmluZyBpbmZvID0gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkluZm9fIiArIHR5cGVOYW1lU3RyaW5nICsgKGlzQXJyYXkgPyAiQSIgOiAiIikpOwotCQlpZiAoaXNBcnJheSkgewotCQkJdHlwZU5hbWVTdHJpbmcgKz0gIltdIjsKLQkJfQotCQlyZXR1cm4gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhcmFtZXRlcl9JbmZvIiwgbmV3IE9iamVjdFtdIHt0eXBlTmFtZVN0cmluZywgaW5mb30pOwotCX0KLQotCXZvaWQgZ2V0VmFsdWUoKSB7Ci0JCVN0cmluZyBtZXRob2ROYW1lID0gImdldCIgKyBuYW1lQ29tYm8uZ2V0VGV4dCgpOwotCQlnZXRUZXh0LnNldFRleHQoIiIpOwotCQlDb250cm9sW10gY29udHJvbHMgPSBnZXRFeGFtcGxlV2lkZ2V0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QgPSBjb250cm9sc1tpXS5nZXRDbGFzcygpLmdldE1ldGhvZChtZXRob2ROYW1lLCBudWxsKTsKLQkJCQlPYmplY3QgcmVzdWx0ID0gbWV0aG9kLmludm9rZShjb250cm9sc1tpXSwgbnVsbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCWdldFRleHQuYXBwZW5kKCJudWxsIik7Ci0JCQkJfSBlbHNlIGlmIChyZXN1bHQuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLQkJCQkJaW50IGxlbmd0aCA9IGphdmEubGFuZy5yZWZsZWN0LkFycmF5LmdldExlbmd0aChyZXN1bHQpOwotCQkJCQlpZiAobGVuZ3RoID09IDApIHsKLQkJCQkJCWdldFRleHQuYXBwZW5kKHJlc3VsdC5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSArICJbMF0iKTsKLQkJCQkJfQotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7Ci0JCQkJCQlnZXRUZXh0LmFwcGVuZChqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5nZXQocmVzdWx0LGopLnRvU3RyaW5nKCkgKyAiXG4iKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWdldFRleHQuYXBwZW5kKHJlc3VsdC50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWdldFRleHQuYXBwZW5kKGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlpZiAoaSArIDEgPCBjb250cm9scy5sZW5ndGgpIHsKLQkJCQlnZXRUZXh0LmFwcGVuZCgiXG5cbiIpOwotCQkJfQotCQl9Ci0JfQotCi0JQ2xhc3MgZ2V0UmV0dXJuVHlwZShTdHJpbmcgbWV0aG9kUm9vdCkgewotCQlDbGFzcyByZXR1cm5UeXBlID0gbnVsbDsKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSAiZ2V0IiArIG1ldGhvZFJvb3Q7Ci0JCUNvbnRyb2xbXSBjb250cm9scyA9IGdldEV4YW1wbGVXaWRnZXRzKCk7Ci0JCXRyeSB7Ci0JCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gY29udHJvbHNbMF0uZ2V0Q2xhc3MoKS5nZXRNZXRob2QobWV0aG9kTmFtZSwgbnVsbCk7Ci0JCQlyZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gcmV0dXJuVHlwZTsKLQl9Ci0JCi0Jdm9pZCBzZXRWYWx1ZSgpIHsKLQkJLyogVGhlIHBhcmFtZXRlciB0eXBlIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGdldCBtZXRob2QncyByZXR1cm4gdHlwZSAqLwotCQlTdHJpbmcgbWV0aG9kUm9vdCA9IG5hbWVDb21iby5nZXRUZXh0KCk7Ci0JCUNsYXNzIHJldHVyblR5cGUgPSBnZXRSZXR1cm5UeXBlKG1ldGhvZFJvb3QpOwotCQlTdHJpbmcgbWV0aG9kTmFtZSA9IHNldE1ldGhvZE5hbWUobWV0aG9kUm9vdCk7Ci0JCVN0cmluZyB2YWx1ZSA9IHNldFRleHQuZ2V0VGV4dCgpOwotCQlDb250cm9sW10gY29udHJvbHMgPSBnZXRFeGFtcGxlV2lkZ2V0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QgPSBjb250cm9sc1tpXS5nZXRDbGFzcygpLmdldE1ldGhvZChtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cmV0dXJuVHlwZX0pOwotCQkJCVN0cmluZyB0eXBlTmFtZSA9IHJldHVyblR5cGUuZ2V0TmFtZSgpOwotCQkJCU9iamVjdFtdIHBhcmFtZXRlciA9IG51bGw7Ci0JCQkJaWYgKHR5cGVOYW1lLmVxdWFscygiaW50IikpIHsKLQkJCQkJcGFyYW1ldGVyID0gbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcih2YWx1ZSl9OwotCQkJCX0gZWxzZSBpZiAodHlwZU5hbWUuZXF1YWxzKCJsb25nIikpIHsKLQkJCQkJcGFyYW1ldGVyID0gbmV3IE9iamVjdFtdIHtuZXcgTG9uZyh2YWx1ZSl9OwotCQkJCX0gZWxzZSBpZiAodHlwZU5hbWUuZXF1YWxzKCJjaGFyIikpIHsKLQkJCQkJcGFyYW1ldGVyID0gbmV3IE9iamVjdFtdIHt2YWx1ZS5sZW5ndGgoKSA9PSAxID8gbmV3IENoYXJhY3Rlcih2YWx1ZS5jaGFyQXQoMCkpIDogbmV3IENoYXJhY3RlcignXDAnKX07Ci0JCQkJfSBlbHNlIGlmICh0eXBlTmFtZS5lcXVhbHMoImJvb2xlYW4iKSkgewotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge25ldyBCb29sZWFuKHZhbHVlKX07Ci0JCQkJfSBlbHNlIGlmICh0eXBlTmFtZS5lcXVhbHMoImphdmEubGFuZy5TdHJpbmciKSkgewotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge3ZhbHVlfTsKLQkJCQl9IGVsc2UgaWYgKHR5cGVOYW1lLmVxdWFscygib3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50IikpIHsKLQkJCQkJU3RyaW5nIHh5W10gPSB2YWx1ZS5zcGxpdCgiLCIpOwotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge25ldyBQb2ludChuZXcgSW50ZWdlcih4eVswXSkuaW50VmFsdWUoKSxuZXcgSW50ZWdlcih4eVsxXSkuaW50VmFsdWUoKSl9OwotCQkJCX0gZWxzZSBpZiAodHlwZU5hbWUuZXF1YWxzKCJbSSIpKSB7Ci0JCQkJCVN0cmluZyBzdHJpbmdzW10gPSB2YWx1ZS5zcGxpdCgiLCIpOwotCQkJCQlpbnRbXSBpbnRzID0gbmV3IGludFtzdHJpbmdzLmxlbmd0aF07Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc3RyaW5ncy5sZW5ndGg7IGorKykgewotCQkJCQkJaW50c1tqXSA9IG5ldyBJbnRlZ2VyKHN0cmluZ3Nbal0pLmludFZhbHVlKCk7Ci0JCQkJCX0KLQkJCQkJcGFyYW1ldGVyID0gbmV3IE9iamVjdFtdIHtpbnRzfTsKLQkJCQl9IGVsc2UgaWYgKHR5cGVOYW1lLmVxdWFscygiW0xqYXZhLmxhbmcuU3RyaW5nOyIpKSB7Ci0JCQkJCXBhcmFtZXRlciA9IG5ldyBPYmplY3RbXSB7dmFsdWUuc3BsaXQoIiwiKX07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGFyYW1ldGVyID0gcGFyYW1ldGVyRm9yVHlwZSh0eXBlTmFtZSwgdmFsdWUsIGNvbnRyb2xzW2ldKTsKLQkJCQl9Ci0JCQkJbWV0aG9kLmludm9rZShjb250cm9sc1tpXSwgcGFyYW1ldGVyKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZ2V0VGV4dC5zZXRUZXh0KGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlPYmplY3RbXSBwYXJhbWV0ZXJGb3JUeXBlKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHZhbHVlLCBDb250cm9sIGNvbnRyb2wpIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7dmFsdWV9OwotCX0KLQotCXZvaWQgY3JlYXRlT3JpZW50YXRpb25Hcm91cCAoKSB7Ci0JCS8qIENyZWF0ZSBPcmllbnRhdGlvbiBncm91cCovCi0JCW9yaWVudGF0aW9uR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlvcmllbnRhdGlvbkdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCW9yaWVudGF0aW9uR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCW9yaWVudGF0aW9uR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk9yaWVudGF0aW9uIikpOwotCQlkZWZhdWx0T3JpZXRhdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24gKG9yaWVudGF0aW9uR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWRlZmF1bHRPcmlldGF0aW9uQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEZWZhdWx0IikpOwotCQlkZWZhdWx0T3JpZXRhdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQlsdHJCdXR0b24gPSBuZXcgQnV0dG9uIChvcmllbnRhdGlvbkdyb3VwLCBTV1QuUkFESU8pOwotCQlsdHJCdXR0b24uc2V0VGV4dCAoIlNXVC5MRUZUX1RPX1JJR0hUIik7Ci0JCXJ0bEJ1dHRvbiA9IG5ldyBCdXR0b24gKG9yaWVudGF0aW9uR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXJ0bEJ1dHRvbi5zZXRUZXh0ICgiU1dULlJJR0hUX1RPX0xFRlQiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlNpemUiIGdyb3VwLiAgVGhlICJTaXplIiBncm91cCBjb250YWlucwotCSAqIGNvbnRyb2xzIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSBzaXplIG9mCi0JICogdGhlIGV4YW1wbGUgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZVNpemVHcm91cCAoKSB7Ci0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJc2l6ZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJc2l6ZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXNpemVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJc2l6ZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTaXplIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGNvbnRyb2xzICovCi0JCi0JCS8qCi0JCSAqIFRoZSBwcmVmZXJyZWQgc2l6ZSBvZiBhIHdpZGdldCBpcyB0aGUgc2l6ZSByZXR1cm5lZAotCQkgKiBieSB3aWRnZXQuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkuCi0JCSAqIFRoaXMgc2l6ZSBpcyBkZWZpbmVkIG9uIGEgd2lkZ2V0IGJ5IHdpZGdldCBiYXNpcy4KLQkJICogTWFueSB3aWRnZXRzIHdpbGwgYXR0ZW1wdCB0byBkaXNwbGF5IHRoZWlyIGNvbnRlbnRzLgotCQkgKi8KLQkJcHJlZmVycmVkQnV0dG9uID0gbmV3IEJ1dHRvbiAoc2l6ZUdyb3VwLCBTV1QuUkFESU8pOwotCQlwcmVmZXJyZWRCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlByZWZlcnJlZCIpKTsKLQkJdG9vU21hbGxCdXR0b24gPSBuZXcgQnV0dG9uIChzaXplR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXRvb1NtYWxsQnV0dG9uLnNldFRleHQgKFRPT19TTUFMTF9TSVpFICsgIiBYICIgKyBUT09fU01BTExfU0laRSk7Ci0JCXNtYWxsQnV0dG9uID0gbmV3IEJ1dHRvbihzaXplR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNtYWxsQnV0dG9uLnNldFRleHQgKFNNQUxMX1NJWkUgKyAiIFggIiArIFNNQUxMX1NJWkUpOwotCQlsYXJnZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHNpemVHcm91cCwgU1dULlJBRElPKTsKLQkJbGFyZ2VCdXR0b24uc2V0VGV4dCAoTEFSR0VfU0laRSArICIgWCAiICsgTEFSR0VfU0laRSk7Ci0JCWZpbGxIQnV0dG9uID0gbmV3IEJ1dHRvbiAoc2l6ZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmaWxsSEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsbF9YIikpOwotCQlmaWxsVkJ1dHRvbiA9IG5ldyBCdXR0b24gKHNpemVHcm91cCwgU1dULkNIRUNLKTsKLQkJZmlsbFZCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGxfWSIpKTsKLQkJCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCVNlbGVjdGlvbkFkYXB0ZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCX0KLQkJfTsKLQkJcHJlZmVycmVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdG9vU21hbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzbWFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWxhcmdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJZmlsbEhCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlmaWxsVkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCi0JCS8qIFNldCB0aGUgZGVmYXVsdCBzdGF0ZSAqLwotCQlwcmVmZXJyZWRCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4gIFRoZSAiU3R5bGUiIGdyb3VwIGNvbnRhaW5zCi0JICogY29udHJvbHMgdGhhdCBhbGxvdyB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIHN0eWxlIG9mCi0JICogdGhlIGV4YW1wbGUgd2lkZ2V0cy4gIENoYW5naW5nIGEgd2lkZ2V0ICJTdHlsZSIgY2F1c2VzCi0JICogdGhlIHdpZGdldCB0byBiZSBkZXN0cm95ZWQgYW5kIHJlY3JlYXRlZC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJc3R5bGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJc3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJc3R5bGVHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3R5bGVzIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlIGZvciB0aGUgdGFiIGZvbGRlcgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlIChUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCS8qCi0JCSogQ3JlYXRlIGEgdHdvIGNvbHVtbiBwYWdlLgotCQkqLwotCQl0YWJGb2xkZXJQYWdlID0gbmV3IENvbXBvc2l0ZSAodGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCXRhYkZvbGRlclBhZ2Uuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMiwgZmFsc2UpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSAiRXhhbXBsZSIgYW5kICJDb250cm9sIiBncm91cHMuICovCi0JCWNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJY3JlYXRlQ29udHJvbEdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSAiTGlzdGVuZXJzIiBncm91cCB1bmRlciB0aGUgIkNvbnRyb2wiIGdyb3VwLiAqLwotCQljcmVhdGVMaXN0ZW5lcnNHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZXhhbXBsZSBhbmQgY29udHJvbCB3aWRnZXRzLiAqLwotCQljcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJaG9va0V4YW1wbGVXaWRnZXRMaXN0ZW5lcnMgKCk7Ci0JCWNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCQotCQlyZXR1cm4gdGFiRm9sZGVyUGFnZTsKLQl9Ci0JCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgZGlzcG9zZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQlmb3IgKGludCBpPTA7IGk8Y29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbnRyb2xzIFtpXS5kaXNwb3NlICgpOwotCQl9Ci0JfQotCQotCXZvaWQgZHJhd0ltYWdlIChJbWFnZSBpbWFnZSwgQ29sb3IgY29sb3IpIHsKLQkJR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JCWdjLmRyYXdSZWN0YW5nbGUoMCwgMCwgYm91bmRzLndpZHRoIC0gMSwgYm91bmRzLmhlaWdodCAtIDEpOwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgY3VzdG9tIGV2ZW50IG5hbWVzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBjdXN0b20gZXZlbnQgbmFtZXMKLQkgKi8KLQlTdHJpbmcgW10gZ2V0Q3VzdG9tRXZlbnROYW1lcyAoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFswXTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBzdHlsZSBmb3IgYSB3aWRnZXQKLQkgKgotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgc3R5bGUgYml0Ci0JICovCi0JaW50IGdldERlZmF1bHRTdHlsZSAoKSB7Ci0JCWlmIChsdHJCdXR0b24gIT0gbnVsbCAmJiBsdHJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJldHVybiBTV1QuTEVGVF9UT19SSUdIVDsKLQkJfQotCQlpZiAocnRsQnV0dG9uICE9IG51bGwgJiYgcnRsQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlyZXR1cm4gU1dULlJJR0hUX1RPX0xFRlQ7Ci0JCX0KLQkJcmV0dXJuIFNXVC5OT05FOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBleGFtcGxlIHdpZGdldCBjaGlsZHJlbgotCSAqLwotCUNvbnRyb2wgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2wgWzBdOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMsIGlmIGFueS4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZXhhbXBsZSB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcwotCSAqLwotCUl0ZW0gW10gZ2V0RXhhbXBsZVdpZGdldEl0ZW1zICgpIHsKLQkJcmV0dXJuIG5ldyBJdGVtIFswXTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHRleHQgZm9yIHRoZSB0YWIgaXRlbQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQkKLQkvKioKLQkgKiBIb29rcyBhbGwgbGlzdGVuZXJzIHRvIGFsbCBleGFtcGxlIGNvbnRyb2xzCi0JICogYW5kIGV4YW1wbGUgY29udHJvbCBpdGVtcy4KLQkgKi8KLQl2b2lkIGhvb2tFeGFtcGxlV2lkZ2V0TGlzdGVuZXJzICgpIHsKLQkJaWYgKGxvZ2dpbmcpIHsKLQkJCUNvbnRyb2xbXSBleGFtcGxlQ29udHJvbHMgPSBnZXRFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhhbXBsZUNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaG9va0xpc3RlbmVycyAoZXhhbXBsZUNvbnRyb2xzIFtpXSk7Ci0JCQl9Ci0JCQlJdGVtW10gZXhhbXBsZUl0ZW1zID0gZ2V0RXhhbXBsZVdpZGdldEl0ZW1zICgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGFtcGxlSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlob29rTGlzdGVuZXJzIChleGFtcGxlSXRlbXMgW2ldKTsKLQkJCX0KLQkJCVN0cmluZyBbXSBjdXN0b21OYW1lcyA9IGdldEN1c3RvbUV2ZW50TmFtZXMgKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGV2ZW50c0ZpbHRlciBbRVZFTlRfTkFNRVMubGVuZ3RoICsgaV0pIGhvb2tDdXN0b21MaXN0ZW5lciAoY3VzdG9tTmFtZXNbaV0pOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEhvb2tzIHRoZSBjdXN0b20gbGlzdGVuZXIgc3BlY2lmaWVkIGJ5IGV2ZW50TmFtZS4KLQkgKi8KLQl2b2lkIGhvb2tDdXN0b21MaXN0ZW5lciAoU3RyaW5nIGV2ZW50TmFtZSkgewotCX0KLQkKLQkvKioKLQkgKiBIb29rcyBhbGwgbGlzdGVuZXJzIHRvIHRoZSBzcGVjaWZpZWQgd2lkZ2V0LgotCSAqLwotCXZvaWQgaG9va0xpc3RlbmVycyAoV2lkZ2V0IHdpZGdldCkgewotCQlpZiAobG9nZ2luZykgewotCQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWxvZyAoZXZlbnQpOwotCQkJCX0KLQkJCX07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IEVWRU5UX05BTUVTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGV2ZW50c0ZpbHRlciBbaV0pIHdpZGdldC5hZGRMaXN0ZW5lciAoaSwgbGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIExvZ3MgYW4gdW50eXBlZCBldmVudCB0byB0aGUgZXZlbnQgY29uc29sZS4KLQkgKi8KLQl2b2lkIGxvZyhFdmVudCBldmVudCkgewotCQlTdHJpbmcgdG9TdHJpbmcgPSBFVkVOVF9OQU1FU1tldmVudC50eXBlXSArICIgWyIrZXZlbnQudHlwZSsiXTogIjsKLQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQljYXNlIFNXVC5LZXlEb3duOgotCQkJY2FzZSBTV1QuS2V5VXA6IHRvU3RyaW5nICs9IG5ldyBLZXlFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULk1vdXNlRG93bjoKLQkJCWNhc2UgU1dULk1vdXNlVXA6Ci0JCQljYXNlIFNXVC5Nb3VzZU1vdmU6Ci0JCQljYXNlIFNXVC5Nb3VzZUVudGVyOgotCQkJY2FzZSBTV1QuTW91c2VFeGl0OgotCQkJY2FzZSBTV1QuTW91c2VEb3VibGVDbGljazoKLQkJCWNhc2UgU1dULk1vdXNlV2hlZWw6IAotCQkJY2FzZSBTV1QuTW91c2VIb3ZlcjogdG9TdHJpbmcgKz0gbmV3IE1vdXNlRXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5QYWludDogdG9TdHJpbmcgKz0gbmV3IFBhaW50RXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5Nb3ZlOgotCQkJY2FzZSBTV1QuUmVzaXplOiB0b1N0cmluZyArPSBuZXcgQ29udHJvbEV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuRGlzcG9zZTogdG9TdHJpbmcgKz0gbmV3IERpc3Bvc2VFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULlNlbGVjdGlvbjoKLQkJCWNhc2UgU1dULkRlZmF1bHRTZWxlY3Rpb246IHRvU3RyaW5nICs9IG5ldyBTZWxlY3Rpb25FdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULkZvY3VzSW46Ci0JCQljYXNlIFNXVC5Gb2N1c091dDogdG9TdHJpbmcgKz0gbmV3IEZvY3VzRXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5FeHBhbmQ6Ci0JCQljYXNlIFNXVC5Db2xsYXBzZTogdG9TdHJpbmcgKz0gbmV3IFRyZWVFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULkljb25pZnk6Ci0JCQljYXNlIFNXVC5EZWljb25pZnk6Ci0JCQljYXNlIFNXVC5DbG9zZToKLQkJCWNhc2UgU1dULkFjdGl2YXRlOgotCQkJY2FzZSBTV1QuRGVhY3RpdmF0ZTogdG9TdHJpbmcgKz0gbmV3IFNoZWxsRXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5TaG93OgotCQkJY2FzZSBTV1QuSGlkZTogdG9TdHJpbmcgKz0gKGV2ZW50LndpZGdldCBpbnN0YW5jZW9mIE1lbnUpID8gbmV3IE1lbnVFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpIDogZXZlbnQudG9TdHJpbmcoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5Nb2RpZnk6IHRvU3RyaW5nICs9IG5ldyBNb2RpZnlFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULlZlcmlmeTogdG9TdHJpbmcgKz0gbmV3IFZlcmlmeUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuSGVscDogdG9TdHJpbmcgKz0gbmV3IEhlbHBFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULkFybTogdG9TdHJpbmcgKz0gbmV3IEFybUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuVHJhdmVyc2U6IHRvU3RyaW5nICs9IG5ldyBUcmF2ZXJzZUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuSGFyZEtleURvd246Ci0JCQljYXNlIFNXVC5IYXJkS2V5VXA6Ci0JCQljYXNlIFNXVC5EcmFnRGV0ZWN0OgotCQkJY2FzZSBTV1QuTWVudURldGVjdDoKLQkJCWNhc2UgU1dULlNldERhdGE6Ci0JCQlkZWZhdWx0OiB0b1N0cmluZyArPSBldmVudC50b1N0cmluZyAoKTsKLQkJfQotCQlldmVudENvbnNvbGUuYXBwZW5kICh0b1N0cmluZyk7Ci0JCWV2ZW50Q29uc29sZS5hcHBlbmQgKCJcbiIpOwotCX0KLQkKLQkvKioKLQkgKiBMb2dzIGEgc3RyaW5nIHRvIHRoZSBldmVudCBjb25zb2xlLgotCSAqLwotCXZvaWQgbG9nIChTdHJpbmcgc3RyaW5nKSB7Ci0JCWV2ZW50Q29uc29sZS5hcHBlbmQgKHN0cmluZyk7Ci0JCWV2ZW50Q29uc29sZS5hcHBlbmQgKCJcbiIpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgYSB0eXBlZCBldmVudCB0byB0aGUgZXZlbnQgY29uc29sZS4KLQkgKi8KLQl2b2lkIGxvZyAoU3RyaW5nIGV2ZW50TmFtZSwgVHlwZWRFdmVudCBldmVudCkgewotCQlldmVudENvbnNvbGUuYXBwZW5kIChldmVudE5hbWUgKyAiOiAiKTsKLQkJZXZlbnRDb25zb2xlLmFwcGVuZCAoZXZlbnQudG9TdHJpbmcgKCkpOwotCQlldmVudENvbnNvbGUuYXBwZW5kICgiXG4iKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVjcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQlkaXNwb3NlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQlob29rRXhhbXBsZVdpZGdldExpc3RlbmVycyAoKTsKLQkJc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBmb3JlZ3JvdW5kIGNvbG9yLCBiYWNrZ3JvdW5kIGNvbG9yLCBhbmQgZm9udAotCSAqIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cyB0byB0aGVpciBkZWZhdWx0IHNldHRpbmdzLgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCBpbiBvcmRlciB0byByZXNldCBvdGhlciBjb2xvcnMKLQkgKiBhbmQgZm9udHMgdG8gZGVmYXVsdCBzZXR0aW5ncyBhcyB3ZWxsLgotCSAqLwotCXZvaWQgcmVzZXRDb2xvcnNBbmRGb250cyAoKSB7Ci0JCUNvbG9yIG9sZENvbG9yID0gZm9yZWdyb3VuZENvbG9yOwotCQlmb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwotCQlzZXRFeGFtcGxlV2lkZ2V0Rm9yZWdyb3VuZCAoKTsKLQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UoKTsKLQkJb2xkQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7Ci0JCWJhY2tncm91bmRDb2xvciA9IG51bGw7Ci0JCXNldEV4YW1wbGVXaWRnZXRCYWNrZ3JvdW5kICgpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlGb250IG9sZEZvbnQgPSBmb250OwotCQlmb250ID0gbnVsbDsKLQkJc2V0RXhhbXBsZVdpZGdldEZvbnQgKCk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0QmFja2dyb3VuZCAoKSB7Ci0JCWlmIChiYWNrZ3JvdW5kQnV0dG9uID09IG51bGwpIHJldHVybjsgLy8gbm8gYmFja2dyb3VuZCBidXR0b24gb24gdGhpcyB0YWIKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb250cm9sc1tpXS5zZXRCYWNrZ3JvdW5kIChiYWNrZ3JvdW5kQ29sb3IpOwotCQl9Ci0JCS8vIFNldCB0aGUgYmFja2dyb3VuZCBidXR0b24ncyBjb2xvciB0byBtYXRjaCB0aGUgY29sb3IganVzdCBzZXQuCi0JCUNvbG9yIGNvbG9yID0gYmFja2dyb3VuZENvbG9yOwotCQlpZiAoY29udHJvbHMubGVuZ3RoID09IDApIHJldHVybjsKLQkJaWYgKGNvbG9yID09IG51bGwpIGNvbG9yID0gY29udHJvbHMgWzBdLmdldEJhY2tncm91bmQgKCk7Ci0JCWRyYXdJbWFnZSAoYmFja2dyb3VuZEltYWdlLCBjb2xvcik7Ci0JCWJhY2tncm91bmRCdXR0b24uc2V0SW1hZ2UgKGJhY2tncm91bmRJbWFnZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldEVuYWJsZWQgKCkgewotCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxjb250cm9scy5sZW5ndGg7IGkrKykgewotCQkJY29udHJvbHMgW2ldLnNldEVuYWJsZWQgKGVuYWJsZWRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBmb250IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRGb250ICgpIHsKLQkJaWYgKGluc3RhbmNlLnN0YXJ0dXApIHJldHVybjsKLQkJaWYgKGZvbnRCdXR0b24gPT0gbnVsbCkgcmV0dXJuOyAvLyBubyBmb250IGJ1dHRvbiBvbiB0aGlzIHRhYgotCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCUNvbnRyb2wgY29udHJvbCA9IGNvbnRyb2xzW2ldOwotCQkJY29udHJvbC5zZXRGb250KGZvbnQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldEZvcmVncm91bmQgKCkgewotCQlpZiAoZm9yZWdyb3VuZEJ1dHRvbiA9PSBudWxsKSByZXR1cm47IC8vIG5vIGZvcmVncm91bmQgYnV0dG9uIG9uIHRoaXMgdGFiCi0JCUNvbnRyb2wgW10gY29udHJvbHMgPSBnZXRFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKykgewotCQkJY29udHJvbHNbaV0uc2V0Rm9yZWdyb3VuZCAoZm9yZWdyb3VuZENvbG9yKTsKLQkJfQotCQkvLyBTZXQgdGhlIGZvcmVncm91bmQgYnV0dG9uJ3MgY29sb3IgdG8gbWF0Y2ggdGhlIGNvbG9yIGp1c3Qgc2V0LgotCQlDb2xvciBjb2xvciA9IGZvcmVncm91bmRDb2xvcjsKLQkJaWYgKGNvbnRyb2xzLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IGNvbnRyb2xzIFswXS5nZXRGb3JlZ3JvdW5kICgpOwotCQlkcmF3SW1hZ2UgKGZvcmVncm91bmRJbWFnZSwgY29sb3IpOwotCQlmb3JlZ3JvdW5kQnV0dG9uLnNldEltYWdlIChmb3JlZ3JvdW5kSW1hZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTaXplICgpIHsKLQkJaW50IHNpemUgPSBTV1QuREVGQVVMVDsKLQkJaWYgKHByZWZlcnJlZEJ1dHRvbiA9PSBudWxsKSByZXR1cm47Ci0JCWlmIChwcmVmZXJyZWRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHNpemUgPSBTV1QuREVGQVVMVDsKLQkJaWYgKHRvb1NtYWxsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzaXplID0gVE9PX1NNQUxMX1NJWkU7Ci0JCWlmIChzbWFsbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc2l6ZSA9IFNNQUxMX1NJWkU7Ci0JCWlmIChsYXJnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc2l6ZSA9IExBUkdFX1NJWkU7Ci0JCUNvbnRyb2wgW10gY29udHJvbHMgPSBnZXRFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShzaXplLCBzaXplKTsgCi0JCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmlsbEhCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZpbGxWQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IGZpbGxIQnV0dG9uLmdldFNlbGVjdGlvbigpID8gU1dULkZJTEwgOiBTV1QuTEVGVDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gZmlsbFZCdXR0b24uZ2V0U2VsZWN0aW9uKCkgPyBTV1QuRklMTCA6IFNXVC5UT1A7Ci0JCQljb250cm9scyBbaV0uc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQl9Ci0JCXRhYkZvbGRlclBhZ2UubGF5b3V0IChjb250cm9scyk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4gIFN1YmNsYXNzZXMKLQkgKiByZWltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgIkV4YW1wbGUiIHdpZGdldCBzdGF0ZQotCSAqIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIHdpZGdldC4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXNldEV4YW1wbGVXaWRnZXRFbmFibGVkICgpOwotCQlzZXRFeGFtcGxlV2lkZ2V0VmlzaWJpbGl0eSAoKTsKLQkJc2V0RXhhbXBsZVdpZGdldEJhY2tncm91bmQgKCk7Ci0JCXNldEV4YW1wbGVXaWRnZXRGb3JlZ3JvdW5kICgpOwotCQlzZXRFeGFtcGxlV2lkZ2V0Rm9udCAoKTsKLQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCS8vVEVNUE9SQVJZIENPREUKLS8vCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0vLwkJZm9yIChpbnQgaT0wOyBpPGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCWxvZyAoIkNvbnRyb2w9IiArIGNvbnRyb2xzIFtpXSArICIsIGJvcmRlciB3aWR0aD0iICsgY29udHJvbHMgW2ldLmdldEJvcmRlcldpZHRoICgpKTsKLS8vCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFZpc2liaWxpdHkgKCkgewotCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxjb250cm9scy5sZW5ndGg7IGkrKykgewotCQkJY29udHJvbHMgW2ldLnNldFZpc2libGUgKHZpc2libGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RhYkZvbGRlclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFiRm9sZGVyVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwY2I3OTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFiRm9sZGVyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBUYWJGb2xkZXJUYWIgZXh0ZW5kcyBUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JVGFiRm9sZGVyIHRhYkZvbGRlcjE7Ci0JR3JvdXAgdGFiRm9sZGVyR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiB0b3BCdXR0b24sIGJvdHRvbUJ1dHRvbjsKLQotCXN0YXRpYyBTdHJpbmcgW10gVGFiSXRlbXMxID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJJdGVtMV8wIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYkl0ZW0xXzEiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFiSXRlbTFfMiIpfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlUYWJGb2xkZXJUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIFRhYkZvbGRlciAqLwotCQl0YWJGb2xkZXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRhYkZvbGRlckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQl0YWJGb2xkZXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0YWJGb2xkZXJHcm91cC5zZXRUZXh0ICgiVGFiRm9sZGVyIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAodG9wQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlRPUDsKLQkJaWYgKGJvdHRvbUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1RUT007Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXRhYkZvbGRlcjEgPSBuZXcgVGFiRm9sZGVyICh0YWJGb2xkZXJHcm91cCwgc3R5bGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IFRhYkl0ZW1zMS5sZW5ndGg7IGkrKykgewotCQkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyMSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KFRhYkl0ZW1zMVtpXSk7Ci0JCQlpdGVtLnNldFRvb2xUaXBUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUb29sdGlwIiwgbmV3IFN0cmluZyBbXSB7VGFiSXRlbXMxW2ldfSkpOwotCQkJVGV4dCBjb250ZW50ID0gbmV3IFRleHQodGFiRm9sZGVyMSwgU1dULldSQVAgfCBTV1QuTVVMVEkpOwotCQkJY29udGVudC5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJJdGVtX2NvbnRlbnQiKSArICI6ICIgKyBpKTsKLQkJCWl0ZW0uc2V0Q29udHJvbChjb250ZW50KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQl0b3BCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQl0b3BCdXR0b24uc2V0VGV4dCAoIlNXVC5UT1AiKTsKLQkJdG9wQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYm90dG9tQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJYm90dG9tQnV0dG9uLnNldFRleHQgKCJTV1QuQk9UVE9NIik7Ci0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRUZXh0ICgiU1dULkJPUkRFUiIpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCEoKEJ1dHRvbikgZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24gKCkpIHJldHVybjsKLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9OwotCQl0b3BCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJYm90dG9tQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcywgaWYgYW55LgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBleGFtcGxlIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zCi0JICovCi0JSXRlbSBbXSBnZXRFeGFtcGxlV2lkZ2V0SXRlbXMgKCkgewotCQlyZXR1cm4gdGFiRm9sZGVyMS5nZXRJdGVtcygpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCUNvbnRyb2wgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2wgW10ge3RhYkZvbGRlcjF9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlNlbGVjdGlvbiIsICJTZWxlY3Rpb25JbmRleCJ9OwotCX0KLQotCVN0cmluZyBzZXRNZXRob2ROYW1lKFN0cmluZyBtZXRob2RSb290KSB7Ci0JCS8qIE92ZXJyaWRlIHRvIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgaW50IGdldFNlbGVjdGlvbkluZGV4KCkvc2V0U2VsZWN0aW9uKGludCkgKi8KLQkJcmV0dXJuIChtZXRob2RSb290LmVxdWFscygiU2VsZWN0aW9uSW5kZXgiKSkgPyAic2V0U2VsZWN0aW9uIiA6ICJzZXQiICsgbWV0aG9kUm9vdDsKLQl9Ci0KLQlPYmplY3RbXSBwYXJhbWV0ZXJGb3JUeXBlKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHZhbHVlLCBDb250cm9sIGNvbnRyb2wpIHsKLQkJaWYgKHZhbHVlLmVxdWFscygiIikpIHJldHVybiBuZXcgT2JqZWN0W10ge25ldyBUYWJJdGVtWzBdfTsKLQkJaWYgKHR5cGVOYW1lLmVxdWFscygib3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbSIpKSB7Ci0JCQlUYWJJdGVtIGl0ZW0gPSBmaW5kSXRlbSh2YWx1ZSwgKChUYWJGb2xkZXIpIGNvbnRyb2wpLmdldEl0ZW1zKCkpOwotCQkJaWYgKGl0ZW0gIT0gbnVsbCkgcmV0dXJuIG5ldyBPYmplY3RbXSB7aXRlbX07Ci0JCX0KLQkJaWYgKHR5cGVOYW1lLmVxdWFscygiW0xvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtOyIpKSB7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB2YWx1ZS5zcGxpdCgiLCIpOwotCQkJVGFiSXRlbVtdIGl0ZW1zID0gbmV3IFRhYkl0ZW1bdmFsdWVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCWl0ZW1zW2ldID0gZmluZEl0ZW0odmFsdWVzW2ldLCAoKFRhYkZvbGRlcikgY29udHJvbCkuZ2V0SXRlbXMoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHtpdGVtc307Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnBhcmFtZXRlckZvclR5cGUodHlwZU5hbWUsIHZhbHVlLCBjb250cm9sKTsKLQl9Ci0KLQlUYWJJdGVtIGZpbmRJdGVtKFN0cmluZyB2YWx1ZSwgVGFiSXRlbVtdIGl0ZW1zKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYkl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJaWYgKGl0ZW0uZ2V0VGV4dCgpLmVxdWFscyh2YWx1ZSkpIHJldHVybiBpdGVtOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlRhYkZvbGRlciI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQl0b3BCdXR0b24uc2V0U2VsZWN0aW9uICgodGFiRm9sZGVyMS5nZXRTdHlsZSAoKSAmIFNXVC5UT1ApICE9IDApOwotCQlib3R0b21CdXR0b24uc2V0U2VsZWN0aW9uICgodGFiRm9sZGVyMS5nZXRTdHlsZSAoKSAmIFNXVC5CT1RUT00pICE9IDApOwotCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgodGFiRm9sZGVyMS5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RhYmxlVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UYWJsZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMGQzNTE5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RhYmxlVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBUYWJsZVRhYiBleHRlbmRzIFNjcm9sbGFibGVUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JVGFibGUgdGFibGUxOwotCUdyb3VwIHRhYmxlR3JvdXAsIGl0ZW1Hcm91cDsKLQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gY2hlY2tCdXR0b24sIGZ1bGxTZWxlY3Rpb25CdXR0b24sIGhpZGVTZWxlY3Rpb25CdXR0b247Ci0KLQkvKiBPdGhlciB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiT3RoZXIiIGdyb3VwICovCi0JQnV0dG9uIG11bHRpcGxlQ29sdW1ucywgbW92ZWFibGVDb2x1bW5zLCBoZWFkZXJWaXNpYmxlQnV0dG9uLCBsaW5lc1Zpc2libGVCdXR0b247Ci0JCi0JLyogQ29udHJvbHMgYW5kIHJlc291cmNlcyBhZGRlZCB0byB0aGUgIkNvbG9ycyIgZ3JvdXAgKi8KLQlCdXR0b24gaXRlbUZvcmVncm91bmRCdXR0b24sIGl0ZW1CYWNrZ3JvdW5kQnV0dG9uLCBpdGVtRm9udEJ1dHRvbjsKLQlDb2xvciBpdGVtRm9yZWdyb3VuZENvbG9yLCBpdGVtQmFja2dyb3VuZENvbG9yOwotCUltYWdlIGl0ZW1Gb3JlZ3JvdW5kSW1hZ2UsIGl0ZW1CYWNrZ3JvdW5kSW1hZ2U7Ci0JRm9udCBpdGVtRm9udDsKLQkKLQlzdGF0aWMgU3RyaW5nIFtdIGNvbHVtblRpdGxlcwk9IHtDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVUaXRsZV8wIiksCi0JCQkJCQkJCQkgICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVUaXRsZV8xIiksCi0JCQkJCQkJCQkgICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVUaXRsZV8yIiksCi0JCQkJCQkJCQkgICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVUaXRsZV8zIil9OwotCQkJCQkJCQkJICAgCi0Jc3RhdGljIFN0cmluZ1tdW10gdGFibGVEYXRhID0gewotCQl7IENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUwXzAiKSwKLQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMF8xIiksCi0JCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTBfMiIpLAotCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUwXzMiKSB9LAotCQl7IENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUxXzAiKSwKLQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMV8xIiksCi0JCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTFfMiIpLAotCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUxXzMiKSB9LAotCQl7IENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUyXzAiKSwKLQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMl8xIiksCi0JCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTJfMiIpLAotCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUyXzMiKSB9IH07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JVGFibGVUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29sb3JzIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbG9yR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVDb2xvckdyb3VwKCk7Ci0JCQotCQlpdGVtR3JvdXAgPSBuZXcgR3JvdXAgKGNvbG9yR3JvdXAsIFNXVC5OT05FKTsKLQkJaXRlbUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiVGFibGVfSXRlbV9Db2xvcnMiKSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEgKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlpdGVtR3JvdXAuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCWl0ZW1Hcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgyLCBmYWxzZSkpOwotCQluZXcgTGFiZWwgKGl0ZW1Hcm91cCwgU1dULk5PTkUpLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiRm9yZWdyb3VuZF9Db2xvciIpKTsKLQkJaXRlbUZvcmVncm91bmRCdXR0b24gPSBuZXcgQnV0dG9uIChpdGVtR3JvdXAsIFNXVC5QVVNIKTsKLQkJbmV3IExhYmVsIChpdGVtR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkJhY2tncm91bmRfQ29sb3IiKSk7Ci0JCWl0ZW1CYWNrZ3JvdW5kQnV0dG9uID0gbmV3IEJ1dHRvbiAoaXRlbUdyb3VwLCBTV1QuUFVTSCk7Ci0JCWl0ZW1Gb250QnV0dG9uID0gbmV3IEJ1dHRvbiAoaXRlbUdyb3VwLCBTV1QuUFVTSCk7Ci0JCWl0ZW1Gb250QnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZvbnQiKSk7Ci0JCWl0ZW1Gb250QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJCi0JCVNoZWxsIHNoZWxsID0gY29sb3JHcm91cC5nZXRTaGVsbCAoKTsKLQkJZmluYWwgQ29sb3JEaWFsb2cgZm9yZWdyb3VuZERpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyAoc2hlbGwpOwotCQlmaW5hbCBDb2xvckRpYWxvZyBiYWNrZ3JvdW5kRGlhbG9nID0gbmV3IENvbG9yRGlhbG9nIChzaGVsbCk7Ci0JCWZpbmFsIEZvbnREaWFsb2cgZm9udERpYWxvZyA9IG5ldyBGb250RGlhbG9nIChzaGVsbCk7Ci0KLQkJaW50IGltYWdlU2l6ZSA9IDEyOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5ICgpOwotCQlpdGVtRm9yZWdyb3VuZEltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlU2l6ZSwgaW1hZ2VTaXplKTsKLQkJaXRlbUJhY2tncm91bmRJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZVNpemUsIGltYWdlU2l6ZSk7Ci0KLQkJLyogQWRkIGxpc3RlbmVycyB0byBzZXQgdGhlIGNvbG9ycyBhbmQgZm9udCAqLwotCQlpdGVtRm9yZWdyb3VuZEJ1dHRvbi5zZXRJbWFnZShpdGVtRm9yZWdyb3VuZEltYWdlKTsKLQkJaXRlbUZvcmVncm91bmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbG9yIG9sZENvbG9yID0gaXRlbUZvcmVncm91bmRDb2xvcjsKLQkJCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgb2xkQ29sb3IgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0Rm9yZWdyb3VuZCAoKTsKLQkJCQlmb3JlZ3JvdW5kRGlhbG9nLnNldFJHQihvbGRDb2xvci5nZXRSR0IoKSk7Ci0JCQkJUkdCIHJnYiA9IGZvcmVncm91bmREaWFsb2cub3BlbigpOwotCQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJCW9sZENvbG9yID0gaXRlbUZvcmVncm91bmRDb2xvcjsKLQkJCQlpdGVtRm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yIChldmVudC5kaXNwbGF5LCByZ2IpOwotCQkJCXNldEl0ZW1Gb3JlZ3JvdW5kICgpOwotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQkJfQotCQl9KTsKLQkJaXRlbUJhY2tncm91bmRCdXR0b24uc2V0SW1hZ2UoaXRlbUJhY2tncm91bmRJbWFnZSk7Ci0JCWl0ZW1CYWNrZ3JvdW5kQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xvciBvbGRDb2xvciA9IGl0ZW1CYWNrZ3JvdW5kQ29sb3I7Ci0JCQkJaWYgKG9sZENvbG9yID09IG51bGwpIG9sZENvbG9yID0gdGFibGUxLmdldEl0ZW0gKDApLmdldEJhY2tncm91bmQgKCk7Ci0JCQkJYmFja2dyb3VuZERpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJCVJHQiByZ2IgPSBiYWNrZ3JvdW5kRGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJCQlvbGRDb2xvciA9IGl0ZW1CYWNrZ3JvdW5kQ29sb3I7Ci0JCQkJaXRlbUJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZXZlbnQuZGlzcGxheSwgcmdiKTsKLQkJCQlzZXRJdGVtQmFja2dyb3VuZCAoKTsKLQkJCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW1Gb250QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUZvbnQgb2xkRm9udCA9IGl0ZW1Gb250OwotCQkJCWlmIChvbGRGb250ID09IG51bGwpIG9sZEZvbnQgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0Rm9udCAoKTsKLQkJCQlmb250RGlhbG9nLnNldEZvbnRMaXN0KG9sZEZvbnQuZ2V0Rm9udERhdGEoKSk7Ci0JCQkJRm9udERhdGEgZm9udERhdGEgPSBmb250RGlhbG9nLm9wZW4gKCk7Ci0JCQkJaWYgKGZvbnREYXRhID09IG51bGwpIHJldHVybjsKLQkJCQlvbGRGb250ID0gaXRlbUZvbnQ7Ci0JCQkJaXRlbUZvbnQgPSBuZXcgRm9udCAoZXZlbnQuZGlzcGxheSwgZm9udERhdGEpOwotCQkJCXNldEl0ZW1Gb250ICgpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJCWlmIChvbGRGb250ICE9IG51bGwpIG9sZEZvbnQuZGlzcG9zZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGl0ZW1CYWNrZ3JvdW5kSW1hZ2UgIT0gbnVsbCkgaXRlbUJhY2tncm91bmRJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJaWYgKGl0ZW1Gb3JlZ3JvdW5kSW1hZ2UgIT0gbnVsbCkgaXRlbUZvcmVncm91bmRJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJaWYgKGl0ZW1CYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgaXRlbUJhY2tncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGl0ZW1Gb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgaXRlbUZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGl0ZW1Gb250ICE9IG51bGwpIGl0ZW1Gb250LmRpc3Bvc2UoKTsKLQkJCQlpdGVtQmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJCQlpdGVtRm9yZWdyb3VuZENvbG9yID0gbnVsbDsJCQkKLQkJCQlpdGVtRm9udCA9IG51bGw7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJPdGhlciIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVPdGhlckdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlT3RoZXJHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIGRpc3BsYXkgY29udHJvbHMgc3BlY2lmaWMgdG8gdGhpcyBleGFtcGxlICovCi0JCWhlYWRlclZpc2libGVCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQloZWFkZXJWaXNpYmxlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJIZWFkZXJfVmlzaWJsZSIpKTsKLQkJbXVsdGlwbGVDb2x1bW5zID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJbXVsdGlwbGVDb2x1bW5zLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNdWx0aXBsZV9Db2x1bW5zIikpOwotCQltdWx0aXBsZUNvbHVtbnMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQltb3ZlYWJsZUNvbHVtbnMgPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQltb3ZlYWJsZUNvbHVtbnMuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1vdmVhYmxlX0NvbHVtbnMiKSk7Ci0JCW1vdmVhYmxlQ29sdW1ucy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlsaW5lc1Zpc2libGVCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlsaW5lc1Zpc2libGVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVzX1Zpc2libGUiKSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWhlYWRlclZpc2libGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldEhlYWRlclZpc2libGUgKCk7Ci0JCQl9Ci0JCX0pOwotCQltdWx0aXBsZUNvbHVtbnMuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX0pOwotCQltb3ZlYWJsZUNvbHVtbnMuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldENvbHVtbnNNb3ZlYWJsZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCWxpbmVzVmlzaWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0TGluZXNWaXNpYmxlICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSB0YWJsZSAqLwotCQl0YWJsZUdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJdGFibGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJdGFibGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0YWJsZUdyb3VwLnNldFRleHQgKCJUYWJsZSIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHNpbmdsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSU5HTEU7Ci0JCWlmIChtdWx0aUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5NVUxUSTsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlZfU0NST0xMOwotCQlpZiAoaG9yaXpvbnRhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5IX1NDUk9MTDsKLQkJaWYgKGNoZWNrQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkNIRUNLOwotCQlpZiAoZnVsbFNlbGVjdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5GVUxMX1NFTEVDVElPTjsKLQkJaWYgKGhpZGVTZWxlY3Rpb25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSElERV9TRUxFQ1RJT047Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQotCQkvKiBDcmVhdGUgdGhlIHRhYmxlIHdpZGdldCAqLwotCQl0YWJsZTEgPSBuZXcgVGFibGUgKHRhYmxlR3JvdXAsIHN0eWxlKTsKLQkKLQkJLyogRmlsbCB0aGUgdGFibGUgd2l0aCBkYXRhICovCi0JCWlmIChtdWx0aXBsZUNvbHVtbnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uVGl0bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUxLCBTV1QuTk9ORSk7Ci0JCQkJdGFibGVDb2x1bW4uc2V0VGV4dChjb2x1bW5UaXRsZXNbaV0pOwotCQkJCXRhYmxlQ29sdW1uLnNldFRvb2xUaXBUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUb29sdGlwIiwgbmV3IFN0cmluZyBbXSB7Y29sdW1uVGl0bGVzW2ldfSkpOwotCQkJfQotCQkJdGFibGUxLnNldFNvcnRDb2x1bW4odGFibGUxLmdldENvbHVtbigwKSk7Ci0JCX0KLQkJZm9yIChpbnQgaT0wOyBpPDE2OyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUxLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXMgW2kgJSAzXSk7Ci0JCQlzZXRJdGVtVGV4dCAoaXRlbSwgaSwgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkluZGV4IikgKyBpKTsKLQkJfQotCQlwYWNrQ29sdW1ucygpOwotCQlzZXRDb2x1bW5zTW92ZWFibGUoKTsKLQl9Ci0JCi0Jdm9pZCBzZXRJdGVtVGV4dChUYWJsZUl0ZW0gaXRlbSwgaW50IGksIFN0cmluZyBub2RlKSB7Ci0JCWludCBpbmRleCA9IGkgJSAzOwotCQlpZiAobXVsdGlwbGVDb2x1bW5zLmdldFNlbGVjdGlvbigpKSB7Ci0JCQl0YWJsZURhdGEgW2luZGV4XVswXSA9IG5vZGU7Ci0JCQlpdGVtLnNldFRleHQgKHRhYmxlRGF0YSBbaW5kZXhdKTsKLQkJfSBlbHNlIHsKLQkJCWl0ZW0uc2V0VGV4dCAobm9kZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWNoZWNrQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCdXR0b24uc2V0VGV4dCAoIlNXVC5DSEVDSyIpOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJZnVsbFNlbGVjdGlvbkJ1dHRvbi5zZXRUZXh0ICgiU1dULkZVTExfU0VMRUNUSU9OIik7Ci0JCWhpZGVTZWxlY3Rpb25CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQloaWRlU2VsZWN0aW9uQnV0dG9uLnNldFRleHQgKCJTV1QuSElERV9TRUxFQ1RJT04iKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zLCBpZiBhbnkuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGV4YW1wbGUgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMKLQkgKi8KLQlJdGVtIFtdIGdldEV4YW1wbGVXaWRnZXRJdGVtcyAoKSB7Ci0JCUl0ZW0gW10gY29sdW1ucyA9IHRhYmxlMS5nZXRDb2x1bW5zKCk7Ci0JCUl0ZW0gW10gaXRlbXMgPSB0YWJsZTEuZ2V0SXRlbXMoKTsKLQkJSXRlbSBbXSBhbGxJdGVtcyA9IG5ldyBJdGVtIFtjb2x1bW5zLmxlbmd0aCArIGl0ZW1zLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY29sdW1ucywgMCwgYWxsSXRlbXMsIDAsIGNvbHVtbnMubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShpdGVtcywgMCwgYWxsSXRlbXMsIGNvbHVtbnMubGVuZ3RoLCBpdGVtcy5sZW5ndGgpOwotCQlyZXR1cm4gYWxsSXRlbXM7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbXSB7dGFibGUxfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJDb2x1bW5PcmRlciIsICJJdGVtQ291bnQiLCAiU2VsZWN0aW9uIiwgIlNlbGVjdGlvbkluZGV4IiwgIlNvcnREaXJlY3Rpb24iLCAiVG9vbFRpcFRleHQiLCAiVG9wSW5kZXgifTsKLQl9Ci0KLQlTdHJpbmcgc2V0TWV0aG9kTmFtZShTdHJpbmcgbWV0aG9kUm9vdCkgewotCQkvKiBPdmVycmlkZSB0byBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGludCBnZXRTZWxlY3Rpb25JbmRleCgpL3NldFNlbGVjdGlvbihpbnQpICovCi0JCXJldHVybiAobWV0aG9kUm9vdC5lcXVhbHMoIlNlbGVjdGlvbkluZGV4IikpID8gInNldFNlbGVjdGlvbiIgOiAic2V0IiArIG1ldGhvZFJvb3Q7Ci0JfQotCi0JT2JqZWN0W10gcGFyYW1ldGVyRm9yVHlwZShTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyB2YWx1ZSwgQ29udHJvbCBjb250cm9sKSB7Ci0JCWlmICh2YWx1ZS5lcXVhbHMoIiIpKSByZXR1cm4gbmV3IE9iamVjdFtdIHtuZXcgVGFibGVJdGVtWzBdfTsgLy8gYnVnIGluIFRhYmxlPwotCQlpZiAodHlwZU5hbWUuZXF1YWxzKCJvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW0iKSkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSBmaW5kSXRlbSh2YWx1ZSwgKChUYWJsZSkgY29udHJvbCkuZ2V0SXRlbXMoKSk7Ci0JCQlpZiAoaXRlbSAhPSBudWxsKSByZXR1cm4gbmV3IE9iamVjdFtdIHtpdGVtfTsKLQkJfQotCQlpZiAodHlwZU5hbWUuZXF1YWxzKCJbTG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsiKSkgewotCQkJU3RyaW5nW10gdmFsdWVzID0gdmFsdWUuc3BsaXQoIiwiKTsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVt2YWx1ZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaXRlbXNbaV0gPSBmaW5kSXRlbSh2YWx1ZXNbaV0sICgoVGFibGUpIGNvbnRyb2wpLmdldEl0ZW1zKCkpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7aXRlbXN9OwotCQl9Ci0JCXJldHVybiBzdXBlci5wYXJhbWV0ZXJGb3JUeXBlKHR5cGVOYW1lLCB2YWx1ZSwgY29udHJvbCk7Ci0JfQotCi0JVGFibGVJdGVtIGZpbmRJdGVtKFN0cmluZyB2YWx1ZSwgVGFibGVJdGVtW10gaXRlbXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCWlmIChpdGVtLmdldFRleHQoKS5lcXVhbHModmFsdWUpKSByZXR1cm4gaXRlbTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJUYWJsZSI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3IsIGJhY2tncm91bmQgY29sb3IsIGFuZCBmb250Ci0JICogb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzIHRvIHRoZWlyIGRlZmF1bHQgc2V0dGluZ3MuCi0JICogQWxzbyBzZXRzIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3Igb2YgVGFibGVJdGVtIFswXQotCSAqIHRvIGRlZmF1bHQgc2V0dGluZ3MuCi0JICovCi0Jdm9pZCByZXNldENvbG9yc0FuZEZvbnRzICgpIHsKLQkJc3VwZXIucmVzZXRDb2xvcnNBbmRGb250cyAoKTsKLQkJQ29sb3Igb2xkQ29sb3IgPSBpdGVtRm9yZWdyb3VuZENvbG9yOwotCQlpdGVtRm9yZWdyb3VuZENvbG9yID0gbnVsbDsKLQkJc2V0SXRlbUZvcmVncm91bmQgKCk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JCW9sZENvbG9yID0gaXRlbUJhY2tncm91bmRDb2xvcjsKLQkJaXRlbUJhY2tncm91bmRDb2xvciA9IG51bGw7Ci0JCXNldEl0ZW1CYWNrZ3JvdW5kICgpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlGb250IG9sZEZvbnQgPSBmb250OwotCQlpdGVtRm9udCA9IG51bGw7Ci0JCXNldEl0ZW1Gb250ICgpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgb2xkRm9udC5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgVGFibGVJdGVtIFswXS4KLQkgKi8KLQl2b2lkIHNldEl0ZW1CYWNrZ3JvdW5kICgpIHsKLQkJdGFibGUxLmdldEl0ZW0gKDApLnNldEJhY2tncm91bmQgKGl0ZW1CYWNrZ3JvdW5kQ29sb3IpOwotCQkvKiBTZXQgdGhlIGJhY2tncm91bmQgYnV0dG9uJ3MgY29sb3IgdG8gbWF0Y2ggdGhlIGNvbG9yIGp1c3Qgc2V0LiAqLwotCQlDb2xvciBjb2xvciA9IGl0ZW1CYWNrZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IHRhYmxlMS5nZXRJdGVtICgwKS5nZXRCYWNrZ3JvdW5kICgpOwotCQlkcmF3SW1hZ2UgKGl0ZW1CYWNrZ3JvdW5kSW1hZ2UsIGNvbG9yKTsKLQkJaXRlbUJhY2tncm91bmRCdXR0b24uc2V0SW1hZ2UgKGl0ZW1CYWNrZ3JvdW5kSW1hZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIG9mIFRhYmxlSXRlbSBbMF0uCi0JICovCi0Jdm9pZCBzZXRJdGVtRm9yZWdyb3VuZCAoKSB7Ci0JCXRhYmxlMS5nZXRJdGVtICgwKS5zZXRGb3JlZ3JvdW5kIChpdGVtRm9yZWdyb3VuZENvbG9yKTsKLQkJLyogU2V0IHRoZSBmb3JlZ3JvdW5kIGJ1dHRvbidzIGNvbG9yIHRvIG1hdGNoIHRoZSBjb2xvciBqdXN0IHNldC4gKi8KLQkJQ29sb3IgY29sb3IgPSBpdGVtRm9yZWdyb3VuZENvbG9yOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgY29sb3IgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0Rm9yZWdyb3VuZCAoKTsKLQkJZHJhd0ltYWdlIChpdGVtRm9yZWdyb3VuZEltYWdlLCBjb2xvcik7Ci0JCWl0ZW1Gb3JlZ3JvdW5kQnV0dG9uLnNldEltYWdlIChpdGVtRm9yZWdyb3VuZEltYWdlKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZm9udCBvZiBUYWJsZUl0ZW0gMC4KLQkgKi8KLQl2b2lkIHNldEl0ZW1Gb250ICgpIHsKLQkJaWYgKGluc3RhbmNlLnN0YXJ0dXApIHJldHVybjsKLQkJdGFibGUxLmdldEl0ZW0gKDApLnNldEZvbnQgKGl0ZW1Gb250KTsKLQkJcGFja0NvbHVtbnMgKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9udCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0Rm9udCAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRGb250KCk7Ci0JCXBhY2tDb2x1bW5zICgpOwotCX0KLQkKLQl2b2lkIHBhY2tDb2x1bW5zICgpIHsKLQkJaW50IGNvbHVtbkNvdW50ID0gdGFibGUxLmdldENvbHVtbkNvdW50KCk7IAotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJCVRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gdGFibGUxLmdldENvbHVtbihpKTsKLQkJCXRhYmxlQ29sdW1uLnBhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vdmVhYmxlIGNvbHVtbnMgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0Q29sdW1uc01vdmVhYmxlICgpIHsKLQkJYm9vbGVhbiBzZWxlY3Rpb24gPSBtb3ZlYWJsZUNvbHVtbnMuZ2V0U2VsZWN0aW9uKCk7Ci0JCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlMS5nZXRDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJY29sdW1uc1tpXS5zZXRNb3ZlYWJsZShzZWxlY3Rpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlzZXRJdGVtQmFja2dyb3VuZCAoKTsKLQkJc2V0SXRlbUZvcmVncm91bmQgKCk7Ci0JCXNldEl0ZW1Gb250ICgpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJc2V0V2lkZ2V0SGVhZGVyVmlzaWJsZSAoKTsKLQkJc2V0V2lkZ2V0TGluZXNWaXNpYmxlICgpOwotCQljaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24gKCh0YWJsZTEuZ2V0U3R5bGUgKCkgJiBTV1QuQ0hFQ0spICE9IDApOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRhYmxlMS5nZXRTdHlsZSAoKSAmIFNXVC5GVUxMX1NFTEVDVElPTikgIT0gMCk7Ci0JCWhpZGVTZWxlY3Rpb25CdXR0b24uc2V0U2VsZWN0aW9uICgodGFibGUxLmdldFN0eWxlICgpICYgU1dULkhJREVfU0VMRUNUSU9OKSAhPSAwKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgaGVhZGVyIHZpc2libGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0SGVhZGVyVmlzaWJsZSAoKSB7Ci0JCXRhYmxlMS5zZXRIZWFkZXJWaXNpYmxlIChoZWFkZXJWaXNpYmxlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGxpbmVzIHZpc2libGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0TGluZXNWaXNpYmxlICgpIHsKLQkJdGFibGUxLnNldExpbmVzVmlzaWJsZSAobGluZXNWaXNpYmxlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGV4dFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGV4dFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NDg5YWMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RleHRUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIFRleHRUYWIgZXh0ZW5kcyBTY3JvbGxhYmxlVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVRleHQgdGV4dDsKLQlHcm91cCB0ZXh0R3JvdXA7Ci0KLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHdyYXBCdXR0b24sIHJlYWRPbmx5QnV0dG9uOwotCUJ1dHRvbiBsZWZ0QnV0dG9uLCBjZW50ZXJCdXR0b24sIHJpZ2h0QnV0dG9uOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlUZXh0VGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHRleHQgd2lkZ2V0ICovCi0JCXRleHRHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRleHRHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJdGV4dEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRleHRHcm91cC5zZXRUZXh0ICgiVGV4dCIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHNpbmdsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSU5HTEU7Ci0JCWlmIChtdWx0aUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5NVUxUSTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSF9TQ1JPTEw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WX1NDUk9MTDsKLQkJaWYgKHdyYXBCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuV1JBUDsKLQkJaWYgKHJlYWRPbmx5QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlJFQURfT05MWTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmIChsZWZ0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkxFRlQ7Ci0JCWlmIChjZW50ZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQ0VOVEVSOwotCQlpZiAocmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUklHSFQ7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXRleHQgPSBuZXcgVGV4dCAodGV4dEdyb3VwLCBzdHlsZSk7Ci0JCXRleHQuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkV4YW1wbGVfc3RyaW5nIikgKyBUZXh0LkRFTElNSVRFUiArIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPbmVfVHdvX1RocmVlIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJd3JhcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXdyYXBCdXR0b24uc2V0VGV4dCAoIlNXVC5XUkFQIik7Ci0JCXJlYWRPbmx5QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJcmVhZE9ubHlCdXR0b24uc2V0VGV4dCAoIlNXVC5SRUFEX09OTFkiKTsKLQotCQlDb21wb3NpdGUgYWxpZ25tZW50R3JvdXAgPSBuZXcgQ29tcG9zaXRlIChzdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQgKCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlhbGlnbm1lbnRHcm91cC5zZXRMYXlvdXQgKGxheW91dCk7Ci0JCWFsaWdubWVudEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWxlZnRCdXR0b24gPSBuZXcgQnV0dG9uIChhbGlnbm1lbnRHcm91cCwgU1dULlJBRElPKTsKLQkJbGVmdEJ1dHRvbi5zZXRUZXh0ICgiU1dULkxFRlQiKTsKLQkJY2VudGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoYWxpZ25tZW50R3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNlbnRlckJ1dHRvbi5zZXRUZXh0ICgiU1dULkNFTlRFUiIpOwotCQlyaWdodEJ1dHRvbiA9IG5ldyBCdXR0b24gKGFsaWdubWVudEdyb3VwLCBTV1QuUkFESU8pOwotCQlyaWdodEJ1dHRvbi5zZXRUZXh0ICgiU1dULlJJR0hUIik7Ci0JCQotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmICghKChCdXR0b24pIGV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uICgpKSByZXR1cm47Ci0JCQkJcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCX0KLQkJfTsKLQkJbGVmdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQljZW50ZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJcmlnaHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlIGZvciB0aGUgdGFiIGZvbGRlcgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlIChUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcik7Ci0KLQkJLyoKLQkJICogQWRkIGEgcmVzaXplIGxpc3RlbmVyIHRvIHRoZSB0YWJGb2xkZXJQYWdlIHNvIHRoYXQKLQkJICogaWYgdGhlIHVzZXIgdHlwZXMgaW50byB0aGUgZXhhbXBsZSB3aWRnZXQgdG8gY2hhbmdlCi0JCSAqIGl0cyBwcmVmZXJyZWQgc2l6ZSwgYW5kIHRoZW4gcmVzaXplcyB0aGUgc2hlbGwsIHdlCi0JCSAqIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZSBjb3JyZWN0bHkuCi0JCSAqLwotCQl0YWJGb2xkZXJQYWdlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiB0YWJGb2xkZXJQYWdlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbXSB7dGV4dH07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiRG91YmxlQ2xpY2tFbmFibGVkIiwgIkVjaG9DaGFyIiwgIkVkaXRhYmxlIiwgIk9yaWVudGF0aW9uIiwgIlNlbGVjdGlvbiIsICJUYWJzIiwgIlRleHQiLCAiVGV4dExpbWl0IiwgIlRvb2xUaXBUZXh0IiwgIlRvcEluZGV4In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiVGV4dCI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJd3JhcEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULldSQVApICE9IDApOwotCQlyZWFkT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULlJFQURfT05MWSkgIT0gMCk7Ci0JCXdyYXBCdXR0b24uc2V0RW5hYmxlZCAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuTVVMVEkpICE9IDApOwotCQlob3Jpem9udGFsQnV0dG9uLnNldEVuYWJsZWQgKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULk1VTFRJKSAhPSAwKTsKLQkJdmVydGljYWxCdXR0b24uc2V0RW5hYmxlZCAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuTVVMVEkpICE9IDApOwotCQlsZWZ0QnV0dG9uLnNldFNlbGVjdGlvbiAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuTEVGVCkgIT0gMCk7Ci0JCWNlbnRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULkNFTlRFUikgIT0gMCk7Ci0JCXJpZ2h0QnV0dG9uLnNldFNlbGVjdGlvbiAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuUklHSFQpICE9IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Rvb2xCYXJUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Rvb2xCYXJUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzFkMDNiYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Ub29sQmFyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBUb29sQmFyVGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVRvb2xCYXIgaW1hZ2VUb29sQmFyLCB0ZXh0VG9vbEJhciwgaW1hZ2VUZXh0VG9vbEJhcjsKLQlHcm91cCBpbWFnZVRvb2xCYXJHcm91cCwgdGV4dFRvb2xCYXJHcm91cCwgaW1hZ2VUZXh0VG9vbEJhckdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gaG9yaXpvbnRhbEJ1dHRvbiwgdmVydGljYWxCdXR0b24sIGZsYXRCdXR0b24sIHNoYWRvd091dEJ1dHRvbiwgd3JhcEJ1dHRvbiwgcmlnaHRCdXR0b247Ci0KLQkvKiBPdGhlciB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiT3RoZXIiIGdyb3VwICovCi0JQnV0dG9uIGNvbWJvQ2hpbGRCdXR0b247Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVRvb2xCYXJUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgaW1hZ2UgdG9vbCBiYXIgKi8KLQkJaW1hZ2VUb29sQmFyR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlpbWFnZVRvb2xCYXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJaW1hZ2VUb29sQmFyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJaW1hZ2VUb29sQmFyR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkltYWdlX1Rvb2xCYXIiKSk7Ci0JCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdGV4dCB0b29sIGJhciAqLwotCQl0ZXh0VG9vbEJhckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJdGV4dFRvb2xCYXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJdGV4dFRvb2xCYXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0ZXh0VG9vbEJhckdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUZXh0X1Rvb2xCYXIiKSk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGltYWdlIGFuZCB0ZXh0IHRvb2wgYmFyICovCi0JCWltYWdlVGV4dFRvb2xCYXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWltYWdlVGV4dFRvb2xCYXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJaW1hZ2VUZXh0VG9vbEJhckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWltYWdlVGV4dFRvb2xCYXJHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2VUZXh0X1Rvb2xCYXIiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuSE9SSVpPTlRBTDsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuVkVSVElDQUw7Ci0JCWlmIChmbGF0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuRkxBVDsKLQkJaWYgKHdyYXBCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5XUkFQOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAoc2hhZG93T3V0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuU0hBRE9XX09VVDsKLQkJaWYgKHJpZ2h0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuUklHSFQ7Ci0JCi0JCS8qCi0JCSogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMuCi0JCSoKLQkJKiBBIHRvb2wgYmFyIG11c3QgY29uc2lzdCBvZiBhbGwgaW1hZ2UgdG9vbAotCQkqIGl0ZW1zIG9yIGFsbCB0ZXh0IHRvb2wgaXRlbXMgYnV0IG5vdCBib3RoLgotCQkqLwotCQotCQkvKiBDcmVhdGUgdGhlIGltYWdlIHRvb2wgYmFyICovCi0JCWltYWdlVG9vbEJhciA9IG5ldyBUb29sQmFyIChpbWFnZVRvb2xCYXJHcm91cCwgc3R5bGUpOwotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULkNIRUNLKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuQ0hFQ0siKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5TRVBBUkFUT1IiKTsKLQkJaWYgKGNvbWJvQ2hpbGRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyAoaW1hZ2VUb29sQmFyLCBTV1QuTk9ORSk7Ci0JCQljb21iby5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IjI1MCIsICI1MDAiLCAiNzUwIn0pOwotCQkJY29tYm8uc2V0VGV4dCAoY29tYm8uZ2V0SXRlbSAoMCkpOwotCQkJY29tYm8ucGFjayAoKTsKLQkJCWl0ZW0uc2V0V2lkdGggKGNvbWJvLmdldFNpemUgKCkueCk7Ci0JCQlpdGVtLnNldENvbnRyb2wgKGNvbWJvKTsKLQkJfQotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5EUk9QX0RPV04iKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgRHJvcERvd25TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSB0ZXh0IHRvb2wgYmFyICovCi0JCXRleHRUb29sQmFyID0gbmV3IFRvb2xCYXIgKHRleHRUb29sQmFyR3JvdXAsIHN0eWxlKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUHVzaCIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUHVzaCIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJhZGlvIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJhZGlvIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNoZWNrIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuQ0hFQ0siKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJhZGlvIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJhZGlvIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuU0VQQVJBVE9SIik7Ci0JCWlmIChjb21ib0NoaWxkQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8gKHRleHRUb29sQmFyLCBTV1QuTk9ORSk7Ci0JCQljb21iby5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IjI1MCIsICI1MDAiLCAiNzUwIn0pOwotCQkJY29tYm8uc2V0VGV4dCAoY29tYm8uZ2V0SXRlbSAoMCkpOwotCQkJY29tYm8ucGFjayAoKTsKLQkJCWl0ZW0uc2V0V2lkdGggKGNvbWJvLmdldFNpemUgKCkueCk7Ci0JCQlpdGVtLnNldENvbnRyb2wgKGNvbWJvKTsKLQkJfQotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0ZXh0VG9vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRyb3BfRG93biIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULkRST1BfRE9XTiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBEcm9wRG93blNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0JCS8qIENyZWF0ZSB0aGUgaW1hZ2UgYW5kIHRleHQgdG9vbCBiYXIgKi8KLQkJaW1hZ2VUZXh0VG9vbEJhciA9IG5ldyBUb29sQmFyIChpbWFnZVRleHRUb29sQmFyR3JvdXAsIHN0eWxlKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUZXh0VG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUHVzaCIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUZXh0VG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUHVzaCIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUZXh0VG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSYWRpbyIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmFkaW8iKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuQ0hFQ0spOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2hlY2siKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5DSEVDSyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmFkaW8iKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmFkaW8iKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlNFUEFSQVRPUiIpOwotCQlpZiAoY29tYm9DaGlsZEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvIChpbWFnZVRleHRUb29sQmFyLCBTV1QuTk9ORSk7Ci0JCQljb21iby5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IjI1MCIsICI1MDAiLCAiNzUwIn0pOwotCQkJY29tYm8uc2V0VGV4dCAoY29tYm8uZ2V0SXRlbSAoMCkpOwotCQkJY29tYm8ucGFjayAoKTsKLQkJCWl0ZW0uc2V0V2lkdGggKGNvbWJvLmdldFNpemUgKCkueCk7Ci0JCQlpdGVtLnNldENvbnRyb2wgKGNvbWJvKTsKLQkJfQotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRyb3BfRG93biIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULkRST1BfRE9XTiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBEcm9wRG93blNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0JCS8qCi0JCSogRG8gbm90IGFkZCB0aGUgc2VsZWN0aW9uIGV2ZW50IGZvciB0aGlzIGRyb3AgZG93bgotCQkqIHRvb2wgaXRlbS4gIFdpdGhvdXQgaG9va2luZyB0aGUgZXZlbnQsIHRoZSBkcm9wIGRvd24KLQkJKiB3aWRnZXQgZG9lcyBub3RoaW5nIHNwZWNpYWwgd2hlbiB0aGUgZHJvcCBkb3duIGFyZWEKLQkJKiBpcyBzZWxlY3RlZC4KLQkJKi8KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVPdGhlckdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgZGlzcGxheSBjb250cm9scyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUgKi8KLQkJY29tYm9DaGlsZEJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNvbWJvQ2hpbGRCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbWJvX2NoaWxkIikpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQljb21ib0NoaWxkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWhvcml6b250YWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFRleHQgKCJTV1QuSE9SSVpPTlRBTCIpOwotCQl2ZXJ0aWNhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFRleHQgKCJTV1QuVkVSVElDQUwiKTsKLQkJZmxhdEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZsYXRCdXR0b24uc2V0VGV4dCAoIlNXVC5GTEFUIik7Ci0JCXNoYWRvd091dEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNoYWRvd091dEJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19PVVQiKTsKLQkJd3JhcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXdyYXBCdXR0b24uc2V0VGV4dCAoIlNXVC5XUkFQIik7Ci0JCXJpZ2h0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJcmlnaHRCdXR0b24uc2V0VGV4dCAoIlNXVC5SSUdIVCIpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0Jdm9pZCBkaXNwb3NlRXhhbXBsZVdpZGdldHMgKCkgewotCQlzdXBlci5kaXNwb3NlRXhhbXBsZVdpZGdldHMgKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcywgaWYgYW55LgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBleGFtcGxlIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zCi0JICovCi0JSXRlbSBbXSBnZXRFeGFtcGxlV2lkZ2V0SXRlbXMgKCkgewotCQlJdGVtIFtdIGltYWdlVG9vbEJhckl0ZW1zID0gaW1hZ2VUb29sQmFyLmdldEl0ZW1zKCk7Ci0JCUl0ZW0gW10gdGV4dFRvb2xCYXJJdGVtcyA9IHRleHRUb29sQmFyLmdldEl0ZW1zKCk7Ci0JCUl0ZW0gW10gaW1hZ2VUZXh0VG9vbEJhckl0ZW1zID0gaW1hZ2VUZXh0VG9vbEJhci5nZXRJdGVtcygpOwotCQlJdGVtIFtdIGFsbEl0ZW1zID0gbmV3IEl0ZW0gW2ltYWdlVG9vbEJhckl0ZW1zLmxlbmd0aCArIHRleHRUb29sQmFySXRlbXMubGVuZ3RoICsgaW1hZ2VUZXh0VG9vbEJhckl0ZW1zLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoaW1hZ2VUb29sQmFySXRlbXMsIDAsIGFsbEl0ZW1zLCAwLCBpbWFnZVRvb2xCYXJJdGVtcy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRleHRUb29sQmFySXRlbXMsIDAsIGFsbEl0ZW1zLCBpbWFnZVRvb2xCYXJJdGVtcy5sZW5ndGgsIHRleHRUb29sQmFySXRlbXMubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShpbWFnZVRleHRUb29sQmFySXRlbXMsIDAsIGFsbEl0ZW1zLCBpbWFnZVRvb2xCYXJJdGVtcy5sZW5ndGggKyB0ZXh0VG9vbEJhckl0ZW1zLmxlbmd0aCwgaW1hZ2VUZXh0VG9vbEJhckl0ZW1zLmxlbmd0aCk7Ci0JCXJldHVybiBhbGxJdGVtczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sIFtdIHtpbWFnZVRvb2xCYXIsIHRleHRUb29sQmFyLCBpbWFnZVRleHRUb29sQmFyfTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiVG9vbEJhciI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChpbWFnZVRvb2xCYXIuZ2V0U3R5bGUgKCkgJiBTV1QuSE9SSVpPTlRBTCkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5WRVJUSUNBTCkgIT0gMCk7Ci0JCWZsYXRCdXR0b24uc2V0U2VsZWN0aW9uICgoaW1hZ2VUb29sQmFyLmdldFN0eWxlICgpICYgU1dULkZMQVQpICE9IDApOwotCQl3cmFwQnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5XUkFQKSAhPSAwKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5TSEFET1dfT1VUKSAhPSAwKTsKLQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCQlyaWdodEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChpbWFnZVRvb2xCYXIuZ2V0U3R5bGUgKCkgJiBTV1QuUklHSFQpICE9IDApOwotCX0KLQkKLQkvKioKLQkgKiBMaXN0ZW5zIHRvIHdpZGdldFNlbGVjdGVkKCkgZXZlbnRzIG9uIFNXVC5EUk9QX0RPV04gdHlwZSBUb29sSXRlbXMKLQkgKiBhbmQgb3BlbnMvY2xvc2VzIGEgbWVudSB3aGVuIGFwcHJvcHJpYXRlLgotCSAqLwotCWNsYXNzIERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIHsKLQkJcHJpdmF0ZSBNZW51ICAgIG1lbnUgPSBudWxsOwotCQlwcml2YXRlIGJvb2xlYW4gdmlzaWJsZSA9IGZhbHNlOwotCQkKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCS8vIENyZWF0ZSB0aGUgbWVudSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBjcmVhdGVkCi0JCQlpZiAobWVudSA9PSBudWxsKSB7Ci0JCQkJLy8gTGF6eSBjcmVhdGUgdGhlIG1lbnUuCi0JCQkJU2hlbGwgc2hlbGwgPSB0YWJGb2xkZXJQYWdlLmdldFNoZWxsKCk7Ci0JCQkJbWVudSA9IG5ldyBNZW51KHNoZWxsKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDk7ICsraSkgewotCQkJCQlmaW5hbCBTdHJpbmcgdGV4dCA9IENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEcm9wRG93bkRhdGFfIiArIGkpOwotCQkJCQlpZiAodGV4dC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0JCQkJCQltZW51SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQkJLyoKLQkJCQkJCSAqIEFkZCBhIG1lbnUgc2VsZWN0aW9uIGxpc3RlbmVyIHNvIHRoYXQgdGhlIG1lbnUgaXMgaGlkZGVuCi0JCQkJCQkgKiB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbSBmcm9tIHRoZSBkcm9wIGRvd24gbWVudS4KLQkJCQkJCSAqLwotCQkJCQkJbWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCQlzZXRNZW51VmlzaWJsZShmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8qKgotCQkJICogQSBzZWxlY3Rpb24gZXZlbnQgd2lsbCBiZSBmaXJlZCB3aGVuIGEgZHJvcCBkb3duIHRvb2wKLQkJCSAqIGl0ZW0gaXMgc2VsZWN0ZWQgaW4gdGhlIG1haW4gYXJlYSBhbmQgaW4gdGhlIGRyb3AKLQkJCSAqIGRvd24gYXJyb3cuICBFeGFtaW5lIHRoZSBldmVudCBkZXRhaWwgdG8gZGV0ZXJtaW5lCi0JCQkgKiB3aGVyZSB0aGUgd2lkZ2V0IHdhcyBzZWxlY3RlZC4KLQkJCSAqLwkJCi0JCQlpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5BUlJPVykgewotCQkJCS8qCi0JCQkJICogVGhlIGRyb3AgZG93biBhcnJvdyB3YXMgc2VsZWN0ZWQuCi0JCQkJICovCi0JCQkJaWYgKHZpc2libGUpIHsKLQkJCQkJLy8gSGlkZSB0aGUgbWVudSB0byBnaXZlIHRoZSBBcnJvdyB0aGUgYXBwZWFyYW5jZSBvZiBiZWluZyBhIHRvZ2dsZSBidXR0b24uCi0JCQkJCXNldE1lbnVWaXNpYmxlKGZhbHNlKTsKLQkJCQl9IGVsc2UgewkKLQkJCQkJLy8gUG9zaXRpb24gdGhlIG1lbnUgYmVsb3cgYW5kIHZlcnRpY2FsbHkgYWxpZ25lZCB3aXRoIHRoZSB0aGUgZHJvcCBkb3duIHRvb2wgYnV0dG9uLgotCQkJCQlmaW5hbCBUb29sSXRlbSB0b29sSXRlbSA9IChUb29sSXRlbSkgZXZlbnQud2lkZ2V0OwotCQkJCQlmaW5hbCBUb29sQmFyICB0b29sQmFyID0gdG9vbEl0ZW0uZ2V0UGFyZW50KCk7Ci0JCQkJCQotCQkJCQlSZWN0YW5nbGUgdG9vbEl0ZW1Cb3VuZHMgPSB0b29sSXRlbS5nZXRCb3VuZHMoKTsKLQkJCQkJUG9pbnQgcG9pbnQgPSB0b29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQodG9vbEl0ZW1Cb3VuZHMueCwgdG9vbEl0ZW1Cb3VuZHMueSkpOwotCQkJCQltZW51LnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyB0b29sSXRlbUJvdW5kcy5oZWlnaHQpOwotCQkJCQlzZXRNZW51VmlzaWJsZSh0cnVlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogTWFpbiBhcmVhIG9mIGRyb3AgZG93biB0b29sIGl0ZW0gc2VsZWN0ZWQuCi0JCQkJICogQW4gYXBwbGljYXRpb24gd291bGQgaW52b2tlIHRoZSBjb2RlIHRvIHBlcmZvcm0gdGhlIGFjdGlvbiBmb3IgdGhlIHRvb2wgaXRlbS4KLQkJCQkgKi8KLQkJCX0KLQkJfQotCQlwcml2YXRlIHZvaWQgc2V0TWVudVZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCQltZW51LnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQl0aGlzLnZpc2libGUgPSB2aXNpYmxlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVHJlZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVHJlZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjE2NzRhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RyZWVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWNsYXNzIFRyZWVUYWIgZXh0ZW5kcyBTY3JvbGxhYmxlVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVRyZWUgdHJlZTEsIHRyZWUyOwotCVRyZWVJdGVtIHRleHROb2RlMSwgaW1hZ2VOb2RlMTsKLQlHcm91cCB0cmVlR3JvdXAsIGltYWdlVHJlZUdyb3VwLCBpdGVtR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBjaGVja0J1dHRvbiwgZnVsbFNlbGVjdGlvbkJ1dHRvbjsKLQotCS8qIE90aGVyIHdpZGdldHMgYWRkZWQgdG8gdGhlICJPdGhlciIgZ3JvdXAgKi8KLQlCdXR0b24gbXVsdGlwbGVDb2x1bW5zLCBtb3ZlYWJsZUNvbHVtbnMsIGhlYWRlclZpc2libGVCdXR0b24sIGxpbmVzVmlzaWJsZUJ1dHRvbjsKLQkKLQkvKiBDb250cm9scyBhbmQgcmVzb3VyY2VzIGFkZGVkIHRvIHRoZSAiQ29sb3JzIiBncm91cCAqLwotCUJ1dHRvbiBpdGVtRm9yZWdyb3VuZEJ1dHRvbiwgaXRlbUJhY2tncm91bmRCdXR0b24sIGl0ZW1Gb250QnV0dG9uOwotCUNvbG9yIGl0ZW1Gb3JlZ3JvdW5kQ29sb3IsIGl0ZW1CYWNrZ3JvdW5kQ29sb3I7Ci0JSW1hZ2UgaXRlbUZvcmVncm91bmRJbWFnZSwgaXRlbUJhY2tncm91bmRJbWFnZTsKLQlGb250IGl0ZW1Gb250OwotCQotCXN0YXRpYyBTdHJpbmcgW10gY29sdW1uVGl0bGVzCT0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZVRpdGxlXzAiKSwKLQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMSIpLAotCQkgICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVUaXRsZV8yIiksCi0JCSAgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZVRpdGxlXzMiKX07Ci0JCSAgIAotCXN0YXRpYyBTdHJpbmdbXVtdIHRhYmxlRGF0YSA9IHsKLQkJCXsgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTBfMCIpLAotCQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMF8xIiksCi0JCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUwXzIiKSwKLQkJCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTBfMyIpIH0sCi0JCQl7IENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUxXzAiKSwKLQkJCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTFfMSIpLAotCQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMV8yIiksCi0JCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUxXzMiKSB9LAotCQkJeyBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMl8wIiksCi0JCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUyXzEiKSwKLQkJCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTJfMiIpLAotCQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMl8zIikgfSB9OwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVRyZWVUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb2xvcnMiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlQ29sb3JHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbG9yR3JvdXAoKTsKLQkJCi0JCWl0ZW1Hcm91cCA9IG5ldyBHcm91cCAoY29sb3JHcm91cCwgU1dULk5PTkUpOwotCQlpdGVtR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJUcmVlX0l0ZW1fQ29sb3JzIikpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhICgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJaXRlbUdyb3VwLnNldExheW91dERhdGEgKGRhdGEpOwotCQlpdGVtR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMiwgZmFsc2UpKTsKLQkJbmV3IExhYmVsIChpdGVtR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkZvcmVncm91bmRfQ29sb3IiKSk7Ci0JCWl0ZW1Gb3JlZ3JvdW5kQnV0dG9uID0gbmV3IEJ1dHRvbiAoaXRlbUdyb3VwLCBTV1QuUFVTSCk7Ci0JCW5ldyBMYWJlbCAoaXRlbUdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJCYWNrZ3JvdW5kX0NvbG9yIikpOwotCQlpdGVtQmFja2dyb3VuZEJ1dHRvbiA9IG5ldyBCdXR0b24gKGl0ZW1Hcm91cCwgU1dULlBVU0gpOwotCQlpdGVtRm9udEJ1dHRvbiA9IG5ldyBCdXR0b24gKGl0ZW1Hcm91cCwgU1dULlBVU0gpOwotCQlpdGVtRm9udEJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGb250IikpOwotCQlpdGVtRm9udEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCQotCQlTaGVsbCBzaGVsbCA9IGNvbG9yR3JvdXAuZ2V0U2hlbGwgKCk7Ci0JCWZpbmFsIENvbG9yRGlhbG9nIGZvcmVncm91bmREaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2cgKHNoZWxsKTsKLQkJZmluYWwgQ29sb3JEaWFsb2cgYmFja2dyb3VuZERpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyAoc2hlbGwpOwotCQlmaW5hbCBGb250RGlhbG9nIGZvbnREaWFsb2cgPSBuZXcgRm9udERpYWxvZyAoc2hlbGwpOwotCi0JCWludCBpbWFnZVNpemUgPSAxMjsKLQkJRGlzcGxheSBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSAoKTsKLQkJaXRlbUZvcmVncm91bmRJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZVNpemUsIGltYWdlU2l6ZSk7Ci0JCWl0ZW1CYWNrZ3JvdW5kSW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VTaXplLCBpbWFnZVNpemUpOwotCi0JCS8qIEFkZCBsaXN0ZW5lcnMgdG8gc2V0IHRoZSBjb2xvcnMgYW5kIGZvbnQgKi8KLQkJaXRlbUZvcmVncm91bmRCdXR0b24uc2V0SW1hZ2UoaXRlbUZvcmVncm91bmRJbWFnZSk7Ci0JCWl0ZW1Gb3JlZ3JvdW5kQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xvciBvbGRDb2xvciA9IGl0ZW1Gb3JlZ3JvdW5kQ29sb3I7Ci0JCQkJaWYgKG9sZENvbG9yID09IG51bGwpIG9sZENvbG9yID0gdGV4dE5vZGUxLmdldEZvcmVncm91bmQgKCk7Ci0JCQkJZm9yZWdyb3VuZERpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJCVJHQiByZ2IgPSBmb3JlZ3JvdW5kRGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJCQlvbGRDb2xvciA9IGl0ZW1Gb3JlZ3JvdW5kQ29sb3I7Ci0JCQkJaXRlbUZvcmVncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZXZlbnQuZGlzcGxheSwgcmdiKTsKLQkJCQlzZXRJdGVtRm9yZWdyb3VuZCAoKTsKLQkJCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW1CYWNrZ3JvdW5kQnV0dG9uLnNldEltYWdlKGl0ZW1CYWNrZ3JvdW5kSW1hZ2UpOwotCQlpdGVtQmFja2dyb3VuZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sb3Igb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQkJCWlmIChvbGRDb2xvciA9PSBudWxsKSBvbGRDb2xvciA9IHRleHROb2RlMS5nZXRCYWNrZ3JvdW5kICgpOwotCQkJCWJhY2tncm91bmREaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsKLQkJCQlSR0IgcmdiID0gYmFja2dyb3VuZERpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQkJCWl0ZW1CYWNrZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IgKGV2ZW50LmRpc3BsYXksIHJnYik7Ci0JCQkJc2V0SXRlbUJhY2tncm91bmQgKCk7Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtRm9udEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlGb250IG9sZEZvbnQgPSBpdGVtRm9udDsKLQkJCQlpZiAob2xkRm9udCA9PSBudWxsKSBvbGRGb250ID0gdGV4dE5vZGUxLmdldEZvbnQgKCk7Ci0JCQkJZm9udERpYWxvZy5zZXRGb250TGlzdChvbGRGb250LmdldEZvbnREYXRhKCkpOwotCQkJCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuICgpOwotCQkJCWlmIChmb250RGF0YSA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkRm9udCA9IGl0ZW1Gb250OwotCQkJCWl0ZW1Gb250ID0gbmV3IEZvbnQgKGV2ZW50LmRpc3BsYXksIGZvbnREYXRhKTsKLQkJCQlzZXRJdGVtRm9udCAoKTsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCWlmIChpdGVtQmFja2dyb3VuZEltYWdlICE9IG51bGwpIGl0ZW1CYWNrZ3JvdW5kSW1hZ2UuZGlzcG9zZSgpOwotCQkJCWlmIChpdGVtRm9yZWdyb3VuZEltYWdlICE9IG51bGwpIGl0ZW1Gb3JlZ3JvdW5kSW1hZ2UuZGlzcG9zZSgpOwotCQkJCWlmIChpdGVtQmFja2dyb3VuZENvbG9yICE9IG51bGwpIGl0ZW1CYWNrZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJCWlmIChpdGVtRm9yZWdyb3VuZENvbG9yICE9IG51bGwpIGl0ZW1Gb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJCWlmIChpdGVtRm9udCAhPSBudWxsKSBpdGVtRm9udC5kaXNwb3NlKCk7Ci0JCQkJaXRlbUJhY2tncm91bmRDb2xvciA9IG51bGw7Ci0JCQkJaXRlbUZvcmVncm91bmRDb2xvciA9IG51bGw7CQkJCi0JCQkJaXRlbUZvbnQgPSBudWxsOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiT3RoZXIiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlT3RoZXJHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZU90aGVyR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSBkaXNwbGF5IGNvbnRyb2xzIHNwZWNpZmljIHRvIHRoaXMgZXhhbXBsZSAqLwotCQloZWFkZXJWaXNpYmxlQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJaGVhZGVyVmlzaWJsZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSGVhZGVyX1Zpc2libGUiKSk7Ci0JCW11bHRpcGxlQ29sdW1ucyA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW11bHRpcGxlQ29sdW1ucy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTXVsdGlwbGVfQ29sdW1ucyIpKTsKLQkJbW92ZWFibGVDb2x1bW5zID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJbW92ZWFibGVDb2x1bW5zLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNb3ZlYWJsZV9Db2x1bW5zIikpOwotCQltb3ZlYWJsZUNvbHVtbnMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJbGluZXNWaXNpYmxlQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJbGluZXNWaXNpYmxlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lc19WaXNpYmxlIikpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQloZWFkZXJWaXNpYmxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRIZWFkZXJWaXNpYmxlICgpOwotCQkJfQotCQl9KTsKLQkJbXVsdGlwbGVDb2x1bW5zLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9KTsKLQkJbW92ZWFibGVDb2x1bW5zLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRDb2x1bW5zTW92ZWFibGUgKCk7Ci0JCQl9Ci0JCX0pOwotCQlsaW5lc1Zpc2libGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldExpbmVzVmlzaWJsZSAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdGV4dCB0cmVlICovCi0JCXRyZWVHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRyZWVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJdHJlZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRyZWVHcm91cC5zZXRUZXh0ICgiVHJlZSIpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGltYWdlIHRyZWUgKi8KLQkJaW1hZ2VUcmVlR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlpbWFnZVRyZWVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJaW1hZ2VUcmVlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJaW1hZ2VUcmVlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRyZWVfV2l0aF9JbWFnZXMiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChzaW5nbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5TSU5HTEU7Ci0JCWlmIChtdWx0aUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULk1VTFRJOwotCQlpZiAoY2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5DSEVDSzsKLQkJaWYgKGZ1bGxTZWxlY3Rpb25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRlVMTF9TRUxFQ1RJT047Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgdGV4dCB0cmVlICovCi0JCXRyZWUxID0gbmV3IFRyZWUgKHRyZWVHcm91cCwgc3R5bGUpOwotCQlpZiAobXVsdGlwbGVDb2x1bW5zLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblRpdGxlcy5sZW5ndGg7IGkrKykgewotCQkJCVRyZWVDb2x1bW4gdHJlZUNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUxLCBTV1QuTk9ORSk7Ci0JCQkJdHJlZUNvbHVtbi5zZXRUZXh0KGNvbHVtblRpdGxlc1tpXSk7Ci0JCQkJdHJlZUNvbHVtbi5zZXRUb29sVGlwVGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVG9vbHRpcCIsIG5ldyBTdHJpbmcgW10ge2NvbHVtblRpdGxlc1tpXX0pKTsKLQkJCX0KLQkJCXRyZWUxLnNldFNvcnRDb2x1bW4odHJlZTEuZ2V0Q29sdW1uKDApKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZTEsIFNXVC5OT05FKTsKLQkJCXNldEl0ZW1UZXh0KGl0ZW0sIGksIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb2RlXyIgKyAoaSArIDEpKSk7Ci0JCQlpZiAoaSA8IDMpIHsKLQkJCQlUcmVlSXRlbSBzdWJpdGVtID0gbmV3IFRyZWVJdGVtIChpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJc2V0SXRlbVRleHQoc3ViaXRlbSwgaSwgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vZGVfIiArIChpICsgMSkgKyAiXzEiKSk7Ci0JCQl9Ci0JCX0KLQkJVHJlZUl0ZW0gdHJlZVJvb3RzW10gPSB0cmVlMS5nZXRJdGVtcyAoKTsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZVJvb3RzWzFdLCBTV1QuTk9ORSk7Ci0JCXNldEl0ZW1UZXh0KGl0ZW0sIDEsIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb2RlXzJfMiIpKTsKLQkJaXRlbSA9IG5ldyBUcmVlSXRlbSAoaXRlbSwgU1dULk5PTkUpOwotCQlzZXRJdGVtVGV4dChpdGVtLCAxLCBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9kZV8yXzJfMSIpKTsJCQkJCQotCQl0ZXh0Tm9kZTEgPSB0cmVlUm9vdHNbMF07Ci0JCXBhY2tDb2x1bW5zKHRyZWUxKTsKLQotCQkvKiBDcmVhdGUgdGhlIGltYWdlIHRyZWUgKi8JCi0JCXRyZWUyID0gbmV3IFRyZWUgKGltYWdlVHJlZUdyb3VwLCBzdHlsZSk7Ci0JCUltYWdlIGltYWdlID0gaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXTsKLQkJaWYgKG11bHRpcGxlQ29sdW1ucy5nZXRTZWxlY3Rpb24oKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5UaXRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlUcmVlQ29sdW1uIHRyZWVDb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlMiwgU1dULk5PTkUpOwotCQkJCXRyZWVDb2x1bW4uc2V0VGV4dChjb2x1bW5UaXRsZXNbaV0pOwotCQkJCXRyZWVDb2x1bW4uc2V0VG9vbFRpcFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRvb2x0aXAiKSArIGNvbHVtblRpdGxlc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCWl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUyLCBTV1QuTk9ORSk7Ci0JCQlzZXRJdGVtVGV4dChpdGVtLCBpLCBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9kZV8iICsgKGkgKyAxKSkpOwotCQkJaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCQlpZiAoaSA8IDMpIHsKLQkJCQlUcmVlSXRlbSBzdWJpdGVtID0gbmV3IFRyZWVJdGVtIChpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJc2V0SXRlbVRleHQoc3ViaXRlbSwgaSwgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vZGVfIiArIChpICsgMSkgKyAiXzEiKSk7Ci0JCQkJc3ViaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCQl9Ci0JCX0KLQkJdHJlZVJvb3RzID0gdHJlZTIuZ2V0SXRlbXMgKCk7Ci0JCWl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWVSb290c1sxXSwgU1dULk5PTkUpOwotCQlzZXRJdGVtVGV4dChpdGVtLCAxLCBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9kZV8yXzIiKSk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQlpdGVtID0gbmV3IFRyZWVJdGVtIChpdGVtLCBTV1QuTk9ORSk7Ci0JCXNldEl0ZW1UZXh0KGl0ZW0sIDEsIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb2RlXzJfMl8xIikpOwotCQlpdGVtLnNldEltYWdlKGltYWdlKTsKLQkJaW1hZ2VOb2RlMSA9IHRyZWVSb290c1swXTsKLQkJcGFja0NvbHVtbnModHJlZTIpOwotCQkKLQkJc2V0Q29sdW1uc01vdmVhYmxlKCk7Ci0JfQotCQotCXZvaWQgc2V0SXRlbVRleHQoVHJlZUl0ZW0gaXRlbSwgaW50IGksIFN0cmluZyBub2RlKSB7Ci0JCWludCBpbmRleCA9IGkgJSAzOwotCQlpZiAobXVsdGlwbGVDb2x1bW5zLmdldFNlbGVjdGlvbigpKSB7Ci0JCQl0YWJsZURhdGEgW2luZGV4XVswXSA9IG5vZGU7Ci0JCQlpdGVtLnNldFRleHQgKHRhYmxlRGF0YSBbaW5kZXhdKTsKLQkJfSBlbHNlIHsKLQkJCWl0ZW0uc2V0VGV4dCAobm9kZSk7Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWNoZWNrQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCdXR0b24uc2V0VGV4dCAoIlNXVC5DSEVDSyIpOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJZnVsbFNlbGVjdGlvbkJ1dHRvbi5zZXRUZXh0ICgiU1dULkZVTExfU0VMRUNUSU9OIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcywgaWYgYW55LgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBleGFtcGxlIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zCi0JICovCi0JSXRlbSBbXSBnZXRFeGFtcGxlV2lkZ2V0SXRlbXMgKCkgewotCQkvKiBOb3RlOiBXZSBkbyBub3QgYm90aGVyIGNvbGxlY3RpbmcgdGhlIHRyZWUgaXRlbXMKLQkJICogYmVjYXVzZSB0cmVlIGl0ZW1zIGRvbid0IGhhdmUgYW55IGV2ZW50cy4gSWYgZXZlbnRzCi0JCSAqIGFyZSBldmVyIGFkZGVkIHRvIFRyZWVJdGVtLCB0aGVuIHRoaXMgbmVlZHMgdG8gY2hhbmdlLgotCQkgKi8KLQkJSXRlbSBbXSBjb2x1bW5zMSA9IHRyZWUxLmdldENvbHVtbnMoKTsKLQkJSXRlbSBbXSBjb2x1bW5zMiA9IHRyZWUyLmdldENvbHVtbnMoKTsKLQkJSXRlbSBbXSBhbGxJdGVtcyA9IG5ldyBJdGVtIFtjb2x1bW5zMS5sZW5ndGggKyBjb2x1bW5zMi5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbHVtbnMxLCAwLCBhbGxJdGVtcywgMCwgY29sdW1uczEubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShjb2x1bW5zMiwgMCwgYWxsSXRlbXMsIGNvbHVtbnMxLmxlbmd0aCwgY29sdW1uczIubGVuZ3RoKTsKLQkJcmV0dXJuIGFsbEl0ZW1zOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCUNvbnRyb2wgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2wgW10ge3RyZWUxLCB0cmVlMn07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiQ29sdW1uT3JkZXIiLCAiU2VsZWN0aW9uIiwgIlNvcnREaXJlY3Rpb24iLCAiVG9vbFRpcFRleHQiLCAiVG9wSXRlbSJ9OwotCX0KLQotCU9iamVjdFtdIHBhcmFtZXRlckZvclR5cGUoU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgdmFsdWUsIENvbnRyb2wgY29udHJvbCkgewotCQlpZiAodHlwZU5hbWUuZXF1YWxzKCJvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbSIpKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gZmluZEl0ZW0odmFsdWUsICgoVHJlZSkgY29udHJvbCkuZ2V0SXRlbXMoKSk7Ci0JCQlpZiAoaXRlbSAhPSBudWxsKSByZXR1cm4gbmV3IE9iamVjdFtdIHtpdGVtfTsKLQkJfQotCQlpZiAodHlwZU5hbWUuZXF1YWxzKCJbTG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOyIpKSB7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB2YWx1ZS5zcGxpdCgiLCIpOwotCQkJVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbVt2YWx1ZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IGZpbmRJdGVtKHZhbHVlc1tpXSwgKChUcmVlKSBjb250cm9sKS5nZXRJdGVtcygpKTsKLQkJCQlpZiAoaXRlbSA9PSBudWxsKSBicmVhazsKLQkJCQlpdGVtc1tpXSA9IGl0ZW07CQkJCQotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7aXRlbXN9OwotCQl9Ci0JCXJldHVybiBzdXBlci5wYXJhbWV0ZXJGb3JUeXBlKHR5cGVOYW1lLCB2YWx1ZSwgY29udHJvbCk7Ci0JfQotCi0JVHJlZUl0ZW0gZmluZEl0ZW0oU3RyaW5nIHZhbHVlLCBUcmVlSXRlbVtdIGl0ZW1zKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCWlmIChpdGVtLmdldFRleHQoKS5lcXVhbHModmFsdWUpKSByZXR1cm4gaXRlbTsKLQkJCWl0ZW0gPSBmaW5kSXRlbSh2YWx1ZSwgaXRlbS5nZXRJdGVtcygpKTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHJldHVybiBpdGVtOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlRyZWUiOwotCX0KLQotCXZvaWQgcGFja0NvbHVtbnMgKFRyZWUgdHJlZSkgewotCQlpZiAobXVsdGlwbGVDb2x1bW5zLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlpbnQgY29sdW1uQ291bnQgPSB0cmVlLmdldENvbHVtbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJCQlUcmVlQ29sdW1uIHRyZWVDb2x1bW4gPSB0cmVlLmdldENvbHVtbihpKTsKLQkJCQl0cmVlQ29sdW1uLnBhY2soKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBtb3ZlYWJsZSBjb2x1bW5zIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldENvbHVtbnNNb3ZlYWJsZSAoKSB7Ci0JCWJvb2xlYW4gc2VsZWN0aW9uID0gbW92ZWFibGVDb2x1bW5zLmdldFNlbGVjdGlvbigpOwotCQlUcmVlQ29sdW1uW10gY29sdW1uczEgPSB0cmVlMS5nZXRDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uczEubGVuZ3RoOyBpKyspIHsKLQkJCWNvbHVtbnMxW2ldLnNldE1vdmVhYmxlKHNlbGVjdGlvbik7Ci0JCX0KLQkJVHJlZUNvbHVtbltdIGNvbHVtbnMyID0gdHJlZTIuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMyLmxlbmd0aDsgaSsrKSB7Ci0JCQljb2x1bW5zMltpXS5zZXRNb3ZlYWJsZShzZWxlY3Rpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciwgYmFja2dyb3VuZCBjb2xvciwgYW5kIGZvbnQKLQkgKiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMgdG8gdGhlaXIgZGVmYXVsdCBzZXR0aW5ncy4KLQkgKiBBbHNvIHNldHMgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgTm9kZSAxCi0JICogVHJlZUl0ZW1zIHRvIGRlZmF1bHQgc2V0dGluZ3MuCi0JICovCi0Jdm9pZCByZXNldENvbG9yc0FuZEZvbnRzICgpIHsKLQkJc3VwZXIucmVzZXRDb2xvcnNBbmRGb250cyAoKTsKLQkJQ29sb3Igb2xkQ29sb3IgPSBpdGVtRm9yZWdyb3VuZENvbG9yOwotCQlpdGVtRm9yZWdyb3VuZENvbG9yID0gbnVsbDsKLQkJc2V0SXRlbUZvcmVncm91bmQgKCk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JCW9sZENvbG9yID0gaXRlbUJhY2tncm91bmRDb2xvcjsKLQkJaXRlbUJhY2tncm91bmRDb2xvciA9IG51bGw7Ci0JCXNldEl0ZW1CYWNrZ3JvdW5kICgpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlGb250IG9sZEZvbnQgPSBmb250OwotCQlpdGVtRm9udCA9IG51bGw7Ci0JCXNldEl0ZW1Gb250ICgpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgb2xkRm9udC5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJc2V0SXRlbUJhY2tncm91bmQgKCk7Ci0JCXNldEl0ZW1Gb3JlZ3JvdW5kICgpOwotCQlzZXRJdGVtRm9udCAoKTsKLQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCXNldFdpZGdldEhlYWRlclZpc2libGUgKCk7Ci0JCXNldFdpZGdldExpbmVzVmlzaWJsZSAoKTsKLQkJY2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uICgodHJlZTEuZ2V0U3R5bGUgKCkgJiBTV1QuQ0hFQ0spICE9IDApOwotCQljaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24gKCh0cmVlMi5nZXRTdHlsZSAoKSAmIFNXVC5DSEVDSykgIT0gMCk7Ci0JCWZ1bGxTZWxlY3Rpb25CdXR0b24uc2V0U2VsZWN0aW9uICgodHJlZTEuZ2V0U3R5bGUgKCkgJiBTV1QuRlVMTF9TRUxFQ1RJT04pICE9IDApOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRyZWUyLmdldFN0eWxlICgpICYgU1dULkZVTExfU0VMRUNUSU9OKSAhPSAwKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgTm9kZSAxIFRyZWVJdGVtcy4KLQkgKi8KLQl2b2lkIHNldEl0ZW1CYWNrZ3JvdW5kICgpIHsKLQkJdGV4dE5vZGUxLnNldEJhY2tncm91bmQgKGl0ZW1CYWNrZ3JvdW5kQ29sb3IpOwotCQlpbWFnZU5vZGUxLnNldEJhY2tncm91bmQgKGl0ZW1CYWNrZ3JvdW5kQ29sb3IpOwotCQkvKiBTZXQgdGhlIGJhY2tncm91bmQgYnV0dG9uJ3MgY29sb3IgdG8gbWF0Y2ggdGhlIGNvbG9yIGp1c3Qgc2V0LiAqLwotCQlDb2xvciBjb2xvciA9IGl0ZW1CYWNrZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IHRleHROb2RlMS5nZXRCYWNrZ3JvdW5kICgpOwotCQlkcmF3SW1hZ2UgKGl0ZW1CYWNrZ3JvdW5kSW1hZ2UsIGNvbG9yKTsKLQkJaXRlbUJhY2tncm91bmRCdXR0b24uc2V0SW1hZ2UgKGl0ZW1CYWNrZ3JvdW5kSW1hZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIG9mIHRoZSBOb2RlIDEgVHJlZUl0ZW1zLgotCSAqLwotCXZvaWQgc2V0SXRlbUZvcmVncm91bmQgKCkgewotCQl0ZXh0Tm9kZTEuc2V0Rm9yZWdyb3VuZCAoaXRlbUZvcmVncm91bmRDb2xvcik7Ci0JCWltYWdlTm9kZTEuc2V0Rm9yZWdyb3VuZCAoaXRlbUZvcmVncm91bmRDb2xvcik7Ci0JCS8qIFNldCB0aGUgZm9yZWdyb3VuZCBidXR0b24ncyBjb2xvciB0byBtYXRjaCB0aGUgY29sb3IganVzdCBzZXQuICovCi0JCUNvbG9yIGNvbG9yID0gaXRlbUZvcmVncm91bmRDb2xvcjsKLQkJaWYgKGNvbG9yID09IG51bGwpIGNvbG9yID0gdGV4dE5vZGUxLmdldEZvcmVncm91bmQgKCk7Ci0JCWRyYXdJbWFnZSAoaXRlbUZvcmVncm91bmRJbWFnZSwgY29sb3IpOwotCQlpdGVtRm9yZWdyb3VuZEJ1dHRvbi5zZXRJbWFnZSAoaXRlbUZvcmVncm91bmRJbWFnZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgb2YgdGhlIE5vZGUgMSBUcmVlSXRlbXMuCi0JICovCi0Jdm9pZCBzZXRJdGVtRm9udCAoKSB7Ci0JCWlmIChpbnN0YW5jZS5zdGFydHVwKSByZXR1cm47Ci0JCXRleHROb2RlMS5zZXRGb250IChpdGVtRm9udCk7Ci0JCWltYWdlTm9kZTEuc2V0Rm9udCAoaXRlbUZvbnQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGhlYWRlciB2aXNpYmxlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldEhlYWRlclZpc2libGUgKCkgewotCQl0cmVlMS5zZXRIZWFkZXJWaXNpYmxlIChoZWFkZXJWaXNpYmxlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXRyZWUyLnNldEhlYWRlclZpc2libGUgKGhlYWRlclZpc2libGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbGluZXMgdmlzaWJsZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRMaW5lc1Zpc2libGUgKCkgewotCQl0cmVlMS5zZXRMaW5lc1Zpc2libGUgKGxpbmVzVmlzaWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQl0cmVlMi5zZXRMaW5lc1Zpc2libGUgKGxpbmVzVmlzaWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2JvbGQuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvYm9sZC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTM2Y2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvYm9sZC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9ib2xkX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvYm9sZF9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2MzQyOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9ib2xkX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvY2xvc2VkRm9sZGVyLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2Nsb3NlZEZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NjBkMGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvY2xvc2VkRm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2l0YWxpYy5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9pdGFsaWMuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjA3MWY2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2l0YWxpYy5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9pdGFsaWNfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9pdGFsaWNfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZjIzNTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvaXRhbGljX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvb3BlbkZvbGRlci5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9vcGVuRm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5OTQzZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9vcGVuRm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3JlZC5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9yZWQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTU2M2ZmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3JlZC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9yZWRfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9yZWRfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNTljMDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvcmVkX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvc3RyaWtlb3V0LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3N0cmlrZW91dC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMjFiM2MuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvc3RyaWtlb3V0LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3N0cmlrZW91dF9tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3N0cmlrZW91dF9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiNDhmYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9zdHJpa2VvdXRfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS90YXJnZXQuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvdGFyZ2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwN2FlNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS90YXJnZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvdW5kZXJsaW5lLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3VuZGVybGluZS5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZTI4ZTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvdW5kZXJsaW5lLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3VuZGVybGluZV9tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3VuZGVybGluZV9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxNWQ4Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS91bmRlcmxpbmVfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS95ZWxsb3cuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUveWVsbG93LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRhOWMxZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS95ZWxsb3cuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUveWVsbG93X21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUveWVsbG93X21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzU5YzA4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3llbGxvd19tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2RuZC9ETkRFeGFtcGxlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9kbmQvRE5ERXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTJmOWFkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2RuZC9ETkRFeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZG5kOwotCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBETkRFeGFtcGxlIHsKLQkKLQlwcml2YXRlIGludCBkcmFnT3BlcmF0aW9uID0gMDsKLQlwcml2YXRlIFRyYW5zZmVyW10gZHJhZ1R5cGVzID0gbmV3IFRyYW5zZmVyWzBdOwotCXByaXZhdGUgQ29udHJvbCBkcmFnQ29udHJvbDsKLQlwcml2YXRlIGludCBkcmFnQ29udHJvbFR5cGUgPSAwOwotCXByaXZhdGUgRHJhZ1NvdXJjZSBkcmFnU291cmNlOwotCXByaXZhdGUgU3RyaW5nIGRyYWdEYXRhVGV4dDsKLQlwcml2YXRlIFN0cmluZyBkcmFnRGF0YVJURjsKLQlwcml2YXRlIFN0cmluZyBkcmFnRGF0YUhUTUw7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBkcmFnRGF0YUZpbGVzOwotCXByaXZhdGUgTGlzdCBmaWxlTGlzdDsKLQlwcml2YXRlIGJvb2xlYW4gZHJhZ0VuYWJsZWQgPSBmYWxzZTsKLQkKLQlwcml2YXRlIGludCBkcm9wT3BlcmF0aW9uID0gMDsKLQlwcml2YXRlIGludCBkcm9wRmVlZGJhY2sgPSAwOwotCXByaXZhdGUgaW50IGRyb3BEZWZhdWx0T3BlcmF0aW9uID0gMDsKLQlwcml2YXRlIFRyYW5zZmVyW10gZHJvcFR5cGVzID0gbmV3IFRyYW5zZmVyWzBdOwotCXByaXZhdGUgRHJvcFRhcmdldCBkcm9wVGFyZ2V0OwotCXByaXZhdGUgQ29udHJvbCBkcm9wQ29udHJvbDsKLQlwcml2YXRlIGludCBkcm9wQ29udHJvbFR5cGUgPSAwOwotCXByaXZhdGUgQ29tcG9zaXRlIGRlZmF1bHRQYXJlbnQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRyb3BFbmFibGVkID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBUZXh0IGRyYWdDb25zb2xlOwotCXByaXZhdGUgYm9vbGVhbiBkcmFnRXZlbnREZXRhaWwgPSBmYWxzZTsKLQlwcml2YXRlIFRleHQgZHJvcENvbnNvbGU7Ci0JcHJpdmF0ZSBib29sZWFuIGRyb3BFdmVudERldGFpbCA9IGZhbHNlOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVVRUT05fVE9HR0xFID0gMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX1JBRElPID0gMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX0NIRUNLID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FOVkFTID0gMzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFCRUwgPSA0OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSVNUID0gNTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCTEUgPSA2OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkVFID0gNzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVYVCA9IDg7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlETkRFeGFtcGxlIGV4YW1wbGUgPSBuZXcgRE5ERXhhbXBsZSgpOwotCWV4YW1wbGUub3BlbihkaXNwbGF5KTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGFkZERyYWdUcmFuc2ZlcihUcmFuc2ZlciB0cmFuc2Zlcil7Ci0JVHJhbnNmZXJbXSBuZXdUeXBlcyA9IG5ldyBUcmFuc2ZlcltkcmFnVHlwZXMubGVuZ3RoICsgMV07Ci0JU3lzdGVtLmFycmF5Y29weShkcmFnVHlwZXMsIDAsIG5ld1R5cGVzLCAwLCBkcmFnVHlwZXMubGVuZ3RoKTsKLQluZXdUeXBlc1tkcmFnVHlwZXMubGVuZ3RoXSA9IHRyYW5zZmVyOwotCWRyYWdUeXBlcyA9IG5ld1R5cGVzOwotCWlmIChkcmFnU291cmNlICE9IG51bGwpIHsKLQkJZHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihkcmFnVHlwZXMpOwotCX0KLX0KLQotcHJpdmF0ZSB2b2lkIGFkZERyb3BUcmFuc2ZlcihUcmFuc2ZlciB0cmFuc2Zlcil7Ci0JVHJhbnNmZXJbXSBuZXdUeXBlcyA9IG5ldyBUcmFuc2Zlcltkcm9wVHlwZXMubGVuZ3RoICsgMV07Ci0JU3lzdGVtLmFycmF5Y29weShkcm9wVHlwZXMsIDAsIG5ld1R5cGVzLCAwLCBkcm9wVHlwZXMubGVuZ3RoKTsKLQluZXdUeXBlc1tkcm9wVHlwZXMubGVuZ3RoXSA9IHRyYW5zZmVyOwotCWRyb3BUeXBlcyA9IG5ld1R5cGVzOwotCWlmIChkcm9wVGFyZ2V0ICE9IG51bGwpIHsKLQkJZHJvcFRhcmdldC5zZXRUcmFuc2Zlcihkcm9wVHlwZXMpOwotCX0KLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZURyYWdPcGVyYXRpb25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JZmluYWwgQnV0dG9uIG1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQltb3ZlQnV0dG9uLnNldFRleHQoIkRORC5EUk9QX01PVkUiKTsKLQltb3ZlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQlkcmFnT3BlcmF0aW9uID0gRE5ELkRST1BfTU9WRTsKLQltb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyYWdPcGVyYXRpb24gfD0gRE5ELkRST1BfTU9WRTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJhZ09wZXJhdGlvbiA9IGRyYWdPcGVyYXRpb24gJn5ETkQuRFJPUF9NT1ZFOwotCQkJCWlmIChkcmFnT3BlcmF0aW9uID09IDApIHsKLQkJCQkJZHJhZ09wZXJhdGlvbiA9IERORC5EUk9QX01PVkU7Ci0JCQkJCW1vdmVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkcmFnRW5hYmxlZCkgewotCQkJCWNyZWF0ZURyYWdTb3VyY2UoKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIkRORC5EUk9QX0NPUFkiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyYWdPcGVyYXRpb24gfD0gRE5ELkRST1BfQ09QWTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJhZ09wZXJhdGlvbiA9IGRyYWdPcGVyYXRpb24gJn5ETkQuRFJPUF9DT1BZOwotCQkJCWlmIChkcmFnT3BlcmF0aW9uID09IDApIHsKLQkJCQkJZHJhZ09wZXJhdGlvbiA9IERORC5EUk9QX01PVkU7Ci0JCQkJCW1vdmVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkcmFnRW5hYmxlZCkgewotCQkJCWNyZWF0ZURyYWdTb3VyY2UoKTsKLQkJCX0KLQkJfQotCX0pOwotCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRE5ELkRST1BfTElOSyIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJhZ09wZXJhdGlvbiB8PSBETkQuRFJPUF9MSU5LOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcmFnT3BlcmF0aW9uID0gZHJhZ09wZXJhdGlvbiAmfkRORC5EUk9QX0xJTks7Ci0JCQkJaWYgKGRyYWdPcGVyYXRpb24gPT0gMCkgewotCQkJCQlkcmFnT3BlcmF0aW9uID0gRE5ELkRST1BfTU9WRTsKLQkJCQkJbW92ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRyYWdFbmFibGVkKSB7Ci0JCQkJY3JlYXRlRHJhZ1NvdXJjZSgpOwotCQkJfQotCQl9Ci0JfSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVEcmFnU291cmNlKCkgewotCWlmIChkcmFnU291cmNlICE9IG51bGwpIGRyYWdTb3VyY2UuZGlzcG9zZSgpOwotCWRyYWdTb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZShkcmFnQ29udHJvbCwgZHJhZ09wZXJhdGlvbik7Ci0JZHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihkcmFnVHlwZXMpOwotCWRyYWdTb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJZHJhZ0NvbnNvbGUuYXBwZW5kKCI+PmRyYWdGaW5pc2hlZFxuIik7Ci0JCQlwcmludEV2ZW50KGV2ZW50KTsKLQkJCWRyYWdEYXRhVGV4dCA9IGRyYWdEYXRhUlRGID0gZHJhZ0RhdGFIVE1MID0gbnVsbDsKLQkJCWRyYWdEYXRhRmlsZXMgPSBudWxsOwotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9NT1ZFKSB7Ci0JCQkJc3dpdGNoKGRyYWdDb250cm9sVHlwZSkgewotCQkJCQljYXNlIEJVVFRPTl9DSEVDSzoKLQkJCQkJY2FzZSBCVVRUT05fVE9HR0xFOgotCQkJCQljYXNlIEJVVFRPTl9SQURJTzogewotCQkJCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWRyYWdDb250cm9sOwotCQkJCQkJYi5zZXRUZXh0KCIiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgVEFCTEU6IHsKLQkJCQkJCVRhYmxlIHRhYmxlID0gKFRhYmxlKWRyYWdDb250cm9sOwotCQkJCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlpdGVtc1tpXS5kaXNwb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIFRFWFQ6IHsKLQkJCQkJCVRleHQgdGV4dCA9IChUZXh0KWRyYWdDb250cm9sOwotCQkJCQkJdGV4dC5jbGVhclNlbGVjdGlvbigpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBUUkVFOiB7Ci0JCQkJCQlUcmVlIHRyZWUgPSAoVHJlZSlkcmFnQ29udHJvbDsKLQkJCQkJCVRyZWVJdGVtW10gaXRlbXMgPSB0cmVlLmdldFNlbGVjdGlvbigpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWl0ZW1zW2ldLmRpc3Bvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgQ0FOVkFTOiB7Ci0JCQkJCQlkcmFnQ29udHJvbC5zZXREYXRhKCJTVFJJTkdTIiwgbnVsbCk7Ci0JCQkJCQlkcmFnQ29udHJvbC5yZWRyYXcoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgTEFCRUw6IHsKLQkJCQkJCUxhYmVsIGxhYmVsID0gKExhYmVsKWRyYWdDb250cm9sOwotCQkJCQkJbGFiZWwuc2V0VGV4dCgiIik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIExJU1Q6IHsKLQkJCQkJCUxpc3QgbGlzdCA9IChMaXN0KWRyYWdDb250cm9sOwotCQkJCQkJaW50W10gaW5kaWNlcyA9IGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpOwotCQkJCQkJbGlzdC5yZW1vdmUoaW5kaWNlcyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJZHJhZ0NvbnNvbGUuYXBwZW5kKCI+PmRyYWdTZXREYXRhXG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQkJaWYgKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsKLQkJCQlldmVudC5kYXRhID0gZHJhZ0RhdGFUZXh0OwotCQkJfQotCQkJaWYgKFJURlRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotCQkJCWV2ZW50LmRhdGEgPSBkcmFnRGF0YVJURjsKLQkJCX0KLQkJCWlmIChIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQkJZXZlbnQuZGF0YSA9IGRyYWdEYXRhSFRNTDsKLQkJCX0KLQkJCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQkJZXZlbnQuZGF0YSA9IGRyYWdEYXRhRmlsZXM7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlkcmFnQ29uc29sZS5hcHBlbmQoIj4+ZHJhZ1N0YXJ0XG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQkJZHJhZ0RhdGFGaWxlcyA9IGZpbGVMaXN0LmdldEl0ZW1zKCk7Ci0JCQlzd2l0Y2goZHJhZ0NvbnRyb2xUeXBlKSB7Ci0JCQkJY2FzZSBCVVRUT05fQ0hFQ0s6Ci0JCQkJY2FzZSBCVVRUT05fVE9HR0xFOgotCQkJCWNhc2UgQlVUVE9OX1JBRElPOiB7Ci0JCQkJCUJ1dHRvbiBiID0gKEJ1dHRvbilkcmFnQ29udHJvbDsKLQkJCQkJZHJhZ0RhdGFUZXh0ID0gYi5nZXRTZWxlY3Rpb24oKSA/ICJ0cnVlIiA6ICJmYWxzZSI7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFRBQkxFOiB7Ci0JCQkJCVRhYmxlIHRhYmxlID0gKFRhYmxlKWRyYWdDb250cm9sOwotCQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHsKLQkJCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChpdGVtc1tpXS5nZXRUZXh0KCkpOwotCQkJCQkJCWlmIChpdGVtcy5sZW5ndGggPiAxICYmIGkgPCBpdGVtcy5sZW5ndGggLSAxKSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZHJhZ0RhdGFUZXh0ID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgVEVYVDogewotCQkJCQlUZXh0IHRleHQgPSAoVGV4dClkcmFnQ29udHJvbDsKLQkJCQkJU3RyaW5nIHMgPSB0ZXh0LmdldFNlbGVjdGlvblRleHQoKTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZHJhZ0RhdGFUZXh0ID0gczsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBUUkVFOiB7Ci0JCQkJCVRyZWUgdHJlZSA9IChUcmVlKWRyYWdDb250cm9sOwotCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoaXRlbXNbaV0uZ2V0VGV4dCgpKTsKLQkJCQkJCQlpZiAoaXRlbXMubGVuZ3RoID4gMSAmJiBpIDwgaXRlbXMubGVuZ3RoIC0gMSkgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWRyYWdEYXRhVGV4dCA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIENBTlZBUzogewotCQkJCQlTdHJpbmdbXSBzdHJpbmdzID0gKFN0cmluZ1tdKWRyYWdDb250cm9sLmdldERhdGEoIlNUUklOR1MiKTsKLQkJCQkJaWYgKHN0cmluZ3MgPT0gbnVsbCB8fCBzdHJpbmdzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChzdHJpbmdzW2ldKTsKLQkJCQkJCQlpZiAoc3RyaW5ncy5sZW5ndGggPiAxICYmIGkgPCBzdHJpbmdzLmxlbmd0aCAtIDEpIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlkcmFnRGF0YVRleHQgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBMQUJFTDogewotCQkJCQlMYWJlbCBsYWJlbCA9IChMYWJlbClkcmFnQ29udHJvbDsKLQkJCQkJU3RyaW5nIHN0cmluZyA9IGxhYmVsLmdldFRleHQoKTsKLQkJCQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkcmFnRGF0YVRleHQgPSBzdHJpbmc7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTElTVDogewotCQkJCQlMaXN0IGxpc3QgPSAoTGlzdClkcmFnQ29udHJvbDsKLQkJCQkJU3RyaW5nW10gc2VsZWN0aW9uID0gbGlzdC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkgewotCQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChzZWxlY3Rpb25baV0pOwotCQkJCQkJCWlmIChzZWxlY3Rpb24ubGVuZ3RoID4gMSAmJiBpIDwgc2VsZWN0aW9uLmxlbmd0aCAtIDEpIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlkcmFnRGF0YVRleHQgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgbmV3IFNXVEVycm9yKFNXVC5FUlJPUl9OT1RfSU1QTEVNRU5URUQpOwotCQkJfQotCQkJaWYgKGRyYWdEYXRhVGV4dCAhPSBudWxsKSB7Ci0JCQkJZHJhZ0RhdGFSVEYgPSAie1xccnRmMXtcXGNvbG9ydGJsO1xccmVkMjU1XFxncmVlbjBcXGJsdWUwO31cXGNmMVxcYiAiK2RyYWdEYXRhVGV4dCsifSI7Ci0JCQkJZHJhZ0RhdGFIVE1MID0gIjxiPiIrZHJhZ0RhdGFUZXh0KyI8L2I+IjsKLQkJCX0KLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkcmFnVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZHJhZ1R5cGVzW2ldIGluc3RhbmNlb2YgVGV4dFRyYW5zZmVyICYmIGRyYWdEYXRhVGV4dCA9PSBudWxsKSB7Ci0JCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKGRyYWdUeXBlc1tpXSBpbnN0YW5jZW9mIFJURlRyYW5zZmVyICYmIGRyYWdEYXRhUlRGID09IG51bGwpIHsKLQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoZHJhZ1R5cGVzW2ldIGluc3RhbmNlb2YgSFRNTFRyYW5zZmVyICYmIGRyYWdEYXRhSFRNTCA9PSBudWxsKSB7Ci0JCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKGRyYWdUeXBlc1tpXSBpbnN0YW5jZW9mIEZpbGVUcmFuc2ZlciAmJiAoZHJhZ0RhdGFGaWxlcyA9PSBudWxsIHx8IGRyYWdEYXRhRmlsZXMubGVuZ3RoID09IDApKSB7Ci0JCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZURyYWdUeXBlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiVGV4dCBUcmFuc2ZlciIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYWRkRHJhZ1RyYW5zZmVyKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcmVtb3ZlRHJhZ1RyYW5zZmVyKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIlJURiBUcmFuc2ZlciIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYWRkRHJhZ1RyYW5zZmVyKFJURlRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcmFnVHJhbnNmZXIoUlRGVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJIVE1MIFRyYW5zZmVyIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlhZGREcmFnVHJhbnNmZXIoSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcmFnVHJhbnNmZXIoSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRmlsZSBUcmFuc2ZlciIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlhZGREcmFnVHJhbnNmZXIoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcmFnVHJhbnNmZXIoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJTZWxlY3QgRmlsZShzKSIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhmaWxlTGlzdC5nZXRTaGVsbCgpLCBTV1QuT1BFTiB8IFNXVC5NVUxUSSk7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoKCkgPiAwKXsKLQkJCQlmaWxlTGlzdC5yZW1vdmVBbGwoKTsKLQkJCQlTdHJpbmcgc2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOwotCQkJCVN0cmluZyBwYXRoID0gZGlhbG9nLmdldEZpbHRlclBhdGgoKTsKLQkJCQlTdHJpbmdbXSBuYW1lcyA9IGRpYWxvZy5nZXRGaWxlTmFtZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWZpbGVMaXN0LmFkZChwYXRoK3NlcGFyYXRvcituYW1lc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0JZmlsZUxpc3QgPSBuZXcgTGlzdChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQlmaWxlTGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlRHJhZ1dpZGdldChDb21wb3NpdGUgcGFyZW50KSB7Ci0JcGFyZW50LnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCWNvbWJvLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7IlRvZ2dsZSBCdXR0b24iLCAiUmFkaW8gQnV0dG9uIiwgIkNoZWNrYm94IiwgIkNhbnZhcyIsICJMYWJlbCIsICJMaXN0IiwgIlRhYmxlIiwgIlRyZWUifSk7Ci0JY29tYm8uc2VsZWN0KExBQkVMKTsKLQlkcmFnQ29udHJvbFR5cGUgPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCWRyYWdDb250cm9sID0gY3JlYXRlV2lkZ2V0KGRyYWdDb250cm9sVHlwZSwgcGFyZW50LCAiRHJhZyBTb3VyY2UiKTsKLQkKLQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJT2JqZWN0IGRhdGEgPSBkcmFnQ29udHJvbC5nZXRMYXlvdXREYXRhKCk7Ci0JCQlDb21wb3NpdGUgcGFyZW50ID0gZHJhZ0NvbnRyb2wuZ2V0UGFyZW50KCk7Ci0JCQlkcmFnQ29udHJvbC5kaXNwb3NlKCk7Ci0JCQlDb21ibyBjID0gKENvbWJvKWUud2lkZ2V0OyAKLQkJCWRyYWdDb250cm9sVHlwZSA9IGMuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCWRyYWdDb250cm9sID0gY3JlYXRlV2lkZ2V0KGRyYWdDb250cm9sVHlwZSwgcGFyZW50LCAiRHJhZyBTb3VyY2UiKTsKLQkJCWRyYWdDb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlpZiAoZHJhZ0VuYWJsZWQpIGNyZWF0ZURyYWdTb3VyY2UoKTsKLQkJCXBhcmVudC5sYXlvdXQoKTsKLQkJfQotCX0pOwotCQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJEcmFnU291cmNlIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJZHJhZ0VuYWJsZWQgPSBiLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGRyYWdFbmFibGVkKSB7Ci0JCQkJY3JlYXRlRHJhZ1NvdXJjZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZHJhZ1NvdXJjZSAhPSBudWxsKXsKLQkJCQkJZHJhZ1NvdXJjZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCWRyYWdTb3VyY2UgPSBudWxsOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChjb21ibywgLTEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWRyYWdDb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tYm8sIDEwKTsKLQliLnNldExheW91dERhdGEoZGF0YSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVEcm9wT3BlcmF0aW9ucyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JcGFyZW50LnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCWZpbmFsIEJ1dHRvbiBtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JbW92ZUJ1dHRvbi5zZXRUZXh0KCJETkQuRFJPUF9NT1ZFIik7Ci0JbW92ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JZHJvcE9wZXJhdGlvbiA9IERORC5EUk9QX01PVkU7Ci0JbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wT3BlcmF0aW9uIHw9IERORC5EUk9QX01PVkU7CQkJCi0JCQl9IGVsc2UgewotCQkJCWRyb3BPcGVyYXRpb24gPSBkcm9wT3BlcmF0aW9uICYgfkRORC5EUk9QX01PVkU7Ci0JCQkJaWYgKGRyb3BPcGVyYXRpb24gPT0gMCB8fCAoZHJvcERlZmF1bHRPcGVyYXRpb24gJiBETkQuRFJPUF9NT1ZFKSAhPSAwKSB7Ci0JCQkJCWRyb3BPcGVyYXRpb24gfD0gRE5ELkRST1BfTU9WRTsKLQkJCQkJbW92ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRyb3BFbmFibGVkKSB7Ci0JCQkJY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0KLQlmaW5hbCBCdXR0b24gY29weUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWNvcHlCdXR0b24uc2V0VGV4dCgiRE5ELkRST1BfQ09QWSIpOwotCWNvcHlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJvcE9wZXJhdGlvbiB8PSBETkQuRFJPUF9DT1BZOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcm9wT3BlcmF0aW9uID0gZHJvcE9wZXJhdGlvbiAmIH5ETkQuRFJPUF9DT1BZOwotCQkJCWlmIChkcm9wT3BlcmF0aW9uID09IDAgfHwgKGRyb3BEZWZhdWx0T3BlcmF0aW9uICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgewotCQkJCQlkcm9wT3BlcmF0aW9uID0gRE5ELkRST1BfQ09QWTsKLQkJCQkJY29weUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRyb3BFbmFibGVkKSB7Ci0JCQkJY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQlmaW5hbCBCdXR0b24gbGlua0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWxpbmtCdXR0b24uc2V0VGV4dCgiRE5ELkRST1BfTElOSyIpOwotCWxpbmtCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJvcE9wZXJhdGlvbiB8PSBETkQuRFJPUF9MSU5LOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcm9wT3BlcmF0aW9uID0gZHJvcE9wZXJhdGlvbiAmIH5ETkQuRFJPUF9MSU5LOwotCQkJCWlmIChkcm9wT3BlcmF0aW9uID09IDAgfHwgKGRyb3BEZWZhdWx0T3BlcmF0aW9uICYgRE5ELkRST1BfTElOSykgIT0gMCkgewotCQkJCQlkcm9wT3BlcmF0aW9uID0gRE5ELkRST1BfTElOSzsKLQkJCQkJbGlua0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRyb3BFbmFibGVkKSB7Ci0JCQkJY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIkRORC5EUk9QX0RFRkFVTFQiKTsKLQlkZWZhdWx0UGFyZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BPcGVyYXRpb24gfD0gRE5ELkRST1BfREVGQVVMVDsKLQkJCQlkZWZhdWx0UGFyZW50LnNldFZpc2libGUodHJ1ZSk7CQkJCi0JCQl9IGVsc2UgewotCQkJCWRyb3BPcGVyYXRpb24gPSBkcm9wT3BlcmF0aW9uICYgfkRORC5EUk9QX0RFRkFVTFQ7Ci0JCQkJZGVmYXVsdFBhcmVudC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCX0KLQkJCWlmIChkcm9wRW5hYmxlZCkgewotCQkJCWNyZWF0ZURyb3BUYXJnZXQoKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCWRlZmF1bHRQYXJlbnQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5tYXJnaW5XaWR0aCA9IDIwOwotCWRlZmF1bHRQYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZGVmYXVsdFBhcmVudCwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoIlZhbHVlIGZvciBkZWZhdWx0IG9wZXJhdGlvbiBpczoiKTsKLQliID0gbmV3IEJ1dHRvbihkZWZhdWx0UGFyZW50LCBTV1QuUkFESU8pOwotCWIuc2V0VGV4dCgiRE5ELkRST1BfTU9WRSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJvcERlZmF1bHRPcGVyYXRpb24gPSBETkQuRFJPUF9NT1ZFOwotCQkJCWRyb3BPcGVyYXRpb24gfD0gRE5ELkRST1BfTU9WRTsKLQkJCQltb3ZlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlpZiAoZHJvcEVuYWJsZWQpIHsKLQkJCQkJY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCQotCWIgPSBuZXcgQnV0dG9uKGRlZmF1bHRQYXJlbnQsIFNXVC5SQURJTyk7Ci0JYi5zZXRUZXh0KCJETkQuRFJPUF9DT1BZIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRGVmYXVsdE9wZXJhdGlvbiA9IERORC5EUk9QX0NPUFk7Ci0JCQkJZHJvcE9wZXJhdGlvbiB8PSBETkQuRFJPUF9DT1BZOwotCQkJCWNvcHlCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCWlmIChkcm9wRW5hYmxlZCkgewotCQkJCQljcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0KLQliID0gbmV3IEJ1dHRvbihkZWZhdWx0UGFyZW50LCBTV1QuUkFESU8pOwotCWIuc2V0VGV4dCgiRE5ELkRST1BfTElOSyIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJvcERlZmF1bHRPcGVyYXRpb24gPSBETkQuRFJPUF9MSU5LOwotCQkJCWRyb3BPcGVyYXRpb24gfD0gRE5ELkRST1BfTElOSzsKLQkJCQlsaW5rQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlpZiAoZHJvcEVuYWJsZWQpIHsKLQkJCQkJY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCQotCWIgPSBuZXcgQnV0dG9uKGRlZmF1bHRQYXJlbnQsIFNXVC5SQURJTyk7Ci0JYi5zZXRUZXh0KCJETkQuRFJPUF9OT05FIik7Ci0JYi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRGVmYXVsdE9wZXJhdGlvbiA9IERORC5EUk9QX05PTkU7Ci0JCQkJZHJvcE9wZXJhdGlvbiAmPSB+RE5ELkRST1BfREVGQVVMVDsKLQkJCQlpZiAoZHJvcEVuYWJsZWQpIHsKLQkJCQkJY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlRHJvcFRhcmdldCgpIHsKLQlpZiAoZHJvcFRhcmdldCAhPSBudWxsKSBkcm9wVGFyZ2V0LmRpc3Bvc2UoKTsKLQlkcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQoZHJvcENvbnRyb2wsIGRyb3BPcGVyYXRpb24pOwotCWRyb3BUYXJnZXQuc2V0VHJhbnNmZXIoZHJvcFR5cGVzKTsKLQlkcm9wVGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlkcm9wQ29uc29sZS5hcHBlbmQoIj4+ZHJhZ0VudGVyXG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJZXZlbnQuZGV0YWlsID0gZHJvcERlZmF1bHRPcGVyYXRpb247Ci0JCQl9Ci0JCQlldmVudC5mZWVkYmFjayA9IGRyb3BGZWVkYmFjazsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnTGVhdmUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlkcm9wQ29uc29sZS5hcHBlbmQoIj4+ZHJhZ0xlYXZlXG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJZHJvcENvbnNvbGUuYXBwZW5kKCI+PmRyYWdPcGVyYXRpb25DaGFuZ2VkXG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJZXZlbnQuZGV0YWlsID0gZHJvcERlZmF1bHRPcGVyYXRpb247Ci0JCQl9Ci0JCQlldmVudC5mZWVkYmFjayA9IGRyb3BGZWVkYmFjazsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWRyb3BDb25zb2xlLmFwcGVuZCgiPj5kcmFnT3ZlclxuIik7Ci0JCQlwcmludEV2ZW50KGV2ZW50KTsKLQkJCWV2ZW50LmZlZWRiYWNrID0gZHJvcEZlZWRiYWNrOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlkcm9wQ29uc29sZS5hcHBlbmQoIj4+ZHJvcFxuIik7Ci0JCQlwcmludEV2ZW50KGV2ZW50KTsKLQkJCVN0cmluZ1tdIHN0cmluZ3MgPSBudWxsOwotCQkJaWYgKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpIHx8Ci0JCQkgICAgUlRGVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSB8fAotCQkJICAgIEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpKSB7Ci0JCQkgICAgc3RyaW5ncyA9IG5ldyBTdHJpbmdbXSB7KFN0cmluZylldmVudC5kYXRhfTsKLQkJCX0KLQkJCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSkgewotCQkJCXN0cmluZ3MgPSAoU3RyaW5nW10pZXZlbnQuZGF0YTsKLQkJCX0KLQkJCWlmIChzdHJpbmdzID09IG51bGwgfHwgc3RyaW5ncy5sZW5ndGggPT0gMCkgewotCQkJCWRyb3BDb25zb2xlLmFwcGVuZCgiISFJbnZhbGlkIGRhdGEgZHJvcHBlZCIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJaWYgKHN0cmluZ3MubGVuZ3RoID09IDEgJiYgKGRyb3BDb250cm9sVHlwZSA9PSBUQUJMRSB8fCAKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wQ29udHJvbFR5cGUgPT0gVFJFRSB8fCAKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wQ29udHJvbFR5cGUgPT0gTElTVCkpIHsKLQkJCQkvLyBjb252ZXJ0IHN0cmluZyBzZXBhcmF0ZWQgYnkgIlxuIiBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3MgCi0JCQkJU3RyaW5nIHN0cmluZyA9IHN0cmluZ3NbMF07Ci0JCQkJaW50IGNvdW50ID0gMDsKLQkJCQlpbnQgb2Zmc2V0ID0gc3RyaW5nLmluZGV4T2YoIlxuIiwgMCk7Ci0JCQkJd2hpbGUgKG9mZnNldCA+IDApIHsKLQkJCQkJY291bnQrKzsKLQkJCQkJb2Zmc2V0ID0gc3RyaW5nLmluZGV4T2YoIlxuIiwgb2Zmc2V0ICsgMSk7Ci0JCQkJfQotCQkJCWlmIChjb3VudCA+IDApIHsKLQkJCQkJc3RyaW5ncyA9IG5ldyBTdHJpbmdbY291bnQgKyAxXTsKLQkJCQkJaW50IHN0YXJ0ID0gMDsKLQkJCQkJaW50IGVuZCA9IHN0cmluZy5pbmRleE9mKCJcbiIpOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQl3aGlsZSAoc3RhcnQgPCBlbmQpIHsKLQkJCQkJCXN0cmluZ3NbaW5kZXgrK10gPSBzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotCQkJCQkJc3RhcnQgPSBlbmQgKyAxOwotCQkJCQkJZW5kID0gc3RyaW5nLmluZGV4T2YoIlxuIiwgc3RhcnQpOwotCQkJCQkJaWYgKGVuZCA9PSAtMSkgZW5kID0gc3RyaW5nLmxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3dpdGNoKGRyb3BDb250cm9sVHlwZSkgewotCQkJCWNhc2UgQlVUVE9OX0NIRUNLOgotCQkJCWNhc2UgQlVUVE9OX1RPR0dMRToKLQkJCQljYXNlIEJVVFRPTl9SQURJTzogewotCQkJCQlCdXR0b24gYiA9IChCdXR0b24pZHJvcENvbnRyb2w7Ci0JCQkJCWIuc2V0VGV4dChzdHJpbmdzWzBdKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgVEFCTEU6IHsKLQkJCQkJVGFibGUgdGFibGUgPSAoVGFibGUpZHJvcENvbnRyb2w7Ci0JCQkJCVBvaW50IHAgPSBldmVudC5kaXNwbGF5Lm1hcChudWxsLCB0YWJsZSwgZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJCVRhYmxlSXRlbSBkcm9wSXRlbSA9IHRhYmxlLmdldEl0ZW0ocCk7Ci0JCQkJCWludCBpbmRleCA9IGRyb3BJdGVtID09IG51bGwgPyB0YWJsZS5nZXRJdGVtQ291bnQoKSA6IHRhYmxlLmluZGV4T2YoZHJvcEl0ZW0pOwotCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSwgaW5kZXgpOwotCQkJCQkJaXRlbS5zZXRUZXh0KDAsIHN0cmluZ3NbaV0pOwotCQkJCQkJaXRlbS5zZXRUZXh0KDEsICJkcm9wcGVkIGl0ZW0iKTsKLQkJCQkJfQotCQkJCQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJCQkJY29sdW1uc1tpXS5wYWNrKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgVEVYVDogewotCQkJCQlUZXh0IHRleHQgPSAoVGV4dClkcm9wQ29udHJvbDsKLQkJCQkJZm9yKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXRleHQuYXBwZW5kKHN0cmluZ3NbaV0rIlxuIik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgVFJFRTogewotCQkJCQlUcmVlIHRyZWUgPSAoVHJlZSlkcm9wQ29udHJvbDsKLQkJCQkJUG9pbnQgcCA9IGV2ZW50LmRpc3BsYXkubWFwKG51bGwsIHRyZWUsIGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCQlUcmVlSXRlbSBwYXJlbnRJdGVtID0gdHJlZS5nZXRJdGVtKHApOwotCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCQkJVHJlZUl0ZW0gaXRlbSA9IHBhcmVudEl0ZW0gIT0gbnVsbCA/IG5ldyBUcmVlSXRlbShwYXJlbnRJdGVtLCBTV1QuTk9ORSkgOiBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQkJCQkJaXRlbS5zZXRUZXh0KHN0cmluZ3NbaV0pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIENBTlZBUzogewotCQkJCQlkcm9wQ29udHJvbC5zZXREYXRhKCJTVFJJTkdTIiwgc3RyaW5ncyk7Ci0JCQkJCWRyb3BDb250cm9sLnJlZHJhdygpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBMQUJFTDogewotCQkJCQlMYWJlbCBsYWJlbCA9IChMYWJlbClkcm9wQ29udHJvbDsKLQkJCQkJbGFiZWwuc2V0VGV4dChzdHJpbmdzWzBdKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTElTVDogewotCQkJCQlMaXN0IGxpc3QgPSAoTGlzdClkcm9wQ29udHJvbDsKLQkJCQkJZm9yKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWxpc3QuYWRkKHN0cmluZ3NbaV0pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlkZWZhdWx0OgotCQkJCQl0aHJvdyBuZXcgU1dURXJyb3IoU1dULkVSUk9SX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWRyb3BDb25zb2xlLmFwcGVuZCgiPj5kcm9wQWNjZXB0XG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQl9Ci0JfSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVGZWVkYmFja1R5cGVzKEdyb3VwIHBhcmVudCkgewotCXBhcmVudC5zZXRMYXlvdXQobmV3IFJvd0xheW91dChTV1QuVkVSVElDQUwpKTsKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRkVFREJBQ0tfU0VMRUNUIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX1NFTEVDVDsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJvcEZlZWRiYWNrICY9IH5ETkQuRkVFREJBQ0tfU0VMRUNUOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRkVFREJBQ0tfU0NST0xMIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX1NDUk9MTDsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJvcEZlZWRiYWNrICY9IH5ETkQuRkVFREJBQ0tfU0NST0xMOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRkVFREJBQ0tfSU5TRVJUX0JFRk9SRSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJvcEZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19JTlNFUlRfQkVGT1JFOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcm9wRmVlZGJhY2sgJj0gfkRORC5GRUVEQkFDS19JTlNFUlRfQkVGT1JFOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRkVFREJBQ0tfSU5TRVJUX0FGVEVSIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUjsKLQkJCX0gZWxzZSB7Ci0JCQkJZHJvcEZlZWRiYWNrICY9IH5ETkQuRkVFREJBQ0tfSU5TRVJUX0FGVEVSOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRkVFREJBQ0tfRVhQQU5EIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0VYUEFORDsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJvcEZlZWRiYWNrICY9IH5ETkQuRkVFREJBQ0tfRVhQQU5EOwotCQkJfQotCQl9Ci0JfSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVEcm9wVHlwZXMoQ29tcG9zaXRlIHBhcmVudCkgewotCXBhcmVudC5zZXRMYXlvdXQobmV3IFJvd0xheW91dChTV1QuVkVSVElDQUwpKTsKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiVGV4dCBUcmFuc2ZlciIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYWRkRHJvcFRyYW5zZmVyKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcmVtb3ZlRHJvcFRyYW5zZmVyKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIlJURiBUcmFuc2ZlciIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYWRkRHJvcFRyYW5zZmVyKFJURlRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcm9wVHJhbnNmZXIoUlRGVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJIVE1MIFRyYW5zZmVyIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlhZGREcm9wVHJhbnNmZXIoSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcm9wVHJhbnNmZXIoSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRmlsZSBUcmFuc2ZlciIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYWRkRHJvcFRyYW5zZmVyKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcmVtb3ZlRHJvcFRyYW5zZmVyKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCX0KLQkJfQotCX0pOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlRHJvcFdpZGdldChDb21wb3NpdGUgcGFyZW50KSB7Ci0JcGFyZW50LnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCWNvbWJvLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7IlRvZ2dsZSBCdXR0b24iLCAiUmFkaW8gQnV0dG9uIiwgIkNoZWNrYm94IiwgIkNhbnZhcyIsICJMYWJlbCIsICJMaXN0IiwgIlRhYmxlIiwgIlRyZWUiLCAiVGV4dCJ9KTsKLQljb21iby5zZWxlY3QoTEFCRUwpOwotCWRyb3BDb250cm9sVHlwZSA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JZHJvcENvbnRyb2wgPSBjcmVhdGVXaWRnZXQoZHJvcENvbnRyb2xUeXBlLCBwYXJlbnQsICJEcm9wIFRhcmdldCIpOwotCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlPYmplY3QgZGF0YSA9IGRyb3BDb250cm9sLmdldExheW91dERhdGEoKTsKLQkJCUNvbXBvc2l0ZSBwYXJlbnQgPSBkcm9wQ29udHJvbC5nZXRQYXJlbnQoKTsKLQkJCWRyb3BDb250cm9sLmRpc3Bvc2UoKTsKLQkJCUNvbWJvIGMgPSAoQ29tYm8pZS53aWRnZXQ7Ci0JCQlkcm9wQ29udHJvbFR5cGUgPSBjLmdldFNlbGVjdGlvbkluZGV4KCk7IAotCQkJZHJvcENvbnRyb2wgPSBjcmVhdGVXaWRnZXQoZHJvcENvbnRyb2xUeXBlLCBwYXJlbnQsICJEcm9wIFRhcmdldCIpOwotCQkJZHJvcENvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWlmIChkcm9wRW5hYmxlZCkgY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJcGFyZW50LmxheW91dCgpOwotCQl9Ci0JfSk7Ci0JCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIkRyb3BUYXJnZXQiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlkcm9wRW5hYmxlZCA9IGIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoZHJvcEVuYWJsZWQpIHsKLQkJCQljcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChkcm9wVGFyZ2V0ICE9IG51bGwpewotCQkJCQlkcm9wVGFyZ2V0LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJZHJvcFRhcmdldCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbWJvLCAtMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMCk7Ci0JZHJvcENvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjb21ibywgMTApOwotCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLX0KLQotcHJpdmF0ZSBDb250cm9sIGNyZWF0ZVdpZGdldChpbnQgdHlwZSwgQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHByZWZpeCl7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgQlVUVE9OX0NIRUNLOiB7Ci0JCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCQlidXR0b24uc2V0VGV4dChwcmVmaXgrIiBDaGVjayBib3giKTsKLQkJCXJldHVybiBidXR0b247Ci0JCX0KLQkJY2FzZSBCVVRUT05fVE9HR0xFOiB7Ci0JCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5UT0dHTEUpOwotCQkJYnV0dG9uLnNldFRleHQocHJlZml4KyIgVG9nZ2xlIGJ1dHRvbiIpOwotCQkJcmV0dXJuIGJ1dHRvbjsKLQkJfQotCQljYXNlIEJVVFRPTl9SQURJTzogewotCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotCQkJYnV0dG9uLnNldFRleHQocHJlZml4KyIgUmFkaW8gYnV0dG9uIik7Ci0JCQlyZXR1cm4gYnV0dG9uOwotCQl9Ci0JCWNhc2UgVEFCTEU6IHsKLQkJCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCQlpdGVtLnNldFRleHQoMCwgcHJlZml4KyIgbmFtZSAiICsgaSk7Ci0JCQkJaXRlbS5zZXRUZXh0KDEsIHByZWZpeCsiIHZhbHVlICIgKyBpKTsKLQkJCX0KLQkJCWNvbHVtbjEucGFjaygpOwotCQkJY29sdW1uMi5wYWNrKCk7Ci0JCQlyZXR1cm4gdGFibGU7Ci0JCX0KLQkJY2FzZSBURVhUOiB7Ci0JCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkJdGV4dC5zZXRUZXh0KHByZWZpeCsiIFRleHQiKTsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JCWNhc2UgVFJFRTogewotCQkJVHJlZSB0cmVlID0gbmV3IFRyZWUocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCQkJaXRlbS5zZXRUZXh0KHByZWZpeCsiIGl0ZW0gIiArIGkpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgMzsgaisrKSB7Ci0JCQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJCQlzdWJJdGVtLnNldFRleHQocHJlZml4KyIgaXRlbSAiICsgaik7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgMzsgaysrKSB7Ci0JCQkJCQlUcmVlSXRlbSBzdWJzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHN1Ykl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJCXN1YnN1Ykl0ZW0uc2V0VGV4dChwcmVmaXgrIiBpdGVtICIgKyBrKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cmVlOwotCQl9Ci0JCWNhc2UgQ0FOVkFTOiB7Ci0JCQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhwYXJlbnQsIFNXVC5CT1JERVIpOwotCQkJY2FudmFzLnNldERhdGEoIlNUUklOR1MiLCBuZXcgU3RyaW5nW10ge3ByZWZpeCsiIENhbnZhcyB3aWRnZXQifSk7Ci0JCQljYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQkJCUNhbnZhcyBjID0gKENhbnZhcyllLndpZGdldDsKLQkJCQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpYy5nZXREYXRhKCJJTUFHRSIpOwotCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UsIDUsIDUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nW10gc3RyaW5ncyA9IChTdHJpbmdbXSljLmdldERhdGEoIlNUUklOR1MiKTsKLQkJCQkJCWlmIChzdHJpbmdzICE9IG51bGwpIHsKLQkJCQkJCQlGb250TWV0cmljcyBtZXRyaWNzID0gZS5nYy5nZXRGb250TWV0cmljcygpOwotCQkJCQkJCWludCBoZWlnaHQgPSBtZXRyaWNzLmdldEhlaWdodCgpOwotCQkJCQkJCWludCB5ID0gNTsKLQkJCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQllLmdjLmRyYXdTdHJpbmcoc3RyaW5nc1tpXSwgNSwgeSk7Ci0JCQkJCQkJCXkgKz0gaGVpZ2h0ICsgNTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCXJldHVybiBjYW52YXM7Ci0JCX0KLQkJY2FzZSBMQUJFTDogewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJCWxhYmVsLnNldFRleHQocHJlZml4KyIgTGFiZWwiKTsKLQkJCXJldHVybiBsYWJlbDsKLQkJfQotCQljYXNlIExJU1Q6IHsKLQkJCUxpc3QgbGlzdCA9IG5ldyBMaXN0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCQlsaXN0LnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7cHJlZml4KyIgSXRlbSBhIiwgcHJlZml4KyIgSXRlbSBiIiwgIHByZWZpeCsiIEl0ZW0gYyIsICBwcmVmaXgrIiBJdGVtIGQifSk7Ci0JCQlyZXR1cm4gbGlzdDsKLQkJfQotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IFNXVEVycm9yKFNXVC5FUlJPUl9OT1RfSU1QTEVNRU5URUQpOwotCX0KLX0KLQotcHVibGljIHZvaWQgb3BlbihEaXNwbGF5IGRpc3BsYXkpIHsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJEcmFnIGFuZCBEcm9wIEV4YW1wbGUiKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCi0JU2Nyb2xsZWRDb21wb3NpdGUgc2MgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoc2hlbGwsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoc2MsIFNXVC5OT05FKTsKLQlzYy5zZXRDb250ZW50KHBhcmVudCk7Ci0JcGFyZW50LnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkKLQlMYWJlbCBkcmFnTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JZHJhZ0xhYmVsLnNldFRleHQoIkRyYWcgU291cmNlOiIpOwotCQotCUdyb3VwIGRyYWdXaWRnZXRHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQlkcmFnV2lkZ2V0R3JvdXAuc2V0VGV4dCgiV2lkZ2V0Iik7Ci0JY3JlYXRlRHJhZ1dpZGdldChkcmFnV2lkZ2V0R3JvdXApOwotCQotCUNvbXBvc2l0ZSBjTGVmdCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY0xlZnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JR3JvdXAgZHJhZ09wZXJhdGlvbnNHcm91cCA9IG5ldyBHcm91cChjTGVmdCwgU1dULk5PTkUpOwotCWRyYWdPcGVyYXRpb25zR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UsIDEsIDEpKTsKLQlkcmFnT3BlcmF0aW9uc0dyb3VwLnNldFRleHQoIkFsbG93ZWQgT3BlcmF0aW9uKHMpOiIpOwotCWNyZWF0ZURyYWdPcGVyYXRpb25zKGRyYWdPcGVyYXRpb25zR3JvdXApOwotCQotCUdyb3VwIGRyYWdUeXBlc0dyb3VwID0gbmV3IEdyb3VwKGNMZWZ0LCBTV1QuTk9ORSk7Ci0JZHJhZ1R5cGVzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlLCAxLCAxKSk7Ci0JZHJhZ1R5cGVzR3JvdXAuc2V0VGV4dCgiVHJhbnNmZXIgVHlwZShzKToiKTsKLQljcmVhdGVEcmFnVHlwZXMoZHJhZ1R5cGVzR3JvdXApOwotCQotCWRyYWdDb25zb2xlID0gbmV3IFRleHQoY0xlZnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSIHxTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuTVVMVEkpOwotCWRyYWdDb25zb2xlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOwotCU1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCAoIkNsZWFyIik7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJZHJhZ0NvbnNvbGUuc2V0VGV4dCgiIik7Ci0JCX0KLQl9KTsKLQlpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuQ0hFQ0spOwotCWl0ZW0uc2V0VGV4dCAoIlNob3cgRXZlbnQgZGV0YWlsIik7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJTWVudUl0ZW0gaXRlbSA9IChNZW51SXRlbSllLndpZGdldDsKLQkJCWRyYWdFdmVudERldGFpbCA9IGl0ZW0uZ2V0U2VsZWN0aW9uKCk7Ci0JCX0KLQl9KTsKLQlkcmFnQ29uc29sZS5zZXRNZW51KG1lbnUpOwotCQotCUxhYmVsIGRyb3BMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQlkcm9wTGFiZWwuc2V0VGV4dCgiRHJvcCBUYXJnZXQ6Iik7Ci0JCi0JR3JvdXAgZHJvcFdpZGdldEdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCWRyb3BXaWRnZXRHcm91cC5zZXRUZXh0KCJXaWRnZXQiKTsKLQljcmVhdGVEcm9wV2lkZ2V0KGRyb3BXaWRnZXRHcm91cCk7Ci0JCi0JQ29tcG9zaXRlIGNSaWdodCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY1JpZ2h0LnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCUdyb3VwIGRyb3BPcGVyYXRpb25zR3JvdXAgPSBuZXcgR3JvdXAoY1JpZ2h0LCBTV1QuTk9ORSk7Ci0JZHJvcE9wZXJhdGlvbnNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSwgMSwgMikpOwotCWRyb3BPcGVyYXRpb25zR3JvdXAuc2V0VGV4dCgiQWxsb3dlZCBPcGVyYXRpb24ocyk6Iik7Ci0JY3JlYXRlRHJvcE9wZXJhdGlvbnMoZHJvcE9wZXJhdGlvbnNHcm91cCk7Ci0JCi0JR3JvdXAgZHJvcFR5cGVzR3JvdXAgPSBuZXcgR3JvdXAoY1JpZ2h0LCBTV1QuTk9ORSk7Ci0JZHJvcFR5cGVzR3JvdXAuc2V0VGV4dCgiVHJhbnNmZXIgVHlwZShzKToiKTsKLQljcmVhdGVEcm9wVHlwZXMoZHJvcFR5cGVzR3JvdXApOwotCQotCUdyb3VwIGZlZWRiYWNrVHlwZXNHcm91cCA9IG5ldyBHcm91cChjUmlnaHQsIFNXVC5OT05FKTsKLQlmZWVkYmFja1R5cGVzR3JvdXAuc2V0VGV4dCgiRmVlZGJhY2sgVHlwZShzKToiKTsKLQljcmVhdGVGZWVkYmFja1R5cGVzKGZlZWRiYWNrVHlwZXNHcm91cCk7Ci0JCi0JZHJvcENvbnNvbGUgPSBuZXcgVGV4dChjUmlnaHQsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSIHxTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuTVVMVEkpOwotCWRyb3BDb25zb2xlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOwotCW1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCWl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKCJDbGVhciIpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWRyb3BDb25zb2xlLnNldFRleHQoIiIpOwotCQl9Ci0JfSk7Ci0JaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULkNIRUNLKTsKLQlpdGVtLnNldFRleHQgKCJTaG93IEV2ZW50IGRldGFpbCIpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCU1lbnVJdGVtIGl0ZW0gPSAoTWVudUl0ZW0pZS53aWRnZXQ7Ci0JCQlkcm9wRXZlbnREZXRhaWwgPSBpdGVtLmdldFNlbGVjdGlvbigpOwotCQl9Ci0JfSk7Ci0JZHJvcENvbnNvbGUuc2V0TWVudShtZW51KTsKLQkKLQlpbnQgaGVpZ2h0ID0gMjAwOwotCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwKTsKLQlkcmFnTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZHJhZ0xhYmVsLCAxMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDUwLCAtMTApOwotCWRhdGEuaGVpZ2h0ID0gaGVpZ2h0OwotCWRyYWdXaWRnZXRHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChkcmFnV2lkZ2V0R3JvdXAsIDEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIC0xMCk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWNMZWZ0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGVmdCwgMTApOwotCWRyb3BMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChkcm9wTGFiZWwsIDEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xlZnQsIDEwKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEwKTsKLQlkYXRhLmhlaWdodCA9IGhlaWdodDsKLQlkcm9wV2lkZ2V0R3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZHJvcFdpZGdldEdyb3VwLCAxMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNMZWZ0LCAxMCk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMCk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWNSaWdodC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQlzYy5zZXRNaW5TaXplKHBhcmVudC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQlzYy5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotCXNjLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQotCVBvaW50IHNpemUgPSBzaGVsbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCVJlY3RhbmdsZSBtb25pdG9yQXJlYSA9IHNoZWxsLmdldE1vbml0b3IoKS5nZXRDbGllbnRBcmVhKCk7Ci0Jc2hlbGwuc2V0U2l6ZShNYXRoLm1pbihzaXplLngsIG1vbml0b3JBcmVhLndpZHRoIC0gMjApLCBNYXRoLm1pbihzaXplLnksIG1vbml0b3JBcmVhLmhlaWdodCAtIDIwKSk7Ci0Jc2hlbGwub3BlbigpOwotCQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQkKLX0KLQotcHJpdmF0ZSB2b2lkIHByaW50RXZlbnQoRHJhZ1NvdXJjZUV2ZW50IGUpIHsKLQlpZiAoIWRyYWdFdmVudERldGFpbCkgcmV0dXJuOwotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlzYi5hcHBlbmQoIndpZGdldDogIik7IHNiLmFwcGVuZChlLndpZGdldCk7Ci0Jc2IuYXBwZW5kKCIsIHRpbWU6ICIpOyBzYi5hcHBlbmQoZS50aW1lKTsKLQlzYi5hcHBlbmQoIiwgb3BlcmF0aW9uOiAiKTsgc2IuYXBwZW5kKGUuZGV0YWlsKTsKLQlzYi5hcHBlbmQoIiwgdHlwZTogIik7IHNiLmFwcGVuZChlLmRhdGFUeXBlICE9IG51bGwgPyBlLmRhdGFUeXBlLnR5cGUgOiAwKTsKLQlzYi5hcHBlbmQoIiwgZG9pdDogIik7IHNiLmFwcGVuZChlLmRvaXQpOwotCXNiLmFwcGVuZCgiLCBkYXRhOiAiKTsgc2IuYXBwZW5kKGUuZGF0YSk7Ci0Jc2IuYXBwZW5kKCJcbiIpOwotCWRyYWdDb25zb2xlLmFwcGVuZChzYi50b1N0cmluZygpKTsKLX0KLQotcHJpdmF0ZSB2b2lkIHByaW50RXZlbnQoRHJvcFRhcmdldEV2ZW50IGUpIHsKLQlpZiAoIWRyb3BFdmVudERldGFpbCkgcmV0dXJuOwotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlzYi5hcHBlbmQoIndpZGdldDsgIik7IHNiLmFwcGVuZChlLndpZGdldCk7Ci0Jc2IuYXBwZW5kKCIsIHRpbWU6ICIpOyBzYi5hcHBlbmQoZS50aW1lKTsKLQlzYi5hcHBlbmQoIiwgeDogIik7IHNiLmFwcGVuZChlLngpOwotCXNiLmFwcGVuZCgiLCB5OiAiKTsgc2IuYXBwZW5kKGUueSk7Ci0Jc2IuYXBwZW5kKCIsIGl0ZW06ICIpOyBzYi5hcHBlbmQoZS5pdGVtKTsKLQlzYi5hcHBlbmQoIiwgb3BlcmF0aW9uczogIik7IHNiLmFwcGVuZChlLm9wZXJhdGlvbnMpOwotCXNiLmFwcGVuZCgiLCBvcGVyYXRpb246ICIpOyBzYi5hcHBlbmQoZS5kZXRhaWwpOwotCXNiLmFwcGVuZCgiLCBmZWVkYmFjazogIik7IHNiLmFwcGVuZChlLmZlZWRiYWNrKTsKLQlpZiAoZS5kYXRhVHlwZXMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGUuZGF0YVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzYi5hcHBlbmQoIiwgZGF0YVR5cGUgIik7IHNiLmFwcGVuZChpKTsgc2IuYXBwZW5kKCI6ICIpOyBzYi5hcHBlbmQoZS5kYXRhVHlwZXNbaV0udHlwZSk7Ci0JCX0KLQl9IGVsc2UgewotCQlzYi5hcHBlbmQoIiwgZGF0YVR5cGVzOiBub25lIik7Ci0JfQotCXNiLmFwcGVuZCgiLCBjdXJyZW50RGF0YVR5cGU6ICIpOyBzYi5hcHBlbmQoZS5jdXJyZW50RGF0YVR5cGUpOwotCXNiLmFwcGVuZCgiLCBkYXRhOiAiKTsgc2IuYXBwZW5kKGUuZGF0YSk7Ci0Jc2IuYXBwZW5kKCJcbiIpOwotCWRyb3BDb25zb2xlLmFwcGVuZChzYi50b1N0cmluZygpKTsKLX0KLQotcHJpdmF0ZSB2b2lkIHJlbW92ZURyYWdUcmFuc2ZlcihUcmFuc2ZlciB0cmFuc2Zlcil7Ci0JaWYgKGRyYWdUeXBlcy5sZW5ndGggPT0gMSkgewotCQlkcmFnVHlwZXMgPSBuZXcgVHJhbnNmZXJbMF07Ci0JfSBlbHNlIHsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBkcmFnVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkcmFnVHlwZXNbaV0gPT0gdHJhbnNmZXIpIHsKLQkJCQlpbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZGV4ID09IC0xKSByZXR1cm47Ci0JCVRyYW5zZmVyW10gbmV3VHlwZXMgPSBuZXcgVHJhbnNmZXJbZHJhZ1R5cGVzLmxlbmd0aCAtIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGRyYWdUeXBlcywgMCwgbmV3VHlwZXMsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShkcmFnVHlwZXMsIGluZGV4ICsgMSwgbmV3VHlwZXMsIGluZGV4LCBkcmFnVHlwZXMubGVuZ3RoIC0gaW5kZXggLSAxKTsKLQkJZHJhZ1R5cGVzID0gbmV3VHlwZXM7Ci0JfQotCWlmIChkcmFnU291cmNlICE9IG51bGwpIHsKLQkJZHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihkcmFnVHlwZXMpOwotCX0KLX0KLQotcHJpdmF0ZSB2b2lkIHJlbW92ZURyb3BUcmFuc2ZlcihUcmFuc2ZlciB0cmFuc2Zlcil7Ci0JaWYgKGRyb3BUeXBlcy5sZW5ndGggPT0gMSkgewotCQlkcm9wVHlwZXMgPSBuZXcgVHJhbnNmZXJbMF07Ci0JfSBlbHNlIHsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBkcm9wVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkcm9wVHlwZXNbaV0gPT0gdHJhbnNmZXIpIHsKLQkJCQlpbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZGV4ID09IC0xKSByZXR1cm47Ci0JCVRyYW5zZmVyW10gbmV3VHlwZXMgPSBuZXcgVHJhbnNmZXJbZHJvcFR5cGVzLmxlbmd0aCAtIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGRyb3BUeXBlcywgMCwgbmV3VHlwZXMsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShkcm9wVHlwZXMsIGluZGV4ICsgMSwgbmV3VHlwZXMsIGluZGV4LCBkcm9wVHlwZXMubGVuZ3RoIC0gaW5kZXggLSAxKTsKLQkJZHJvcFR5cGVzID0gbmV3VHlwZXM7Ci0JfQotCWlmIChkcm9wVGFyZ2V0ICE9IG51bGwpIHsKLQkJZHJvcFRhcmdldC5zZXRUcmFuc2Zlcihkcm9wVHlwZXMpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2RuZC9JbWFnZVRyYW5zZmVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9kbmQvSW1hZ2VUcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2Y3ZWQxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2RuZC9JbWFnZVRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmRuZDsKLQotIAotLyoqCi0gKiBUcmFuc2ZlciB0eXBlIHRvIHRyYW5zZmVyIFNXVCBJbWFnZURhdGEgb2JqZWN0cy4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIEltYWdlVHJhbnNmZXIgZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVOQU1FID0gImltYWdlZGF0YSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVJRCA9IHJlZ2lzdGVyVHlwZShUWVBFTkFNRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VUcmFuc2ZlciBfaW5zdGFuY2UgPSBuZXcgSW1hZ2VUcmFuc2ZlcigpOwotCi1wdWJsaWMgc3RhdGljIEltYWdlVHJhbnNmZXIgZ2V0SW5zdGFuY2UgKCkgewotCXJldHVybiBfaW5zdGFuY2U7Ci19Ci0KLXB1YmxpYyB2b2lkIGphdmFUb05hdGl2ZSAoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCWlmICghY2hlY2tJbWFnZShvYmplY3QpIHx8ICFpc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSkgewotCQlETkQuZXJyb3IoRE5ELkVSUk9SX0lOVkFMSURfREFUQSk7Ci0JfQotCUltYWdlRGF0YSBpbWRhdGEgPSAoSW1hZ2VEYXRhKW9iamVjdDsKLQl0cnkgewotCQkvLyB3cml0ZSBkYXRhIHRvIGEgYnl0ZSBhcnJheSBhbmQgdGhlbiBhc2sgc3VwZXIgdG8gY29udmVydCB0byBwTWVkaXVtCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCURhdGFPdXRwdXRTdHJlYW0gd3JpdGVPdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShvdXQpOwotCQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJbG9hZGVyLmRhdGEgPSBuZXcgSW1hZ2VEYXRhIFtdIHtpbWRhdGF9OwotCQlsb2FkZXIuc2F2ZSh3cml0ZU91dCwgU1dULklNQUdFX0JNUCk7Ci0JCXdyaXRlT3V0LmNsb3NlKCk7Ci0JCWJ5dGVbXSBidWZmZXIgPSBvdXQudG9CeXRlQXJyYXkoKTsKLQkJc3VwZXIuamF2YVRvTmF0aXZlKGJ1ZmZlciwgdHJhbnNmZXJEYXRhKTsKLQkJb3V0LmNsb3NlKCk7Ci0JfSAKLQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCX0KLX0KLXB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpewkKLQlpZiAoIWlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlckRhdGEpKSByZXR1cm4gbnVsbDsKLQkJCi0JYnl0ZVtdIGJ1ZmZlciA9IChieXRlW10pc3VwZXIubmF0aXZlVG9KYXZhKHRyYW5zZmVyRGF0YSk7Ci0JaWYgKGJ1ZmZlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkKLQlJbWFnZURhdGEgaW1kYXRhOwotCXRyeSB7Ci0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZlcik7Ci0JCURhdGFJbnB1dFN0cmVhbSByZWFkSW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKGluKTsKLQkJaW1kYXRhID0gbmV3IEltYWdlRGF0YShyZWFkSW4pOwotCQlyZWFkSW4uY2xvc2UoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIGltZGF0YTsKLX0KLXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKXsKLQlyZXR1cm4gbmV3IFN0cmluZ1tde1RZUEVOQU1FfTsKLX0KLXByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCl7Ci0JcmV0dXJuIG5ldyBpbnRbXSB7VFlQRUlEfTsKLX0KLWJvb2xlYW4gY2hlY2tJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JcmV0dXJuIChvYmplY3QgIT0gbnVsbCAgJiYgb2JqZWN0IGluc3RhbmNlb2YgSW1hZ2VEYXRhKTsKLX0KLXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKE9iamVjdCBvYmplY3QpIHsKLQlyZXR1cm4gY2hlY2tJbWFnZShvYmplY3QpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9GaWxlVmlld2VyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL0ZpbGVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDMxMTBhNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL0ZpbGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5maWxldmlld2VyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEZpbGUgVmlld2VyIGV4YW1wbGUKLSAqLwotcHVibGljIGNsYXNzIEZpbGVWaWV3ZXIgeyAKLSAJcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2ZpbGV2aWV3ZXIiKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBEUklWRV9BID0gImE6IiArIEZpbGUuc2VwYXJhdG9yOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBEUklWRV9CID0gImI6IiArIEZpbGUuc2VwYXJhdG9yOwotCi0JLyogVUkgZWxlbWVudHMgKi8gCQotCXByaXZhdGUgRGlzcGxheSBkaXNwbGF5OyAKLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCXByaXZhdGUgVG9vbEJhciB0b29sQmFyOwotCi0JcHJpdmF0ZSBMYWJlbCBudW1PYmplY3RzTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBkaXNrU3BhY2VMYWJlbDsKLQkKLQlwcml2YXRlIEZpbGUgY3VycmVudERpcmVjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWwgPSB0cnVlOwotCQotCS8qIERyYWcgYW5kIGRyb3Agb3B0aW1pemF0aW9ucyAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0RyYWdnaW5nID0gZmFsc2U7IC8vIGlmIHRoaXMgYXBwIGlzIGRyYWdnaW5nCi0JcHJpdmF0ZSBib29sZWFuIGlzRHJvcHBpbmcgPSBmYWxzZTsgLy8gaWYgdGhpcyBhcHAgaXMgZHJvcHBpbmcKLQotCXByaXZhdGUgRmlsZVtdICBwcm9jZXNzZWREcm9wRmlsZXMgPSBudWxsOyAvLyBzbyBEcmFnIG9ubHkgZGVsZXRlcyB3aGF0IGl0IG5lZWRzIHRvCi0JcHJpdmF0ZSBGaWxlW10gIGRlZmVycmVkUmVmcmVzaEZpbGVzID0gbnVsbDsgICAgICAvLyB0byBkZWZlciBub3RpZnlSZWZyZXNoRmlsZXMgd2hpbGUgd2UgZG8gRE5ECi0JcHJpdmF0ZSBib29sZWFuIGRlZmVycmVkUmVmcmVzaFJlcXVlc3RlZCA9IGZhbHNlOyAvLyB0byBkZWZlciBub3RpZnlSZWZyZXNoRmlsZXMgd2hpbGUgd2UgZG8gRE5ECi0JcHJpdmF0ZSBQcm9ncmVzc0RpYWxvZyBwcm9ncmVzc0RpYWxvZyA9IG51bGw7IC8vIHByb2dyZXNzIGRpYWxvZyBmb3IgbG9jYWxseS1pbml0aWF0ZWQgb3BlcmF0aW9ucwotCi0JLyogQ29tYm8gdmlldyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01CT0RBVEFfUk9PVFMgPSAiQ29tYm8ucm9vdHMiOwotCQkvLyBGaWxlW106IEFycmF5IG9mIGZpbGVzIHdob3NlIHBhdGhzIGFyZSBjdXJyZW50bHkgZGlzcGxheWVkIGluIHRoZSBjb21ibwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01CT0RBVEFfTEFTVFRFWFQgPSAiQ29tYm8ubGFzdFRleHQiOwotCQkvLyBTdHJpbmc6IFByZXZpb3VzIHNlbGVjdGlvbiB0ZXh0IHN0cmluZwotCi0JcHJpdmF0ZSBDb21ibyBjb21ibzsKLQotCS8qIFRyZWUgdmlldyAqLwotCXByaXZhdGUgSWNvbkNhY2hlIGljb25DYWNoZSA9IG5ldyBJY29uQ2FjaGUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJFRUlURU1EQVRBX0ZJTEUgPSAiVHJlZUl0ZW0uZmlsZSI7Ci0JCS8vIEZpbGU6IEZpbGUgYXNzb2NpYXRlZCB3aXRoIHRyZWUgaXRlbQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkVFSVRFTURBVEFfSU1BR0VFWFBBTkRFRCA9ICJUcmVlSXRlbS5pbWFnZUV4cGFuZGVkIjsKLQkJLy8gSW1hZ2U6IHNob3duIHdoZW4gaXRlbSBpcyBleHBhbmRlZAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkVFSVRFTURBVEFfSU1BR0VDT0xMQVBTRUQgPSAiVHJlZUl0ZW0uaW1hZ2VDb2xsYXBzZWQiOwotCQkvLyBJbWFnZTogc2hvd24gd2hlbiBpdGVtIGlzIGNvbGxhcHNlZAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkVFSVRFTURBVEFfU1RVQiA9ICJUcmVlSXRlbS5zdHViIjsKLQkJLy8gT2JqZWN0OiBpZiBub3QgcHJlc2VudCBvciBudWxsIHRoZW4gdGhlIGl0ZW0gaGFzIG5vdCBiZWVuIHBvcHVsYXRlZAotCi0JcHJpdmF0ZSBUcmVlIHRyZWU7Ci0JcHJpdmF0ZSBMYWJlbCB0cmVlU2NvcGVMYWJlbDsKLQotCS8qIFRhYmxlIHZpZXcgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2UoCi0JCURhdGVGb3JtYXQuTUVESVVNLCBEYXRlRm9ybWF0Lk1FRElVTSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFSVRFTURBVEFfRklMRSA9ICJUYWJsZUl0ZW0uZmlsZSI7Ci0JCS8vIEZpbGU6IEZpbGUgYXNzb2NpYXRlZCB3aXRoIHRhYmxlIHJvdwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRURBVEFfRElSID0gIlRhYmxlLmRpciI7Ci0JCS8vIEZpbGU6IEN1cnJlbnRseSB2aXNpYmxlIGRpcmVjdG9yeQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHRhYmxlV2lkdGhzID0gbmV3IGludFtdIHsxNTAsIDYwLCA3NSwgMTUwfTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHRhYmxlVGl0bGVzID0gbmV3IFN0cmluZyBbXSB7Ci0JCUZpbGVWaWV3ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInRhYmxlLk5hbWUudGl0bGUiKSwKLQkJRmlsZVZpZXdlci5nZXRSZXNvdXJjZVN0cmluZygidGFibGUuU2l6ZS50aXRsZSIpLAotCQlGaWxlVmlld2VyLmdldFJlc291cmNlU3RyaW5nKCJ0YWJsZS5UeXBlLnRpdGxlIiksCi0JCUZpbGVWaWV3ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInRhYmxlLk1vZGlmaWVkLnRpdGxlIikKLQl9OwotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0JcHJpdmF0ZSBMYWJlbCB0YWJsZUNvbnRlbnRzT2ZMYWJlbDsKLQotCS8qIFRhYmxlIHVwZGF0ZSB3b3JrZXIgKi8KLQkvLyBDb250cm9sIGRhdGEKLQlwcml2YXRlIGZpbmFsIE9iamVjdCB3b3JrZXJMb2NrID0gbmV3IE9iamVjdCgpOwotCQkvLyBMb2NrIGZvciBhbGwgd29ya2VyIGNvbnRyb2wgZGF0YSBhbmQgc3RhdGUKLQlwcml2YXRlIHZvbGF0aWxlIFRocmVhZCAgd29ya2VyVGhyZWFkID0gbnVsbDsKLQkJLy8gVGhlIHdvcmtlcidzIHRocmVhZAotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiB3b3JrZXJTdG9wcGVkID0gZmFsc2U7Ci0JCS8vIFRydWUgaWYgdGhlIHdvcmtlciBtdXN0IGV4aXQgb24gY29tcGxldGlvbiBvZiB0aGUgY3VycmVudCBjeWNsZQotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiB3b3JrZXJDYW5jZWxsZWQgPSBmYWxzZTsKLQkJLy8gVHJ1ZSBpZiB0aGUgd29ya2VyIG11c3QgY2FuY2VsIGl0cyBvcGVyYXRpb25zIHByZW1hdHVyZWx5IHBlcmhhcHMgZHVlIHRvIGEgc3RhdGUgdXBkYXRlCi0KLQkvLyBXb3JrZXIgc3RhdGUgaW5mb3JtYXRpb24gLS0gdGhpcyBpcyB3aGF0IGdldHMgc3luY2hyb25pemVkIGJ5IGFuIHVwZGF0ZQotCXByaXZhdGUgdm9sYXRpbGUgRmlsZSB3b3JrZXJTdGF0ZURpciA9IG51bGw7Ci0KLQkvLyBTdGF0ZSBpbmZvcm1hdGlvbiB0byB1c2UgZm9yIHRoZSBuZXh0IGN5Y2xlCi0JcHJpdmF0ZSB2b2xhdGlsZSBGaWxlIHdvcmtlck5leHREaXIgPSBudWxsOwotCi0JLyogU2ltdWxhdGUgb25seSBmbGFnICovCi0JLy8gd2hlbiB0cnVlLCBkaXNhYmxlcyBhY3R1YWwgZmlsZXN5c3RlbSBtYW5pcHVsYXRpb25zIGFuZCBvdXRwdXRzIHJlc3VsdHMgdG8gc3RhbmRhcmQgb3V0Ci0JcHJpdmF0ZSBib29sZWFuIHNpbXVsYXRlT25seSA9IHRydWU7Ci0KLQkvKioKLQkgKiBSdW5zIG1haW4gcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JCUZpbGVWaWV3ZXIgYXBwbGljYXRpb24gPSBuZXcgRmlsZVZpZXdlcigpOwotCQlTaGVsbCBzaGVsbCA9IGFwcGxpY2F0aW9uLm9wZW4oZGlzcGxheSk7Ci0JCXdoaWxlICghIHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCEgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWFwcGxpY2F0aW9uLmNsb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBtYWluIHByb2dyYW0uCi0JICovCi0JcHVibGljIFNoZWxsIG9wZW4oRGlzcGxheSBkaXNwbGF5KSB7CQkKLQkJLy8gQ3JlYXRlIHRoZSB3aW5kb3cKLQkJdGhpcy5kaXNwbGF5ID0gZGlzcGxheTsKLQkJaWNvbkNhY2hlLmluaXRSZXNvdXJjZXMoZGlzcGxheSk7Ci0JCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JCWNyZWF0ZVNoZWxsQ29udGVudHMoKTsKLQkJbm90aWZ5UmVmcmVzaEZpbGVzKG51bGwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIG1haW4gcHJvZ3JhbS4KLQkgKi8KLQl2b2lkIGNsb3NlKCkgewotCQl3b3JrZXJTdG9wKCk7Ci0JCWljb25DYWNoZS5mcmVlUmVzb3VyY2VzKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqIFdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggYmVjYXVzZSBvZiBhIG1pc3NpbmcgU3RyaW5nLgotCSAqIFJldHVybnMgdGhlIGtleSBpZiBub3QgZm91bmQuCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgYW5kIGJpbmRzIGl0Ci0JICogd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwKLQkgKiByZXR1cm4gdGhlIGtleS4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgdGhlIFVJCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lciB0aGUgU2hlbGxDb250YWluZXIgbWFuYWdpbmcgdGhlIFNoZWxsIHdlIGFyZSByZW5kZXJpbmcgaW5zaWRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNoZWxsQ29udGVudHMoKSB7Ci0JCXNoZWxsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIiwgbmV3IE9iamVjdFtdIHsgIiIgfSkpOwkKLQkJc2hlbGwuc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5zaGVsbEljb25dKTsKLQkJTWVudSBiYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCXNoZWxsLnNldE1lbnVCYXIoYmFyKTsKLQkJY3JlYXRlRmlsZU1lbnUoYmFyKTsKLQkJY3JlYXRlSGVscE1lbnUoYmFyKTsKLQotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlzaGVsbC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMTg1OwotCQljcmVhdGVDb21ib1ZpZXcoc2hlbGwsIGdyaWREYXRhKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQljcmVhdGVUb29sQmFyKHNoZWxsLCBncmlkRGF0YSk7Ci0KLQkJU2FzaEZvcm0gc2FzaEZvcm0gPSBuZXcgU2FzaEZvcm0oc2hlbGwsIFNXVC5OT05FKTsKLQkJc2FzaEZvcm0uc2V0T3JpZW50YXRpb24oU1dULkhPUklaT05UQUwpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzYXNoRm9ybS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJY3JlYXRlVHJlZVZpZXcoc2FzaEZvcm0pOwotCQljcmVhdGVUYWJsZVZpZXcoc2FzaEZvcm0pOwotCQlzYXNoRm9ybS5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7IDIsIDUgfSk7Ci0KLQkJbnVtT2JqZWN0c0xhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDE4NTsKLQkJbnVtT2JqZWN0c0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJZGlza1NwYWNlTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkaXNrU3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRmlsZSBNZW51LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBtZW51Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUZpbGVNZW51KE1lbnUgcGFyZW50KSB7Ci0JCU1lbnUgbWVudSA9IG5ldyBNZW51KHBhcmVudCk7Ci0JCU1lbnVJdGVtIGhlYWRlciA9IG5ldyBNZW51SXRlbShwYXJlbnQsIFNXVC5DQVNDQURFKTsKLQkJaGVhZGVyLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIm1lbnUuRmlsZS50ZXh0IikpOwotCQloZWFkZXIuc2V0TWVudShtZW51KTsKLQotCQlmaW5hbCBNZW51SXRlbSBzaW11bGF0ZUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNIRUNLKTsKLQkJc2ltdWxhdGVJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIm1lbnUuRmlsZS5TaW11bGF0ZU9ubHkudGV4dCIpKTsKLQkJc2ltdWxhdGVJdGVtLnNldFNlbGVjdGlvbihzaW11bGF0ZU9ubHkpOwotCQlzaW11bGF0ZUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNpbXVsYXRlT25seSA9IHNpbXVsYXRlSXRlbS5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygibWVudS5GaWxlLkNsb3NlLnRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBIZWxwIE1lbnUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IG1lbnUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlSGVscE1lbnUoTWVudSBwYXJlbnQpIHsKLQkJTWVudSBtZW51ID0gbmV3IE1lbnUocGFyZW50KTsKLQkJTWVudUl0ZW0gaGVhZGVyID0gbmV3IE1lbnVJdGVtKHBhcmVudCwgU1dULkNBU0NBREUpOwotCQloZWFkZXIuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygibWVudS5IZWxwLnRleHQiKSk7Ci0JCWhlYWRlci5zZXRNZW51KG1lbnUpOwotCi0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIm1lbnUuSGVscC5BYm91dC50ZXh0IikpOwkJCi0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0lORk9STUFUSU9OIHwgU1dULk9LKTsKLQkJCQlib3guc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLkFib3V0LnRpdGxlIikpOwotCQkJCWJveC5zZXRNZXNzYWdlKGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuQWJvdXQuZGVzY3JpcHRpb24iLAotCQkJCQluZXcgT2JqZWN0W10geyBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKSB9KSk7Ci0JCQkJYm94Lm9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdG9vbGJhcgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbCB0aGUgc2hlbGwgb24gd2hpY2ggdG8gYXR0YWNoIHRoZSB0b29sYmFyCi0JICogQHBhcmFtIGxheW91dERhdGEgdGhlIGxheW91dCBkYXRhCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRvb2xCYXIoZmluYWwgU2hlbGwgc2hlbGwsIE9iamVjdCBsYXlvdXREYXRhKSB7Ci0JCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihzaGVsbCwgU1dULk5PTkUpOwotCQl0b29sQmFyLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuY21kUGFyZW50XSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuUGFyZW50LnRpcHRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWRvUGFyZW50KCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmNtZFJlZnJlc2hdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygidG9vbC5SZWZyZXNoLnRpcHRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWRvUmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQkJU2VsZWN0aW9uQWRhcHRlciB1bmltcGxlbWVudGVkTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9JTkZPUk1BVElPTiB8IFNXVC5PSyk7Ci0JCQkJYm94LnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoImRpYWxvZy5Ob3RJbXBsZW1lbnRlZC50aXRsZSIpKTsKLQkJCQlib3guc2V0TWVzc2FnZShnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLkFjdGlvbk5vdEltcGxlbWVudGVkLmRlc2NyaXB0aW9uIikpOwotCQkJCWJveC5vcGVuKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5jbWRDdXRdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygidG9vbC5DdXQudGlwdGV4dCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih1bmltcGxlbWVudGVkTGlzdGVuZXIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmNtZENvcHldKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygidG9vbC5Db3B5LnRpcHRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodW5pbXBsZW1lbnRlZExpc3RlbmVyKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5jbWRQYXN0ZV0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ0b29sLlBhc3RlLnRpcHRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodW5pbXBsZW1lbnRlZExpc3RlbmVyKTsKLQotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmNtZERlbGV0ZV0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ0b29sLkRlbGV0ZS50aXB0ZXh0IikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHVuaW1wbGVtZW50ZWRMaXN0ZW5lcik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuY21kUmVuYW1lXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuUmVuYW1lLnRpcHRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodW5pbXBsZW1lbnRlZExpc3RlbmVyKTsKLQotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmNtZFNlYXJjaF0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ0b29sLlNlYXJjaC50aXB0ZXh0IikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHVuaW1wbGVtZW50ZWRMaXN0ZW5lcik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuY21kUHJpbnRdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygidG9vbC5QcmludC50aXB0ZXh0IikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHVuaW1wbGVtZW50ZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29tYm8gYm94IHZpZXcuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29tYm9WaWV3KENvbXBvc2l0ZSBwYXJlbnQsIE9iamVjdCBsYXlvdXREYXRhKSB7Ci0JCWNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21iby5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmaW5hbCBGaWxlW10gcm9vdHMgPSAoRmlsZVtdKSBjb21iby5nZXREYXRhKENPTUJPREFUQV9ST09UUyk7Ci0JCQkJaWYgKHJvb3RzID09IG51bGwpIHJldHVybjsKLQkJCQlpbnQgc2VsZWN0aW9uID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlpZiAoc2VsZWN0aW9uID49IDAgJiYgc2VsZWN0aW9uIDwgcm9vdHMubGVuZ3RoKSB7Ci0JCQkJCW5vdGlmeVNlbGVjdGVkRGlyZWN0b3J5KHJvb3RzW3NlbGVjdGlvbl0pOwotCQkJCX0KLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZmluYWwgU3RyaW5nIGxhc3RUZXh0ID0gKFN0cmluZykgY29tYm8uZ2V0RGF0YShDT01CT0RBVEFfTEFTVFRFWFQpOwotCQkJCVN0cmluZyB0ZXh0ID0gY29tYm8uZ2V0VGV4dCgpOwotCQkJCWlmICh0ZXh0ID09IG51bGwpIHJldHVybjsKLQkJCQlpZiAobGFzdFRleHQgIT0gbnVsbCAmJiBsYXN0VGV4dC5lcXVhbHModGV4dCkpIHJldHVybjsKLQkJCQljb21iby5zZXREYXRhKENPTUJPREFUQV9MQVNUVEVYVCwgdGV4dCk7Ci0JCQkJbm90aWZ5U2VsZWN0ZWREaXJlY3RvcnkobmV3IEZpbGUodGV4dCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBmaWxlIHRyZWUgdmlldy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUcmVlVmlldyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAyOwotCQlncmlkTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCXRyZWVTY29wZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXRyZWVTY29wZUxhYmVsLnNldFRleHQoRmlsZVZpZXdlci5nZXRSZXNvdXJjZVN0cmluZygiZGV0YWlscy5BbGxGb2xkZXJzLnRleHQiKSk7Ci0JCXRyZWVTY29wZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQotCQl0cmVlID0gbmV3IFRyZWUoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULlNJTkdMRSk7Ci0JCXRyZWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotCi0JCXRyZWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBUcmVlSXRlbVtdIHNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi5sZW5ndGggIT0gMCkgewotCQkJCQlUcmVlSXRlbSBpdGVtID0gc2VsZWN0aW9uWzBdOwotCQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgaXRlbS5nZXREYXRhKFRSRUVJVEVNREFUQV9GSUxFKTsKLQkJCQkKLQkJCQkJbm90aWZ5U2VsZWN0ZWREaXJlY3RvcnkoZmlsZSk7Ci0JCQkJfQotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJZmluYWwgVHJlZUl0ZW1bXSBzZWxlY3Rpb24gPSB0cmVlLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24ubGVuZ3RoICE9IDApIHsKLQkJCQkJVHJlZUl0ZW0gaXRlbSA9IHNlbGVjdGlvblswXTsKLQkJCQkJaXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCQkJdHJlZUV4cGFuZEl0ZW0oaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJdHJlZS5hZGRUcmVlTGlzdGVuZXIobmV3IFRyZWVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFdmVudCBldmVudCkgewotCQkJCWZpbmFsIFRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGl0ZW0uZ2V0RGF0YShUUkVFSVRFTURBVEFfSU1BR0VFWFBBTkRFRCk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQkJCXRyZWVFeHBhbmRJdGVtKGl0ZW0pOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZChUcmVlRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJCWZpbmFsIEltYWdlIGltYWdlID0gKEltYWdlKSBpdGVtLmdldERhdGEoVFJFRUlURU1EQVRBX0lNQUdFQ09MTEFQU0VEKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCQl9Ci0JCX0pOwotCQljcmVhdGVUcmVlRHJhZ1NvdXJjZSh0cmVlKTsKLQkJY3JlYXRlVHJlZURyb3BUYXJnZXQodHJlZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRHJhZyAmIERyb3AgRHJhZ1NvdXJjZSBmb3IgaXRlbXMgYmVpbmcgZHJhZ2dlZCBmcm9tIHRoZSB0cmVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIERyYWdTb3VyY2UgZm9yIHRoZSB0cmVlCi0JICovCi0JcHJpdmF0ZSBEcmFnU291cmNlIGNyZWF0ZVRyZWVEcmFnU291cmNlKGZpbmFsIFRyZWUgdHJlZSl7Ci0JCURyYWdTb3VyY2UgZHJhZ1NvdXJjZSA9IG5ldyBEcmFnU291cmNlKHRyZWUsIERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZKTsKLQkJZHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7IEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotCQlkcmFnU291cmNlLmFkZERyYWdMaXN0ZW5lcihuZXcgRHJhZ1NvdXJjZUxpc3RlbmVyKCkgewotCQkJVHJlZUl0ZW1bXSBkbmRTZWxlY3Rpb24gPSBudWxsOwotCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSBudWxsOwotCQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCl7Ci0JCQkJZG5kU2VsZWN0aW9uID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlzb3VyY2VOYW1lcyA9IG51bGw7Ci0JCQkJZXZlbnQuZG9pdCA9IGRuZFNlbGVjdGlvbi5sZW5ndGggPiAwOwotCQkJCWlzRHJhZ2dpbmcgPSB0cnVlOwotCQkJCXByb2Nlc3NlZERyb3BGaWxlcyA9IG51bGw7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KXsKLQkJCQlkcmFnU291cmNlSGFuZGxlRHJhZ0ZpbmlzaGVkKGV2ZW50LCBzb3VyY2VOYW1lcyk7Ci0JCQkJZG5kU2VsZWN0aW9uID0gbnVsbDsKLQkJCQlzb3VyY2VOYW1lcyA9IG51bGw7Ci0JCQkJaXNEcmFnZ2luZyA9IGZhbHNlOwotCQkJCXByb2Nlc3NlZERyb3BGaWxlcyA9IG51bGw7Ci0JCQkJaGFuZGxlRGVmZXJyZWRSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpewotCQkJCWlmIChkbmRTZWxlY3Rpb24gPT0gbnVsbCB8fCBkbmRTZWxlY3Rpb24ubGVuZ3RoID09IDApIHJldHVybjsKLQkJCQlpZiAoISBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSByZXR1cm47Ci0JCQkJCi0JCQkJc291cmNlTmFtZXMgID0gbmV3IFN0cmluZ1tkbmRTZWxlY3Rpb24ubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRuZFNlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgZG5kU2VsZWN0aW9uW2ldLmdldERhdGEoVFJFRUlURU1EQVRBX0ZJTEUpOwotCQkJCQlzb3VyY2VOYW1lc1tpXSA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJfQotCQkJCWV2ZW50LmRhdGEgPSBzb3VyY2VOYW1lczsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBkcmFnU291cmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIERyYWcgJiBEcm9wIERyb3BUYXJnZXQgZm9yIGl0ZW1zIGJlaW5nIGRyb3BwZWQgb250byB0aGUgdHJlZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBEcm9wVGFyZ2V0IGZvciB0aGUgdHJlZQotCSAqLwotCXByaXZhdGUgRHJvcFRhcmdldCBjcmVhdGVUcmVlRHJvcFRhcmdldChmaW5hbCBUcmVlIHRyZWUpIHsKLQkJRHJvcFRhcmdldCBkcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodHJlZSwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkpOwotCQlkcm9wVGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHsgRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkgfSk7Ci0JCWRyb3BUYXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQlpc0Ryb3BwaW5nID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRyYWdMZWF2ZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQlpc0Ryb3BwaW5nID0gZmFsc2U7Ci0JCQkJaGFuZGxlRGVmZXJyZWRSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQlkcm9wVGFyZ2V0VmFsaWRhdGUoZXZlbnQsIGdldFRhcmdldEZpbGUoZXZlbnQpKTsKLQkJCQlldmVudC5mZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfRVhQQU5EIHwgRE5ELkZFRURCQUNLX1NDUk9MTDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJRmlsZSB0YXJnZXRGaWxlID0gZ2V0VGFyZ2V0RmlsZShldmVudCk7Ci0JCQkJaWYgKGRyb3BUYXJnZXRWYWxpZGF0ZShldmVudCwgdGFyZ2V0RmlsZSkpCi0JCQkJCWRyb3BUYXJnZXRIYW5kbGVEcm9wKGV2ZW50LCB0YXJnZXRGaWxlKTsKLQkJCX0KLQkJCXByaXZhdGUgRmlsZSBnZXRUYXJnZXRGaWxlKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCS8vIERldGVybWluZSB0aGUgdGFyZ2V0IEZpbGUgZm9yIHRoZSBkcm9wIAotCQkJCVRyZWVJdGVtIGl0ZW0gPSB0cmVlLmdldEl0ZW0odHJlZS50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKSk7Ci0JCQkJRmlsZSB0YXJnZXRGaWxlID0gbnVsbDsKLQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJCS8vIFdlIGFyZSBvdmVyIGEgcGFydGljdWxhciBpdGVtIGluIHRoZSB0cmVlLCB1c2UgdGhlIGl0ZW0ncyBmaWxlCi0JCQkJCXRhcmdldEZpbGUgPSAoRmlsZSkgaXRlbS5nZXREYXRhKFRSRUVJVEVNREFUQV9GSUxFKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRhcmdldEZpbGU7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gZHJvcFRhcmdldDsJCi0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBleHBhbmQgZXZlbnRzIG9uIGEgdHJlZSBpdGVtLgotCSAqIAotCSAqIEBwYXJhbSBpdGVtIHRoZSBUcmVlSXRlbSB0byBmaWxsIGluCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRyZWVFeHBhbmRJdGVtKFRyZWVJdGVtIGl0ZW0pIHsKLQkJc2hlbGwuc2V0Q3Vyc29yKGljb25DYWNoZS5zdG9ja0N1cnNvcnNbaWNvbkNhY2hlLmN1cnNvcldhaXRdKTsKLQkJZmluYWwgT2JqZWN0IHN0dWIgPSBpdGVtLmdldERhdGEoVFJFRUlURU1EQVRBX1NUVUIpOwotCQlpZiAoc3R1YiA9PSBudWxsKSB0cmVlUmVmcmVzaEl0ZW0oaXRlbSwgdHJ1ZSk7Ci0JCXNoZWxsLnNldEN1cnNvcihpY29uQ2FjaGUuc3RvY2tDdXJzb3JzW2ljb25DYWNoZS5jdXJzb3JEZWZhdWx0XSk7Ci0JfQotCQotCS8qKgotCSAqIFRyYXZlcnNlIHRoZSBlbnRpcmUgdHJlZSBhbmQgdXBkYXRlIG9ubHkgd2hhdCBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdHMgdGhlIHJvb3QgZGlyZWN0b3J5IGxpc3RpbmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJlZVJlZnJlc2goRmlsZVtdIG1hc3RlckZpbGVzKSB7Ci0JCVRyZWVJdGVtW10gaXRlbXMgPSB0cmVlLmdldEl0ZW1zKCk7Ci0JCWludCBtYXN0ZXJJbmRleCA9IDA7Ci0JCWludCBpdGVtSW5kZXggPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBUcmVlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQlmaW5hbCBGaWxlIGl0ZW1GaWxlID0gKEZpbGUpIGl0ZW0uZ2V0RGF0YShUUkVFSVRFTURBVEFfRklMRSk7Ci0JCQlpZiAoKGl0ZW1GaWxlID09IG51bGwpIHx8IChtYXN0ZXJJbmRleCA9PSBtYXN0ZXJGaWxlcy5sZW5ndGgpKSB7Ci0JCQkJLy8gcmVtb3ZlIGJhZCBpdGVtIG9yIHBsYWNlaG9sZGVyCi0JCQkJaXRlbS5kaXNwb3NlKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlmaW5hbCBGaWxlIG1hc3RlckZpbGUgPSBtYXN0ZXJGaWxlc1ttYXN0ZXJJbmRleF07Ci0JCQlpbnQgY29tcGFyZSA9IGNvbXBhcmVGaWxlcyhtYXN0ZXJGaWxlLCBpdGVtRmlsZSk7Ci0JCQlpZiAoY29tcGFyZSA9PSAwKSB7Ci0JCQkJLy8gc2FtZSBmaWxlLCB1cGRhdGUgaXQKLQkJCQl0cmVlUmVmcmVzaEl0ZW0oaXRlbSwgZmFsc2UpOwotCQkJCSsraXRlbUluZGV4OwotCQkJCSsrbWFzdGVySW5kZXg7Ci0JCQl9IGVsc2UgaWYgKGNvbXBhcmUgPCAwKSB7Ci0JCQkJLy8gc2hvdWxkIGFwcGVhciBiZWZvcmUgZmlsZSwgaW5zZXJ0IGl0Ci0JCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSwgaXRlbUluZGV4KTsKLQkJCQl0cmVlSW5pdFZvbHVtZShuZXdJdGVtLCBtYXN0ZXJGaWxlKTsKLQkJCQluZXcgVHJlZUl0ZW0obmV3SXRlbSwgU1dULk5PTkUpOyAvLyBwbGFjZWhvbGRlciBjaGlsZCBpdGVtIHRvIGdldCAiZXhwYW5kIiBidXR0b24KLQkJCQkrK2l0ZW1JbmRleDsKLQkJCQkrK21hc3RlckluZGV4OwotCQkJCS0taTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gc2hvdWxkIGFwcGVhciBhZnRlciBmaWxlLCBkZWxldGUgc3RhbGUgaXRlbQotCQkJCWl0ZW0uZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCWZvciAoO21hc3RlckluZGV4IDwgbWFzdGVyRmlsZXMubGVuZ3RoOyArK21hc3RlckluZGV4KSB7Ci0JCQlmaW5hbCBGaWxlIG1hc3RlckZpbGUgPSBtYXN0ZXJGaWxlc1ttYXN0ZXJJbmRleF07Ci0JCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJCXRyZWVJbml0Vm9sdW1lKG5ld0l0ZW0sIG1hc3RlckZpbGUpOwotCQkJbmV3IFRyZWVJdGVtKG5ld0l0ZW0sIFNXVC5OT05FKTsgLy8gcGxhY2Vob2xkZXIgY2hpbGQgaXRlbSB0byBnZXQgImV4cGFuZCIgYnV0dG9uCi0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBUcmF2ZXJzZSBhbiBpdGVtIGluIHRoZSB0cmVlIGFuZCB1cGRhdGUgb25seSB3aGF0IGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBkaXJJdGVtIHRoZSB0cmVlIGl0ZW0gb2YgdGhlIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBmb3JjZVBvcHVsYXRlIHRydWUgaWZmIHdlIHNob3VsZCBwb3B1bGF0ZSBub24tZXhwYW5kZWQgaXRlbXMgYXMgd2VsbAotCSAqLwotCXByaXZhdGUgdm9pZCB0cmVlUmVmcmVzaEl0ZW0oVHJlZUl0ZW0gZGlySXRlbSwgYm9vbGVhbiBmb3JjZVBvcHVsYXRlKSB7Ci0JCWZpbmFsIEZpbGUgZGlyID0gKEZpbGUpIGRpckl0ZW0uZ2V0RGF0YShUUkVFSVRFTURBVEFfRklMRSk7Ci0JCQotCQlpZiAoISBmb3JjZVBvcHVsYXRlICYmICEgZGlySXRlbS5nZXRFeHBhbmRlZCgpKSB7Ci0JCQkvLyBSZWZyZXNoIG5vbi1leHBhbmRlZCBpdGVtCi0JCQlpZiAoZGlySXRlbS5nZXREYXRhKFRSRUVJVEVNREFUQV9TVFVCKSAhPSBudWxsKSB7Ci0JCQkJdHJlZUl0ZW1SZW1vdmVBbGwoZGlySXRlbSk7Ci0JCQkJbmV3IFRyZWVJdGVtKGRpckl0ZW0sIFNXVC5OT05FKTsgLy8gcGxhY2Vob2xkZXIgY2hpbGQgaXRlbSB0byBnZXQgImV4cGFuZCIgYnV0dG9uCi0JCQkJZGlySXRlbS5zZXREYXRhKFRSRUVJVEVNREFUQV9TVFVCLCBudWxsKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkvLyBSZWZyZXNoIGV4cGFuZGVkIGl0ZW0KLQkJZGlySXRlbS5zZXREYXRhKFRSRUVJVEVNREFUQV9TVFVCLCB0aGlzKTsgLy8gY2xlYXIgc3R1YiBmbGFnCi0KLQkJLyogR2V0IGRpcmVjdG9yeSBsaXN0aW5nICovCi0JCUZpbGVbXSBzdWJGaWxlcyA9IChkaXIgIT0gbnVsbCkgPyBGaWxlVmlld2VyLmdldERpcmVjdG9yeUxpc3QoZGlyKSA6IG51bGw7Ci0JCWlmIChzdWJGaWxlcyA9PSBudWxsIHx8IHN1YkZpbGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQkvKiBFcnJvciBvciBubyBjb250ZW50cyAqLwotCQkJdHJlZUl0ZW1SZW1vdmVBbGwoZGlySXRlbSk7Ci0JCQlkaXJJdGVtLnNldEV4cGFuZGVkKGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qIFJlZnJlc2ggc3ViLWl0ZW1zICovCi0JCVRyZWVJdGVtW10gaXRlbXMgPSBkaXJJdGVtLmdldEl0ZW1zKCk7Ci0JCWZpbmFsIEZpbGVbXSBtYXN0ZXJGaWxlcyA9IHN1YkZpbGVzOwotCQlpbnQgbWFzdGVySW5kZXggPSAwOwotCQlpbnQgaXRlbUluZGV4ID0gMDsKLQkJRmlsZSBtYXN0ZXJGaWxlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkgewotCQkJd2hpbGUgKChtYXN0ZXJGaWxlID09IG51bGwpICYmIChtYXN0ZXJJbmRleCA8IG1hc3RlckZpbGVzLmxlbmd0aCkpIHsKLQkJCQltYXN0ZXJGaWxlID0gbWFzdGVyRmlsZXNbbWFzdGVySW5kZXgrK107Ci0JCQkJaWYgKCEgbWFzdGVyRmlsZS5pc0RpcmVjdG9yeSgpKSBtYXN0ZXJGaWxlID0gbnVsbDsKLQkJCX0KLQotCQkJZmluYWwgVHJlZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJZmluYWwgRmlsZSBpdGVtRmlsZSA9IChGaWxlKSBpdGVtLmdldERhdGEoVFJFRUlURU1EQVRBX0ZJTEUpOwotCQkJaWYgKChpdGVtRmlsZSA9PSBudWxsKSB8fCAobWFzdGVyRmlsZSA9PSBudWxsKSkgewotCQkJCS8vIHJlbW92ZSBiYWQgaXRlbSBvciBwbGFjZWhvbGRlcgotCQkJCWl0ZW0uZGlzcG9zZSgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaW50IGNvbXBhcmUgPSBjb21wYXJlRmlsZXMobWFzdGVyRmlsZSwgaXRlbUZpbGUpOwotCQkJaWYgKGNvbXBhcmUgPT0gMCkgewotCQkJCS8vIHNhbWUgZmlsZSwgdXBkYXRlIGl0Ci0JCQkJdHJlZVJlZnJlc2hJdGVtKGl0ZW0sIGZhbHNlKTsKLQkJCQltYXN0ZXJGaWxlID0gbnVsbDsKLQkJCQkrK2l0ZW1JbmRleDsKLQkJCX0gZWxzZSBpZiAoY29tcGFyZSA8IDApIHsKLQkJCQkvLyBzaG91bGQgYXBwZWFyIGJlZm9yZSBmaWxlLCBpbnNlcnQgaXQKLQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKGRpckl0ZW0sIFNXVC5OT05FLCBpdGVtSW5kZXgpOwotCQkJCXRyZWVJbml0Rm9sZGVyKG5ld0l0ZW0sIG1hc3RlckZpbGUpOwotCQkJCW5ldyBUcmVlSXRlbShuZXdJdGVtLCBTV1QuTk9ORSk7IC8vIGFkZCBhIHBsYWNlaG9sZGVyIGNoaWxkIGl0ZW0gc28gd2UgZ2V0IHRoZSAiZXhwYW5kIiBidXR0b24KLQkJCQltYXN0ZXJGaWxlID0gbnVsbDsKLQkJCQkrK2l0ZW1JbmRleDsKLQkJCQktLWk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHNob3VsZCBhcHBlYXIgYWZ0ZXIgZmlsZSwgZGVsZXRlIHN0YWxlIGl0ZW0KLQkJCQlpdGVtLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQl3aGlsZSAoKG1hc3RlckZpbGUgIT0gbnVsbCkgfHwgKG1hc3RlckluZGV4IDwgbWFzdGVyRmlsZXMubGVuZ3RoKSkgewotCQkJaWYgKG1hc3RlckZpbGUgIT0gbnVsbCkgewotCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0oZGlySXRlbSwgU1dULk5PTkUpOwotCQkJCXRyZWVJbml0Rm9sZGVyKG5ld0l0ZW0sIG1hc3RlckZpbGUpOwotCQkJCW5ldyBUcmVlSXRlbShuZXdJdGVtLCBTV1QuTk9ORSk7IC8vIGFkZCBhIHBsYWNlaG9sZGVyIGNoaWxkIGl0ZW0gc28gd2UgZ2V0IHRoZSAiZXhwYW5kIiBidXR0b24KLQkJCQlpZiAobWFzdGVySW5kZXggPT0gbWFzdGVyRmlsZXMubGVuZ3RoKSBicmVhazsKLQkJCX0KLQkJCW1hc3RlckZpbGUgPSBtYXN0ZXJGaWxlc1ttYXN0ZXJJbmRleCsrXTsKLQkJCWlmICghIG1hc3RlckZpbGUuaXNEaXJlY3RvcnkoKSkgbWFzdGVyRmlsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGb3JlaWduIG1ldGhvZDogcmVtb3ZlcyBhbGwgY2hpbGRyZW4gb2YgYSBUcmVlSXRlbS4KLQkgKiBAcGFyYW0gdHJlZUl0ZW0gdGhlIFRyZWVJdGVtCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cmVlSXRlbVJlbW92ZUFsbChUcmVlSXRlbSB0cmVlSXRlbSkgewotCQlmaW5hbCBUcmVlSXRlbVtdIGNoaWxkcmVuID0gdHJlZUl0ZW0uZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotCQkJY2hpbGRyZW5baV0uZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgYSBmb2xkZXIgaXRlbS4KLQkgKiAKLQkgKiBAcGFyYW0gaXRlbSB0aGUgVHJlZUl0ZW0gdG8gaW5pdGlhbGl6ZQotCSAqIEBwYXJhbSBmb2xkZXIgdGhlIEZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVHJlZUl0ZW0KLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJlZUluaXRGb2xkZXIoVHJlZUl0ZW0gaXRlbSwgRmlsZSBmb2xkZXIpIHsKLQkJaXRlbS5zZXRUZXh0KGZvbGRlci5nZXROYW1lKCkpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuaWNvbkNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldERhdGEoVFJFRUlURU1EQVRBX0ZJTEUsIGZvbGRlcik7Ci0JCWl0ZW0uc2V0RGF0YShUUkVFSVRFTURBVEFfSU1BR0VFWFBBTkRFRCwgaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5pY29uT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldERhdGEoVFJFRUlURU1EQVRBX0lNQUdFQ09MTEFQU0VELCBpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmljb25DbG9zZWRGb2xkZXJdKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBhIHZvbHVtZSBpdGVtLgotCSAqIAotCSAqIEBwYXJhbSBpdGVtIHRoZSBUcmVlSXRlbSB0byBpbml0aWFsaXplCi0JICogQHBhcmFtIHZvbHVtZSB0aGUgRmlsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBUcmVlSXRlbQotCSAqLwotCXByaXZhdGUgdm9pZCB0cmVlSW5pdFZvbHVtZShUcmVlSXRlbSBpdGVtLCBGaWxlIHZvbHVtZSkgewotCQlpdGVtLnNldFRleHQodm9sdW1lLmdldFBhdGgoKSk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5pY29uQ2xvc2VkRHJpdmVdKTsKLQkJaXRlbS5zZXREYXRhKFRSRUVJVEVNREFUQV9GSUxFLCB2b2x1bWUpOwotCQlpdGVtLnNldERhdGEoVFJFRUlURU1EQVRBX0lNQUdFRVhQQU5ERUQsIGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuaWNvbk9wZW5Ecml2ZV0pOwotCQlpdGVtLnNldERhdGEoVFJFRUlURU1EQVRBX0lNQUdFQ09MTEFQU0VELCBpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmljb25DbG9zZWREcml2ZV0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGZpbGUgZGV0YWlscyB0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZVZpZXcoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMjsKLQkJZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGdyaWRMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJdGFibGVDb250ZW50c09mTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdGFibGVDb250ZW50c09mTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCi0JCXRhYmxlID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlVGl0bGVzLmxlbmd0aDsgKytpKSB7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJCWNvbHVtbi5zZXRUZXh0KHRhYmxlVGl0bGVzW2ldKTsKLQkJCWNvbHVtbi5zZXRXaWR0aCh0YWJsZVdpZHRoc1tpXSk7Ci0JCX0KLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW5vdGlmeVNlbGVjdGVkRmlsZXMoZ2V0U2VsZWN0ZWRGaWxlcygpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWRvRGVmYXVsdEZpbGVBY3Rpb24oZ2V0U2VsZWN0ZWRGaWxlcygpKTsKLQkJCX0KLQkJCXByaXZhdGUgRmlsZVtdIGdldFNlbGVjdGVkRmlsZXMoKSB7Ci0JCQkJZmluYWwgVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlmaW5hbCBGaWxlW10gZmlsZXMgPSBuZXcgRmlsZVtpdGVtcy5sZW5ndGhdOwotCQkJCQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHsKLQkJCQkJZmlsZXNbaV0gPSAoRmlsZSkgaXRlbXNbaV0uZ2V0RGF0YShUQUJMRUlURU1EQVRBX0ZJTEUpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmlsZXM7Ci0JCQl9Ci0JCX0pOwotCi0JCWNyZWF0ZVRhYmxlRHJhZ1NvdXJjZSh0YWJsZSk7Ci0JCWNyZWF0ZVRhYmxlRHJvcFRhcmdldCh0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRHJhZyAmIERyb3AgRHJhZ1NvdXJjZSBmb3IgaXRlbXMgYmVpbmcgZHJhZ2dlZCBmcm9tIHRoZSB0YWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBEcmFnU291cmNlIGZvciB0aGUgdGFibGUKLQkgKi8KLQlwcml2YXRlIERyYWdTb3VyY2UgY3JlYXRlVGFibGVEcmFnU291cmNlKGZpbmFsIFRhYmxlIHRhYmxlKSB7Ci0JCURyYWdTb3VyY2UgZHJhZ1NvdXJjZSA9IG5ldyBEcmFnU291cmNlKHRhYmxlLCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSk7Ci0JCWRyYWdTb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10geyBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9KTsKLQkJZHJhZ1NvdXJjZS5hZGREcmFnTGlzdGVuZXIobmV3IERyYWdTb3VyY2VMaXN0ZW5lcigpIHsKLQkJCVRhYmxlSXRlbVtdIGRuZFNlbGVjdGlvbiA9IG51bGw7Ci0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IG51bGw7Ci0JCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KXsKLQkJCQlkbmRTZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlzb3VyY2VOYW1lcyA9IG51bGw7Ci0JCQkJZXZlbnQuZG9pdCA9IGRuZFNlbGVjdGlvbi5sZW5ndGggPiAwOwotCQkJCWlzRHJhZ2dpbmcgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCl7Ci0JCQkJZHJhZ1NvdXJjZUhhbmRsZURyYWdGaW5pc2hlZChldmVudCwgc291cmNlTmFtZXMpOwotCQkJCWRuZFNlbGVjdGlvbiA9IG51bGw7Ci0JCQkJc291cmNlTmFtZXMgPSBudWxsOwotCQkJCWlzRHJhZ2dpbmcgPSBmYWxzZTsKLQkJCQloYW5kbGVEZWZlcnJlZFJlZnJlc2goKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCl7Ci0JCQkJaWYgKGRuZFNlbGVjdGlvbiA9PSBudWxsIHx8IGRuZFNlbGVjdGlvbi5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkJCWlmICghIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHJldHVybjsKLQkJCQkKLQkJCQlzb3VyY2VOYW1lcyAgPSBuZXcgU3RyaW5nW2RuZFNlbGVjdGlvbi5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZG5kU2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBkbmRTZWxlY3Rpb25baV0uZ2V0RGF0YShUQUJMRUlURU1EQVRBX0ZJTEUpOwotCQkJCQlzb3VyY2VOYW1lc1tpXSA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJfQotCQkJCWV2ZW50LmRhdGEgPSBzb3VyY2VOYW1lczsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBkcmFnU291cmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIERyYWcgJiBEcm9wIERyb3BUYXJnZXQgZm9yIGl0ZW1zIGJlaW5nIGRyb3BwZWQgb250byB0aGUgdGFibGUuCi0JICogCi0JICogQHJldHVybiB0aGUgRHJvcFRhcmdldCBmb3IgdGhlIHRhYmxlCi0JICovCi0JcHJpdmF0ZSBEcm9wVGFyZ2V0IGNyZWF0ZVRhYmxlRHJvcFRhcmdldChmaW5hbCBUYWJsZSB0YWJsZSl7Ci0JCURyb3BUYXJnZXQgZHJvcFRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KHRhYmxlLCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSk7Ci0JCWRyb3BUYXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10geyBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9KTsKLQkJZHJvcFRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCWlzRHJvcHBpbmcgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCWlzRHJvcHBpbmcgPSBmYWxzZTsKLQkJCQloYW5kbGVEZWZlcnJlZFJlZnJlc2goKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCWRyb3BUYXJnZXRWYWxpZGF0ZShldmVudCwgZ2V0VGFyZ2V0RmlsZShldmVudCkpOwotCQkJCWV2ZW50LmZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19FWFBBTkQgfCBETkQuRkVFREJBQ0tfU0NST0xMOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQlGaWxlIHRhcmdldEZpbGUgPSBnZXRUYXJnZXRGaWxlKGV2ZW50KTsKLQkJCQlpZiAoZHJvcFRhcmdldFZhbGlkYXRlKGV2ZW50LCB0YXJnZXRGaWxlKSkKLQkJCQkJZHJvcFRhcmdldEhhbmRsZURyb3AoZXZlbnQsIHRhcmdldEZpbGUpOwotCQkJfQotCQkJcHJpdmF0ZSBGaWxlIGdldFRhcmdldEZpbGUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gRGV0ZXJtaW5lIHRoZSB0YXJnZXQgRmlsZSBmb3IgdGhlIGRyb3AgCi0JCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtKHRhYmxlLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpKTsKLQkJCQlGaWxlIHRhcmdldEZpbGUgPSBudWxsOwotCQkJCWlmIChpdGVtID09IG51bGwpIHsKLQkJCQkJLy8gV2UgYXJlIG92ZXIgYW4gdW5vY2N1cGllZCBhcmVhIG9mIHRoZSB0YWJsZS4KLQkJCQkJLy8gSWYgaXQgaXMgYSBDT1BZLCB3ZSBjYW4gdXNlIHRoZSB0YWJsZSdzIHJvb3QgZmlsZS4KLQkJCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9DT1BZKSB7Ci0JCQkJCQl0YXJnZXRGaWxlID0gKEZpbGUpIHRhYmxlLmdldERhdGEoVEFCTEVEQVRBX0RJUik7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBXZSBhcmUgb3ZlciBhIHBhcnRpY3VsYXIgaXRlbSBpbiB0aGUgdGFibGUsIHVzZSB0aGUgaXRlbSdzIGZpbGUKLQkJCQkJdGFyZ2V0RmlsZSA9IChGaWxlKSBpdGVtLmdldERhdGEoVEFCTEVJVEVNREFUQV9GSUxFKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRhcmdldEZpbGU7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gZHJvcFRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50cyB0aGF0IGEgbmV3IGN1cnJlbnQgZGlyZWN0b3J5IGhhcyBiZWVuIHNlbGVjdGVkCi0JICogCi0JICogQHBhcmFtIGRpciB0aGUgZGlyZWN0b3J5IHRoYXQgd2FzIHNlbGVjdGVkLCBudWxsIGlzIGlnbm9yZWQKLQkgKi8KLQl2b2lkIG5vdGlmeVNlbGVjdGVkRGlyZWN0b3J5KEZpbGUgZGlyKSB7Ci0JCWlmIChkaXIgPT0gbnVsbCkgcmV0dXJuOwotCQlpZiAoY3VycmVudERpcmVjdG9yeSAhPSBudWxsICYmIGRpci5lcXVhbHMoY3VycmVudERpcmVjdG9yeSkpIHJldHVybjsKLQkJY3VycmVudERpcmVjdG9yeSA9IGRpcjsKLQkJbm90aWZ5U2VsZWN0ZWRGaWxlcyhudWxsKTsKLQkJCi0JCS8qIFNoZWxsOgotCQkgKiBTZXRzIHRoZSB0aXRsZSB0byBpbmRpY2F0ZSB0aGUgc2VsZWN0ZWQgZGlyZWN0b3J5Ci0JCSAqLwotCQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJUaXRsZSIsIG5ldyBPYmplY3RbXSB7IGN1cnJlbnREaXJlY3RvcnkuZ2V0UGF0aCgpIH0pKTsKLQotCQkvKiBUYWJsZSB2aWV3OgotCQkgKiBEaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIHNlbGVjdGVkIGRpcmVjdG9yeS4KLQkJICovCi0JCXdvcmtlclVwZGF0ZShkaXIsIGZhbHNlKTsKLQotCQkvKiBDb21ibyB2aWV3OgotCQkgKiBTZXRzIHRoZSBjb21ibyBib3ggdG8gcG9pbnQgdG8gdGhlIHNlbGVjdGVkIGRpcmVjdG9yeS4KLQkJICovCi0JCWZpbmFsIEZpbGVbXSBjb21ib1Jvb3RzID0gKEZpbGVbXSkgY29tYm8uZ2V0RGF0YShDT01CT0RBVEFfUk9PVFMpOwotCQlpbnQgY29tYm9FbnRyeSA9IC0xOwotCQlpZiAoY29tYm9Sb290cyAhPSBudWxsKSB7CQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tYm9Sb290cy5sZW5ndGg7ICsraSkgewotCQkJCWlmIChkaXIuZXF1YWxzKGNvbWJvUm9vdHNbaV0pKSB7Ci0JCQkJCWNvbWJvRW50cnkgPSBpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbWJvRW50cnkgPT0gLTEpIGNvbWJvLnNldFRleHQoZGlyLmdldFBhdGgoKSk7Ci0JCWVsc2UgY29tYm8uc2VsZWN0KGNvbWJvRW50cnkpOwotCi0JCS8qIFRyZWUgdmlldzoKLQkJICogSWYgbm90IGFscmVhZHkgZXhwYW5kZWQsIHJlY3Vyc2l2ZWx5IGV4cGFuZHMgdGhlIHBhcmVudHMgb2YgdGhlIHNwZWNpZmllZAotCQkgKiBkaXJlY3RvcnkgdW50aWwgaXQgaXMgdmlzaWJsZS4KLQkJICovCi0JCVZlY3RvciAvKiBvZiBGaWxlICovIHBhdGggPSBuZXcgVmVjdG9yKCk7Ci0JCS8vIEJ1aWxkIGEgc3RhY2sgb2YgcGF0aHMgZnJvbSB0aGUgcm9vdCBvZiB0aGUgdHJlZQotCQl3aGlsZSAoZGlyICE9IG51bGwpIHsKLQkJCXBhdGguYWRkKGRpcik7Ci0JCQlkaXIgPSBkaXIuZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0JCS8vIFJlY3Vyc2l2ZWx5IGV4cGFuZCB0aGUgdHJlZSB0byBnZXQgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkKLQkJVHJlZUl0ZW1bXSBpdGVtcyA9IHRyZWUuZ2V0SXRlbXMoKTsKLQkJVHJlZUl0ZW0gbGFzdEl0ZW0gPSBudWxsOwotCQlmb3IgKGludCBpID0gcGF0aC5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewotCQkJZmluYWwgRmlsZSBwYXRoRWxlbWVudCA9IChGaWxlKSBwYXRoLmVsZW1lbnRBdChpKTsKLQotCQkJLy8gU2VhcmNoIGZvciBhIHBhcnRpY3VsYXIgRmlsZSBpbiB0aGUgYXJyYXkgb2YgdHJlZSBpdGVtcwotCQkJLy8gTm8gZ3VhcmFudGVlIHRoYXQgdGhlIGl0ZW1zIGFyZSBzb3J0ZWQgaW4gYW55IHJlY29nbml6YWJsZSBmYXNoaW9uLCBzbyB3ZSdsbAotCQkJLy8ganVzdCBzZXF1ZW50aWFsIHNjYW4uICBUaGVyZSBzaG91bGRuJ3QgYmUgbW9yZSB0aGFuIGEgZmV3IHRob3VzYW5kIGVudHJpZXMuCi0JCQlUcmVlSXRlbSBpdGVtID0gbnVsbDsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgaXRlbXMubGVuZ3RoOyArK2spIHsKLQkJCQlpdGVtID0gaXRlbXNba107Ci0JCQkJaWYgKGl0ZW0uaXNEaXNwb3NlZCgpKSBjb250aW51ZTsKLQkJCQlmaW5hbCBGaWxlIGl0ZW1GaWxlID0gKEZpbGUpIGl0ZW0uZ2V0RGF0YShUUkVFSVRFTURBVEFfRklMRSk7Ci0JCQkJaWYgKGl0ZW1GaWxlICE9IG51bGwgJiYgaXRlbUZpbGUuZXF1YWxzKHBhdGhFbGVtZW50KSkgYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSBicmVhazsKLQkJCWxhc3RJdGVtID0gaXRlbTsKLQkJCWlmIChpICE9IDAgJiYgIWl0ZW0uZ2V0RXhwYW5kZWQoKSkgewotCQkJCXRyZWVFeHBhbmRJdGVtKGl0ZW0pOwotCQkJCWl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlpdGVtcyA9IGl0ZW0uZ2V0SXRlbXMoKTsKLQkJfQotCQl0cmVlLnNldFNlbGVjdGlvbigobGFzdEl0ZW0gIT0gbnVsbCkgPyBuZXcgVHJlZUl0ZW1bXSB7IGxhc3RJdGVtIH0gOiBuZXcgVHJlZUl0ZW1bMF0pOwotCX0KLQkKLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50cyB0aGF0IGZpbGVzIGhhdmUgYmVlbiBzZWxlY3RlZAotCSAqIAotCSAqIEBwYXJhbSBmaWxlcyB0aGUgZmlsZXMgdGhhdCB3ZXJlIHNlbGVjdGVkLCBudWxsIG9yIGVtcHR5IGFycmF5IGluZGljYXRlcyBubyBhY3RpdmUgc2VsZWN0aW9uCi0JICovCi0Jdm9pZCBub3RpZnlTZWxlY3RlZEZpbGVzKEZpbGVbXSBmaWxlcykgewotCQkvKiBEZXRhaWxzOgotCQkgKiBVcGRhdGUgdGhlIGRldGFpbHMgdGhhdCBhcmUgdmlzaWJsZSBvbiBzY3JlZW4uCi0JCSAqLwotCQlpZiAoKGZpbGVzICE9IG51bGwpICYmIChmaWxlcy5sZW5ndGggIT0gMCkpIHsKLQkJCW51bU9iamVjdHNMYWJlbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJkZXRhaWxzLk51bWJlck9mU2VsZWN0ZWRGaWxlcy50ZXh0IiwKLQkJCQluZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihmaWxlcy5sZW5ndGgpIH0pKTsKLQkJCWxvbmcgZmlsZVNpemUgPSAwTDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsKLQkJCQlmaWxlU2l6ZSArPSBmaWxlc1tpXS5sZW5ndGgoKTsKLQkJCX0KLQkJCWRpc2tTcGFjZUxhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoImRldGFpbHMuRmlsZVNpemUudGV4dCIsCi0JCQkJbmV3IE9iamVjdFtdIHsgbmV3IExvbmcoZmlsZVNpemUpIH0pKTsKLQkJfSBlbHNlIHsKLQkJCS8vIE5vIGZpbGVzIHNlbGVjdGVkCi0JCQlkaXNrU3BhY2VMYWJlbC5zZXRUZXh0KCIiKTsKLQkJCWlmIChjdXJyZW50RGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCQlpbnQgbnVtT2JqZWN0cyA9IGdldERpcmVjdG9yeUxpc3QoY3VycmVudERpcmVjdG9yeSkubGVuZ3RoOwotCQkJCW51bU9iamVjdHNMYWJlbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJkZXRhaWxzLkRpck51bWJlck9mT2JqZWN0cy50ZXh0IiwKLQkJCQkJbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIobnVtT2JqZWN0cykgfSkpOwotCQkJfSBlbHNlIHsKLQkJCQludW1PYmplY3RzTGFiZWwuc2V0VGV4dCgiIik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50cyB0aGF0IGZpbGVzIG11c3QgYmUgcmVmcmVzaGVkCi0JICogCi0JICogQHBhcmFtIGZpbGVzIHRoZSBmaWxlcyB0aGF0IG5lZWQgcmVmcmVzaGluZywgZW1wdHkgYXJyYXkgaXMgYSBuby1vcCwgbnVsbCByZWZyZXNoZXMgYWxsCi0JICovCi0Jdm9pZCBub3RpZnlSZWZyZXNoRmlsZXMoRmlsZVtdIGZpbGVzKSB7Ci0JCWlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0KLQkJaWYgKChkZWZlcnJlZFJlZnJlc2hSZXF1ZXN0ZWQpICYmIChkZWZlcnJlZFJlZnJlc2hGaWxlcyAhPSBudWxsKSAmJiAoZmlsZXMgIT0gbnVsbCkpIHsKLQkJCS8vIG1lcmdlIHJlcXVlc3RzCi0JCQlGaWxlW10gbmV3UmVxdWVzdCA9IG5ldyBGaWxlW2RlZmVycmVkUmVmcmVzaEZpbGVzLmxlbmd0aCArIGZpbGVzLmxlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGRlZmVycmVkUmVmcmVzaEZpbGVzLCAwLCBuZXdSZXF1ZXN0LCAwLCBkZWZlcnJlZFJlZnJlc2hGaWxlcy5sZW5ndGgpOwotCQkJU3lzdGVtLmFycmF5Y29weShmaWxlcywgMCwgbmV3UmVxdWVzdCwgZGVmZXJyZWRSZWZyZXNoRmlsZXMubGVuZ3RoLCBmaWxlcy5sZW5ndGgpOwotCQkJZGVmZXJyZWRSZWZyZXNoRmlsZXMgPSBuZXdSZXF1ZXN0OwotCQl9IGVsc2UgewotCQkJZGVmZXJyZWRSZWZyZXNoRmlsZXMgPSBmaWxlczsKLQkJCWRlZmVycmVkUmVmcmVzaFJlcXVlc3RlZCA9IHRydWU7Ci0JCX0KLQkJaGFuZGxlRGVmZXJyZWRSZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBkZWZlcnJlZCBSZWZyZXNoIG5vdGlmaWNhdGlvbnMgKGR1ZSB0byBEcmFnICYgRHJvcCkKLQkgKi8KLQl2b2lkIGhhbmRsZURlZmVycmVkUmVmcmVzaCgpIHsKLQkJaWYgKGlzRHJhZ2dpbmcgfHwgaXNEcm9wcGluZyB8fCAhIGRlZmVycmVkUmVmcmVzaFJlcXVlc3RlZCkgcmV0dXJuOwotCQlpZiAocHJvZ3Jlc3NEaWFsb2cgIT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NEaWFsb2cuY2xvc2UoKTsKLQkJCXByb2dyZXNzRGlhbG9nID0gbnVsbDsKLQkJfQotCi0JCWRlZmVycmVkUmVmcmVzaFJlcXVlc3RlZCA9IGZhbHNlOwotCQlGaWxlW10gZmlsZXMgPSBkZWZlcnJlZFJlZnJlc2hGaWxlczsKLQkJZGVmZXJyZWRSZWZyZXNoRmlsZXMgPSBudWxsOwotCi0JCXNoZWxsLnNldEN1cnNvcihpY29uQ2FjaGUuc3RvY2tDdXJzb3JzW2ljb25DYWNoZS5jdXJzb3JXYWl0XSk7Ci0KLQkJLyogVGFibGUgdmlldzoKLQkJICogUmVmcmVzaGVzIGluZm9ybWF0aW9uIGFib3V0IGFueSBmaWxlcyBpbiB0aGUgbGlzdCBhbmQgdGhlaXIgY2hpbGRyZW4uCi0JCSAqLwotCQlib29sZWFuIHJlZnJlc2hUYWJsZSA9IGZhbHNlOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIEZpbGUgZmlsZSA9IGZpbGVzW2ldOwotCQkJCWlmIChmaWxlLmVxdWFscyhjdXJyZW50RGlyZWN0b3J5KSkgewotCQkJCQlyZWZyZXNoVGFibGUgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJRmlsZSBwYXJlbnRGaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJaWYgKChwYXJlbnRGaWxlICE9IG51bGwpICYmIChwYXJlbnRGaWxlLmVxdWFscyhjdXJyZW50RGlyZWN0b3J5KSkpIHsKLQkJCQkJcmVmcmVzaFRhYmxlID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgcmVmcmVzaFRhYmxlID0gdHJ1ZTsKLQkJaWYgKHJlZnJlc2hUYWJsZSkgd29ya2VyVXBkYXRlKGN1cnJlbnREaXJlY3RvcnksIHRydWUpOwotCi0JCS8qIENvbWJvIHZpZXc6Ci0JCSAqIFJlZnJlc2hlcyB0aGUgbGlzdCBvZiByb290cwotCQkgKi8KLQkJZmluYWwgRmlsZVtdIHJvb3RzID0gZ2V0Um9vdHMoKTsKLQotCQlpZiAoZmlsZXMgPT0gbnVsbCkgewotCQkJYm9vbGVhbiByZWZyZXNoQ29tYm8gPSBmYWxzZTsKLQkJCWZpbmFsIEZpbGVbXSBjb21ib1Jvb3RzID0gKEZpbGVbXSkgY29tYm8uZ2V0RGF0YShDT01CT0RBVEFfUk9PVFMpOwotCQkKLQkJCWlmICgoY29tYm9Sb290cyAhPSBudWxsKSAmJiAoY29tYm9Sb290cy5sZW5ndGggPT0gcm9vdHMubGVuZ3RoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJaWYgKCEgcm9vdHNbaV0uZXF1YWxzKGNvbWJvUm9vdHNbaV0pKSB7Ci0JCQkJCQlyZWZyZXNoQ29tYm8gPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgcmVmcmVzaENvbWJvID0gdHJ1ZTsKLQotCQkJaWYgKHJlZnJlc2hDb21ibykgewotCQkJCWNvbWJvLnJlbW92ZUFsbCgpOwotCQkJCWNvbWJvLnNldERhdGEoQ09NQk9EQVRBX1JPT1RTLCByb290cyk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7ICsraSkgewotCQkJCQlmaW5hbCBGaWxlIGZpbGUgPSByb290c1tpXTsKLQkJCQkJY29tYm8uYWRkKGZpbGUuZ2V0UGF0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKiBUcmVlIHZpZXc6Ci0JCSAqIFJlZnJlc2hlcyBpbmZvcm1hdGlvbiBhYm91dCBhbnkgZmlsZXMgaW4gdGhlIGxpc3QgYW5kIHRoZWlyIGNoaWxkcmVuLgotCQkgKi8KLQkJdHJlZVJlZnJlc2gocm9vdHMpOwotCQkKLQkJLy8gUmVtaW5kIGV2ZXJ5b25lIHdoZXJlIHdlIGFyZSBpbiB0aGUgZmlsZXN5c3RlbQotCQlmaW5hbCBGaWxlIGRpciA9IGN1cnJlbnREaXJlY3Rvcnk7Ci0JCWN1cnJlbnREaXJlY3RvcnkgPSBudWxsOwotCQlub3RpZnlTZWxlY3RlZERpcmVjdG9yeShkaXIpOwotCi0JCXNoZWxsLnNldEN1cnNvcihpY29uQ2FjaGUuc3RvY2tDdXJzb3JzW2ljb25DYWNoZS5jdXJzb3JEZWZhdWx0XSk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGRlZmF1bHQgYWN0aW9uIG9uIGEgc2V0IG9mIGZpbGVzLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlcyB0aGUgYXJyYXkgb2YgZmlsZXMgdG8gcHJvY2VzcwotCSAqLwotCXZvaWQgZG9EZWZhdWx0RmlsZUFjdGlvbihGaWxlW10gZmlsZXMpIHsKLQkJLy8gb25seSB1c2VzIHRoZSAxc3QgZmlsZSAoZm9yIG5vdykKLQkJaWYgKGZpbGVzLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCWZpbmFsIEZpbGUgZmlsZSA9IGZpbGVzWzBdOwotCi0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCW5vdGlmeVNlbGVjdGVkRGlyZWN0b3J5KGZpbGUpOwotCQl9IGVsc2UgewotCQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCWlmICghIFByb2dyYW0ubGF1bmNoKGZpbGVOYW1lKSkgewkKLQkJCQlNZXNzYWdlQm94IGRpYWxvZyA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9FUlJPUiB8IFNXVC5PSyk7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkZhaWxlZExhdW5jaC5tZXNzYWdlIiwgbmV3IE9iamVjdFtdIHsgZmlsZU5hbWUgfSkpOwotCQkJCWRpYWxvZy5zZXRUZXh0KHNoZWxsLmdldFRleHQgKCkpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOYXZpZ2F0ZXMgdG8gdGhlIHBhcmVudCBkaXJlY3RvcnkKLQkgKi8KLQl2b2lkIGRvUGFyZW50KCkgewotCQlpZiAoY3VycmVudERpcmVjdG9yeSA9PSBudWxsKSByZXR1cm47Ci0JCUZpbGUgcGFyZW50RGlyZWN0b3J5ID0gY3VycmVudERpcmVjdG9yeS5nZXRQYXJlbnRGaWxlKCk7Ci0JCW5vdGlmeVNlbGVjdGVkRGlyZWN0b3J5KHBhcmVudERpcmVjdG9yeSk7Ci0JfQotCSAKLQkvKioKLQkgKiBQZXJmb3JtcyBhIHJlZnJlc2gKLQkgKi8KLQl2b2lkIGRvUmVmcmVzaCgpIHsKLQkJbm90aWZ5UmVmcmVzaEZpbGVzKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyBhIGRyb3AgdGFyZ2V0IGFzIGEgY2FuZGlkYXRlIGZvciBhIGRyb3Agb3BlcmF0aW9uLgotCSAqIDxwPgotCSAqIFVzZWQgaW4gZHJhZ092ZXIoKSBhbmQgZHJvcEFjY2VwdCgpLjxicj4KLQkgKiBOb3RlIGV2ZW50LmRldGFpbCBpcyBzZXQgdG8gRE5ELkRST1BfTk9ORSBieSB0aGlzIG1ldGhvZCBpZiB0aGUgdGFyZ2V0IGlzIG5vdCB2YWxpZC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIGV2ZW50IHRoZSBEcm9wVGFyZ2V0RXZlbnQgdG8gdmFsaWRhdGUKLQkgKiBAcGFyYW0gdGFyZ2V0RmlsZSB0aGUgRmlsZSByZXByZXNlbnRpbmcgdGhlIGRyb3AgdGFyZ2V0IGxvY2F0aW9uCi0JICogICAgICAgIHVuZGVyIGluc3BlY3Rpb24sIG9yIG51bGwgaWYgbm9uZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkcm9wVGFyZ2V0VmFsaWRhdGUoRHJvcFRhcmdldEV2ZW50IGV2ZW50LCBGaWxlIHRhcmdldEZpbGUpIHsKLQkJaWYgKHRhcmdldEZpbGUgIT0gbnVsbCAmJiB0YXJnZXRGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgIT0gRE5ELkRST1BfQ09QWSAmJiBldmVudC5kZXRhaWwgIT0gRE5ELkRST1BfTU9WRSkgewotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX01PVkU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQl9Ci0JCXJldHVybiBldmVudC5kZXRhaWwgIT0gRE5ELkRST1BfTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgZHJvcCBvbiBhIGRyb3BUYXJnZXQuCi0JICogPHA+Ci0JICogVXNlZCBpbiBkcm9wKCkuPGJyPgotCSAqIE5vdGUgZXZlbnQuZGV0YWlsIGlzIG1vZGlmaWVkIGJ5IHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gZXZlbnQgdGhlIERyb3BUYXJnZXRFdmVudCBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIHRoZSBkcm9wKCkgbWV0aG9kCi0JICogQHBhcmFtIHRhcmdldEZpbGUgdGhlIEZpbGUgcmVwcmVzZW50aW5nIHRoZSBkcm9wIHRhcmdldCBsb2NhdGlvbgotCSAqICAgICAgICB1bmRlciBpbnNwZWN0aW9uLCBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwcml2YXRlIHZvaWQgZHJvcFRhcmdldEhhbmRsZURyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50LCBGaWxlIHRhcmdldEZpbGUpIHsKLQkJLy8gR2V0IGRyb3BwZWQgZGF0YSAoYW4gYXJyYXkgb2YgZmlsZW5hbWVzKQotCQlpZiAoISBkcm9wVGFyZ2V0VmFsaWRhdGUoZXZlbnQsIHRhcmdldEZpbGUpKSByZXR1cm47Ci0JCWZpbmFsIFN0cmluZ1tdIHNvdXJjZU5hbWVzID0gKFN0cmluZ1tdKSBldmVudC5kYXRhOwotCQlpZiAoc291cmNlTmFtZXMgPT0gbnVsbCkgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9OT05FKSByZXR1cm47Ci0KLQkJLy8gT3BlbiBwcm9ncmVzcyBkaWFsb2cKLQkJcHJvZ3Jlc3NEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NEaWFsb2coc2hlbGwsCi0JCQkoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX01PVkUpID8gUHJvZ3Jlc3NEaWFsb2cuTU9WRSA6IFByb2dyZXNzRGlhbG9nLkNPUFkpOwotCQlwcm9ncmVzc0RpYWxvZy5zZXRUb3RhbFdvcmtVbml0cyhzb3VyY2VOYW1lcy5sZW5ndGgpOwotCQlwcm9ncmVzc0RpYWxvZy5vcGVuKCk7Ci0KLQkJLy8gQ29weSBlYWNoIGZpbGUKLQkJVmVjdG9yIC8qIG9mIEZpbGUgKi8gcHJvY2Vzc2VkRmlsZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyAoaSA8IHNvdXJjZU5hbWVzLmxlbmd0aCkgJiYgKCEgcHJvZ3Jlc3NEaWFsb2cuaXNDYW5jZWxsZWQoKSk7IGkrKyl7Ci0JCQlmaW5hbCBGaWxlIHNvdXJjZSA9IG5ldyBGaWxlKHNvdXJjZU5hbWVzW2ldKTsKLQkJCWZpbmFsIEZpbGUgZGVzdCA9IG5ldyBGaWxlKHRhcmdldEZpbGUsIHNvdXJjZS5nZXROYW1lKCkpOwotCQkJaWYgKHNvdXJjZS5lcXVhbHMoZGVzdCkpIGNvbnRpbnVlOyAvLyBpZ25vcmUgaWYgaW4gc2FtZSBsb2NhdGlvbgotCi0JCQlwcm9ncmVzc0RpYWxvZy5zZXREZXRhaWxGaWxlKHNvdXJjZSwgUHJvZ3Jlc3NEaWFsb2cuQ09QWSk7Ci0JCQl3aGlsZSAoISBwcm9ncmVzc0RpYWxvZy5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJaWYgKGNvcHlGaWxlU3RydWN0dXJlKHNvdXJjZSwgZGVzdCkpIHsKLQkJCQkJcHJvY2Vzc2VkRmlsZXMuYWRkKHNvdXJjZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSBpZiAoISBwcm9ncmVzc0RpYWxvZy5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTU9WRSAmJiAoIWlzRHJhZ2dpbmcpKSB7Ci0JCQkJCQkvLyBJdCBpcyBub3QgcG9zc2libGUgdG8gbm90aWZ5IGFuIGV4dGVybmFsIGRyYWcgc291cmNlIHRoYXQgYSBkcm9wCi0JCQkJCQkvLyBvcGVyYXRpb24gd2FzIG9ubHkgcGFydGlhbGx5IHN1Y2Nlc3NmdWwuICBUaGlzIGlzIHBhcnRpY3VsYXJseSBhCi0JCQkJCQkvLyBwcm9ibGVtIGZvciBEUk9QX01PVkUgb3BlcmF0aW9ucyBzaW5jZSB1bmxlc3MgdGhlIHNvdXJjZSBnZXRzCi0JCQkJCQkvLyBEUk9QX05PTkUsIGl0IHdpbGwgZGVsZXRlIHRoZSBvcmlnaW5hbCBkYXRhIGluY2x1ZGluZyBiaXRzIHRoYXQKLQkJCQkJCS8vIG1heSBub3QgaGF2ZSBiZWVuIHRyYW5zZmVycmVkIHN1Y2Nlc3NmdWxseS4KLQkJCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SIHwgU1dULlJFVFJZIHwgU1dULkNBTkNFTCk7Ci0JCQkJCQlib3guc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLkZhaWxlZENvcHkudGl0bGUiKSk7Ci0JCQkJCQlib3guc2V0TWVzc2FnZShnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLkZhaWxlZENvcHkuZGVzY3JpcHRpb24iLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IHNvdXJjZSwgZGVzdCB9KSk7Ci0JCQkJCQlpbnQgYnV0dG9uID0gYm94Lm9wZW4oKTsKLQkJCQkJCWlmIChidXR0b24gPT0gU1dULkNBTkNFTCkgewotCQkJCQkJCWkgPSBzb3VyY2VOYW1lcy5sZW5ndGg7Ci0JCQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIFdlIGNhbiByZWNvdmVyIGdyYWNlZnVsbHkgZnJvbSBlcnJvcnMgaWYgdGhlIGRyYWcgc291cmNlIGJlbG9uZ3MKLQkJCQkJCS8vIHRvIHRoaXMgYXBwbGljYXRpb24gc2luY2UgaXQgd2lsbCBsb29rIGF0IHByb2Nlc3NlZERyb3BGaWxlcy4KLQkJCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SIHwgU1dULkFCT1JUIHwgU1dULlJFVFJZIHwgU1dULklHTk9SRSk7Ci0JCQkJCQlib3guc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLkZhaWxlZENvcHkudGl0bGUiKSk7Ci0JCQkJCQlib3guc2V0TWVzc2FnZShnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLkZhaWxlZENvcHkuZGVzY3JpcHRpb24iLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IHNvdXJjZSwgZGVzdCB9KSk7Ci0JCQkJCQlpbnQgYnV0dG9uID0gYm94Lm9wZW4oKTsKLQkJCQkJCWlmIChidXR0b24gPT0gU1dULkFCT1JUKSBpID0gc291cmNlTmFtZXMubGVuZ3RoOwotCQkJCQkJaWYgKGJ1dHRvbiAhPSBTV1QuUkVUUlkpIGJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCXByb2dyZXNzRGlhbG9nLmFkZFByb2dyZXNzKDEpOwotCQkJfQotCQl9Ci0JCWlmIChpc0RyYWdnaW5nKSB7Ci0JCQkvLyBSZW1lbWJlciBleGFjdGx5IHdoaWNoIGZpbGVzIHdlIHByb2Nlc3NlZAotCQkJcHJvY2Vzc2VkRHJvcEZpbGVzID0gKChGaWxlW10pIHByb2Nlc3NlZEZpbGVzLnRvQXJyYXkobmV3IEZpbGVbcHJvY2Vzc2VkRmlsZXMuc2l6ZSgpXSkpOwotCQl9IGVsc2UgewotCQkJcHJvZ3Jlc3NEaWFsb2cuY2xvc2UoKTsKLQkJCXByb2dyZXNzRGlhbG9nID0gbnVsbDsKLQkJfQotCQlub3RpZnlSZWZyZXNoRmlsZXMobmV3IEZpbGVbXSB7IHRhcmdldEZpbGUgfSk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyB0aGUgY29tcGxldGlvbiBvZiBhIGRyYWcgb24gYSBkcmFnU291cmNlLgotCSAqIDxwPgotCSAqIFVzZWQgaW4gZHJhZ0ZpbmlzaGVkKCkuPGJyPgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gZXZlbnQgdGhlIERyYWdTb3VyY2VFdmVudCBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIHRoZSBkcmFnRmluaXNoZWQoKSBtZXRob2QKLQkgKiBAcGFyYW0gc291cmNlTmFtZXMgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB0aGF0IHdlcmUgZHJhZ2dlZCAoZXZlbnQuZGF0YSBpcyBpbnZhbGlkKQotCSAqLwotCXByaXZhdGUgdm9pZCBkcmFnU291cmNlSGFuZGxlRHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCwgU3RyaW5nW10gc291cmNlTmFtZXMpIHsKLQkJaWYgKHNvdXJjZU5hbWVzID09IG51bGwpIHJldHVybjsKLQkJaWYgKGV2ZW50LmRldGFpbCAhPSBETkQuRFJPUF9NT1ZFKSByZXR1cm47Ci0KLQkJLy8gR2V0IGFycmF5IG9mIGZpbGVzIHRoYXQgd2VyZSBhY3R1YWxseSB0cmFuc2ZlcnJlZAotCQlmaW5hbCBGaWxlW10gc291cmNlRmlsZXM7Ci0JCWlmIChwcm9jZXNzZWREcm9wRmlsZXMgIT0gbnVsbCkgewotCQkJc291cmNlRmlsZXMgPSBwcm9jZXNzZWREcm9wRmlsZXM7Ci0JCX0gZWxzZSB7Ci0JCQlzb3VyY2VGaWxlcyA9IG5ldyBGaWxlW3NvdXJjZU5hbWVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZU5hbWVzLmxlbmd0aDsgKytpKQotCQkJCXNvdXJjZUZpbGVzW2ldID0gbmV3IEZpbGUoc291cmNlTmFtZXNbaV0pOwotCQl9CQotCQlpZiAocHJvZ3Jlc3NEaWFsb2cgPT0gbnVsbCkKLQkJCXByb2dyZXNzRGlhbG9nID0gbmV3IFByb2dyZXNzRGlhbG9nKHNoZWxsLCBQcm9ncmVzc0RpYWxvZy5NT1ZFKTsKLQkJcHJvZ3Jlc3NEaWFsb2cuc2V0VG90YWxXb3JrVW5pdHMoc291cmNlRmlsZXMubGVuZ3RoKTsKLQkJcHJvZ3Jlc3NEaWFsb2cuc2V0UHJvZ3Jlc3MoMCk7Ci0JCXByb2dyZXNzRGlhbG9nLm9wZW4oKTsKLQotCQkvLyBEZWxldGUgZWFjaCBmaWxlCi0JCWZvciAoaW50IGkgPSAwOyAoaSA8IHNvdXJjZUZpbGVzLmxlbmd0aCkgJiYgKCEgcHJvZ3Jlc3NEaWFsb2cuaXNDYW5jZWxsZWQoKSk7IGkrKyl7Ci0JCQlmaW5hbCBGaWxlIHNvdXJjZSA9IHNvdXJjZUZpbGVzW2ldOwotCQkJcHJvZ3Jlc3NEaWFsb2cuc2V0RGV0YWlsRmlsZShzb3VyY2UsIFByb2dyZXNzRGlhbG9nLkRFTEVURSk7Ci0JCQl3aGlsZSAoISBwcm9ncmVzc0RpYWxvZy5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJaWYgKGRlbGV0ZUZpbGVTdHJ1Y3R1cmUoc291cmNlKSkgewotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgaWYgKCEgcHJvZ3Jlc3NEaWFsb2cuaXNDYW5jZWxsZWQoKSkgewotCQkJCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9FUlJPUiB8IFNXVC5BQk9SVCB8IFNXVC5SRVRSWSB8IFNXVC5JR05PUkUpOwotCQkJCQlib3guc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLkZhaWxlZERlbGV0ZS50aXRsZSIpKTsKLQkJCQkJYm94LnNldE1lc3NhZ2UoZ2V0UmVzb3VyY2VTdHJpbmcoImRpYWxvZy5GYWlsZWREZWxldGUuZGVzY3JpcHRpb24iLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgc291cmNlIH0pKTsKLQkJCQkJaW50IGJ1dHRvbiA9IGJveC5vcGVuKCk7Ci0JCQkJCWlmIChidXR0b24gPT0gU1dULkFCT1JUKSBpID0gc291cmNlTmFtZXMubGVuZ3RoOwotCQkJCQlpZiAoYnV0dG9uID09IFNXVC5SRVRSWSkgYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcHJvZ3Jlc3NEaWFsb2cuYWRkUHJvZ3Jlc3MoMSk7Ci0JCX0KLQkJbm90aWZ5UmVmcmVzaEZpbGVzKHNvdXJjZUZpbGVzKTsKLQkJcHJvZ3Jlc3NEaWFsb2cuY2xvc2UoKTsKLQkJcHJvZ3Jlc3NEaWFsb2cgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgZmlsZXN5c3RlbSByb290IGVudHJpZXMKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIEZpbGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJvb3QgZGlyZWN0b3JpZXMgb24gdGhlIHBsYXRmb3JtLAotCSAqICAgICAgICAgbWF5IGJlIGVtcHR5IGJ1dCBub3QgbnVsbAotCSAqLwotCUZpbGVbXSBnZXRSb290cygpIHsKLQkJLyoKLQkJICogT24gSkRLIDEuMjIgb25seS4uLgotCQkgKi8KLQkJLy8gcmV0dXJuIEZpbGUubGlzdFJvb3RzKCk7Ci0KLQkJLyoKLQkJICogT24gSkRLIDEuMS43IGFuZCBiZXlvbmQuLi4KLQkJICogLS0gUE9SVEFCSUxJVFkgSVNTVUVTIEhFUkUgLS0KLQkJICovCi0JCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkgKCJvcy5uYW1lIikuaW5kZXhPZiAoIldpbmRvd3MiKSAhPSAtMSkgewotCQkJVmVjdG9yIC8qIG9mIEZpbGUgKi8gbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJCWxpc3QuYWRkKG5ldyBGaWxlKERSSVZFX0EpKTsKLQkJCWxpc3QuYWRkKG5ldyBGaWxlKERSSVZFX0IpKTsKLQkJCWZvciAoY2hhciBpID0gJ2MnOyBpIDw9ICd6JzsgKytpKSB7Ci0JCQkJRmlsZSBkcml2ZSA9IG5ldyBGaWxlKGkgKyAiOiIgKyBGaWxlLnNlcGFyYXRvcik7Ci0JCQkJaWYgKGRyaXZlLmlzRGlyZWN0b3J5KCkgJiYgZHJpdmUuZXhpc3RzKCkpIHsKLQkJCQkJbGlzdC5hZGQoZHJpdmUpOwotCQkJCQlpZiAoaW5pdGlhbCAmJiBpID09ICdjJykgewotCQkJCQkJY3VycmVudERpcmVjdG9yeSA9IGRyaXZlOwotCQkJCQkJaW5pdGlhbCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJRmlsZVtdIHJvb3RzID0gKEZpbGVbXSkgbGlzdC50b0FycmF5KG5ldyBGaWxlW2xpc3Quc2l6ZSgpXSk7Ci0JCQlzb3J0RmlsZXMocm9vdHMpOwotCQkJcmV0dXJuIHJvb3RzOwotCQl9IGVsc2UgewotCQkJRmlsZSByb290ID0gbmV3IEZpbGUoRmlsZS5zZXBhcmF0b3IpOwotCQkJaWYgKGluaXRpYWwpIHsKLQkJCQljdXJyZW50RGlyZWN0b3J5ID0gcm9vdDsKLQkJCQlpbml0aWFsID0gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IEZpbGVbXSB7IHJvb3QgfTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgYSBkaXJlY3RvcnkgbGlzdGluZwotCSAqIAotCSAqIEBwYXJhbSBmaWxlIHRoZSBkaXJlY3RvcnkgdG8gYmUgbGlzdGVkCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBmaWxlcyB0aGlzIGRpcmVjdG9yeSBjb250YWlucywgbWF5IGJlIGVtcHR5IGJ1dCBub3QgbnVsbAotCSAqLwotCXN0YXRpYyBGaWxlW10gZ2V0RGlyZWN0b3J5TGlzdChGaWxlIGZpbGUpIHsKLQkJRmlsZVtdIGxpc3QgPSBmaWxlLmxpc3RGaWxlcygpOwotCQlpZiAobGlzdCA9PSBudWxsKSByZXR1cm4gbmV3IEZpbGVbMF07Ci0JCXNvcnRGaWxlcyhsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIENvcGllcyBhIGZpbGUgb3IgZW50aXJlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCi0JICogCi0JICogQHBhcmFtIG9sZEZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBvbGQgZmlsZSBvciBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gbmV3RmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIG5ldyBmaWxlIG9yIGRpcmVjdG9yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyB3aXRob3V0IGVycm9ycwotCSAqLwotCWJvb2xlYW4gY29weUZpbGVTdHJ1Y3R1cmUoRmlsZSBvbGRGaWxlLCBGaWxlIG5ld0ZpbGUpIHsKLQkJaWYgKG9sZEZpbGUgPT0gbnVsbCB8fCBuZXdGaWxlID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJCi0JCS8vIGVuc3VyZSB0aGF0IG5ld0ZpbGUgaXMgbm90IGEgY2hpbGQgb2Ygb2xkRmlsZSBvciBhIGR1cGUKLQkJRmlsZSBzZWFyY2hGaWxlID0gbmV3RmlsZTsKLQkJZG8gewotCQkJaWYgKG9sZEZpbGUuZXF1YWxzKHNlYXJjaEZpbGUpKSByZXR1cm4gZmFsc2U7Ci0JCQlzZWFyY2hGaWxlID0gc2VhcmNoRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCX0gd2hpbGUgKHNlYXJjaEZpbGUgIT0gbnVsbCk7Ci0JCQotCQlpZiAob2xkRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkvKgotCQkJICogQ29weSBhIGRpcmVjdG9yeQotCQkJICovCi0JCQlpZiAocHJvZ3Jlc3NEaWFsb2cgIT0gbnVsbCkgewotCQkJCXByb2dyZXNzRGlhbG9nLnNldERldGFpbEZpbGUob2xkRmlsZSwgUHJvZ3Jlc3NEaWFsb2cuQ09QWSk7Ci0JCQl9Ci0JCQlpZiAoc2ltdWxhdGVPbmx5KSB7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oZ2V0UmVzb3VyY2VTdHJpbmcoInNpbXVsYXRlLkRpcmVjdG9yaWVzQ3JlYXRlZC50ZXh0IiwKLQkJCQkvLwluZXcgT2JqZWN0W10geyBuZXdGaWxlLmdldFBhdGgoKSB9KSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghIG5ld0ZpbGUubWtkaXJzKCkpIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUZpbGVbXSBzdWJGaWxlcyA9IG9sZEZpbGUubGlzdEZpbGVzKCk7Ci0JCQlpZiAoc3ViRmlsZXMgIT0gbnVsbCkgewotCQkJCWlmIChwcm9ncmVzc0RpYWxvZyAhPSBudWxsKSB7Ci0JCQkJCXByb2dyZXNzRGlhbG9nLmFkZFdvcmtVbml0cyhzdWJGaWxlcy5sZW5ndGgpOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1YkZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUZpbGUgb2xkU3ViRmlsZSA9IHN1YkZpbGVzW2ldOwotCQkJCQlGaWxlIG5ld1N1YkZpbGUgPSBuZXcgRmlsZShuZXdGaWxlLCBvbGRTdWJGaWxlLmdldE5hbWUoKSk7Ci0JCQkJCWlmICghIGNvcHlGaWxlU3RydWN0dXJlKG9sZFN1YkZpbGUsIG5ld1N1YkZpbGUpKSByZXR1cm4gZmFsc2U7Ci0JCQkJCWlmIChwcm9ncmVzc0RpYWxvZyAhPSBudWxsKSB7Ci0JCQkJCQlwcm9ncmVzc0RpYWxvZy5hZGRQcm9ncmVzcygxKTsKLQkJCQkJCWlmIChwcm9ncmVzc0RpYWxvZy5pc0NhbmNlbGxlZCgpKSByZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogQ29weSBhIGZpbGUKLQkJCSAqLwotCQkJaWYgKHNpbXVsYXRlT25seSkgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKGdldFJlc291cmNlU3RyaW5nKCJzaW11bGF0ZS5Db3B5RnJvbVRvLnRleHQiLAotCQkJCS8vCW5ldyBPYmplY3RbXSB7IG9sZEZpbGUuZ2V0UGF0aCgpLCBuZXdGaWxlLmdldFBhdGgoKSB9KSk7Ci0JCQl9IGVsc2UgewotCQkJCUZpbGVSZWFkZXIgaW4gPSBudWxsOwotCQkJCUZpbGVXcml0ZXIgb3V0ID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlpbiA9IG5ldyBGaWxlUmVhZGVyKG9sZEZpbGUpOwotCQkJCQlvdXQgPSBuZXcgRmlsZVdyaXRlcihuZXdGaWxlKTsKLQkJCQotCQkJCQlpbnQgY291bnQ7Ci0JCQkJCXdoaWxlICgoY291bnQgPSBpbi5yZWFkKCkpICE9IC0xKSBvdXQud3JpdGUoY291bnQpOwotCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKGluICE9IG51bGwpIGluLmNsb3NlKCk7Ci0JCQkJCQlpZiAob3V0ICE9IG51bGwpIG91dC5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyBhIGZpbGUgb3IgZW50aXJlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCi0JICogCi0JICogQHBhcmFtIG9sZEZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBvbGQgZmlsZSBvciBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgd2l0aG91dCBlcnJvcnMKLQkgKi8KLQlib29sZWFuIGRlbGV0ZUZpbGVTdHJ1Y3R1cmUoRmlsZSBvbGRGaWxlKSB7Ci0JCWlmIChvbGRGaWxlID09IG51bGwpIHJldHVybiBmYWxzZTsJCQotCQlpZiAob2xkRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkvKgotCQkJICogRGVsZXRlIGEgZGlyZWN0b3J5Ci0JCQkgKi8KLQkJCWlmIChwcm9ncmVzc0RpYWxvZyAhPSBudWxsKSB7Ci0JCQkJcHJvZ3Jlc3NEaWFsb2cuc2V0RGV0YWlsRmlsZShvbGRGaWxlLCBQcm9ncmVzc0RpYWxvZy5ERUxFVEUpOwotCQkJfQotCQkJRmlsZVtdIHN1YkZpbGVzID0gb2xkRmlsZS5saXN0RmlsZXMoKTsKLQkJCWlmIChzdWJGaWxlcyAhPSBudWxsKSB7Ci0JCQkJaWYgKHByb2dyZXNzRGlhbG9nICE9IG51bGwpIHsKLQkJCQkJcHJvZ3Jlc3NEaWFsb2cuYWRkV29ya1VuaXRzKHN1YkZpbGVzLmxlbmd0aCk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3ViRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJRmlsZSBvbGRTdWJGaWxlID0gc3ViRmlsZXNbaV07Ci0JCQkJCWlmICghIGRlbGV0ZUZpbGVTdHJ1Y3R1cmUob2xkU3ViRmlsZSkpIHJldHVybiBmYWxzZTsKLQkJCQkJaWYgKHByb2dyZXNzRGlhbG9nICE9IG51bGwpIHsKLQkJCQkJCXByb2dyZXNzRGlhbG9nLmFkZFByb2dyZXNzKDEpOwotCQkJCQkJaWYgKHByb2dyZXNzRGlhbG9nLmlzQ2FuY2VsbGVkKCkpIHJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc2ltdWxhdGVPbmx5KSB7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbihnZXRSZXNvdXJjZVN0cmluZygic2ltdWxhdGUuRGVsZXRlLnRleHQiLAotCQkJLy8JbmV3IE9iamVjdFtdIHsgb2xkRmlsZS5nZXRQYXRoKCksIG9sZEZpbGUuZ2V0UGF0aCgpIH0pKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG9sZEZpbGUuZGVsZXRlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU29ydHMgZmlsZXMgbGV4aWNvZ3JhcGhpY2FsbHkgYnkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZXMgdGhlIGFycmF5IG9mIEZpbGVzIHRvIGJlIHNvcnRlZAotCSAqLwotCXN0YXRpYyB2b2lkIHNvcnRGaWxlcyhGaWxlW10gZmlsZXMpIHsKLQkJLyogVmVyeSBsYXp5IG1lcmdlIHNvcnQgYWxnb3JpdGhtICovCi0JCXNvcnRCbG9jayhmaWxlcywgMCwgZmlsZXMubGVuZ3RoIC0gMSwgbmV3IEZpbGVbZmlsZXMubGVuZ3RoXSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIHZvaWQgc29ydEJsb2NrKEZpbGVbXSBmaWxlcywgaW50IHN0YXJ0LCBpbnQgZW5kLCBGaWxlW10gbWVyZ2VUZW1wKSB7Ci0JCWZpbmFsIGludCBsZW5ndGggPSBlbmQgLSBzdGFydCArIDE7Ci0JCWlmIChsZW5ndGggPCA4KSB7Ci0JCQlmb3IgKGludCBpID0gZW5kOyBpID4gc3RhcnQ7IC0taSkgewotCQkJCWZvciAoaW50IGogPSBlbmQ7IGogPiBzdGFydDsgLS1qKSAgewotCQkJCQlpZiAoY29tcGFyZUZpbGVzKGZpbGVzW2ogLSAxXSwgZmlsZXNbal0pID4gMCkgewotCQkJCQkgICAgZmluYWwgRmlsZSB0ZW1wID0gZmlsZXNbal07IAotCQkJCQkgICAgZmlsZXNbal0gPSBmaWxlc1tqLTFdOyAKLQkJCQkJICAgIGZpbGVzW2otMV0gPSB0ZW1wOwotCQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWZpbmFsIGludCBtaWQgPSAoc3RhcnQgKyBlbmQpIC8gMjsKLQkJc29ydEJsb2NrKGZpbGVzLCBzdGFydCwgbWlkLCBtZXJnZVRlbXApOwotCQlzb3J0QmxvY2soZmlsZXMsIG1pZCArIDEsIGVuZCwgbWVyZ2VUZW1wKTsKLQkJaW50IHggPSBzdGFydDsKLQkJaW50IHkgPSBtaWQgKyAxOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7Ci0JCQlpZiAoKHggPiBtaWQpIHx8ICgoeSA8PSBlbmQpICYmIGNvbXBhcmVGaWxlcyhmaWxlc1t4XSwgZmlsZXNbeV0pID4gMCkpIHsKLQkJCQltZXJnZVRlbXBbaV0gPSBmaWxlc1t5KytdOwotCQkJfSBlbHNlIHsKLQkJCQltZXJnZVRlbXBbaV0gPSBmaWxlc1t4KytdOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIGZpbGVzW2kgKyBzdGFydF0gPSBtZXJnZVRlbXBbaV07Ci0JfQotCXByaXZhdGUgc3RhdGljIGludCBjb21wYXJlRmlsZXMoRmlsZSBhLCBGaWxlIGIpIHsKLS8vCQlib29sZWFuIGFJc0RpciA9IGEuaXNEaXJlY3RvcnkoKTsKLS8vCQlib29sZWFuIGJJc0RpciA9IGIuaXNEaXJlY3RvcnkoKTsKLS8vCQlpZiAoYUlzRGlyICYmICEgYklzRGlyKSByZXR1cm4gLTE7Ci0vLwkJaWYgKGJJc0RpciAmJiAhIGFJc0RpcikgcmV0dXJuIDE7Ci0KLQkJLy8gc29ydCBjYXNlLXNlbnNpdGl2ZSBmaWxlcyBpbiBhIGNhc2UtaW5zZW5zaXRpdmUgbWFubmVyCi0JCWludCBjb21wYXJlID0gYS5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShiLmdldE5hbWUoKSk7Ci0JCWlmIChjb21wYXJlID09IDApIGNvbXBhcmUgPSBhLmdldE5hbWUoKS5jb21wYXJlVG8oYi5nZXROYW1lKCkpOwotCQlyZXR1cm4gY29tcGFyZTsKLQl9Ci0JCi0JLyoKLQkgKiBUaGlzIHdvcmtlciB1cGRhdGVzIHRoZSB0YWJsZSB3aXRoIGZpbGUgaW5mb3JtYXRpb24gaW4gdGhlIGJhY2tncm91bmQuCi0JICogPHA+Ci0JICogSW1wbGVtZW50YXRpb24gbm90ZXM6Ci0JICogPHVsPgotCSAqIDxsaT4gSXQgaXMgZGVzaWduZWQgc3VjaCB0aGF0IGl0IGNhbiBiZSBpbnRlcnJ1cHRlZCBjbGVhbmx5LgotCSAqIDxsaT4gSXQgdXNlcyBhc3luY0V4ZWMoKSBpbiBzb21lIHBsYWNlcyB0byBlbnN1cmUgdGhhdCBTV1QgV2lkZ2V0cyBhcmUgbWFuaXB1bGF0ZWQgaW4gdGhlCi0JICogICAgICByaWdodCB0aHJlYWQuICBFeGNsdXNpdmUgdXNlIG9mIHN5bmNFeGVjKCkgd291bGQgYmUgaW5hcHByb3ByaWF0ZSBhcyBpdCB3b3VsZCByZXF1aXJlIGEgcGFpcgotCSAqICAgICAgb2YgY29udGV4dCBzd2l0Y2hlcyBiZXR3ZWVuIGVhY2ggdGFibGUgdXBkYXRlIG9wZXJhdGlvbi4KLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKi8KLQotCS8qKgotCSAqIFN0b3BzIHRoZSB3b3JrZXIgYW5kIHdhaXRzIGZvciBpdCB0byB0ZXJtaW5hdGUuCi0JICovCi0Jdm9pZCB3b3JrZXJTdG9wKCkgewotCQlpZiAod29ya2VyVGhyZWFkID09IG51bGwpIHJldHVybjsKLQkJc3luY2hyb25pemVkKHdvcmtlckxvY2spIHsKLQkJCXdvcmtlckNhbmNlbGxlZCA9IHRydWU7Ci0JCQl3b3JrZXJTdG9wcGVkID0gdHJ1ZTsKLQkJCXdvcmtlckxvY2subm90aWZ5QWxsKCk7Ci0JCX0KLQkJd2hpbGUgKHdvcmtlclRocmVhZCAhPSBudWxsKSB7Ci0JCQlpZiAoISBkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgd29ya2VyIHRoYXQgaXQgc2hvdWxkIHVwZGF0ZSBpdHNlbGYgd2l0aCBuZXcgZGF0YS4KLQkgKiBDYW5jZWxzIGFueSBwcmV2aW91cyBvcGVyYXRpb24gYW5kIGJlZ2lucyBhIG5ldyBvbmUuCi0JICogCi0JICogQHBhcmFtIGRpciB0aGUgbmV3IGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgdGFibGUsIG51bGwgaXMgaWdub3JlZAotCSAqIEBwYXJhbSBmb3JjZSBpZiB0cnVlIGNhdXNlcyBhIHJlZnJlc2ggZXZlbiBpZiB0aGUgZGF0YSBpcyB0aGUgc2FtZQotCSAqLwotCXZvaWQgd29ya2VyVXBkYXRlKEZpbGUgZGlyLCBib29sZWFuIGZvcmNlKSB7Ci0JCWlmIChkaXIgPT0gbnVsbCkgcmV0dXJuOwotCQlpZiAoKCFmb3JjZSkgJiYgKHdvcmtlck5leHREaXIgIT0gbnVsbCkgJiYgKHdvcmtlck5leHREaXIuZXF1YWxzKGRpcikpKSByZXR1cm47Ci0KLQkJc3luY2hyb25pemVkKHdvcmtlckxvY2spIHsKLQkJCXdvcmtlck5leHREaXIgPSBkaXI7Ci0JCQl3b3JrZXJTdG9wcGVkID0gZmFsc2U7Ci0JCQl3b3JrZXJDYW5jZWxsZWQgPSB0cnVlOwotCQkJd29ya2VyTG9jay5ub3RpZnlBbGwoKTsKLQkJfQotCQlpZiAod29ya2VyVGhyZWFkID09IG51bGwpIHsKLQkJCXdvcmtlclRocmVhZCA9IG5ldyBUaHJlYWQod29ya2VyUnVubmFibGUpOwotCQkJd29ya2VyVGhyZWFkLnN0YXJ0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNYW5hZ2VzIHRoZSB3b3JrZXIncyB0aHJlYWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIHdvcmtlclJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl3aGlsZSAoISB3b3JrZXJTdG9wcGVkKSB7Ci0JCQkJc3luY2hyb25pemVkKHdvcmtlckxvY2spIHsKLQkJCQkJd29ya2VyQ2FuY2VsbGVkID0gZmFsc2U7Ci0JCQkJCXdvcmtlclN0YXRlRGlyID0gd29ya2VyTmV4dERpcjsKLQkJCQl9Ci0JCQkJd29ya2VyRXhlY3V0ZSgpOwotCQkJCXN5bmNocm9uaXplZCh3b3JrZXJMb2NrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoKCF3b3JrZXJDYW5jZWxsZWQpICYmICh3b3JrZXJTdGF0ZURpciA9PSB3b3JrZXJOZXh0RGlyKSkgd29ya2VyTG9jay53YWl0KCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXdvcmtlclRocmVhZCA9IG51bGw7Ci0JCQkvLyB3YWtlIHVwIFVJIHRocmVhZCBpbiBjYXNlIGl0IGlzIGluIGEgbW9kYWwgbG9vcCBhd2FpdGluZyB0aHJlYWQgdGVybWluYXRpb24KLQkJCS8vIChzZWUgd29ya2VyU3RvcCgpKQotCQkJZGlzcGxheS53YWtlKCk7Ci0JCX0KLQl9OwotCQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHRhYmxlJ3MgY29udGVudHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgd29ya2VyRXhlY3V0ZSgpIHsKLQkJRmlsZVtdIGRpckxpc3Q7Ci0JCS8vIENsZWFyIGV4aXN0aW5nIGluZm9ybWF0aW9uCi0JCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRhYmxlQ29udGVudHNPZkxhYmVsLnNldFRleHQoRmlsZVZpZXdlci5nZXRSZXNvdXJjZVN0cmluZygiZGV0YWlscy5Db250ZW50c09mLnRleHQiLAotCQkJCQluZXcgT2JqZWN0W10geyB3b3JrZXJTdGF0ZURpci5nZXRQYXRoKCkgfSkpOwotCQkJCXRhYmxlLnJlbW92ZUFsbCgpOwotCQkJCXRhYmxlLnNldERhdGEoVEFCTEVEQVRBX0RJUiwgd29ya2VyU3RhdGVEaXIpOwotCQkJfQotCQl9KTsKLQkJZGlyTGlzdCA9IGdldERpcmVjdG9yeUxpc3Qod29ya2VyU3RhdGVEaXIpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7ICghIHdvcmtlckNhbmNlbGxlZCkgJiYgKGkgPCBkaXJMaXN0Lmxlbmd0aCk7IGkrKykgewotCQkJd29ya2VyQWRkRmlsZURldGFpbHMoZGlyTGlzdFtpXSk7Ci0JCX0KLQotCX0KLQkJCi0JLyoqCi0JICogQWRkcyBhIGZpbGUncyBkZXRhaWwgaW5mb3JtYXRpb24gdG8gdGhlIGRpcmVjdG9yeSBsaXN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHdvcmtlckFkZEZpbGVEZXRhaWxzKGZpbmFsIEZpbGUgZmlsZSkgewotCQlmaW5hbCBTdHJpbmcgbmFtZVN0cmluZyA9IGZpbGUuZ2V0TmFtZSgpOwotCQlmaW5hbCBTdHJpbmcgZGF0ZVN0cmluZyA9IGRhdGVGb3JtYXQuZm9ybWF0KG5ldyBEYXRlKGZpbGUubGFzdE1vZGlmaWVkKCkpKTsKLQkJZmluYWwgU3RyaW5nIHNpemVTdHJpbmc7Ci0JCWZpbmFsIFN0cmluZyB0eXBlU3RyaW5nOwotCQlmaW5hbCBJbWFnZSBpY29uSW1hZ2U7Ci0JCQotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQl0eXBlU3RyaW5nID0gZ2V0UmVzb3VyY2VTdHJpbmcoImZpbGV0eXBlLkZvbGRlciIpOwotCQkJc2l6ZVN0cmluZyA9ICIiOwotCQkJaWNvbkltYWdlID0gaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5pY29uQ2xvc2VkRm9sZGVyXTsKLQkJfSBlbHNlIHsKLQkJCXNpemVTdHJpbmcgPSBnZXRSZXNvdXJjZVN0cmluZygiZmlsZXNpemUuS0IiLAotCQkJCW5ldyBPYmplY3RbXSB7IG5ldyBMb25nKChmaWxlLmxlbmd0aCgpICsgNTEyKSAvIDEwMjQpIH0pOwotCQkJCi0JCQlpbnQgZG90ID0gbmFtZVN0cmluZy5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKGRvdCAhPSAtMSkgewotCQkJCVN0cmluZyBleHRlbnNpb24gPSBuYW1lU3RyaW5nLnN1YnN0cmluZyhkb3QpOwotCQkJCVByb2dyYW0gcHJvZ3JhbSA9IFByb2dyYW0uZmluZFByb2dyYW0oZXh0ZW5zaW9uKTsKLQkJCQlpZiAocHJvZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCXR5cGVTdHJpbmcgPSBwcm9ncmFtLmdldE5hbWUoKTsKLQkJCQkJaWNvbkltYWdlID0gaWNvbkNhY2hlLmdldEljb25Gcm9tUHJvZ3JhbShwcm9ncmFtKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0eXBlU3RyaW5nID0gZ2V0UmVzb3VyY2VTdHJpbmcoImZpbGV0eXBlLlVua25vd24iLCBuZXcgT2JqZWN0W10geyBleHRlbnNpb24udG9VcHBlckNhc2UoKSB9KTsKLQkJCQkJaWNvbkltYWdlID0gaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5pY29uRmlsZV07Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0eXBlU3RyaW5nID0gZ2V0UmVzb3VyY2VTdHJpbmcoImZpbGV0eXBlLk5vbmUiKTsKLQkJCQlpY29uSW1hZ2UgPSBpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmljb25GaWxlXTsKLQkJCX0KLQkJfQotCQlmaW5hbCBTdHJpbmdbXSBzdHJpbmdzID0gbmV3IFN0cmluZ1tdIHsgbmFtZVN0cmluZywgc2l6ZVN0cmluZywgdHlwZVN0cmluZywgZGF0ZVN0cmluZyB9OwotCi0JCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCQkvLyBndWFyZCBhZ2FpbnN0IHRoZSBzaGVsbCBiZWluZyBjbG9zZWQgYmVmb3JlIHRoaXMgcnVucwotCQkJCWlmIChzaGVsbC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCQkJdGFibGVJdGVtLnNldFRleHQoc3RyaW5ncyk7Ci0JCQkJdGFibGVJdGVtLnNldEltYWdlKGljb25JbWFnZSk7Ci0JCQkJdGFibGVJdGVtLnNldERhdGEoVEFCTEVJVEVNREFUQV9GSUxFLCBmaWxlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIG1hbmFnZSBhIHByb2dyZXNzIGRpYWxvZyBmb3IgZmlsZSBvcGVyYXRpb25zLgotCSAqLwotCWNsYXNzIFByb2dyZXNzRGlhbG9nIHsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09QWSA9IDA7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERFTEVURSA9IDE7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE1PVkUgPSAyOwotCi0JCVNoZWxsIHNoZWxsOwotCQlMYWJlbCBtZXNzYWdlTGFiZWwsIGRldGFpbExhYmVsOwotCQlQcm9ncmVzc0JhciBwcm9ncmVzc0JhcjsKLQkJQnV0dG9uIGNhbmNlbEJ1dHRvbjsKLQkJYm9vbGVhbiBpc0NhbmNlbGxlZCA9IGZhbHNlOwotCi0JCWZpbmFsIFN0cmluZyBvcGVyYXRpb25LZXlOYW1lW10gPSB7Ci0JCQkiQ29weSIsCi0JCQkiRGVsZXRlIiwKLQkJCSJNb3ZlIgotCQl9OwotCQotCQkvKioKLQkJICogQ3JlYXRlcyBhIHByb2dyZXNzIGRpYWxvZyBidXQgZG9lcyBub3Qgb3BlbiBpdCBpbW1lZGlhdGVseS4KLQkJICogCi0JCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBTaGVsbAotCQkgKiBAcGFyYW0gc3R5bGUgb25lIG9mIENPUFksIE1PVkUKLQkJICovCi0JCXB1YmxpYyBQcm9ncmVzc0RpYWxvZyhTaGVsbCBwYXJlbnQsIGludCBzdHlsZSkgewotCQkJc2hlbGwgPSBuZXcgU2hlbGwocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlRJVExFIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlzaGVsbC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJwcm9ncmVzc0RpYWxvZy4iICsgb3BlcmF0aW9uS2V5TmFtZVtzdHlsZV0gKyAiLnRpdGxlIikpOwotCQkJc2hlbGwuYWRkU2hlbGxMaXN0ZW5lcihuZXcgU2hlbGxBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkgewotCQkJCQlpc0NhbmNlbGxlZCA9IHRydWU7Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCW1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkhPUklaT05UQUwpOwotCQkJbWVzc2FnZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJwcm9ncmVzc0RpYWxvZy4iICsgb3BlcmF0aW9uS2V5TmFtZVtzdHlsZV0gKyAiLmRlc2NyaXB0aW9uIikpOwotCQkJCi0JCQlwcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0JhcihzaGVsbCwgU1dULkhPUklaT05UQUwgfCBTV1QuV1JBUCk7Ci0JCQlwcm9ncmVzc0Jhci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCQlwcm9ncmVzc0Jhci5zZXRNaW5pbXVtKDApOwotCQkJcHJvZ3Jlc3NCYXIuc2V0TWF4aW11bSgwKTsKLQkJCQotCQkJZGV0YWlsTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5IT1JJWk9OVEFMKTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCQlkZXRhaWxMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQotCQkJY2FuY2VsQnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQkJY2FuY2VsQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQkJY2FuY2VsQnV0dG9uLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInByb2dyZXNzRGlhbG9nLmNhbmNlbEJ1dHRvbi50ZXh0IikpOwotCQkJY2FuY2VsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaXNDYW5jZWxsZWQgPSB0cnVlOwotCQkJCQljYW5jZWxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIGRldGFpbCB0ZXh0IHRvIHNob3cgdGhlIGZpbGVuYW1lIGFsb25nIHdpdGggYSBzdHJpbmcKLQkJICogcmVwcmVzZW50aW5nIHRoZSBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIG9uIHRoYXQgZmlsZS4KLQkJICogCi0JCSAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIHRvIGJlIGRldGFpbGVkCi0JCSAqIEBwYXJhbSBvcGVyYXRpb24gb25lIG9mIENPUFksIERFTEVURQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RGV0YWlsRmlsZShGaWxlIGZpbGUsIGludCBvcGVyYXRpb24pIHsKLQkJCWRldGFpbExhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInByb2dyZXNzRGlhbG9nLiIgKyBvcGVyYXRpb25LZXlOYW1lW29wZXJhdGlvbl0gKyAiLm9wZXJhdGlvbiIsCi0JCQkJbmV3IE9iamVjdFtdIHsgZmlsZSB9KSk7Ci0JCX0KLQkJLyoqCi0JCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ2FuY2VsIGJ1dHRvbiB3YXMgYmVlbiBjbGlja2VkLgotCQkgKiAKLQkJICogQHJldHVybiB0cnVlIGlmIHRoZSBDYW5jZWwgYnV0dG9uIHdhcyBjbGlja2VkLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7Ci0JCQlyZXR1cm4gaXNDYW5jZWxsZWQ7Ci0JCX0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIHRvdGFsIG51bWJlciBvZiB3b3JrIHVuaXRzIHRvIGJlIHBlcmZvcm1lZC4KLQkJICogCi0JCSAqIEBwYXJhbSB3b3JrIHRoZSB0b3RhbCBudW1iZXIgb2Ygd29yayB1bml0cwotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VG90YWxXb3JrVW5pdHMoaW50IHdvcmspIHsKLQkJCXByb2dyZXNzQmFyLnNldE1heGltdW0od29yayk7Ci0JCX0KLQkJLyoqCi0JCSAqIEFkZHMgdG8gdGhlIHRvdGFsIG51bWJlciBvZiB3b3JrIHVuaXRzIHRvIGJlIHBlcmZvcm1lZC4KLQkJICogCi0JCSAqIEBwYXJhbSB3b3JrIHRoZSBudW1iZXIgb2Ygd29yayB1bml0cyB0byBhZGQKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZFdvcmtVbml0cyhpbnQgd29yaykgewotCQkJc2V0VG90YWxXb3JrVW5pdHMocHJvZ3Jlc3NCYXIuZ2V0TWF4aW11bSgpICsgd29yayk7Ci0JCX0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIHByb2dyZXNzIG9mIGNvbXBsZXRpb24gb2YgdGhlIHRvdGFsIHdvcmsgdW5pdHMuCi0JCSAqIAotCQkgKiBAcGFyYW0gd29yayB0aGUgdG90YWwgbnVtYmVyIG9mIHdvcmsgdW5pdHMgY29tcGxldGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzcyhpbnQgd29yaykgewotCQkJcHJvZ3Jlc3NCYXIuc2V0U2VsZWN0aW9uKHdvcmspOwotCQkJd2hpbGUgKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHt9IC8vIGVuYWJsZSBldmVudCBwcm9jZXNzaW5nCi0JCX0KLQkJLyoqCi0JCSAqIEFkZHMgdG8gdGhlIHByb2dyZXNzIG9mIGNvbXBsZXRpb24gb2YgdGhlIHRvdGFsIHdvcmsgdW5pdHMuCi0JCSAqIAotCQkgKiBAcGFyYW0gd29yayB0aGUgbnVtYmVyIG9mIHdvcmsgdW5pdHMgY29tcGxldGVkIHRvIGFkZAotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkUHJvZ3Jlc3MoaW50IHdvcmspIHsKLQkJCXNldFByb2dyZXNzKHByb2dyZXNzQmFyLmdldFNlbGVjdGlvbigpICsgd29yayk7Ci0JCX0KLQkJLyoqCi0JCSAqIE9wZW5zIHRoZSBkaWFsb2cuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQkJc2hlbGwucGFjaygpOwotCQkJZmluYWwgU2hlbGwgcGFyZW50U2hlbGwgPSAoU2hlbGwpIHNoZWxsLmdldFBhcmVudCgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBwYXJlbnRTaGVsbC5nZXRCb3VuZHMoKTsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBzaGVsbC5nZXRCb3VuZHMoKTsKLQkJCWJvdW5kcy54ID0gcmVjdC54ICsgKHJlY3Qud2lkdGggLSBib3VuZHMud2lkdGgpIC8gMjsKLQkJCWJvdW5kcy55ID0gcmVjdC55ICsgKHJlY3QuaGVpZ2h0IC0gYm91bmRzLmhlaWdodCkgLyAyOwotCQkJc2hlbGwuc2V0Qm91bmRzKGJvdW5kcyk7Ci0JCQlzaGVsbC5vcGVuKCk7Ci0JCX0KLQkJLyoqCi0JCSAqIENsb3NlcyB0aGUgZGlhbG9nIGFuZCBkaXNwb3NlcyBpdHMgcmVzb3VyY2VzLgotCQkgKi8KLQkJcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCQlzaGVsbC5jbG9zZSgpOwotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJc2hlbGwgPSBudWxsOwotCQkJbWVzc2FnZUxhYmVsID0gbnVsbDsKLQkJCWRldGFpbExhYmVsID0gbnVsbDsKLQkJCXByb2dyZXNzQmFyID0gbnVsbDsKLQkJCWNhbmNlbEJ1dHRvbiA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL0ljb25DYWNoZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9JY29uQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmNlN2IxMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL0ljb25DYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZmlsZXZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBNYW5hZ2VzIGljb25zIGZvciB0aGUgYXBwbGljYXRpb24uCi0gKiBUaGlzIGlzIG5lY2Vzc2FyeSBhcyB3ZSBjb3VsZCBlYXNpbHkgZW5kIHVwIGNyZWF0aW5nIHRob3VzYW5kcyBvZiBpY29ucwotICogYmVhcmluZyB0aGUgc2FtZSBpbWFnZS4KLSAqLwotY2xhc3MgSWNvbkNhY2hlIHsKLQkvLyBTdG9jayBpbWFnZXMKLQlwdWJsaWMgZmluYWwgaW50Ci0JCXNoZWxsSWNvbiA9IDAsCi0JCWljb25DbG9zZWREcml2ZSA9IDEsCi0JCWljb25DbG9zZWRGb2xkZXIgPSAyLAotCQlpY29uRmlsZSA9IDMsCi0JCWljb25PcGVuRHJpdmUgPSA0LAotCQlpY29uT3BlbkZvbGRlciA9IDUsCi0JCWNtZENvcHkgPSA2LAotCQljbWRDdXQgPSA3LAotCQljbWREZWxldGUgPSA4LAotCQljbWRQYXJlbnQgPSA5LAotCQljbWRQYXN0ZSA9IDEwLAotCQljbWRQcmludCA9IDExLAotCQljbWRSZWZyZXNoID0gMTIsCi0JCWNtZFJlbmFtZSA9IDEzLAotCQljbWRTZWFyY2ggPSAxNDsKLQlwdWJsaWMgZmluYWwgU3RyaW5nW10gc3RvY2tJbWFnZUxvY2F0aW9ucyA9IHsKLQkJImdlbmVyaWNfZXhhbXBsZS5naWYiLAotCQkiaWNvbl9DbG9zZWREcml2ZS5naWYiLAotCQkiaWNvbl9DbG9zZWRGb2xkZXIuZ2lmIiwKLQkJImljb25fRmlsZS5naWYiLAotCQkiaWNvbl9PcGVuRHJpdmUuZ2lmIiwKLQkJImljb25fT3BlbkZvbGRlci5naWYiLAotCQkiY21kX0NvcHkuZ2lmIiwKLQkJImNtZF9DdXQuZ2lmIiwKLQkJImNtZF9EZWxldGUuZ2lmIiwKLQkJImNtZF9QYXJlbnQuZ2lmIiwKLQkJImNtZF9QYXN0ZS5naWYiLAotCQkiY21kX1ByaW50LmdpZiIsCi0JCSJjbWRfUmVmcmVzaC5naWYiLAotCQkiY21kX1JlbmFtZS5naWYiLAotCQkiY21kX1NlYXJjaC5naWYiCi0JfTsKLQlwdWJsaWMgSW1hZ2Ugc3RvY2tJbWFnZXNbXTsKLQkKLQkvLyBTdG9jayBjdXJzb3JzCi0JcHVibGljIGZpbmFsIGludAotCQljdXJzb3JEZWZhdWx0ID0gMCwKLQkJY3Vyc29yV2FpdCA9IDE7Ci0JcHVibGljIEN1cnNvciBzdG9ja0N1cnNvcnNbXTsKLQkvLyBDYWNoZWQgaWNvbnMKLQlwcml2YXRlIEhhc2h0YWJsZSBpY29uQ2FjaGU7IC8qIG1hcCBQcm9ncmFtIHRvIEltYWdlICovCi0JCi0JcHVibGljIEljb25DYWNoZSgpIHsKLQl9Ci0JLyoqCi0JICogTG9hZHMgdGhlIHJlc291cmNlcwotCSAqIAotCSAqIEBwYXJhbSBkaXNwbGF5IHRoZSBkaXNwbGF5Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdFJlc291cmNlcyhEaXNwbGF5IGRpc3BsYXkpIHsKLQkJaWYgKHN0b2NrSW1hZ2VzID09IG51bGwpIHsKLQkJCXN0b2NrSW1hZ2VzID0gbmV3IEltYWdlW3N0b2NrSW1hZ2VMb2NhdGlvbnMubGVuZ3RoXTsKLQkJCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RvY2tJbWFnZUxvY2F0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJCUltYWdlIGltYWdlID0gY3JlYXRlU3RvY2tJbWFnZShkaXNwbGF5LCBzdG9ja0ltYWdlTG9jYXRpb25zW2ldKTsKLQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQlmcmVlUmVzb3VyY2VzKCk7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0JCQkJCQlGaWxlVmlld2VyLmdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMiKSk7Ci0JCQkJfQotCQkJCXN0b2NrSW1hZ2VzW2ldID0gaW1hZ2U7Ci0JCQl9Ci0JCX0JCi0JCWlmIChzdG9ja0N1cnNvcnMgPT0gbnVsbCkgewotCQkJc3RvY2tDdXJzb3JzID0gbmV3IEN1cnNvcltdIHsKLQkJCQludWxsLAotCQkJCW5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKQotCQkJfTsKLQkJfQotCQlpY29uQ2FjaGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JfQotCS8qKgotCSAqIEZyZWVzIHRoZSByZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBmcmVlUmVzb3VyY2VzKCkgewotCQlpZiAoc3RvY2tJbWFnZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9ja0ltYWdlcy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIEltYWdlIGltYWdlID0gc3RvY2tJbWFnZXNbaV07Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXN0b2NrSW1hZ2VzID0gbnVsbDsKLQkJfQotCQlpZiAoaWNvbkNhY2hlICE9IG51bGwpIHsKLQkJCWZvciAoRW51bWVyYXRpb24gaXQgPSBpY29uQ2FjaGUuZWxlbWVudHMoKTsgaXQuaGFzTW9yZUVsZW1lbnRzKCk7ICkgewotCQkJCUltYWdlIGltYWdlID0gKEltYWdlKSBpdC5uZXh0RWxlbWVudCgpOwotCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlpZiAoc3RvY2tDdXJzb3JzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RvY2tDdXJzb3JzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgQ3Vyc29yIGN1cnNvciA9IHN0b2NrQ3Vyc29yc1tpXTsKLQkJCQlpZiAoY3Vyc29yICE9IG51bGwpIGN1cnNvci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlzdG9ja0N1cnNvcnMgPSBudWxsOwotCQl9Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSBzdG9jayBpbWFnZQotCSAqIAotCSAqIEBwYXJhbSBkaXNwbGF5IHRoZSBkaXNwbGF5Ci0JICogQHBhcmFtIHBhdGggdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGljb24KLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZVN0b2NrSW1hZ2UoRGlzcGxheSBkaXNwbGF5LCBTdHJpbmcgcGF0aCkgewotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBJY29uQ2FjaGUuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSAocGF0aCk7Ci0JCUltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhIChzdHJlYW0pOwotCQlJbWFnZURhdGEgbWFzayA9IGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lNYXNrICgpOwotCQlJbWFnZSByZXN1bHQgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIGltYWdlRGF0YSwgbWFzayk7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UgKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlICgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIEdldHMgYW4gaW1hZ2UgZm9yIGEgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9ncmFtCi0JICoKLQkgKiBAcGFyYW0gcHJvZ3JhbSB0aGUgUHJvZ3JhbQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJY29uRnJvbVByb2dyYW0oUHJvZ3JhbSBwcm9ncmFtKSB7Ci0JCUltYWdlIGltYWdlID0gKEltYWdlKSBpY29uQ2FjaGUuZ2V0KHByb2dyYW0pOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJSW1hZ2VEYXRhIGltYWdlRGF0YSA9IHByb2dyYW0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQlpZiAoaW1hZ2VEYXRhICE9IG51bGwpIHsKLQkJCQlpbWFnZSA9IG5ldyBJbWFnZShudWxsLCBpbWFnZURhdGEsIGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lNYXNrKCkpOwotCQkJCWljb25DYWNoZS5wdXQocHJvZ3JhbSwgaW1hZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlpbWFnZSA9IHN0b2NrSW1hZ2VzW2ljb25GaWxlXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfQ29weS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9Db3B5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDI3NGIwNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9Db3B5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX0N1dC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9DdXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYjk0OGI5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX0N1dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9EZWxldGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfRGVsZXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmY2NDc2Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9EZWxldGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUGFyZW50LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1BhcmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliMjc4ZTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUGFyZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1Bhc3RlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1Bhc3RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzVlMGFiMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9QYXN0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9QcmludC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9QcmludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkZmE4Y2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUHJpbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUmVmcmVzaC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9SZWZyZXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTA2M2MyMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9SZWZyZXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1JlbmFtZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9SZW5hbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNWIxMzI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1JlbmFtZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9TZWFyY2guZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfU2VhcmNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmRjM2ViZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9TZWFyY2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9nZW5lcmljX2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9nZW5lcmljX2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOWZiNmIwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvZ2VuZXJpY19leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9DbG9zZWREcml2ZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fQ2xvc2VkRHJpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU1MzBlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9DbG9zZWREcml2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fQ2xvc2VkRm9sZGVyLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9DbG9zZWRGb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZWI2ZWQxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9DbG9zZWRGb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX0ZpbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX0ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2Yjg2ZDA3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9GaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9PcGVuRHJpdmUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX09wZW5Ecml2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiMmI2MzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX09wZW5Ecml2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fT3BlbkZvbGRlci5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fT3BlbkZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5Yzc3NzM0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9PcGVuRm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0FkdmFuY2VkR3JhcGhpY3MuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0FkdmFuY2VkR3JhcGhpY3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM2YjdlNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9BZHZhbmNlZEdyYXBoaWNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotLyogCi0gKiBEcmF3aW5nIHdpdGggdHJhbnNmb3JtYXRpb25zLCBwYXRocyBhbmQgYWxwaGEgYmxlbmRpbmcKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBBZHZhbmNlZEdyYXBoaWNzIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2dyYXBoaWNzIik7Ci0JCi0Jc3RhdGljIEltYWdlIGxvYWRJbWFnZSAoRGlzcGxheSBkaXNwbGF5LCBDbGFzcyBjbGF6eiwgU3RyaW5nIHN0cmluZykgewotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBjbGF6ei5nZXRSZXNvdXJjZUFzU3RyZWFtIChzdHJpbmcpOwotCQlpZiAoc3RyZWFtID09IG51bGwpIHJldHVybiBudWxsOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgc3RyZWFtKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCXN0cmVhbS5jbG9zZSAoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7fQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgU2hlbGwgb3BlbihmaW5hbCBEaXNwbGF5IGRpc3BsYXkpIHsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZygiQWR2YW5jZWRHcmFwaGljcyIpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGlzcGxheSk7Ci0JCQlwYXRoLmRpc3Bvc2UoKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX1dBUk5JTkcgfCBTV1QuT0spOwotCQkJZGlhbG9nLnNldFRleHQoUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZygiV2FybmluZyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZGlhbG9nLnNldE1lc3NhZ2UoUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZygiTGliTm90Rm91bmQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlGb250RGF0YSBmZCA9IHNoZWxsLmdldEZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCQlmaW5hbCBGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBmZC5nZXROYW1lKCksIDk2LCBTV1QuQk9MRCB8IFNXVC5JVEFMSUMpOwotCQlmaW5hbCBJbWFnZSBpbWFnZSA9IGxvYWRJbWFnZShkaXNwbGF5LCBBZHZhbmNlZEdyYXBoaWNzLmNsYXNzLCAiaXJtYW9zLmpwZyIpOwotCQlmaW5hbCBSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJR0MgZ2MgPSBldmVudC5nYzsJCQkJCi0JCQkJVHJhbnNmb3JtIHRyID0gbmV3IFRyYW5zZm9ybShkaXNwbGF5KTsKLQkJCQl0ci50cmFuc2xhdGUocmVjdC53aWR0aCAvIDQsIHJlY3QuaGVpZ2h0IC8gMik7Ci0JCQkJdHIucm90YXRlKC0zMCk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQkJCX0KLQkJCQlnYy5zZXRBbHBoYSgxMDApOwotCQkJCWdjLnNldFRyYW5zZm9ybSh0cik7Ci0JCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGlzcGxheSk7Ci0JCQkJcGF0aC5hZGRTdHJpbmcoIlNXVCIsIDAsIDAsIGZvbnQpOwotCQkJCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLQkJCQlnYy5maWxsUGF0aChwYXRoKTsKLQkJCQlnYy5kcmF3UGF0aChwYXRoKTsKLQkJCQl0ci5kaXNwb3NlKCk7Ci0JCQkJcGF0aC5kaXNwb3NlKCk7Ci0JCQl9CQkJCi0JCX0pOwotCQlzaGVsbC5zZXRTaXplKHNoZWxsLmNvbXB1dGVTaXplKHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQlmb250LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7CQotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgQWR2YW5jZWRHcmFwaGljcygpLm9wZW4oZGlzcGxheSk7Ci0JCXdoaWxlIChzaGVsbCAhPSBudWxsICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQmxhY2tIb2xlVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9CbGFja0hvbGVUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYxZWFhZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9CbGFja0hvbGVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgY2xhc3MgQmxhY2tIb2xlVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCQotCWludCBzaXplID0gMTsKLQkKLXB1YmxpYyBCbGFja0hvbGVUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJsYWNrSG9sZSIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBib29sZWFuIGlzQW5pbWF0ZWQoKSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXB1YmxpYyB2b2lkIG5leHQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKHNpemUgPiB3aWR0aCAqIDMgLyAyKSBzaXplID0gMDsKLQllbHNlIHNpemUgKz0gMTA7Ci19Ci0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JZ2MuZmlsbE92YWwoKHdpZHRoIC0gc2l6ZSkgLyAyLCAoaGVpZ2h0IC0gc2l6ZSkgLyAyLCBzaXplLCBzaXplKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYXBoaWNzRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhcGhpY3NFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZDFkYmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhcGhpY3NFeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgR3JhcGhpY3NFeGFtcGxlIHsKLQkKLQlDb21wb3NpdGUgcGFyZW50OwotCUdyYXBoaWNzVGFiW10gdGFiczsKLQlHcmFwaGljc1RhYiB0YWI7Ci0JT2JqZWN0W10gdGFiQmFja2dyb3VuZDsKLQkKLQlib29sZWFuIGFuaW1hdGU7Ci0JCi0JTGlzdGVuZXIgcmVkcmF3TGlzdGVuZXI7Ci0JCi0JVG9vbEJhciB0b29sQmFyOwotCVRyZWUgdGFiTGlzdDsKLQlDYW52YXMgY2FudmFzOwotCUNvbXBvc2l0ZSBjb250cm9sUGFuZWwsIHRhYlBhbmVsOwotCVRvb2xJdGVtIHBsYXlJdGVtLCBwYXVzZUl0ZW0sIGJhY2tJdGVtLCBkYkl0ZW07Ci0JU3Bpbm5lciB0aW1lclNwaW5uZXI7Ci0JCi0JTWVudSBiYWNrTWVudTsKLQlNZW51SXRlbSBjdXN0b21NSTsKLQlJbWFnZSBjdXN0b21JbWFnZTsKLQlDb2xvciBjdXN0b21Db2xvcjsKLQkKLQlWZWN0b3IgaW1hZ2VzOwotCQotCXN0YXRpYyBib29sZWFuIGFkdmFuY2VHcmFwaGljcywgYWR2YW5jZUdyYXBoaWNzSW5pdDsKLQkKLQlzdGF0aWMgZmluYWwgaW50IFRJTUVSID0gMzA7Ci0Jc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfZ3JhcGhpY3MiKTsgLy8kTk9OLU5MUy0xJAotCi1wdWJsaWMgR3JhcGhpY3NFeGFtcGxlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQlyZWRyYXdMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJcmVkcmF3KCk7Ci0JCX0KLQl9OwotCUdyaWREYXRhIGRhdGE7Ci0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTsKLQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JdGFicyA9IGNyZWF0ZVRhYnMoKTsJCi0JaW1hZ2VzID0gbmV3IFZlY3RvcigpOwkKLQljcmVhdGVUb29sQmFyKHBhcmVudCk7Ci0JY3JlYXRlVGFiTGlzdChwYXJlbnQpOwotCWZpbmFsIFNhc2ggc2FzaCA9IG5ldyBTYXNoKHBhcmVudCwgU1dULlZFUlRJQ0FMKTsKLQljcmVhdGVUYWJQYW5lbChwYXJlbnQpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQl0b29sQmFyLnNldExheW91dERhdGEoZGF0YSk7CQotCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkZJTEwsIGZhbHNlLCB0cnVlKTsKLQlkYXRhLndpZHRoSGludCA9IHRhYkxpc3QuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54ICsgNTA7Ci0JdGFiTGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkZJTEwsIGZhbHNlLCB0cnVlKTsKLQlzYXNoLnNldExheW91dERhdGEoZGF0YSk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCXRhYlBhbmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0Jc2FzaC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsICE9IFNXVC5EUkFHKSB7Ci0JCQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSl0YWJMaXN0LmdldExheW91dERhdGEoKTsJCQkJCi0JCQkJZGF0YS53aWR0aEhpbnQgPSBldmVudC54IC0gdGFiTGlzdC5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKS53aWR0aDsKLQkJCQlwYXJlbnQubGF5b3V0KHRydWUpOwotCQkJCWFuaW1hdGUgPSBwYXVzZUl0ZW0uZ2V0RW5hYmxlZCgpOwotCQkJfSBlbHNlIHsKLQkJCQlhbmltYXRlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9KTsJCi0Jc2V0VGFiKHRhYik7Ci0Jc3RhcnRBbmltYXRpb25UaW1lcigpOwotfQotCi1ib29sZWFuIGNoZWNrQWR2YW5jZWRHcmFwaGljcygpIHsKLQlpZiAoYWR2YW5jZUdyYXBoaWNzSW5pdCkgcmV0dXJuIGFkdmFuY2VHcmFwaGljczsKLQlhZHZhbmNlR3JhcGhpY3NJbml0ID0gdHJ1ZTsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQl0cnkgewotCQlQYXRoIHBhdGggPSBuZXcgUGF0aChkaXNwbGF5KTsKLQkJcGF0aC5kaXNwb3NlKCk7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJU2hlbGwgc2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCksIG5ld1NoZWxsID0gbnVsbDsKLQkJaWYgKHNoZWxsID09IG51bGwpIHNoZWxsID0gbmV3U2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX1dBUk5JTkcgfCBTV1QuT0spOwotCQlkaWFsb2cuc2V0VGV4dChSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKCJXYXJuaW5nIikpOyAvLyROT04tTkxTLTEkCi0JCWRpYWxvZy5zZXRNZXNzYWdlKFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoIkxpYk5vdEZvdW5kIikpOyAvLyROT04tTkxTLTEkCi0JCWRpYWxvZy5vcGVuKCk7Ci0JCWlmIChuZXdTaGVsbCAhPSBudWxsKSBuZXdTaGVsbC5kaXNwb3NlKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcmV0dXJuIGFkdmFuY2VHcmFwaGljcyA9IHRydWU7Ci19Ci0KLXZvaWQgY3JlYXRlQ2FudmFzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQljYW52YXMgPSBuZXcgQ2FudmFzKHBhcmVudCwgU1dULk5PX0JBQ0tHUk9VTkQpOwotCWNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCUdDIGdjOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBjYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQkJSW1hZ2UgYnVmZmVyID0gbnVsbDsKLQkJCWlmIChkYkl0ZW0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlidWZmZXIgPSBuZXcgSW1hZ2UoY2FudmFzLmdldERpc3BsYXkoKSwgcmVjdCk7Ci0JCQkJZ2MgPSBuZXcgR0MoYnVmZmVyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZ2MgPSBldmVudC5nYzsKLQkJCX0KLQkJCXBhaW50QmFja2dyb3VuZChnYywgcmVjdCk7Ci0JCQlHcmFwaGljc1RhYiB0YWIgPSBnZXRUYWIoKTsKLQkJCWlmICh0YWIgIT0gbnVsbCkgdGFiLnBhaW50KGdjLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQlpZiAoZ2MgIT0gZXZlbnQuZ2MpIGdjLmRpc3Bvc2UoKTsKLQkJCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJCWV2ZW50LmdjLmRyYXdJbWFnZShidWZmZXIsIDAsIDApOwotCQkJCWJ1ZmZlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLX0KLQotdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCUdyb3VwIGdyb3VwOwotCWNvbnRyb2xQYW5lbCA9IGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCWdyb3VwLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCi0JY29udHJvbFBhbmVsLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotfQotCi12b2lkIGNyZWF0ZVRhYlBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQl0YWJQYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JR3JpZERhdGEgZGF0YTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQl0YWJQYW5lbC5zZXRMYXlvdXQobGF5b3V0KTsKLQljcmVhdGVDYW52YXModGFiUGFuZWwpOwotCWNyZWF0ZUNvbnRyb2xQYW5lbCh0YWJQYW5lbCk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCWNhbnZhcy5zZXRMYXlvdXREYXRhKGRhdGEpOwkKLQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0JY29udHJvbFBhbmVsLnNldExheW91dERhdGEoZGF0YSk7Ci19Ci0KLXZvaWQgY3JlYXRlVG9vbEJhcihmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gcGFyZW50LmdldERpc3BsYXkoKTsKLQkKLQl0b29sQmFyID0gbmV3IFRvb2xCYXIocGFyZW50LCBTV1QuRkxBVCk7Ci0JTGlzdGVuZXIgdG9vbEJhckxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuU2VsZWN0aW9uOiB7Ci0JCQkJCWlmIChldmVudC53aWRnZXQgPT0gcGxheUl0ZW0pIHsKLQkJCQkJCWFuaW1hdGUgPSB0cnVlOwotCQkJCQkJcGxheUl0ZW0uc2V0RW5hYmxlZCghYW5pbWF0ZSk7Ci0JCQkJCQlwYXVzZUl0ZW0uc2V0RW5hYmxlZChhbmltYXRlKTsKLQkJCQkJfSBlbHNlIGlmIChldmVudC53aWRnZXQgPT0gcGF1c2VJdGVtKSB7Ci0JCQkJCQlhbmltYXRlID0gZmFsc2U7Ci0JCQkJCQlwbGF5SXRlbS5zZXRFbmFibGVkKCFhbmltYXRlKTsKLQkJCQkJCXBhdXNlSXRlbS5zZXRFbmFibGVkKGFuaW1hdGUpOwotCQkJCQl9IGVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBiYWNrSXRlbSkgewotCQkJCQkJZmluYWwgVG9vbEl0ZW0gdG9vbEl0ZW0gPSAoVG9vbEl0ZW0pIGV2ZW50LndpZGdldDsKLQkJCQkJCWZpbmFsIFRvb2xCYXIgIHRvb2xCYXIgPSB0b29sSXRlbS5nZXRQYXJlbnQoKTsJCQkKLQkJCQkJCVJlY3RhbmdsZSB0b29sSXRlbUJvdW5kcyA9IHRvb2xJdGVtLmdldEJvdW5kcygpOwotCQkJCQkJUG9pbnQgcG9pbnQgPSB0b29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQodG9vbEl0ZW1Cb3VuZHMueCwgdG9vbEl0ZW1Cb3VuZHMueSkpOwotCQkJCQkJYmFja01lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIHRvb2xJdGVtQm91bmRzLmhlaWdodCk7Ci0JCQkJCQliYWNrTWVudS5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQkKLQlwbGF5SXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JcGxheUl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiUGxheSIpKTsgLy8kTk9OLU5MUy0xJAotCXBsYXlJdGVtLnNldEltYWdlKGxvYWRJbWFnZShkaXNwbGF5LCAicGxheS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQlwbGF5SXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0b29sQmFyTGlzdGVuZXIpOwotCQotCXBhdXNlSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JcGF1c2VJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlBhdXNlIikpOyAvLyROT04tTkxTLTEkCi0JcGF1c2VJdGVtLnNldEltYWdlKGxvYWRJbWFnZShkaXNwbGF5LCAicGF1c2UuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JcGF1c2VJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRvb2xCYXJMaXN0ZW5lcik7Ci0JCi0JYmFja0l0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCWJhY2tJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkJhY2tncm91bmQiKSk7IC8vJE5PTi1OTFMtMSQKLQliYWNrSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0b29sQmFyTGlzdGVuZXIpOwotCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tdewotCQlnZXRSZXNvdXJjZVN0cmluZygiV2hpdGUiKSwgLy8kTk9OLU5MUy0xJAotCQlnZXRSZXNvdXJjZVN0cmluZygiQmxhY2siKSwgLy8kTk9OLU5MUy0xJAotCQlnZXRSZXNvdXJjZVN0cmluZygiUmVkIiksIC8vJE5PTi1OTFMtMSQKLQkJZ2V0UmVzb3VyY2VTdHJpbmcoIkdyZWVuIiksIC8vJE5PTi1OTFMtMSQKLQkJZ2V0UmVzb3VyY2VTdHJpbmcoIkJsdWUiKSwgLy8kTk9OLU5MUy0xJAotCQlnZXRSZXNvdXJjZVN0cmluZygiQ3VzdG9tQ29sb3IiKSwgLy8kTk9OLU5MUy0xJAotCX07Ci0JQ29sb3JbXSBjb2xvcnMgPSBuZXcgQ29sb3JbXXsKLQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpLAkKLQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spLAkKLQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSwJCi0JCWRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSwJCi0JCWRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpLAotCQludWxsLAotCX07CQotCWJhY2tNZW51ID0gbmV3IE1lbnUocGFyZW50KTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCU1lbnVJdGVtIGl0ZW0gPSAoTWVudUl0ZW0pZXZlbnQud2lkZ2V0OwotCQkJaWYgKGN1c3RvbU1JID09IGl0ZW0pIHsKLQkJCQlDb2xvckRpYWxvZyBkaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2cocGFyZW50LmdldFNoZWxsKCkpOwotCQkJCVJHQiByZ2IgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJCWlmIChjdXN0b21Db2xvciAhPSBudWxsKSBjdXN0b21Db2xvci5kaXNwb3NlKCk7Ci0JCQkJY3VzdG9tQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgcmdiKTsKLQkJCQlpZiAoY3VzdG9tSW1hZ2UgIT0gbnVsbCkgY3VzdG9tSW1hZ2UuZGlzcG9zZSgpOwotCQkJCWN1c3RvbUltYWdlID0gY3JlYXRlSW1hZ2UoZGlzcGxheSwgY3VzdG9tQ29sb3IpOwotCQkJCWl0ZW0uc2V0RGF0YShuZXcgT2JqZWN0W117Y3VzdG9tQ29sb3IsIGN1c3RvbUltYWdlfSk7Ci0JCQkJaXRlbS5zZXRJbWFnZShjdXN0b21JbWFnZSk7Ci0JCQl9Ci0JCQl0YWJCYWNrZ3JvdW5kID0gKE9iamVjdFtdKWl0ZW0uZ2V0RGF0YSgpOwotCQkJYmFja0l0ZW0uc2V0SW1hZ2UoKEltYWdlKXRhYkJhY2tncm91bmRbMV0pOwotCQkJY2FudmFzLnJlZHJhdygpOwotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0oYmFja01lbnUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG5hbWVzW2ldKTsKLQkJaXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJaWYgKGNvbG9yc1tpXSAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKGRpc3BsYXksIGNvbG9yc1tpXSk7Ci0JCQlpbWFnZXMuYWRkRWxlbWVudChpbWFnZSk7Ci0JCQlpdGVtLnNldEltYWdlKGltYWdlKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGN1c3RvbSBtZW51IGl0ZW0KLQkJCWN1c3RvbU1JID0gaXRlbTsKLQkJfQotCQlpdGVtLnNldERhdGEobmV3IE9iamVjdFtde2NvbG9yc1tpXSwgaW1hZ2V9KTsKLQkJaWYgKHRhYkJhY2tncm91bmQgPT0gbnVsbCkgewotCQkJdGFiQmFja2dyb3VuZCA9IChPYmplY3RbXSlpdGVtLmdldERhdGEoKTsKLQkJCWJhY2tJdGVtLnNldEltYWdlKChJbWFnZSl0YWJCYWNrZ3JvdW5kWzFdKTsKLQkJfQotCX0KLQkKLQlkYkl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULkNIRUNLKTsKLQlkYkl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiRG91YmxlQnVmZmVyIikpOyAvLyROT04tTkxTLTEkCi0JZGJJdGVtLnNldEltYWdlKGxvYWRJbWFnZShkaXNwbGF5LCAiZGIuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLQlUb29sSXRlbSBzZXBhcmF0b3IgPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHRvb2xCYXIsIFNXVC5OT05FKTsKLQlHcmlkRGF0YSBkYXRhOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAzOwotCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JdGltZXJTcGlubmVyID0gbmV3IFNwaW5uZXIoY29tcCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JdGltZXJTcGlubmVyLnNldExheW91dERhdGEoZGF0YSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkFuaW1hdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCXRpbWVyU3Bpbm5lci5zZXRNYXhpbXVtKDEwMDApOwotCXRpbWVyU3Bpbm5lci5zZXRTZWxlY3Rpb24oVElNRVIpOwotCXRpbWVyU3Bpbm5lci5zZXRTZWxlY3Rpb24oVElNRVIpOwotCXNlcGFyYXRvci5zZXRDb250cm9sKGNvbXApOwotCXNlcGFyYXRvci5zZXRXaWR0aChjb21wLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueCk7Ci19Ci0KLUltYWdlIGNyZWF0ZUltYWdlKERpc3BsYXkgZGlzcGxheSwgQ29sb3IgY29sb3IpIHsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxNiwgMTYpOwotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCWdjLmZpbGxSZWN0YW5nbGUocmVjdCk7Ci0JaWYgKGNvbG9yLmVxdWFscyhkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpKSB7Ci0JCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQl9Ci0JZ2MuZHJhd1JlY3RhbmdsZShyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCAtIDEsIHJlY3QuaGVpZ2h0IC0gMSk7Ci0JZ2MuZGlzcG9zZSgpOwotCXJldHVybiBpbWFnZTsKLX0KLQotdm9pZCBjcmVhdGVUYWJMaXN0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQl0YWJMaXN0ID0gbmV3IFRyZWUocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykgewotCQlHcmFwaGljc1RhYiB0YWIgPSB0YWJzW2ldOwotCQlzZXQuYWRkKHRhYi5nZXRDYXRlZ29yeSgpKTsKLQl9Ci0JZm9yIChJdGVyYXRvciBpdGVyID0gc2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRhYkxpc3QsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KHRleHQpOwotCX0KLQlUcmVlSXRlbVtdIGl0ZW1zID0gdGFiTGlzdC5nZXRJdGVtcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHRhYnMubGVuZ3RoOyBqKyspIHsKLQkJCUdyYXBoaWNzVGFiIHRhYiA9IHRhYnNbal07Ci0JCQlpZiAoaXRlbS5nZXRUZXh0KCkuZXF1YWxzKHRhYi5nZXRDYXRlZ29yeSgpKSkgewotCQkJCVRyZWVJdGVtIGl0ZW0xID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQlpdGVtMS5zZXRUZXh0KHRhYi5nZXRUZXh0KCkpOwotCQkJCWl0ZW0xLnNldERhdGEodGFiKTsKLQkJCX0KLQkJfQotCX0KLQl0YWJMaXN0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQlzZXRUYWIoKEdyYXBoaWNzVGFiKWl0ZW0uZ2V0RGF0YSgpKTsKLQkJCX0KLQkJfQotCX0pOwotfQotCi1HcmFwaGljc1RhYltdIGNyZWF0ZVRhYnMoKSB7Ci0JcmV0dXJuIG5ldyBHcmFwaGljc1RhYltdIHsKLQkJbmV3IExpbmVUYWIodGhpcyksCi0JCW5ldyBTdGFyUG9seVRhYih0aGlzKSwKLQkJdGFiID0gbmV3IEludHJvVGFiKHRoaXMpLAotCQluZXcgQmxhY2tIb2xlVGFiKHRoaXMpLAotCX07Ci19Ci0KLS8qKgotICogRGlzcG9zZXMgYWxsIHJlc291cmNlcyBjcmVhdGVkIGJ5IHRoZSByZWNlaXZlci4KLSAqLwotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAodGFicyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykgewotCQkJR3JhcGhpY3NUYWIgdGFiID0gdGFic1tpXTsKLQkJCXRhYi5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JdGFicyA9IG51bGw7Ci0JaWYgKGltYWdlcyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkoKEltYWdlKWltYWdlcy5lbGVtZW50QXQoaSkpLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQlpbWFnZXMgPSBudWxsOwotCWlmIChjdXN0b21Db2xvciAhPSBudWxsKSBjdXN0b21Db2xvci5kaXNwb3NlKCk7Ci0JY3VzdG9tQ29sb3IgPSBudWxsOwotCWlmIChjdXN0b21JbWFnZSAhPSBudWxsKSBjdXN0b21JbWFnZS5kaXNwb3NlKCk7Ci0JY3VzdG9tSW1hZ2UgPSBudWxsOwotfQotCi1UcmVlSXRlbSBmaW5kSXRlbUJ5RGF0YShUcmVlSXRlbVtdIGl0ZW1zLCBPYmplY3QgZGF0YSkgewotCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQlpZiAoaXRlbS5nZXREYXRhKCkgPT0gZGF0YSkgcmV0dXJuIGl0ZW07Ci0JCWl0ZW0gPSBmaW5kSXRlbUJ5RGF0YShpdGVtLmdldEl0ZW1zKCksIGRhdGEpOwotCQlpZiAoaXRlbSAhPSBudWxsKSByZXR1cm4gaXRlbTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLS8qKgotICogR2V0cyB0aGUgY3VycmVudCB0YWIuCi0gKi8KLXB1YmxpYyBHcmFwaGljc1RhYiBnZXRUYWIoKSB7Ci0JcmV0dXJuIHRhYjsKLX0KLQotTGlzdGVuZXIgZ2V0UmVkcmF3TGlzdGVuZXIoKSB7Ci0JcmV0dXJuIHJlZHJhd0xpc3RlbmVyOwotfQotCi0vKioKLSAqIEdldHMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0gKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotICovCi1zdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQl0cnkgewotCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBrZXk7Ci0JfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9CQkJCi19Ci0KLXN0YXRpYyBJbWFnZSBsb2FkSW1hZ2UgKERpc3BsYXkgZGlzcGxheSwgQ2xhc3MgY2xhenosIFN0cmluZyBzdHJpbmcpIHsKLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBjbGF6ei5nZXRSZXNvdXJjZUFzU3RyZWFtIChzdHJpbmcpOwotCWlmIChzdHJlYW0gPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBzdHJlYW0pOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCX0gZmluYWxseSB7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UgKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7fQotCX0KLQlyZXR1cm4gaW1hZ2U7Ci19Ci0KLUltYWdlIGxvYWRJbWFnZShEaXNwbGF5IGRpc3BsYXksIFN0cmluZyBuYW1lKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBsb2FkSW1hZ2UoZGlzcGxheSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCBuYW1lKTsKLQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2VzLmFkZEVsZW1lbnQoaW1hZ2UpOwotCXJldHVybiBpbWFnZTsKLX0KLQotdm9pZCBwYWludEJhY2tncm91bmQoR0MgZ2MsIFJlY3RhbmdsZSByZWN0KSB7Ci0JZ2Muc2V0QmFja2dyb3VuZCgoQ29sb3IpdGFiQmFja2dyb3VuZFswXSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZShyZWN0KTsKLX0KLQotLyoqCi0gKiBSZWRyYXdzIHRoZSBjdXJyZW50IHRhYi4KLSAqLwotcHVibGljIHZvaWQgcmVkcmF3KCkgewotCWNhbnZhcy5yZWRyYXcoKTsKLX0KLQotLyoqCi0gKiBHcmFicyBpbnB1dCBmb2N1cy4KLSAqLwotcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JdGFiTGlzdC5zZXRGb2N1cygpOwotfQotCi0vKioKLSAqIFNldHMgdGhlIGN1cnJlbnQgdGFiLgotICovCi1wdWJsaWMgdm9pZCBzZXRUYWIoR3JhcGhpY3NUYWIgdGFiKSB7Ci0JdGhpcy50YWIgPSB0YWI7Ci0JQ29udHJvbFtdIGNoaWxkcmVuID0gY29udHJvbFBhbmVsLmdldENoaWxkcmVuKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQlDb250cm9sIGNvbnRyb2wgPSBjaGlsZHJlbltpXTsKLQkJY29udHJvbC5kaXNwb3NlKCk7Ci0JfQotCWlmICh0YWIgIT0gbnVsbCkgewotCQl0YWIuY3JlYXRlQ29udHJvbFBhbmVsKGNvbnRyb2xQYW5lbCk7Ci0JCWFuaW1hdGUgPSB0YWIuaXNBbmltYXRlZCgpOwotCX0KLQlwbGF5SXRlbS5zZXRFbmFibGVkKCFhbmltYXRlKTsKLQlwYXVzZUl0ZW0uc2V0RW5hYmxlZChhbmltYXRlKTsKLQlHcmlkRGF0YSBkYXRhID0gKEdyaWREYXRhKWNvbnRyb2xQYW5lbC5nZXRMYXlvdXREYXRhKCk7Ci0JY2hpbGRyZW4gPSBjb250cm9sUGFuZWwuZ2V0Q2hpbGRyZW4oKTsKLQlkYXRhLmV4Y2x1ZGUgPSBjaGlsZHJlbi5sZW5ndGggPT0gMDsKLQljb250cm9sUGFuZWwuc2V0VmlzaWJsZSghZGF0YS5leGNsdWRlKTsKLQlpZiAoZGF0YS5leGNsdWRlKSB7Ci0JCXRhYlBhbmVsLmxheW91dCgpOwotCX0gZWxzZSB7Ci0JCXRhYlBhbmVsLmxheW91dChjaGlsZHJlbik7Ci0JfQotCWlmICh0YWIgIT0gbnVsbCkgewotCQlUcmVlSXRlbVtdIHNlbGVjdGlvbiA9IHRhYkxpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24ubGVuZ3RoID09IDAgfHwgc2VsZWN0aW9uWzBdLmdldERhdGEoKSAhPSB0YWIpIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSBmaW5kSXRlbUJ5RGF0YSh0YWJMaXN0LmdldEl0ZW1zKCksIHRhYik7Ci0JCQlpZiAoaXRlbSAhPSBudWxsKSB0YWJMaXN0LnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtfSk7Ci0JCX0KLQl9Ci0JY2FudmFzLnJlZHJhdygpOwotfQotCi12b2lkIHN0YXJ0QW5pbWF0aW9uVGltZXIoKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JZGlzcGxheS50aW1lckV4ZWModGltZXJTcGlubmVyLmdldFNlbGVjdGlvbigpLCBuZXcgUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmIChjYW52YXMuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQlpZiAoYW5pbWF0ZSkgewotCQkJCUdyYXBoaWNzVGFiIHRhYiA9IGdldFRhYigpOwotCQkJCWlmICh0YWIgIT0gbnVsbCAmJiB0YWIuaXNBbmltYXRlZCgpKSB7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gY2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJCQkJdGFiLm5leHQocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQkJCQljYW52YXMucmVkcmF3KCk7Ci0JCQkJCWNhbnZhcy51cGRhdGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlkaXNwbGF5LnRpbWVyRXhlYyh0aW1lclNwaW5uZXIuZ2V0U2VsZWN0aW9uKCksIHRoaXMpOwotCQl9Ci0JfSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlNXVEdyYXBoaWNzIikpOyAvLyROT04tTkxTLTEkCi0JZmluYWwgR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUgPSBuZXcgR3JhcGhpY3NFeGFtcGxlKHNoZWxsKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWV4YW1wbGUuZGlzcG9zZSgpOwotCQl9Ci0JfSk7CQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFwaGljc1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhcGhpY3NUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVlMzI2Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFwaGljc1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmFwaGljc1RhYiB7Ci0JCi1HcmFwaGljc0V4YW1wbGUgZXhhbXBsZTsKLQotcHVibGljIEdyYXBoaWNzVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0JdGhpcy5leGFtcGxlID0gZXhhbXBsZTsKLX0KLQotLyoqIAotICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyB1c2VkIHRvIGNvbnRyb2wgdGhlIGRyYXdpbmcuCi0gKi8KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci19Ci0KLS8qKiAKLSAqIERpc3Bvc2VzIHJlc291cmNlcyBjcmVhdGVkIGJ5IHRoZSByZWNlaXZlci4KLSAqLwotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLX0KLQotLyoqIAotICogQW5zd2VyIHRoZSByZWNlaXZlcidzIG5hbWUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VGV4dCgpOwotCi0vKiogCi0gKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgY2F0ZWdvcnkuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWlzYyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLS8qKiAKLSAqIEFuc3dlciB3aGV0aGVyIHRoZSByZWNlaXZlciBpcyBhbmltYXRlZCBvciBub3QuIAotICovCi1wdWJsaWMgYm9vbGVhbiBpc0FuaW1hdGVkKCkgewotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqIAotICogQWR2YW5jZSB0aGUgYW5pbWF0aW9uLiAKLSAqLwotcHVibGljIHZvaWQgbmV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsJCi19Ci0KLS8qKiAKLSAqIFBhaW50IHRoZSByZWNlaXZlciBpbnRvIHRoZSBzcGVjaWZpZWQgR0MuIAotICovCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ludHJvVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9JbnRyb1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWE5YWI0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ludHJvVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBJbnRyb1RhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQkKLQlGb250IGZvbnQ7Ci0JSW1hZ2UgaW1hZ2U7Ci0JUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKLQlmbG9hdCB4LCB5OwotICAgIGZsb2F0IGluY1ggPSAxMC4wZjsKLQlmbG9hdCBpbmNZID0gNS4wZjsKLQlpbnQgdGV4dFdpZHRoLCB0ZXh0SGVpZ2h0OwotCVN0cmluZyB0ZXh0ID0gIlNXVCI7Ci0JCi1wdWJsaWMgSW50cm9UYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCWltYWdlID0gbnVsbDsKLQlpZiAoZm9udCAhPSBudWxsKSBmb250LmRpc3Bvc2UoKTsKLQlmb250ID0gbnVsbDsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbnRyb2R1Y3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU1dUIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIGJvb2xlYW4gaXNBbmltYXRlZCgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotcHVibGljIHZvaWQgbmV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICB4ICs9IGluY1g7Ci0gICAgeSArPSBpbmNZOwotCWZsb2F0IHJhbmRvbSA9IChmbG9hdClNYXRoLnJhbmRvbSgpOyAKLSAgICBpZiAoeCArIHRleHRXaWR0aCA+IHdpZHRoKSB7Ci0gICAgICAgIHggPSB3aWR0aCAtIHRleHRXaWR0aDsKLSAgICAgICAgaW5jWCA9IHJhbmRvbSAqIC13aWR0aCAvIDE2IC0gMTsKLSAgICB9Ci0gICAgaWYgKHggPCAwKSB7Ci0gICAgICAgIHggPSAwOwotICAgICAgICBpbmNYID0gcmFuZG9tICogd2lkdGggLyAxNiArIDE7Ci0gICAgfQotICAgIGlmICh5ICsgdGV4dEhlaWdodCA+IGhlaWdodCkgewotICAgICAgICB5ID0gKGhlaWdodCAtIHRleHRIZWlnaHQpLSAyOwotICAgICAgICBpbmNZID0gcmFuZG9tICogLWhlaWdodCAvIDE2IC0gMTsKLSAgICB9Ci0gICAgaWYgKHkgPCAwKSB7Ci0gICAgICAgIHkgPSAwOwotICAgICAgICBpbmNZID0gcmFuZG9tICogaGVpZ2h0IC8gMTYgKyAxOwotICAgIH0KLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCWltYWdlID0gZXhhbXBsZS5sb2FkSW1hZ2UoRGlzcGxheS5nZXRDdXJyZW50KCksICJpcm1hb3MuanBnIik7Ci0JCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCUZvbnREYXRhIGZkID0gZGlzcGxheS5nZXRTeXN0ZW1Gb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQkJZm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZkLmdldE5hbWUoKSwgcmVjdC5oZWlnaHQgLyA0LCBTV1QuQk9MRCk7Ci0JCWdjLnNldEZvbnQoZm9udCk7Ci0JCVBvaW50IHNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JCXRleHRXaWR0aCA9IHNpemUueDsKLQkJdGV4dEhlaWdodCA9IHNpemUueTsKLQl9Ci0JUGF0aCBwYXRoID0gbmV3IFBhdGgoZGlzcGxheSk7Ci0JcGF0aC5hZGRTdHJpbmcodGV4dCwgeCwgeSwgZm9udCk7Ci0JZ2Muc2V0Q2xpcHBpbmcocGF0aCk7Ci0JUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQlnYy5zZXRDbGlwcGluZygoUmVjdGFuZ2xlKW51bGwpOwotCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCWdjLmRyYXdQYXRoKHBhdGgpO30KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0xpbmVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0xpbmVUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5MTc5ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9MaW5lVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotCi1wdWJsaWMgY2xhc3MgTGluZVRhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQkKLXB1YmxpYyBMaW5lVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWdjLmRyYXdMaW5lKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCWdjLmRyYXdMaW5lKHdpZHRoLCAwLCAwLCBoZWlnaHQpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvU3RhclBvbHlUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1N0YXJQb2x5VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNTA4MWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvU3RhclBvbHlUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU3RhclBvbHlUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0JaW50W10gcmFkaWFsOwotCXN0YXRpYyBmaW5hbCBpbnQgUE9JTlRTICA9IDExOwotCQotCUNvbWJvIGZpbGxSdWxlQ2I7Ci0KLXB1YmxpYyBTdGFyUG9seVRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotCXJhZGlhbCA9IG5ldyBpbnRbUE9JTlRTICogMl07Ci19Ci0KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWxsUnVsZSIpKTsgLy8kTk9OLU5MUy0xJAotCWZpbGxSdWxlQ2IgPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuRFJPUF9ET1dOKTsKLQlmaWxsUnVsZUNiLmFkZCgiRklMTF9FVkVOX09ERCIpOwotCWZpbGxSdWxlQ2IuYWRkKCJGSUxMX1dJTkRJTkciKTsKLQlmaWxsUnVsZUNiLnNlbGVjdCgwKTsKLQlmaWxsUnVsZUNiLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGV4YW1wbGUuZ2V0UmVkcmF3TGlzdGVuZXIoKSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUG9seWdvbnMiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3RhclBvbHlnb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgaW50IGNlbnRlclggPSB3aWR0aCAvIDI7Ci0gICAgaW50IGNlbnRlclkgPSBoZWlnaHQgLyAyOwotICAgIGludCBwb3MgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUE9JTlRTOyArK2kpIHsKLSAgICAgICAgZG91YmxlIHIgPSBNYXRoLlBJKjIgKiBwb3MvUE9JTlRTOwotICAgICAgICByYWRpYWxbaSoyXSA9IChpbnQpKCgxK01hdGguY29zKHIpKSpjZW50ZXJYKTsKLSAgICAgICAgcmFkaWFsW2kqMisxXSA9IChpbnQpKCgxK01hdGguc2luKHIpKSpjZW50ZXJZKTsKLSAgICAgICAgcG9zID0gKHBvcyArIFBPSU5UUy8yKSAlIFBPSU5UUzsKLSAgICB9Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JZ2Muc2V0RmlsbFJ1bGUoZmlsbFJ1bGVDYi5nZXRTZWxlY3Rpb25JbmRleCgpICE9IDAgPyBTV1QuRklMTF9XSU5ESU5HIDogU1dULkZJTExfRVZFTl9PREQpOwotCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLSAgICBnYy5maWxsUG9seWdvbihyYWRpYWwpOwotICAgIGdjLmRyYXdQb2x5Z29uKHJhZGlhbCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9kYi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9kYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMTNkOGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvZGIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaXJtYW9zLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2lybWFvcy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNTJjZGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaXJtYW9zLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3BhdXNlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3BhdXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxZTNmNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wYXVzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wbGF5LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3BsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmY0ZTI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3BsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYzk4ZGMzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIG1pbmltdW0gYW1vdW50IG9mIGNvZGUgcmVxdWlyZWQKLSAqIHRvIG9wZW4gYW4gU1dUIFNoZWxsIGFuZCBwcm9jZXNzIHRoZSBldmVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IEhlbGxvV29ybGQxICgpLm9wZW4gKGRpc3BsYXkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0JCi1wdWJsaWMgU2hlbGwgb3BlbiAoRGlzcGxheSBkaXNwbGF5KSB7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0JcmV0dXJuIHNoZWxsOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMjBjOGM4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qCi0gKiBUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQxIGFuZCBkZW1vbnN0cmF0ZXMgdGhlIG1pbmltdW0gYW1vdW50IAotICogb2YgY29kZSByZXF1aXJlZCB0byBvcGVuIGFuIFNXVCBTaGVsbCB3aXRoIGEgTGFiZWwgYW5kIHByb2Nlc3MgdGhlIGV2ZW50cy4KLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGQyIHsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNIZWxsbyA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfaGVsbG93b3JsZCIpOwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgSGVsbG9Xb3JsZDIgKCkub3BlbiAoZGlzcGxheSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotcHVibGljIFNoZWxsIG9wZW4gKERpc3BsYXkgZGlzcGxheSkgewotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5DRU5URVIpOwotCWxhYmVsLnNldFRleHQgKHJlc0hlbGxvLmdldFN0cmluZygiSGVsbG9fd29ybGQiKSk7Ci0JbGFiZWwuc2V0Qm91bmRzIChzaGVsbC5nZXRDbGllbnRBcmVhICgpKTsKLQlzaGVsbC5vcGVuICgpOwotCXJldHVybiBzaGVsbDsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2I2MWFkMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoKLSAqIFRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDIgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gcmVzaXplIHRoZSAKLSAqIExhYmVsIHdoZW4gdGhlIFNoZWxsIHJlc2l6ZXMgdXNpbmcgYSBMaXN0ZW5lciBtZWNoYW5pc20uCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkMyB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzSGVsbG8gPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2hlbGxvd29ybGQiKTsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IEhlbGxvV29ybGQzICgpLm9wZW4gKGRpc3BsYXkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQ0VOVEVSKTsKLQlsYWJlbC5zZXRUZXh0IChyZXNIZWxsby5nZXRTdHJpbmcoIkhlbGxvX3dvcmxkIikpOwotCWxhYmVsLnBhY2soKTsKLQlzaGVsbC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJbGFiZWwuc2V0Qm91bmRzIChzaGVsbC5nZXRDbGllbnRBcmVhICgpKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuICgpOwotCXJldHVybiBzaGVsbDsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjA0ZjQ1OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKgotICogVGhpcyBleGFtcGxlIGJ1aWxkcyBvbiBIZWxsb1dvcmxkMiBhbmQgZGVtb25zdHJhdGVzIGhvdyB0byByZXNpemUgdGhlIAotICogTGFiZWwgd2hlbiB0aGUgU2hlbGwgcmVzaXplcyB1c2luZyBhIExheW91dC4KLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGQ0IHsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNIZWxsbyA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfaGVsbG93b3JsZCIpOwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgSGVsbG9Xb3JsZDQgKCkub3BlbiAoZGlzcGxheSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotcHVibGljIFNoZWxsIG9wZW4gKERpc3BsYXkgZGlzcGxheSkgewotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQ0VOVEVSKTsKLQlsYWJlbC5zZXRUZXh0IChyZXNIZWxsby5nZXRTdHJpbmcoIkhlbGxvX3dvcmxkIikpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQ1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQ1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzNjExNTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoKLSAqIFRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDEgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gZHJhdyBkaXJlY3RseQotICogb24gYW4gU1dUIENvbnRyb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkNSB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzSGVsbG8gPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2hlbGxvd29ybGQiKTsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgSGVsbG9Xb3JsZDUgKCkub3BlbiAoZGlzcGxheSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotcHVibGljIFNoZWxsIG9wZW4gKERpc3BsYXkgZGlzcGxheSkgewotCWZpbmFsIENvbG9yIHJlZCA9IG5ldyBDb2xvcihkaXNwbGF5LCAweEZGLCAwLCAwKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KXsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKHJlZCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEoKTsKLQkJCWdjLmRyYXdSZWN0YW5nbGUocmVjdC54ICsgMTAsIHJlY3QueSArIDEwLCByZWN0LndpZHRoIC0gMjAsIHJlY3QuaGVpZ2h0IC0gMjApOwotCQkJZ2MuZHJhd1N0cmluZyhyZXNIZWxsby5nZXRTdHJpbmcoIkhlbGxvX3dvcmxkIiksIHJlY3QueCArIDIwLCByZWN0LnkgKyAyMCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIgKG5ldyBEaXNwb3NlTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZCAoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCXJlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXJldHVybiBzaGVsbDsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hvdmVyaGVscC9Ib3ZlckhlbHAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hvdmVyaGVscC9Ib3ZlckhlbHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTNmN2IzZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvSG92ZXJIZWxwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ob3ZlcmhlbHA7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLS8qKgotICogVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gaW1wbGVtZW50IGhvdmVyIGhlbHAgZmVlZGJhY2sKLSAqIHVzaW5nIHRoZSBNb3VzZVRyYWNrTGlzdGVuZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBIb3ZlckhlbHAgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19ob3ZlcmhlbHAiKTsKLQkKLQlzdGF0aWMgZmluYWwgaW50Ci0JCWhoaUluZm9ybWF0aW9uID0gMCwKLQkJaGhpV2FybmluZyA9IDE7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIGltYWdlTG9jYXRpb25zID0gewotCQkiaW5mb3JtYXRpb24uZ2lmIiwKLQkJIndhcm5pbmcuZ2lmIgotCX07Ci0JSW1hZ2UgaW1hZ2VzW107Ci0KLQkvKioKLQkgKiBSdW5zIG1haW4gcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgSG92ZXJIZWxwKCkub3BlbihkaXNwbGF5KTsKLQkJLy8gRXZlbnQgbG9vcAotCQl3aGlsZSAoc2hlbGwgIT0gbnVsbCAmJiAhIHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCEgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCS8vIENsZWFudXAKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogT3BlbnMgdGhlIG1haW4gcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgU2hlbGwgb3BlbihEaXNwbGF5IGRpc3BsYXkpIHsJCQotCQkvLyBMb2FkIHRoZSBpbWFnZXMKLQkJQ2xhc3MgY2xhenogPSBIb3ZlckhlbHAuY2xhc3M7Ci0JCXRyeSB7Ci0JCQlpZiAoaW1hZ2VzID09IG51bGwpIHsKLQkJCQlpbWFnZXMgPSBuZXcgSW1hZ2VbaW1hZ2VMb2NhdGlvbnMubGVuZ3RoXTsKLQkJCQkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlTG9jYXRpb25zLmxlbmd0aDsgKytpKSB7Ci0JCQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0oaW1hZ2VMb2NhdGlvbnNbaV0pOwotCQkJCQlJbWFnZURhdGEgc291cmNlID0gbmV3IEltYWdlRGF0YShzdHJlYW0pOwotCQkJCQlJbWFnZURhdGEgbWFzayA9IHNvdXJjZS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JCQkJCWltYWdlc1tpXSA9IG5ldyBJbWFnZShkaXNwbGF5LCBzb3VyY2UsIG1hc2spOwotCQkJCQl0cnkgewotCQkJCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzIiwKLQkJCQluZXcgT2JqZWN0W10geyBleC5nZXRNZXNzYWdlKCkgfSkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBDcmVhdGUgdGhlIHdpbmRvdwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCgpOwotCQljcmVhdGVQYXJ0Q29udHJvbChzaGVsbCk7Ci0JCXNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQkvKiBGcmVlIHJlc291cmNlcyAqLwotCQkJCWlmIChpbWFnZXMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbaV07Ci0JCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJCWltYWdlcyA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQkJCQotCX0KLQotCS8qKgotCSAqIEdldHMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGFuZCBiaW5kcyBpdAotCSAqIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gSWYgdGhlIGtleSBpcyBub3QgZm91bmQsCi0JICogcmV0dXJuIHRoZSBrZXkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZXhhbXBsZQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBmcmFtZSkgewotCQlmaW5hbCBUb29sVGlwSGFuZGxlciB0b29sdGlwID0gbmV3IFRvb2xUaXBIYW5kbGVyKGZyYW1lLmdldFNoZWxsKCkpOwotCQkKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWZyYW1lLnNldExheW91dChsYXlvdXQpOwotCQotCQlUb29sQmFyIGJhciA9IG5ldyBUb29sQmFyIChmcmFtZSwgU1dULkJPUkRFUik7Ci0JCWZvciAoaW50IGk9MDsgaTw1OyBpKyspIHsKLQkJCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGJhciwgU1dULlBVU0gpOwotCQkJaXRlbS5zZXRUZXh0IChnZXRSZXNvdXJjZVN0cmluZygiVG9vbEl0ZW0udGV4dCIsIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKGkpIH0pKTsKLQkJCWl0ZW0uc2V0RGF0YSAoIlRJUF9URVhUIiwgZ2V0UmVzb3VyY2VTdHJpbmcoIlRvb2xJdGVtLnRvb2x0aXAiLAotCQkJCW5ldyBPYmplY3RbXSB7IGl0ZW0uZ2V0VGV4dCgpIH0pKTsKLQkJCWl0ZW0uc2V0RGF0YSAoIlRJUF9IRUxQVEVYVEhBTkRMRVIiLCBuZXcgVG9vbFRpcEhlbHBUZXh0SGFuZGxlcigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGdldEhlbHBUZXh0KFdpZGdldCB3aWRnZXQpIHsKLQkJCQkJSXRlbSBpdGVtID0gKEl0ZW0pIHdpZGdldDsKLQkJCQkJcmV0dXJuIGdldFJlc291cmNlU3RyaW5nKCJUb29sSXRlbS5oZWxwIiwgbmV3IE9iamVjdFtdIHsgaXRlbS5nZXRUZXh0KCkgfSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQliYXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXRvb2x0aXAuYWN0aXZhdGVIb3ZlckhlbHAoYmFyKTsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoZnJhbWUsIFNXVC5CT1JERVIpOwotCQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuUFVTSCk7Ci0JCQlpdGVtLnNldFRleHQgKGdldFJlc291cmNlU3RyaW5nKCJJdGVtIiwgbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoaSkgfSkpOwotCQkJaXRlbS5zZXREYXRhICgiVElQX0lNQUdFIiwgaW1hZ2VzW2hoaUluZm9ybWF0aW9uXSk7Ci0JCQlpdGVtLnNldFRleHQgKGdldFJlc291cmNlU3RyaW5nKCJUYWJsZUl0ZW0udGV4dCIsIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKGkpIH0pKTsKLQkJCWl0ZW0uc2V0RGF0YSAoIlRJUF9URVhUIiwgZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlSXRlbS50b29sdGlwIiwKLQkJCQluZXcgT2JqZWN0W10geyBpdGVtLmdldFRleHQoKSB9KSk7Ci0JCQlpdGVtLnNldERhdGEgKCJUSVBfSEVMUFRFWFRIQU5ETEVSIiwgbmV3IFRvb2xUaXBIZWxwVGV4dEhhbmRsZXIoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRIZWxwVGV4dChXaWRnZXQgd2lkZ2V0KSB7Ci0JCQkJCUl0ZW0gaXRlbSA9IChJdGVtKSB3aWRnZXQ7Ci0JCQkJCXJldHVybiBnZXRSZXNvdXJjZVN0cmluZygiVGFibGVJdGVtLmhlbHAiLCBuZXcgT2JqZWN0W10geyBpdGVtLmdldFRleHQoKSB9KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCXRvb2x0aXAuYWN0aXZhdGVIb3ZlckhlbHAodGFibGUpOwotCQotCQlUcmVlIHRyZWUgPSBuZXcgVHJlZSAoZnJhbWUsIFNXVC5CT1JERVIpOwotCQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuUFVTSCk7Ci0JCQlpdGVtLnNldFRleHQgKGdldFJlc291cmNlU3RyaW5nKCJJdGVtIiwgbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoaSkgfSkpOwotCQkJaXRlbS5zZXREYXRhICgiVElQX0lNQUdFIiwgaW1hZ2VzW2hoaVdhcm5pbmddKTsKLQkJCWl0ZW0uc2V0VGV4dCAoZ2V0UmVzb3VyY2VTdHJpbmcoIlRyZWVJdGVtLnRleHQiLCBuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihpKSB9KSk7Ci0JCQlpdGVtLnNldERhdGEgKCJUSVBfVEVYVCIsIGdldFJlc291cmNlU3RyaW5nKCJUcmVlSXRlbS50b29sdGlwIiwKLQkJCQluZXcgT2JqZWN0W10geyBpdGVtLmdldFRleHQoKSB9KSk7Ci0JCQlpdGVtLnNldERhdGEgKCJUSVBfSEVMUFRFWFRIQU5ETEVSIiwgbmV3IFRvb2xUaXBIZWxwVGV4dEhhbmRsZXIoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRIZWxwVGV4dChXaWRnZXQgd2lkZ2V0KSB7Ci0JCQkJCUl0ZW0gaXRlbSA9IChJdGVtKSB3aWRnZXQ7Ci0JCQkJCXJldHVybiBnZXRSZXNvdXJjZVN0cmluZygiVHJlZUl0ZW0uaGVscCIsIG5ldyBPYmplY3RbXSB7IGl0ZW0uZ2V0VGV4dCgpIH0pOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXRyZWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQl0b29sdGlwLmFjdGl2YXRlSG92ZXJIZWxwKHRyZWUpOwotCQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoZnJhbWUsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQgKGdldFJlc291cmNlU3RyaW5nKCJIZWxsby50ZXh0IikpOwotCQlidXR0b24uc2V0RGF0YSAoIlRJUF9URVhUIiwgZ2V0UmVzb3VyY2VTdHJpbmcoIkhlbGxvLnRvb2x0aXAiKSk7Ci0JCXRvb2x0aXAuYWN0aXZhdGVIb3ZlckhlbHAoYnV0dG9uKTsKLQl9Ci0KLQkvKioKLQkgKiBFbXVsYXRlZCB0b29sdGlwIGhhbmRsZXIKLQkgKiBOb3RpY2UgdGhhdCB3ZSBjb3VsZCBkaXNwbGF5IGFueXRoaW5nIGluIGEgdG9vbHRpcCBiZXNpZGVzIHRleHQgYW5kIGltYWdlcy4KLQkgKiBGb3IgaW5zdGFuY2UsIGl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gZW1iZWQgbGFyZ2UgdGFibGVzIG9mIGRhdGEgb3IgYnV0dG9ucyBsaW5raW5nCi0JICogZGF0YSB1bmRlciBpbnNwZWN0aW9uIHRvIG1hdGVyaWFsIGVsc2V3aGVyZSwgb3IgcGVyZm9ybSBkeW5hbWljIGxvb2t1cCBmb3IgY3JlYXRpbmcKLQkgKiB0b29sdGlwIHRleHQgb24gdGhlIGZseS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRvb2xUaXBIYW5kbGVyIHsKLQkJcHJpdmF0ZSBTaGVsbCAgcGFyZW50U2hlbGw7Ci0JCXByaXZhdGUgU2hlbGwgIHRpcFNoZWxsOwotCQlwcml2YXRlIExhYmVsICB0aXBMYWJlbEltYWdlLCB0aXBMYWJlbFRleHQ7Ci0JCXByaXZhdGUgV2lkZ2V0IHRpcFdpZGdldDsgLy8gd2lkZ2V0IHRoaXMgdG9vbHRpcCBpcyBob3ZlcmluZyBvdmVyCi0JCXByaXZhdGUgUG9pbnQgIHRpcFBvc2l0aW9uOyAvLyB0aGUgcG9zaXRpb24gYmVpbmcgaG92ZXJlZCBvdmVyCi0JCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IHRvb2x0aXAgaGFuZGxlcgotCQkgKgotCQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgU2hlbGwKLQkJICovCQotCQlwdWJsaWMgVG9vbFRpcEhhbmRsZXIoU2hlbGwgcGFyZW50KSB7Ci0JCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCQkJdGhpcy5wYXJlbnRTaGVsbCA9IHBhcmVudDsKLQkKLQkJCXRpcFNoZWxsID0gbmV3IFNoZWxsKHBhcmVudCwgU1dULk9OX1RPUCB8IFNXVC5UT09MKTsKLQkJCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDI7Ci0JCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDI7Ci0JCQl0aXBTaGVsbC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCi0JCQl0aXBTaGVsbC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotCQkJCi0JCQl0aXBMYWJlbEltYWdlID0gbmV3IExhYmVsKHRpcFNoZWxsLCBTV1QuTk9ORSk7Ci0JCQl0aXBMYWJlbEltYWdlLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19GT1JFR1JPVU5EKSk7Ci0JCQl0aXBMYWJlbEltYWdlLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKSk7Ci0JCQl0aXBMYWJlbEltYWdlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8Ci0JCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKSk7Ci0JCi0JCQl0aXBMYWJlbFRleHQgPSBuZXcgTGFiZWwodGlwU2hlbGwsIFNXVC5OT05FKTsKLQkJCXRpcExhYmVsVGV4dC5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fRk9SRUdST1VORCkpOwotCQkJdGlwTGFiZWxUZXh0LnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKSk7Ci0JCQl0aXBMYWJlbFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwKLQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpKTsKLQkJfQotCQotCQkvKioKLQkJICogRW5hYmxlcyBjdXN0b21pemVkIGhvdmVyIGhlbHAgZm9yIGEgc3BlY2lmaWVkIGNvbnRyb2wKLQkJICogCi0JCSAqIEBjb250cm9sIHRoZSBjb250cm9sIG9uIHdoaWNoIHRvIGVuYWJsZSBob3ZlcmhlbHAKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFjdGl2YXRlSG92ZXJIZWxwKGZpbmFsIENvbnRyb2wgY29udHJvbCkgewotCQkJLyoKLQkJCSAqIEdldCBvdXQgb2YgdGhlIHdheSBpZiB3ZSBhdHRlbXB0IHRvIGFjdGl2YXRlIHRoZSBjb250cm9sIHVuZGVybmVhdGggdGhlIHRvb2x0aXAKLQkJCSAqLwotCQkJY29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93biAoTW91c2VFdmVudCBlKSB7Ci0JCQkJCWlmICh0aXBTaGVsbC5pc1Zpc2libGUoKSkgdGlwU2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJfQkKLQkJCX0pOwotCQotCQkJLyoKLQkJCSAqIFRyYXAgaG92ZXIgZXZlbnRzIHRvIHBvcC11cCB0b29sdGlwCi0JCQkgKi8KLQkJCWNvbnRyb2wuYWRkTW91c2VUcmFja0xpc3RlbmVyKG5ldyBNb3VzZVRyYWNrQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW91c2VFeGl0KE1vdXNlRXZlbnQgZSkgewotCQkJCQlpZiAodGlwU2hlbGwuaXNWaXNpYmxlKCkpIHRpcFNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQkJCQl0aXBXaWRnZXQgPSBudWxsOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBtb3VzZUhvdmVyIChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVBvaW50IHB0ID0gbmV3IFBvaW50IChldmVudC54LCBldmVudC55KTsKLQkJCQkJV2lkZ2V0IHdpZGdldCA9IGV2ZW50LndpZGdldDsKLQkJCQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRvb2xCYXIpIHsKLQkJCQkJCVRvb2xCYXIgdyA9IChUb29sQmFyKSB3aWRnZXQ7Ci0JCQkJCQl3aWRnZXQgPSB3LmdldEl0ZW0gKHB0KTsKLQkJCQkJfQotCQkJCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgVGFibGUpIHsKLQkJCQkJCVRhYmxlIHcgPSAoVGFibGUpIHdpZGdldDsKLQkJCQkJCXdpZGdldCA9IHcuZ2V0SXRlbSAocHQpOwotCQkJCQl9Ci0JCQkJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBUcmVlKSB7Ci0JCQkJCQlUcmVlIHcgPSAoVHJlZSkgd2lkZ2V0OwotCQkJCQkJd2lkZ2V0ID0gdy5nZXRJdGVtIChwdCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHdpZGdldCA9PSBudWxsKSB7Ci0JCQkJCQl0aXBTaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJCXRpcFdpZGdldCA9IG51bGw7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKHdpZGdldCA9PSB0aXBXaWRnZXQpIHJldHVybjsKLQkJCQkJdGlwV2lkZ2V0ID0gd2lkZ2V0OwotCQkJCQl0aXBQb3NpdGlvbiA9IGNvbnRyb2wudG9EaXNwbGF5KHB0KTsKLQkJCQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKSB3aWRnZXQuZ2V0RGF0YSgiVElQX1RFWFQiKTsKLQkJCQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIHdpZGdldC5nZXREYXRhKCJUSVBfSU1BR0UiKTsKLQkJCQkJdGlwTGFiZWxUZXh0LnNldFRleHQodGV4dCAhPSBudWxsID8gdGV4dCA6ICIiKTsKLQkJCQkJdGlwTGFiZWxJbWFnZS5zZXRJbWFnZShpbWFnZSk7IC8vIGFjY2VwdHMgbnVsbAotCQkJCQl0aXBTaGVsbC5wYWNrKCk7Ci0JCQkJCXNldEhvdmVyTG9jYXRpb24odGlwU2hlbGwsIHRpcFBvc2l0aW9uKTsKLQkJCQkJdGlwU2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQkKLQkJCS8qCi0JCQkgKiBUcmFwIEYxIEhlbHAgdG8gcG9wIHVwIGEgY3VzdG9tIGhlbHAgYm94Ci0JCQkgKi8KLQkJCWNvbnRyb2wuYWRkSGVscExpc3RlbmVyKG5ldyBIZWxwTGlzdGVuZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIGhlbHBSZXF1ZXN0ZWQoSGVscEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmICh0aXBXaWRnZXQgPT0gbnVsbCkgcmV0dXJuOwotCQkJCQlUb29sVGlwSGVscFRleHRIYW5kbGVyIGhhbmRsZXIgPSAoVG9vbFRpcEhlbHBUZXh0SGFuZGxlcikKLQkJCQkJCXRpcFdpZGdldC5nZXREYXRhKCJUSVBfSEVMUFRFWFRIQU5ETEVSIik7Ci0JCQkJCWlmIChoYW5kbGVyID09IG51bGwpIHJldHVybjsKLQkJCQkJU3RyaW5nIHRleHQgPSBoYW5kbGVyLmdldEhlbHBUZXh0KHRpcFdpZGdldCk7Ci0JCQkJCWlmICh0ZXh0ID09IG51bGwpIHJldHVybjsKLQkJCQkJCi0JCQkJCWlmICh0aXBTaGVsbC5pc1Zpc2libGUoKSkgewotCQkJCQkJdGlwU2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCQlTaGVsbCBoZWxwU2hlbGwgPSBuZXcgU2hlbGwocGFyZW50U2hlbGwsIFNXVC5TSEVMTF9UUklNKTsKLQkJCQkJCWhlbHBTaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQkJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChoZWxwU2hlbGwsIFNXVC5OT05FKTsKLQkJCQkJCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCQkJCQloZWxwU2hlbGwucGFjaygpOwotCQkJCQkJc2V0SG92ZXJMb2NhdGlvbihoZWxwU2hlbGwsIHRpcFBvc2l0aW9uKTsKLQkJCQkJCWhlbHBTaGVsbC5vcGVuKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFNldHMgdGhlIGxvY2F0aW9uIGZvciBhIGhvdmVyaW5nIHNoZWxsCi0JCSAqIEBwYXJhbSBzaGVsbCB0aGUgb2JqZWN0IHRoYXQgaXMgdG8gaG92ZXIKLQkJICogQHBhcmFtIHBvc2l0aW9uIHRoZSBwb3NpdGlvbiBvZiBhIHdpZGdldCB0byBob3ZlciBvdmVyCi0JCSAqIEByZXR1cm4gdGhlIHRvcC1sZWZ0IGxvY2F0aW9uIGZvciBhIGhvdmVyaW5nIGJveAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEhvdmVyTG9jYXRpb24oU2hlbGwgc2hlbGwsIFBvaW50IHBvc2l0aW9uKSB7Ci0JCQlSZWN0YW5nbGUgZGlzcGxheUJvdW5kcyA9IHNoZWxsLmdldERpc3BsYXkoKS5nZXRCb3VuZHMoKTsKLQkJCVJlY3RhbmdsZSBzaGVsbEJvdW5kcyA9IHNoZWxsLmdldEJvdW5kcygpOwotCQkJc2hlbGxCb3VuZHMueCA9IE1hdGgubWF4KE1hdGgubWluKHBvc2l0aW9uLngsIGRpc3BsYXlCb3VuZHMud2lkdGggLSBzaGVsbEJvdW5kcy53aWR0aCksIDApOwotCQkJc2hlbGxCb3VuZHMueSA9IE1hdGgubWF4KE1hdGgubWluKHBvc2l0aW9uLnkgKyAxNiwgZGlzcGxheUJvdW5kcy5oZWlnaHQgLSBzaGVsbEJvdW5kcy5oZWlnaHQpLCAwKTsKLQkJCXNoZWxsLnNldEJvdW5kcyhzaGVsbEJvdW5kcyk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVG9vbFRpcCBoZWxwIGhhbmRsZXIKLQkgKi8KLQlwcm90ZWN0ZWQgaW50ZXJmYWNlIFRvb2xUaXBIZWxwVGV4dEhhbmRsZXIgewotCQkvKioKLQkJICogR2V0IGhlbHAgdGV4dAotCQkgKiBAcGFyYW0gd2lkZ2V0IHRoZSB3aWRnZXQgdGhhdCBpcyB1bmRlciBoZWxwCi0JCSAqIEByZXR1cm4gYSBoZWxwIHRleHQgc3RyaW5nCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEhlbHBUZXh0KFdpZGdldCB3aWRnZXQpOwotCX0JCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvaW5mb3JtYXRpb24uZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaG92ZXJoZWxwL2luZm9ybWF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjZjNzQ3Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvaW5mb3JtYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaG92ZXJoZWxwL3dhcm5pbmcuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaG92ZXJoZWxwL3dhcm5pbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjRmZGY5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hvdmVyaGVscC93YXJuaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ltYWdlYW5hbHl6ZXIvSW1hZ2VBbmFseXplci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaW1hZ2VhbmFseXplci9JbWFnZUFuYWx5emVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwODZkOTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaW1hZ2VhbmFseXplci9JbWFnZUFuYWx5emVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaW1hZ2VhbmFseXplcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotcHVibGljIGNsYXNzIEltYWdlQW5hbHl6ZXIgewotCXN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2ltYWdlcyIpOwotCURpc3BsYXkgZGlzcGxheTsKLQlTaGVsbCBzaGVsbDsKLQlDYW52YXMgaW1hZ2VDYW52YXMsIHBhbGV0dGVDYW52YXM7Ci0JTGFiZWwgdHlwZUxhYmVsLCBzaXplTGFiZWwsIGRlcHRoTGFiZWwsIHRyYW5zcGFyZW50UGl4ZWxMYWJlbCwKLQkJdGltZVRvTG9hZExhYmVsLCBzY3JlZW5TaXplTGFiZWwsIGJhY2tncm91bmRQaXhlbExhYmVsLAotCQlsb2NhdGlvbkxhYmVsLCBkaXNwb3NhbE1ldGhvZExhYmVsLCBkZWxheVRpbWVMYWJlbCwKLQkJcmVwZWF0Q291bnRMYWJlbCwgcGFsZXR0ZUxhYmVsLCBkYXRhTGFiZWwsIHN0YXR1c0xhYmVsOwotCUNvbWJvIGJhY2tncm91bmRDb21ibywgc2NhbGVYQ29tYm8sIHNjYWxlWUNvbWJvLCBhbHBoYUNvbWJvOwotCUJ1dHRvbiBpbmNyZW1lbnRhbENoZWNrLCB0cmFuc3BhcmVudENoZWNrLCBtYXNrQ2hlY2ssIGJhY2tncm91bmRDaGVjazsKLQlCdXR0b24gcHJldmlvdXNCdXR0b24sIG5leHRCdXR0b24sIGFuaW1hdGVCdXR0b247Ci0JU3R5bGVkVGV4dCBkYXRhVGV4dDsKLQlTYXNoIHNhc2g7Ci0JQ29sb3Igd2hpdGVDb2xvciwgYmxhY2tDb2xvciwgcmVkQ29sb3IsIGdyZWVuQ29sb3IsIGJsdWVDb2xvciwgY2FudmFzQmFja2dyb3VuZDsKLQlGb250IGZpeGVkV2lkdGhGb250OwotCUN1cnNvciBjcm9zc0N1cnNvcjsKLQlHQyBpbWFnZUNhbnZhc0dDOwotCQotCWludCBwYWxldHRlV2lkdGggPSAxNDA7IC8vIHJlY2FsY3VsYXRlZCBhbmQgdXNlZCBhcyBhIHdpZHRoIGhpbnQKLQlpbnQgaXggPSAwLCBpeSA9IDAsIHB5ID0gMDsgLy8gdXNlZCB0byBzY3JvbGwgdGhlIGltYWdlIGFuZCBwYWxldHRlCi0JZmxvYXQgeHNjYWxlID0gMSwgeXNjYWxlID0gMTsgLy8gdXNlZCB0byBzY2FsZSB0aGUgaW1hZ2UKLQlpbnQgYWxwaGEgPSAyNTU7IC8vIHVzZWQgdG8gbW9kaWZ5IHRoZSBhbHBoYSB2YWx1ZSBvZiB0aGUgaW1hZ2UKLQlib29sZWFuIGluY3JlbWVudGFsID0gZmFsc2U7IC8vIHVzZWQgdG8gaW5jcmVtZW50YWxseSBkaXNwbGF5IGFuIGltYWdlCi0JYm9vbGVhbiB0cmFuc3BhcmVudCA9IHRydWU7IC8vIHVzZWQgdG8gZGlzcGxheSBhbiBpbWFnZSB3aXRoIHRyYW5zcGFyZW5jeQotCWJvb2xlYW4gc2hvd01hc2sgPSBmYWxzZTsgLy8gdXNlZCB0byBkaXNwbGF5IGFuIGljb24gbWFzayBvciB0cmFuc3BhcmVudCBpbWFnZSBtYXNrCi0JYm9vbGVhbiBzaG93QmFja2dyb3VuZCA9IGZhbHNlOyAvLyB1c2VkIHRvIGRpc3BsYXkgdGhlIGJhY2tncm91bmQgb2YgYW4gYW5pbWF0ZWQgaW1hZ2UKLQlib29sZWFuIGFuaW1hdGUgPSBmYWxzZTsgLy8gdXNlZCB0byBhbmltYXRlIGEgbXVsdGktaW1hZ2UgZmlsZQotCVRocmVhZCBhbmltYXRlVGhyZWFkOyAvLyBkcmF3cyBhbmltYXRlZCBpbWFnZXMKLQlUaHJlYWQgaW5jcmVtZW50YWxUaHJlYWQ7IC8vIGRyYXdzIGluY3JlbWVudGFsIGltYWdlcwotCVN0cmluZyBsYXN0UGF0aDsgLy8gdXNlZCB0byBzZWVkIHRoZSBmaWxlIGRpYWxvZwotCVN0cmluZyBjdXJyZW50TmFtZTsgLy8gdGhlIGN1cnJlbnQgaW1hZ2UgZmlsZSBvciBVUkwgbmFtZQotCVN0cmluZyBmaWxlTmFtZTsgLy8gdGhlIGN1cnJlbnQgaW1hZ2UgZmlsZQotCUltYWdlTG9hZGVyIGxvYWRlcjsgLy8gdGhlIGxvYWRlciBmb3IgdGhlIGN1cnJlbnQgaW1hZ2UgZmlsZQotCUltYWdlRGF0YVtdIGltYWdlRGF0YUFycmF5OyAvLyBhbGwgaW1hZ2UgZGF0YSByZWFkIGZyb20gdGhlIGN1cnJlbnQgZmlsZQotCWludCBpbWFnZURhdGFJbmRleDsgLy8gdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGltYWdlIGRhdGEKLQlJbWFnZURhdGEgaW1hZ2VEYXRhOyAvLyB0aGUgY3VycmVudGx5LWRpc3BsYXllZCBpbWFnZSBkYXRhCi0JSW1hZ2UgaW1hZ2U7IC8vIHRoZSBjdXJyZW50bHktZGlzcGxheWVkIGltYWdlCi0JVmVjdG9yIGluY3JlbWVudGFsRXZlbnRzOyAvLyBpbmNyZW1lbnRhbCBpbWFnZSBldmVudHMKLQlsb25nIGxvYWRUaW1lID0gMDsgLy8gdGhlIHRpbWUgaXQgdG9vayB0byBsb2FkIHRoZSBjdXJyZW50IGltYWdlCi0JCi0Jc3RhdGljIGZpbmFsIGludCBJTkRFWF9ESUdJVFMgPSA0OwotCXN0YXRpYyBmaW5hbCBpbnQgQUxQSEFfQ0hBUlMgPSA1OwotCXN0YXRpYyBmaW5hbCBpbnQgQUxQSEFfQ09OU1RBTlQgPSAwOwotCXN0YXRpYyBmaW5hbCBpbnQgQUxQSEFfWCA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBBTFBIQV9ZID0gMjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gT1BFTl9GSUxURVJfRVhURU5TSU9OUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQkiKi5ibXA7ICouZ2lmOyAqLmljbzsgKi5qZmlmOyAqLmpwZWc7ICouanBnOyAqLnBuZzsgKi50aWY7ICoudGlmZiIsCi0JCQkiKi5ibXAiLCAiKi5naWYiLCAiKi5pY28iLCAiKi5qcGc7ICouanBlZzsgKi5qZmlmIiwgIioucG5nIiwgIioudGlmOyAqLnRpZmYiIH07Ci0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9QRU5fRklMVEVSX05BTUVTID0gbmV3IFN0cmluZ1tdIHsKLQkJCWJ1bmRsZS5nZXRTdHJpbmcoIkFsbF9pbWFnZXMiKSArICIgKGJtcCwgZ2lmLCBpY28sIGpmaWYsIGpwZWcsIGpwZywgcG5nLCB0aWYsIHRpZmYpIiwKLQkJCSJCTVAgKCouYm1wKSIsICJHSUYgKCouZ2lmKSIsICJJQ08gKCouaWNvKSIsICJKUEVHICgqLmpwZywgKi5qcGVnLCAqLmpmaWYpIiwKLQkJCSJQTkcgKCoucG5nKSIsICJUSUZGICgqLnRpZiwgKi50aWZmKSIgfTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gU0FWRV9GSUxURVJfRVhURU5TSU9OUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQkiKi5ibXAiLCAiKi5naWYiLCAiKi5pY28iLCAiKi5qcGciLCAiKi5wbmciLCAiKi50aWYiIH07Ci0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNBVkVfRklMVEVSX05BTUVTID0gbmV3IFN0cmluZ1tdIHsKLQkJCSJCTVAgKCouYm1wKSIsICJHSUYgKCouZ2lmKSIsICJJQ08gKCouaWNvKSIsICJKUEVHICgqLmpwZykiLAotCQkJIlBORyAoKi5wbmcpIiwgIlRJRkYgKCoudGlmKSIgfTsKLQotCWNsYXNzIFRleHRQcm9tcHRlciBleHRlbmRzIERpYWxvZyB7Ci0JCVN0cmluZyBtZXNzYWdlID0gIiI7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlTaGVsbCBkaWFsb2c7Ci0JCVRleHQgdGV4dDsKLQkJcHVibGljIFRleHRQcm9tcHRlciAoU2hlbGwgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJCXN1cGVyIChwYXJlbnQsIHN0eWxlKTsKLQkJfQotCQlwdWJsaWMgVGV4dFByb21wdGVyIChTaGVsbCBwYXJlbnQpIHsKLQkJCXRoaXMgKHBhcmVudCwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UgKCkgewotCQkJcmV0dXJuIG1lc3NhZ2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TWVzc2FnZSAoU3RyaW5nIHN0cmluZykgewotCQkJbWVzc2FnZSA9IHN0cmluZzsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIG9wZW4gKCkgewotCQkJZGlhbG9nID0gbmV3IFNoZWxsKGdldFBhcmVudCgpLCBnZXRTdHlsZSgpKTsKLQkJCWRpYWxvZy5zZXRUZXh0KGdldFRleHQoKSk7Ci0JCQlkaWFsb2cuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQl0ZXh0ID0gbmV3IFRleHQoZGlhbG9nLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLndpZHRoSGludCA9IDMwMDsKLQkJCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCUNvbXBvc2l0ZSBidXR0b25zID0gbmV3IENvbXBvc2l0ZShkaWFsb2csIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgZ3JpZCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlncmlkLm51bUNvbHVtbnMgPSAyOwotCQkJYnV0dG9ucy5zZXRMYXlvdXQoZ3JpZCk7Ci0JCQlidXR0b25zLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJCW9rLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiT0siKSk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLndpZHRoSGludCA9IDc1OwotCQkJb2suc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJcmVzdWx0ID0gdGV4dC5nZXRUZXh0KCk7Ci0JCQkJCWRpYWxvZy5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlCdXR0b24gY2FuY2VsID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCQljYW5jZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJDYW5jZWwiKSk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLndpZHRoSGludCA9IDc1OwotCQkJY2FuY2VsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQljYW5jZWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlkaWFsb2cuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJZGlhbG9nLnNldERlZmF1bHRCdXR0b24ob2spOwotCQkJZGlhbG9nLnBhY2soKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQl3aGlsZSAoIWRpYWxvZy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlJbWFnZUFuYWx5emVyIGltYWdlQW5hbHl6ZXIgPSBuZXcgSW1hZ2VBbmFseXplcigpOwotCQlTaGVsbCBzaGVsbCA9IGltYWdlQW5hbHl6ZXIub3BlbihkaXNwbGF5KTsKLQkJCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKQotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBTaGVsbCBvcGVuKERpc3BsYXkgZHB5KSB7Ci0JCS8vIENyZWF0ZSBhIHdpbmRvdyBhbmQgc2V0IGl0cyB0aXRsZS4KLQkJdGhpcy5kaXNwbGF5ID0gZHB5OwotCQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJJbWFnZV9hbmFseXplciIpKTsKLQkJCi0JCS8vIEhvb2sgcmVzaXplIGFuZCBkaXNwb3NlIGxpc3RlbmVycy4KLQkJc2hlbGwuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBldmVudCkgewotCQkJCXJlc2l6ZVNoZWxsKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLmFkZFNoZWxsTGlzdGVuZXIobmV3IFNoZWxsQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkgewotCQkJCWFuaW1hdGUgPSBmYWxzZTsgLy8gc3RvcCBhbnkgYW5pbWF0aW9uIGluIHByb2dyZXNzCi0JCQkJaWYgKGFuaW1hdGVUaHJlYWQgIT0gbnVsbCkgewotCQkJCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGRpZSBiZWZvcmUgZGlzcG9zaW5nIHRoZSBzaGVsbC4KLQkJCQkJd2hpbGUgKGFuaW1hdGVUaHJlYWQuaXNBbGl2ZSgpKSB7Ci0JCQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllLmRvaXQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJc2hlbGwuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCS8vIENsZWFuIHVwLgotCQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJd2hpdGVDb2xvci5kaXNwb3NlKCk7Ci0JCQkJYmxhY2tDb2xvci5kaXNwb3NlKCk7Ci0JCQkJcmVkQ29sb3IuZGlzcG9zZSgpOwotCQkJCWdyZWVuQ29sb3IuZGlzcG9zZSgpOwotCQkJCWJsdWVDb2xvci5kaXNwb3NlKCk7Ci0JCQkJZml4ZWRXaWR0aEZvbnQuZGlzcG9zZSgpOwotCQkJCWNyb3NzQ3Vyc29yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQ3JlYXRlIGNvbG9ycyBhbmQgZm9udHMuCi0JCXdoaXRlQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAyNTUsIDI1NSk7Ci0JCWJsYWNrQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMCwgMCk7Ci0JCXJlZENvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMCwgMCk7Ci0JCWdyZWVuQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMjU1LCAwKTsKLQkJYmx1ZUNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDAsIDI1NSk7Ci0JCWZpeGVkV2lkdGhGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgImNvdXJpZXIiLCAxMCwgMCk7Ci0JCWNyb3NzQ3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX0NST1NTKTsKLQkJCi0JCS8vIEFkZCBhIG1lbnUgYmFyIGFuZCB3aWRnZXRzLgotCQljcmVhdGVNZW51QmFyKCk7Ci0JCWNyZWF0ZVdpZGdldHMoKTsKLQkJc2hlbGwucGFjaygpOwotCQkKLQkJLy8gQ3JlYXRlIGEgR0MgZm9yIGRyYXdpbmcsIGFuZCBob29rIHRoZSBsaXN0ZW5lciB0byBkaXNwb3NlIGl0LgotCQlpbWFnZUNhbnZhc0dDID0gbmV3IEdDKGltYWdlQ2FudmFzKTsKLQkJaW1hZ2VDYW52YXMuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWltYWdlQ2FudmFzR0MuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIE9wZW4gdGhlIHdpbmRvdwotCQlzaGVsbC5vcGVuKCk7Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQl2b2lkIGNyZWF0ZVdpZGdldHMoKSB7Ci0JCS8vIEFkZCB0aGUgd2lkZ2V0cyB0byB0aGUgc2hlbGwgaW4gYSBncmlkIGxheW91dC4KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBTZXBhcmF0ZSB0aGUgbWVudSBiYXIgZnJvbSB0aGUgcmVzdCBvZiB0aGUgd2lkZ2V0cy4KLQkJTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQkvLyBBZGQgYSBjb21wb3NpdGUgdG8gY29udGFpbiBzb21lIGNvbnRyb2wgd2lkZ2V0cyBhY3Jvc3MgdGhlIHRvcC4KLQkJQ29tcG9zaXRlIGNvbnRyb2xzID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQlSb3dMYXlvdXQgcm93TGF5b3V0ID0gbmV3IFJvd0xheW91dCgpOwotCQlyb3dMYXlvdXQubWFyZ2luVG9wID0gMDsKLQkJcm93TGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDU7Ci0JCXJvd0xheW91dC5zcGFjaW5nID0gODsKLQkJY29udHJvbHMuc2V0TGF5b3V0KHJvd0xheW91dCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJY29udHJvbHMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQkvLyBDb21ibyB0byBjaGFuZ2UgdGhlIGJhY2tncm91bmQuCi0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2xzLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCQlncm91cC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkJhY2tncm91bmQiKSk7Ci0JCWJhY2tncm91bmRDb21ibyA9IG5ldyBDb21ibyhncm91cCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQliYWNrZ3JvdW5kQ29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1tdIHsKLQkJCWJ1bmRsZS5nZXRTdHJpbmcoIk5vbmUiKSwKLQkJCWJ1bmRsZS5nZXRTdHJpbmcoIldoaXRlIiksCi0JCQlidW5kbGUuZ2V0U3RyaW5nKCJCbGFjayIpLAotCQkJYnVuZGxlLmdldFN0cmluZygiUmVkIiksCi0JCQlidW5kbGUuZ2V0U3RyaW5nKCJHcmVlbiIpLAotCQkJYnVuZGxlLmdldFN0cmluZygiQmx1ZSIpfSk7Ci0JCWJhY2tncm91bmRDb21iby5zZWxlY3QoYmFja2dyb3VuZENvbWJvLmluZGV4T2YoYnVuZGxlLmdldFN0cmluZygiV2hpdGUiKSkpOwotCQliYWNrZ3JvdW5kQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWNoYW5nZUJhY2tncm91bmQoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBDb21ibyB0byBjaGFuZ2UgdGhlIHggc2NhbGUuCi0JCVN0cmluZ1tdIHZhbHVlcyA9IHsKLQkJCSIwLjEiLCAiMC4yIiwgIjAuMyIsICIwLjQiLCAiMC41IiwgIjAuNiIsICIwLjciLCAiMC44IiwgIjAuOSIsICIxIiwKLQkJCSIxLjEiLCAiMS4yIiwgIjEuMyIsICIxLjQiLCAiMS41IiwgIjEuNiIsICIxLjciLCAiMS44IiwgIjEuOSIsICIyIiwKLQkJCSIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5IiwgIjEwIix9OwotCQlncm91cCA9IG5ldyBHcm91cChjb250cm9scywgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkJZ3JvdXAuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJYX3NjYWxlIikpOwotCQlzY2FsZVhDb21ibyA9IG5ldyBDb21ibyhncm91cCwgU1dULkRST1BfRE9XTik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzY2FsZVhDb21iby5hZGQodmFsdWVzW2ldKTsKLQkJfQotCQlzY2FsZVhDb21iby5zZWxlY3Qoc2NhbGVYQ29tYm8uaW5kZXhPZigiMSIpKTsKLQkJc2NhbGVYQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNjYWxlWCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIENvbWJvIHRvIGNoYW5nZSB0aGUgeSBzY2FsZS4KLQkJZ3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbHMsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JCWdyb3VwLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiWV9zY2FsZSIpKTsKLQkJc2NhbGVZQ29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5EUk9QX0RPV04pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJc2NhbGVZQ29tYm8uYWRkKHZhbHVlc1tpXSk7Ci0JCX0KLQkJc2NhbGVZQ29tYm8uc2VsZWN0KHNjYWxlWUNvbWJvLmluZGV4T2YoIjEiKSk7Ci0JCXNjYWxlWUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzY2FsZVkoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBDb21ibyB0byBjaGFuZ2UgdGhlIGFscGhhIHZhbHVlLgotCQlncm91cCA9IG5ldyBHcm91cChjb250cm9scywgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkJZ3JvdXAuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJBbHBoYV9LIikpOwotCQlhbHBoYUNvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDw9IDI1NTsgaSArPSA1KSB7Ci0JCQlhbHBoYUNvbWJvLmFkZChTdHJpbmcudmFsdWVPZihpKSk7Ci0JCX0KLQkJYWxwaGFDb21iby5zZWxlY3QoYWxwaGFDb21iby5pbmRleE9mKCIyNTUiKSk7Ci0JCWFscGhhQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWFscGhhKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gQ2hlY2sgYm94IHRvIHJlcXVlc3QgaW5jcmVtZW50YWwgZGlzcGxheS4KLQkJZ3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbHMsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JCWdyb3VwLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiRGlzcGxheSIpKTsKLQkJaW5jcmVtZW50YWxDaGVjayA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWluY3JlbWVudGFsQ2hlY2suc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJJbmNyZW1lbnRhbCIpKTsKLQkJaW5jcmVtZW50YWxDaGVjay5zZXRTZWxlY3Rpb24oaW5jcmVtZW50YWwpOwotCQlpbmNyZW1lbnRhbENoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpbmNyZW1lbnRhbCA9ICgoQnV0dG9uKWV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIENoZWNrIGJveCB0byByZXF1ZXN0IHRyYW5zcGFyZW50IGRpc3BsYXkuCi0JCXRyYW5zcGFyZW50Q2hlY2sgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQl0cmFuc3BhcmVudENoZWNrLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiVHJhbnNwYXJlbnQiKSk7Ci0JCXRyYW5zcGFyZW50Q2hlY2suc2V0U2VsZWN0aW9uKHRyYW5zcGFyZW50KTsKLQkJdHJhbnNwYXJlbnRDaGVjay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJhbnNwYXJlbnQgPSAoKEJ1dHRvbilldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCWltYWdlQ2FudmFzLnJlZHJhdygpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQ2hlY2sgYm94IHRvIHJlcXVlc3QgbWFzayBkaXNwbGF5LgotCQltYXNrQ2hlY2sgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQltYXNrQ2hlY2suc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJNYXNrIikpOwotCQltYXNrQ2hlY2suc2V0U2VsZWN0aW9uKHNob3dNYXNrKTsKLQkJbWFza0NoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzaG93TWFzayA9ICgoQnV0dG9uKWV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJaW1hZ2VDYW52YXMucmVkcmF3KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBDaGVjayBib3ggdG8gcmVxdWVzdCBiYWNrZ3JvdW5kIGRpc3BsYXkuCi0JCWJhY2tncm91bmRDaGVjayA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJhY2tncm91bmRDaGVjay5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkJhY2tncm91bmQiKSk7Ci0JCWJhY2tncm91bmRDaGVjay5zZXRTZWxlY3Rpb24oc2hvd0JhY2tncm91bmQpOwotCQliYWNrZ3JvdW5kQ2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNob3dCYWNrZ3JvdW5kID0gKChCdXR0b24pZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gR3JvdXAgdGhlIGFuaW1hdGlvbiBidXR0b25zLgotCQlncm91cCA9IG5ldyBHcm91cChjb250cm9scywgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkJZ3JvdXAuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJBbmltYXRpb24iKSk7Ci0KLQkJLy8gUHVzaCBidXR0b24gdG8gZGlzcGxheSB0aGUgcHJldmlvdXMgaW1hZ2UgaW4gYSBtdWx0aS1pbWFnZSBmaWxlLgotCQlwcmV2aW91c0J1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLQkJcHJldmlvdXNCdXR0b24uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJQcmV2aW91cyIpKTsKLQkJcHJldmlvdXNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXByZXZpb3VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlwcmV2aW91cygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBQdXNoIGJ1dHRvbiB0byBkaXNwbGF5IHRoZSBuZXh0IGltYWdlIGluIGEgbXVsdGktaW1hZ2UgZmlsZS4KLQkJbmV4dEJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLQkJbmV4dEJ1dHRvbi5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIk5leHQiKSk7Ci0JCW5leHRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCW5leHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW5leHQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gUHVzaCBidXR0b24gdG8gdG9nZ2xlIGFuaW1hdGlvbiBvZiBhIG11bHRpLWltYWdlIGZpbGUuCi0JCWFuaW1hdGVCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0JCWFuaW1hdGVCdXR0b24uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJBbmltYXRlIikpOwotCQlhbmltYXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlhbmltYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlhbmltYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIGltYWdlIGZpbGUgdHlwZS4KLQkJdHlwZUxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXR5cGVMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlR5cGVfaW5pdGlhbCIpKTsKLQkJdHlwZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIENhbnZhcyB0byBzaG93IHRoZSBpbWFnZS4KLQkJaW1hZ2VDYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuTk9fUkVEUkFXX1JFU0laRSB8IFNXVC5OT19CQUNLR1JPVU5EKTsKLQkJaW1hZ2VDYW52YXMuc2V0QmFja2dyb3VuZCh3aGl0ZUNvbG9yKTsKLQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKGNyb3NzQ3Vyc29yKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gMTU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWltYWdlQ2FudmFzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlpbWFnZUNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2VDYW52YXMuZ2V0Qm91bmRzKCk7Ci0JCQkJCWV2ZW50LmdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlwYWludEltYWdlKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlpbWFnZUNhbnZhcy5hZGRNb3VzZU1vdmVMaXN0ZW5lcihuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBldmVudCkgewotCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCXNob3dDb2xvckF0KGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gU2V0IHVwIHRoZSBpbWFnZSBjYW52YXMgc2Nyb2xsIGJhcnMuCi0JCVNjcm9sbEJhciBob3Jpem9udGFsID0gaW1hZ2VDYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlob3Jpem9udGFsLnNldFZpc2libGUodHJ1ZSk7Ci0JCWhvcml6b250YWwuc2V0TWluaW11bSgwKTsKLQkJaG9yaXpvbnRhbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaG9yaXpvbnRhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2Nyb2xsSG9yaXpvbnRhbGx5KChTY3JvbGxCYXIpZXZlbnQud2lkZ2V0KTsKLQkJCX0KLQkJfSk7Ci0JCVNjcm9sbEJhciB2ZXJ0aWNhbCA9IGltYWdlQ2FudmFzLmdldFZlcnRpY2FsQmFyKCk7Ci0JCXZlcnRpY2FsLnNldFZpc2libGUodHJ1ZSk7Ci0JCXZlcnRpY2FsLnNldE1pbmltdW0oMCk7Ci0JCXZlcnRpY2FsLnNldEVuYWJsZWQoZmFsc2UpOwotCQl2ZXJ0aWNhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2Nyb2xsVmVydGljYWxseSgoU2Nyb2xsQmFyKWV2ZW50LndpZGdldCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIGltYWdlIHNpemUuCi0JCXNpemVMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlzaXplTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJTaXplX2luaXRpYWwiKSk7Ci0JCXNpemVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSBpbWFnZSBkZXB0aC4KLQkJZGVwdGhMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlkZXB0aExhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiRGVwdGhfaW5pdGlhbCIpKTsKLQkJZGVwdGhMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSB0cmFuc3BhcmVudCBwaXhlbC4KLQkJdHJhbnNwYXJlbnRQaXhlbExhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXRyYW5zcGFyZW50UGl4ZWxMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlRyYW5zcGFyZW50X3BpeGVsX2luaXRpYWwiKSk7Ci0JCXRyYW5zcGFyZW50UGl4ZWxMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSB0aW1lIHRvIGxvYWQuCi0JCXRpbWVUb0xvYWRMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQl0aW1lVG9Mb2FkTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJUaW1lX3RvX2xvYWRfaW5pdGlhbCIpKTsKLQkJdGltZVRvTG9hZExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIFNlcGFyYXRlIHRoZSBhbmltYXRpb24gZmllbGRzIGZyb20gdGhlIHJlc3Qgb2YgdGhlIGZpZWxkcy4KLQkJc2VwYXJhdG9yID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgbG9naWNhbCBzY3JlZW4gc2l6ZSBmb3IgYW5pbWF0aW9uLgotCQlzY3JlZW5TaXplTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJc2NyZWVuU2l6ZUxhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiQW5pbWF0aW9uX3NpemVfaW5pdGlhbCIpKTsKLQkJc2NyZWVuU2l6ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIGJhY2tncm91bmQgcGl4ZWwuCi0JCWJhY2tncm91bmRQaXhlbExhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJhY2tncm91bmRQaXhlbExhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiQmFja2dyb3VuZF9waXhlbF9pbml0aWFsIikpOwotCQliYWNrZ3JvdW5kUGl4ZWxMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSBpbWFnZSBsb2NhdGlvbiAoeCwgeSkuCi0JCWxvY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJbG9jYXRpb25MYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkltYWdlX2xvY2F0aW9uX2luaXRpYWwiKSk7Ci0JCWxvY2F0aW9uTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgaW1hZ2UgZGlzcG9zYWwgbWV0aG9kLgotCQlkaXNwb3NhbE1ldGhvZExhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWRpc3Bvc2FsTWV0aG9kTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJEaXNwb3NhbF9pbml0aWFsIikpOwotCQlkaXNwb3NhbE1ldGhvZExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIGltYWdlIGRlbGF5IHRpbWUuCi0JCWRlbGF5VGltZUxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWRlbGF5VGltZUxhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiRGVsYXlfaW5pdGlhbCIpKTsKLQkJZGVsYXlUaW1lTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgYmFja2dyb3VuZCBwaXhlbC4KLQkJcmVwZWF0Q291bnRMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlyZXBlYXRDb3VudExhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiUmVwZWF0c19pbml0aWFsIikpOwotCQlyZXBlYXRDb3VudExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIFNlcGFyYXRlIHRoZSBhbmltYXRpb24gZmllbGRzIGZyb20gdGhlIHBhbGV0dGUuCi0JCXNlcGFyYXRvciA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIExhYmVsIHRvIHNob3cgaWYgdGhlIGltYWdlIGhhcyBhIGRpcmVjdCBvciBpbmRleGVkIHBhbGV0dGUuCi0JCXBhbGV0dGVMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlwYWxldHRlTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJQYWxldHRlX2luaXRpYWwiKSk7Ci0JCXBhbGV0dGVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBDYW52YXMgdG8gc2hvdyB0aGUgaW1hZ2UncyBwYWxldHRlLgotCQlwYWxldHRlQ2FudmFzID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5OT19SRURSQVdfUkVTSVpFKTsKLQkJcGFsZXR0ZUNhbnZhcy5zZXRGb250KGZpeGVkV2lkdGhGb250KTsKLQkJcGFsZXR0ZUNhbnZhcy5nZXRWZXJ0aWNhbEJhcigpLnNldFZpc2libGUodHJ1ZSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCUdDIGdjID0gbmV3IEdDKHBhbGV0dGVMYWJlbCk7Ci0JCXBhbGV0dGVXaWR0aCA9IGdjLnN0cmluZ0V4dGVudChidW5kbGUuZ2V0U3RyaW5nKCJNYXhfbGVuZ3RoX3N0cmluZyIpKS54OwotCQlnYy5kaXNwb3NlKCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IHBhbGV0dGVXaWR0aDsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDE2ICogMTE7IC8vIHNob3cgYXQgbGVhc3QgMTYgY29sb3JzCi0JCXBhbGV0dGVDYW52YXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXBhbGV0dGVDYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQkJCXBhaW50UGFsZXR0ZShldmVudCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIFNldCB1cCB0aGUgcGFsZXR0ZSBjYW52YXMgc2Nyb2xsIGJhci4KLQkJdmVydGljYWwgPSBwYWxldHRlQ2FudmFzLmdldFZlcnRpY2FsQmFyKCk7Ci0JCXZlcnRpY2FsLnNldFZpc2libGUodHJ1ZSk7Ci0JCXZlcnRpY2FsLnNldE1pbmltdW0oMCk7Ci0JCXZlcnRpY2FsLnNldEluY3JlbWVudCgxMCk7Ci0JCXZlcnRpY2FsLnNldEVuYWJsZWQoZmFsc2UpOwotCQl2ZXJ0aWNhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2Nyb2xsUGFsZXR0ZSgoU2Nyb2xsQmFyKWV2ZW50LndpZGdldCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIFNhc2ggdG8gc2VlIG1vcmUgb2YgaW1hZ2Ugb3IgaW1hZ2UgZGF0YS4KLQkJc2FzaCA9IG5ldyBTYXNoKHNoZWxsLCBTV1QuSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXNhc2guc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXNhc2guYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5kZXRhaWwgIT0gU1dULkRSQUcpIHsKLQkJCQkJKChHcmlkRGF0YSlwYWxldHRlQ2FudmFzLmdldExheW91dERhdGEoKSkuaGVpZ2h0SGludCA9IFNXVC5ERUZBVUxUOwotCQkJCQlSZWN0YW5nbGUgcGFsZXR0ZUNhbnZhc0JvdW5kcyA9IHBhbGV0dGVDYW52YXMuZ2V0Qm91bmRzKCk7Ci0JCQkJCWludCBtaW5ZID0gcGFsZXR0ZUNhbnZhc0JvdW5kcy55ICsgMjA7Ci0JCQkJCVJlY3RhbmdsZSBkYXRhTGFiZWxCb3VuZHMgPSBkYXRhTGFiZWwuZ2V0Qm91bmRzKCk7Ci0JCQkJCWludCBtYXhZID0gc3RhdHVzTGFiZWwuZ2V0Qm91bmRzKCkueSAtIGRhdGFMYWJlbEJvdW5kcy5oZWlnaHQgLSAyMDsKLQkJCQkJaWYgKGV2ZW50LnkgPiBtaW5ZICYmIGV2ZW50LnkgPCBtYXhZKSB7Ci0JCQkJCQlSZWN0YW5nbGUgb2xkU2FzaCA9IHNhc2guZ2V0Qm91bmRzKCk7Ci0JCQkJCQlzYXNoLnNldEJvdW5kcyhldmVudC54LCBldmVudC55LCBldmVudC53aWR0aCwgZXZlbnQuaGVpZ2h0KTsKLQkJCQkJCWludCBkaWZmID0gZXZlbnQueSAtIG9sZFNhc2gueTsKLQkJCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZUNhbnZhcy5nZXRCb3VuZHMoKTsKLQkJCQkJCWltYWdlQ2FudmFzLnNldEJvdW5kcyhib3VuZHMueCwgYm91bmRzLnksIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCArIGRpZmYpOwotCQkJCQkJYm91bmRzID0gcGFsZXR0ZUNhbnZhc0JvdW5kczsKLQkJCQkJCXBhbGV0dGVDYW52YXMuc2V0Qm91bmRzKGJvdW5kcy54LCBib3VuZHMueSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0ICsgZGlmZik7Ci0JCQkJCQlib3VuZHMgPSBkYXRhTGFiZWxCb3VuZHM7Ci0JCQkJCQlkYXRhTGFiZWwuc2V0Qm91bmRzKGJvdW5kcy54LCBib3VuZHMueSArIGRpZmYsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JCQkJCQlib3VuZHMgPSBkYXRhVGV4dC5nZXRCb3VuZHMoKTsKLQkJCQkJCWRhdGFUZXh0LnNldEJvdW5kcyhib3VuZHMueCwgYm91bmRzLnkgKyBkaWZmLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQgLSBkaWZmKTsKLQkJCQkJCS8vc2hlbGwubGF5b3V0KHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBMYWJlbCB0byBzaG93IGRhdGEtc3BlY2lmaWMgZmllbGRzLgotCQlkYXRhTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJZGF0YUxhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiUGl4ZWxfZGF0YV9pbml0aWFsIikpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQkvLyBUZXh0IHRvIHNob3cgYSBkdW1wIG9mIHRoZSBkYXRhLgotCQlkYXRhVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlJFQURfT05MWSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCWRhdGFUZXh0LnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpKTsKLQkJZGF0YVRleHQuc2V0Rm9udChmaXhlZFdpZHRoRm9udCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDEyODsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlkYXRhVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJZGF0YVRleHQuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiBldmVudC5idXR0b24gPT0gMSkgewotCQkJCQlzaG93Q29sb3JGb3JEYXRhKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJZGF0YVRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJc2hvd0NvbG9yRm9yRGF0YSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBMYWJlbCB0byBzaG93IHN0YXR1cyBhbmQgY3Vyc29yIGxvY2F0aW9uIGluIGltYWdlLgotCQlzdGF0dXNMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlzdGF0dXNMYWJlbC5zZXRUZXh0KCIiKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJc3RhdHVzTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCQotCU1lbnUgY3JlYXRlTWVudUJhcigpIHsKLQkJLy8gTWVudSBiYXIuCi0JCU1lbnUgbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQkJc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLQkJY3JlYXRlRmlsZU1lbnUobWVudUJhcik7Ci0JCWNyZWF0ZUFscGhhTWVudShtZW51QmFyKTsKLQkJcmV0dXJuIG1lbnVCYXI7Ci0JfQotCQotCXZvaWQgY3JlYXRlRmlsZU1lbnUoTWVudSBtZW51QmFyKSB7Ci0JCS8vIEZpbGUgbWVudQotCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkZpbGUiKSk7Ci0JCU1lbnUgZmlsZU1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0TWVudShmaWxlTWVudSk7Ci0KLQkJLy8gRmlsZSAtPiBPcGVuIEZpbGUuLi4KLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiT3BlbkZpbGUiKSk7Ci0JCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnTycpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51T3BlbkZpbGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBGaWxlIC0+IE9wZW4gVVJMLi4uCi0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIk9wZW5VUkwiKSk7Ci0JCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnVScpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51T3BlblVSTCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIEZpbGUgLT4gUmVvcGVuCi0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlJlb3BlbiIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudVJlb3BlbigpOwotCQkJfQotCQl9KTsKLQkJCi0JCW5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCQotCQkvLyBGaWxlIC0+IFNhdmUKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiU2F2ZSIpKTsKLQkJaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdTJyk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVTYXZlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gRmlsZSAtPiBTYXZlIEFzLi4uCi0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmVfYXMiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVTYXZlQXMoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBGaWxlIC0+IFNhdmUgTWFzayBBcy4uLgotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJTYXZlX21hc2tfYXMiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVTYXZlTWFza0FzKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkJCi0JCS8vIEZpbGUgLT4gUHJpbnQKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiUHJpbnQiKSk7Ci0JCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnUCcpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51UHJpbnQoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQluZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCi0JCS8vIEZpbGUgLT4gRXhpdAotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJFeGl0IikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJfQotCQl9KTsKLQkKLQl9Ci0KLQl2b2lkIGNyZWF0ZUFscGhhTWVudShNZW51IG1lbnVCYXIpIHsKLQkJLy8gQWxwaGEgbWVudQotCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkFscGhhIikpOwotCQlNZW51IGFscGhhTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQkJaXRlbS5zZXRNZW51KGFscGhhTWVudSk7Ci0KLQkJLy8gQWxwaGEgLT4gSwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGFscGhhTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIksiKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudUNvbXBvc2VBbHBoYShBTFBIQV9DT05TVEFOVCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIEFscGhhIC0+IChLICsgeCkgJSAyNTYKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShhbHBoYU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCIoSyArIHgpICUgMjU2Iik7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVDb21wb3NlQWxwaGEoQUxQSEFfWCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIEFscGhhIC0+IChLICsgeSkgJSAyNTYKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShhbHBoYU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCIoSyArIHkpICUgMjU2Iik7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVDb21wb3NlQWxwaGEoQUxQSEFfWSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXZvaWQgbWVudUNvbXBvc2VBbHBoYShpbnQgYWxwaGFfb3ApIHsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybjsKLQkJYW5pbWF0ZSA9IGZhbHNlOyAvLyBzdG9wIGFueSBhbmltYXRpb24gaW4gcHJvZ3Jlc3MKLQkJQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JCXNoZWxsLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQl0cnkgewotCQkJaWYgKGFscGhhX29wID09IEFMUEhBX0NPTlNUQU5UKSB7Ci0JCQkJaW1hZ2VEYXRhLmFscGhhID0gYWxwaGE7Ci0JCQl9IGVsc2UgewotCQkJCWltYWdlRGF0YS5hbHBoYSA9IC0xOwotCQkJCXN3aXRjaCAoYWxwaGFfb3ApIHsKLQkJCQkJY2FzZSBBTFBIQV9YOiAKLQkJCQkJCWZvciAoaW50IHkgPSAwOyB5IDwgaW1hZ2VEYXRhLmhlaWdodDsgeSsrKSB7Ci0JCQkJCQlmb3IgKGludCB4ID0gMDsgeCA8IGltYWdlRGF0YS53aWR0aDsgeCsrKSB7Ci0JCQkJCQkJaW1hZ2VEYXRhLnNldEFscGhhKHgsIHksICh4ICsgYWxwaGEpICUgMjU2KTsKLQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFMUEhBX1k6IAotCQkJCQkJZm9yIChpbnQgeSA9IDA7IHkgPCBpbWFnZURhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCQkJCWZvciAoaW50IHggPSAwOyB4IDwgaW1hZ2VEYXRhLndpZHRoOyB4KyspIHsKLQkJCQkJCQlpbWFnZURhdGEuc2V0QWxwaGEoeCwgeSwgKHkgKyBhbHBoYSkgJSAyNTYpOwotCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6IGJyZWFrOwotCQkJCX0JCQkJCQotCQkJfQkJCQotCQkJZGlzcGxheUltYWdlKGltYWdlRGF0YSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0JCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3IoY3Jvc3NDdXJzb3IpOwotCQkJd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIG1lbnVPcGVuRmlsZSgpIHsKLQkJYW5pbWF0ZSA9IGZhbHNlOyAvLyBzdG9wIGFueSBhbmltYXRpb24gaW4gcHJvZ3Jlc3MKLQkJCi0JCS8vIEdldCB0aGUgdXNlciB0byBjaG9vc2UgYW4gaW1hZ2UgZmlsZS4KLQkJRmlsZURpYWxvZyBmaWxlQ2hvb3NlciA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0JCWlmIChsYXN0UGF0aCAhPSBudWxsKQotCQkJZmlsZUNob29zZXIuc2V0RmlsdGVyUGF0aChsYXN0UGF0aCk7Ci0JCWZpbGVDaG9vc2VyLnNldEZpbHRlckV4dGVuc2lvbnMoT1BFTl9GSUxURVJfRVhURU5TSU9OUyk7Ci0JCWZpbGVDaG9vc2VyLnNldEZpbHRlck5hbWVzKE9QRU5fRklMVEVSX05BTUVTKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gZmlsZUNob29zZXIub3BlbigpOwotCQlsYXN0UGF0aCA9IGZpbGVDaG9vc2VyLmdldEZpbHRlclBhdGgoKTsKLQkJaWYgKGZpbGVuYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JCXNoZWxsLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQlJbWFnZUxvYWRlciBvbGRMb2FkZXIgPSBsb2FkZXI7Ci0JCXRyeSB7Ci0JCQlsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJCWlmIChpbmNyZW1lbnRhbCkgewotCQkJCS8vIFByZXBhcmUgdG8gaGFuZGxlIGluY3JlbWVudGFsIGV2ZW50cy4KLQkJCQlsb2FkZXIuYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lcihuZXcgSW1hZ2VMb2FkZXJMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaW1hZ2VEYXRhTG9hZGVkKEltYWdlTG9hZGVyRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWluY3JlbWVudGFsRGF0YUxvYWRlZChldmVudCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlpbmNyZW1lbnRhbFRocmVhZFN0YXJ0KCk7Ci0JCQl9Ci0JCQkvLyBSZWFkIHRoZSBuZXcgaW1hZ2UocykgZnJvbSB0aGUgY2hvc2VuIGZpbGUuCi0JCQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJaW1hZ2VEYXRhQXJyYXkgPSBsb2FkZXIubG9hZChmaWxlbmFtZSk7Ci0JCQlsb2FkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lOwotCQkJaWYgKGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCQkvLyBDYWNoZSB0aGUgZmlsZW5hbWUuCi0JCQkJY3VycmVudE5hbWUgPSBmaWxlbmFtZTsKLQkJCQlmaWxlTmFtZSA9IGZpbGVuYW1lOwotCQkJCQotCQkJCS8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBpbWFnZXMgaW4gdGhlIGZpbGUgKHR5cGljYWxseSBHSUYpCi0JCQkJLy8gdGhlbiBlbmFibGUgdGhlIFByZXZpb3VzLCBOZXh0IGFuZCBBbmltYXRlIGJ1dHRvbnMuCi0JCQkJcHJldmlvdXNCdXR0b24uc2V0RW5hYmxlZChpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKTsKLQkJCQluZXh0QnV0dG9uLnNldEVuYWJsZWQoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMSk7Ci0JCQkJYW5pbWF0ZUJ1dHRvbi5zZXRFbmFibGVkKGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEgJiYgbG9hZGVyLmxvZ2ljYWxTY3JlZW5XaWR0aCA+IDAgJiYgbG9hZGVyLmxvZ2ljYWxTY3JlZW5IZWlnaHQgPiAwKTsKLQkKLQkJCQkvLyBEaXNwbGF5IHRoZSBmaXJzdCBpbWFnZSBpbiB0aGUgZmlsZS4KLQkJCQlpbWFnZURhdGFJbmRleCA9IDA7Ci0JCQkJZGlzcGxheUltYWdlKGltYWdlRGF0YUFycmF5W2ltYWdlRGF0YUluZGV4XSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiTG9hZGluZ19sYyIpLCBmaWxlbmFtZSwgZSk7Ci0JCQlsb2FkZXIgPSBvbGRMb2FkZXI7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJMb2FkaW5nX2xjIiksIGZpbGVuYW1lLCBlKTsKLQkJCWxvYWRlciA9IG9sZExvYWRlcjsKLQkJfSBmaW5hbGx5IHsKLQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCWltYWdlQ2FudmFzLnNldEN1cnNvcihjcm9zc0N1cnNvcik7Ci0JCQl3YWl0Q3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQl2b2lkIG1lbnVPcGVuVVJMKCkgewotCQlhbmltYXRlID0gZmFsc2U7IC8vIHN0b3AgYW55IGFuaW1hdGlvbiBpbiBwcm9ncmVzcwotCQkKLQkJLy8gR2V0IHRoZSB1c2VyIHRvIGNob29zZSBhbiBpbWFnZSBVUkwuCi0JCVRleHRQcm9tcHRlciB0ZXh0UHJvbXB0ZXIgPSBuZXcgVGV4dFByb21wdGVyKHNoZWxsLCBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuRElBTE9HX1RSSU0pOwotCQl0ZXh0UHJvbXB0ZXIuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJPcGVuVVJMRGlhbG9nIikpOwotCQl0ZXh0UHJvbXB0ZXIuc2V0TWVzc2FnZShidW5kbGUuZ2V0U3RyaW5nKCJFbnRlclVSTCIpKTsKLQkJU3RyaW5nIHVybG5hbWUgPSB0ZXh0UHJvbXB0ZXIub3BlbigpOwotCQlpZiAodXJsbmFtZSA9PSBudWxsKSByZXR1cm47Ci0KLQkJQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JCXNoZWxsLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQlJbWFnZUxvYWRlciBvbGRMb2FkZXIgPSBsb2FkZXI7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTCh1cmxuYW1lKTsKLQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQlsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJCWlmIChpbmNyZW1lbnRhbCkgewotCQkJCS8vIFByZXBhcmUgdG8gaGFuZGxlIGluY3JlbWVudGFsIGV2ZW50cy4KLQkJCQlsb2FkZXIuYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lcihuZXcgSW1hZ2VMb2FkZXJMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaW1hZ2VEYXRhTG9hZGVkKEltYWdlTG9hZGVyRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWluY3JlbWVudGFsRGF0YUxvYWRlZChldmVudCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlpbmNyZW1lbnRhbFRocmVhZFN0YXJ0KCk7Ci0JCQl9Ci0JCQkvLyBSZWFkIHRoZSBuZXcgaW1hZ2UocykgZnJvbSB0aGUgY2hvc2VuIFVSTC4KLQkJCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlpbWFnZURhdGFBcnJheSA9IGxvYWRlci5sb2FkKHN0cmVhbSk7Ci0JCQlzdHJlYW0uY2xvc2UoKTsKLQkJCWxvYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7Ci0JCQlpZiAoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMCkgewotCQkJCWN1cnJlbnROYW1lID0gdXJsbmFtZTsKLQkJCQlmaWxlTmFtZSA9IG51bGw7Ci0JCQkJCi0JCQkJLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGltYWdlcyAodHlwaWNhbGx5IEdJRikKLQkJCQkvLyB0aGVuIGVuYWJsZSB0aGUgUHJldmlvdXMsIE5leHQgYW5kIEFuaW1hdGUgYnV0dG9ucy4KLQkJCQlwcmV2aW91c0J1dHRvbi5zZXRFbmFibGVkKGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEpOwotCQkJCW5leHRCdXR0b24uc2V0RW5hYmxlZChpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKTsKLQkJCQlhbmltYXRlQnV0dG9uLnNldEVuYWJsZWQoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMSAmJiBsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoID4gMCAmJiBsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCA+IDApOwotCQotCQkJCS8vIERpc3BsYXkgdGhlIGZpcnN0IGltYWdlLgotCQkJCWltYWdlRGF0YUluZGV4ID0gMDsKLQkJCQlkaXNwbGF5SW1hZ2UoaW1hZ2VEYXRhQXJyYXlbaW1hZ2VEYXRhSW5kZXhdKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJMb2FkaW5nX2xjIiksIHVybG5hbWUsIGUpOwotCQkJbG9hZGVyID0gb2xkTG9hZGVyOwotCQl9IGZpbmFsbHkgewotCQkJc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotCQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKGNyb3NzQ3Vyc29yKTsKLQkJCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDYWxsZWQgdG8gc3RhcnQgYSB0aHJlYWQgdGhhdCBkcmF3cyBpbmNyZW1lbnRhbCBpbWFnZXMKLQkgKiBhcyB0aGV5IGFyZSBsb2FkZWQuCi0JICovCi0Jdm9pZCBpbmNyZW1lbnRhbFRocmVhZFN0YXJ0KCkgewotCQlpbmNyZW1lbnRhbEV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLQkJaW5jcmVtZW50YWxUaHJlYWQgPSBuZXcgVGhyZWFkKCJJbmNyZW1lbnRhbCIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBEcmF3IHRoZSBmaXJzdCBJbWFnZURhdGEgaW5jcmVtZW50LgotCQkJCXdoaWxlIChpbmNyZW1lbnRhbEV2ZW50cyAhPSBudWxsKSB7Ci0JCQkJCS8vIFN5bmNocm9uaXplIHNvIHdlIGRvbid0IHRyeSB0byByZW1vdmUgd2hlbiB0aGUgdmVjdG9yIGlzIG51bGwuCi0JCQkJCXN5bmNocm9uaXplZCAoSW1hZ2VBbmFseXplci50aGlzKSB7Ci0JCQkJCQlpZiAoaW5jcmVtZW50YWxFdmVudHMgIT0gbnVsbCkgewotCQkJCQkJCWlmIChpbmNyZW1lbnRhbEV2ZW50cy5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJCUltYWdlTG9hZGVyRXZlbnQgZXZlbnQgPSAoSW1hZ2VMb2FkZXJFdmVudCkgaW5jcmVtZW50YWxFdmVudHMucmVtb3ZlKDApOwotCQkJCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJCQkJCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBldmVudC5pbWFnZURhdGEpOwotCQkJCQkJCQlpbWFnZURhdGEgPSBldmVudC5pbWFnZURhdGE7Ci0JCQkJCQkJCWltYWdlQ2FudmFzR0MuZHJhd0ltYWdlKAotCQkJCQkJCQkJaW1hZ2UsCi0JCQkJCQkJCQkwLAotCQkJCQkJCQkJMCwKLQkJCQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJCQkJCQlpbWFnZURhdGEueCwKLQkJCQkJCQkJCWltYWdlRGF0YS55LAotCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJeWllbGQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZGlzcGxheS53YWtlKCk7Ci0JCQl9Ci0JCX07Ci0JCWluY3JlbWVudGFsVGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJaW5jcmVtZW50YWxUaHJlYWQuc3RhcnQoKTsKLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiBpbmNyZW1lbnRhbCBpbWFnZSBkYXRhIGhhcyBiZWVuIGxvYWRlZCwKLQkgKiBmb3IgZXhhbXBsZSwgZm9yIGludGVybGFjZWQgR0lGL1BORyBvciBwcm9ncmVzc2l2ZSBKUEVHLgotCSAqLwotCXZvaWQgaW5jcmVtZW50YWxEYXRhTG9hZGVkKEltYWdlTG9hZGVyRXZlbnQgZXZlbnQpIHsKLQkJLy8gU3luY2hyb25pemUgc28gdGhhdCB3ZSBkbyBub3QgdHJ5IHRvIGFkZCB3aGlsZQotCQkvLyB0aGUgaW5jcmVtZW50YWwgZHJhd2luZyB0aHJlYWQgaXMgcmVtb3ZpbmcuCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaW5jcmVtZW50YWxFdmVudHMuYWRkRWxlbWVudChldmVudCk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBtZW51U2F2ZSgpIHsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybjsKLQkJYW5pbWF0ZSA9IGZhbHNlOyAvLyBzdG9wIGFueSBhbmltYXRpb24gaW4gcHJvZ3Jlc3MKLQotCQkvLyBJZiB0aGUgaW1hZ2UgZmlsZSB0eXBlIGlzIHVua25vd24sIHdlIGNhbid0ICdTYXZlJywKLQkJLy8gc28gd2UgaGF2ZSB0byB1c2UgJ1NhdmUgQXMuLi4nLgotCQlpZiAoaW1hZ2VEYXRhLnR5cGUgPT0gU1dULklNQUdFX1VOREVGSU5FRCB8fCBmaWxlTmFtZSA9PSBudWxsKSB7Ci0JCQltZW51U2F2ZUFzKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlDdXJzb3Igd2FpdEN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCXRyeSB7Ci0JCQkvLyBTYXZlIHRoZSBjdXJyZW50IGltYWdlIHRvIHRoZSBjdXJyZW50IGZpbGUuCi0JCQlsb2FkZXIuZGF0YSA9IG5ldyBJbWFnZURhdGFbXSB7aW1hZ2VEYXRhfTsKLQkJCWxvYWRlci5zYXZlKGZpbGVOYW1lLCBpbWFnZURhdGEudHlwZSk7Ci0JCQkKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJTYXZpbmdfbGMiKSwgZmlsZU5hbWUsIGUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiU2F2aW5nX2xjIiksIGZpbGVOYW1lLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCWltYWdlQ2FudmFzLnNldEN1cnNvcihjcm9zc0N1cnNvcik7Ci0JCQl3YWl0Q3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXZvaWQgbWVudVNhdmVBcygpIHsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybjsKLQkJYW5pbWF0ZSA9IGZhbHNlOyAvLyBzdG9wIGFueSBhbmltYXRpb24gaW4gcHJvZ3Jlc3MKLQotCQkvLyBHZXQgdGhlIHVzZXIgdG8gY2hvb3NlIGEgZmlsZSBuYW1lIGFuZCB0eXBlIHRvIHNhdmUuCi0JCUZpbGVEaWFsb2cgZmlsZUNob29zZXIgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULlNBVkUpOwotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJQYXRoKGxhc3RQYXRoKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lID0gZmlsZU5hbWU7Ci0JCQlpbnQgbmFtZVN0YXJ0ID0gbmFtZS5sYXN0SW5kZXhPZihqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCQlpZiAobmFtZVN0YXJ0ID4gLTEpIHsKLQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcobmFtZVN0YXJ0ICsgMSk7Ci0JCQl9Ci0JCQlmaWxlQ2hvb3Nlci5zZXRGaWxlTmFtZShuYW1lKTsKLQkJfQotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJFeHRlbnNpb25zKFNBVkVfRklMVEVSX0VYVEVOU0lPTlMpOwotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJOYW1lcyhTQVZFX0ZJTFRFUl9OQU1FUyk7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IGZpbGVDaG9vc2VyLm9wZW4oKTsKLQkJbGFzdFBhdGggPSBmaWxlQ2hvb3Nlci5nZXRGaWx0ZXJQYXRoKCk7Ci0JCWlmIChmaWxlbmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIEZpZ3VyZSBvdXQgd2hhdCBmaWxlIHR5cGUgdGhlIHVzZXIgd2FudHMgc2F2ZWQuCi0JCS8vIFdlIG5lZWQgdG8gcmVseSBvbiB0aGUgZmlsZSBleHRlbnNpb24gYmVjYXVzZSBGaWxlRGlhbG9nCi0JCS8vIGRvZXMgbm90IGhhdmUgQVBJIGZvciBhc2tpbmcgd2hhdCBmaWx0ZXIgdHlwZSB3YXMgc2VsZWN0ZWQuCi0JCWludCBmaWxldHlwZSA9IGRldGVybWluZUZpbGVUeXBlKGZpbGVuYW1lKTsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9VTkRFRklORUQpIHsKLQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SKTsKLQkJCWJveC5zZXRNZXNzYWdlKGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJVbmtub3duX2V4dGVuc2lvbiIpLCAKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZS5zdWJzdHJpbmcoZmlsZW5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpKSk7Ci0JCQlib3gub3BlbigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAobmV3IGphdmEuaW8uRmlsZShmaWxlbmFtZSkuZXhpc3RzKCkpIHsKLQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX1FVRVNUSU9OIHwgU1dULk9LIHwgU1dULkNBTkNFTCk7Ci0JCQlib3guc2V0TWVzc2FnZShjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiT3ZlcndyaXRlIiksIGZpbGVuYW1lKSk7Ci0JCQlpZiAoYm94Lm9wZW4oKSA9PSBTV1QuQ0FOQ0VMKQotCQkJCXJldHVybjsKLQkJfQotCQkKLQkJQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JCXNoZWxsLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQl0cnkgewotCQkJLy8gU2F2ZSB0aGUgY3VycmVudCBpbWFnZSB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JCQlib29sZWFuIG11bHRpID0gZmFsc2U7Ci0JCQlpZiAobG9hZGVyLmRhdGEubGVuZ3RoID4gMSkgewotCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX1FVRVNUSU9OIHwgU1dULllFUyB8IFNXVC5OTyB8IFNXVC5DQU5DRUwpOwotCQkJCWJveC5zZXRNZXNzYWdlKGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJTYXZlX2FsbCIpLCBuZXcgSW50ZWdlcihsb2FkZXIuZGF0YS5sZW5ndGgpKSk7Ci0JCQkJaW50IHJlc3VsdCA9IGJveC5vcGVuKCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBTV1QuQ0FOQ0VMKSByZXR1cm47Ci0JCQkJaWYgKHJlc3VsdCA9PSBTV1QuWUVTKSBtdWx0aSA9IHRydWU7Ci0JCQl9Ci0JCQkvKiBJZiB0aGUgaW1hZ2UgaGFzIHRyYW5zcGFyZW5jeSBidXQgdGhlIHVzZXIgaGFzIHRyYW5zcGFyZW5jeSB0dXJuZWQgb2ZmLAotCQkJICogdHVybiBpdCBvZmYgaW4gdGhlIHNhdmVkIGltYWdlLiAqLwotCQkJaW50IHRyYW5zcGFyZW50UGl4ZWwgPSBpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbDsKLQkJCWlmICghbXVsdGkgJiYgdHJhbnNwYXJlbnRQaXhlbCAhPSAtMSAmJiAhdHJhbnNwYXJlbnQpIHsKLQkJCQlpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCA9IC0xOwotCQkJfQotCQkJCi0JCQlpZiAoIW11bHRpKSBsb2FkZXIuZGF0YSA9IG5ldyBJbWFnZURhdGFbXSB7aW1hZ2VEYXRhfTsKLQkJCWxvYWRlci5zYXZlKGZpbGVuYW1lLCBmaWxldHlwZSk7Ci0JCQkKLQkJCS8qIFJlc3RvcmUgdGhlIHByZXZpb3VzIHRyYW5zcGFyZW5jeSBzZXR0aW5nLiAqLwotCQkJaWYgKCFtdWx0aSAmJiB0cmFuc3BhcmVudFBpeGVsICE9IC0xICYmICF0cmFuc3BhcmVudCkgewotCQkJCWltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gdHJhbnNwYXJlbnRQaXhlbDsKLQkJCX0KLQotCQkJLy8gVXBkYXRlIHRoZSBzaGVsbCB0aXRsZSBhbmQgZmlsZSB0eXBlIGxhYmVsLAotCQkJLy8gYW5kIHVzZSB0aGUgbmV3IGZpbGUuCi0JCQlmaWxlTmFtZSA9IGZpbGVuYW1lOwotCQkJc2hlbGwuc2V0VGV4dChjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiQW5hbHl6ZXJfb24iKSwgZmlsZW5hbWUpKTsKLQkJCXR5cGVMYWJlbC5zZXRUZXh0KGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJUeXBlX3N0cmluZyIpLCBmaWxlVHlwZVN0cmluZyhmaWxldHlwZSkpKTsKLQotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmluZ19sYyIpLCBmaWxlbmFtZSwgZSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJTYXZpbmdfbGMiKSwgZmlsZW5hbWUsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotCQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKGNyb3NzQ3Vyc29yKTsKLQkJCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0Jdm9pZCBtZW51U2F2ZU1hc2tBcygpIHsKLQkJaWYgKGltYWdlID09IG51bGwgfHwgIXNob3dNYXNrKSByZXR1cm47Ci0JCWlmIChpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5VHlwZSgpID09IFNXVC5UUkFOU1BBUkVOQ1lfTk9ORSkgcmV0dXJuOwotCQlhbmltYXRlID0gZmFsc2U7IC8vIHN0b3AgYW55IGFuaW1hdGlvbiBpbiBwcm9ncmVzcwotCi0JCS8vIEdldCB0aGUgdXNlciB0byBjaG9vc2UgYSBmaWxlIG5hbWUgYW5kIHR5cGUgdG8gc2F2ZS4KLQkJRmlsZURpYWxvZyBmaWxlQ2hvb3NlciA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuU0FWRSk7Ci0JCWZpbGVDaG9vc2VyLnNldEZpbHRlclBhdGgobGFzdFBhdGgpOwotCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgZmlsZUNob29zZXIuc2V0RmlsZU5hbWUoZmlsZU5hbWUpOwotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJFeHRlbnNpb25zKFNBVkVfRklMVEVSX0VYVEVOU0lPTlMpOwotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJOYW1lcyhTQVZFX0ZJTFRFUl9OQU1FUyk7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IGZpbGVDaG9vc2VyLm9wZW4oKTsKLQkJbGFzdFBhdGggPSBmaWxlQ2hvb3Nlci5nZXRGaWx0ZXJQYXRoKCk7Ci0JCWlmIChmaWxlbmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIEZpZ3VyZSBvdXQgd2hhdCBmaWxlIHR5cGUgdGhlIHVzZXIgd2FudHMgc2F2ZWQuCi0JCS8vIFdlIG5lZWQgdG8gcmVseSBvbiB0aGUgZmlsZSBleHRlbnNpb24gYmVjYXVzZSBGaWxlRGlhbG9nCi0JCS8vIGRvZXMgbm90IGhhdmUgQVBJIGZvciBhc2tpbmcgd2hhdCBmaWx0ZXIgdHlwZSB3YXMgc2VsZWN0ZWQuCi0JCWludCBmaWxldHlwZSA9IGRldGVybWluZUZpbGVUeXBlKGZpbGVuYW1lKTsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9VTkRFRklORUQpIHsKLQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SKTsKLQkJCWJveC5zZXRNZXNzYWdlKGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJVbmtub3duX2V4dGVuc2lvbiIpLCAKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZS5zdWJzdHJpbmcoZmlsZW5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpKSk7Ci0JCQlib3gub3BlbigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAobmV3IGphdmEuaW8uRmlsZShmaWxlbmFtZSkuZXhpc3RzKCkpIHsKLQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX1FVRVNUSU9OIHwgU1dULk9LIHwgU1dULkNBTkNFTCk7Ci0JCQlib3guc2V0TWVzc2FnZShjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiT3ZlcndyaXRlIiksIGZpbGVuYW1lKSk7Ci0JCQlpZiAoYm94Lm9wZW4oKSA9PSBTV1QuQ0FOQ0VMKQotCQkJCXJldHVybjsKLQkJfQotCQkKLQkJQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JCXNoZWxsLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQl0cnkgewotCQkJLy8gU2F2ZSB0aGUgbWFzayBvZiB0aGUgY3VycmVudCBpbWFnZSB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JCQlJbWFnZURhdGEgbWFza0ltYWdlRGF0YSA9IGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JCQlsb2FkZXIuZGF0YSA9IG5ldyBJbWFnZURhdGFbXSB7bWFza0ltYWdlRGF0YX07Ci0JCQlsb2FkZXIuc2F2ZShmaWxlbmFtZSwgZmlsZXR5cGUpOwotCQkJCi0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiU2F2aW5nX2xjIiksIGZpbGVuYW1lLCBlKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmluZ19sYyIpLCBmaWxlbmFtZSwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0JCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3IoY3Jvc3NDdXJzb3IpOwotCQkJd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIG1lbnVQcmludCgpIHsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybjsKLQotCQl0cnkgewotCQkJLy8gQXNrIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIHByaW50ZXIuCi0JCQlQcmludERpYWxvZyBkaWFsb2cgPSBuZXcgUHJpbnREaWFsb2coc2hlbGwsIFNXVC5OT05FKTsKLQkJCVByaW50ZXJEYXRhIHByaW50ZXJEYXRhID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChwcmludGVyRGF0YSA9PSBudWxsKSByZXR1cm47Ci0JCQkKLQkJCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKHByaW50ZXJEYXRhKTsKLQkJCVBvaW50IHNjcmVlbkRQSSA9IGRpc3BsYXkuZ2V0RFBJKCk7Ci0JCQlQb2ludCBwcmludGVyRFBJID0gcHJpbnRlci5nZXREUEkoKTsKLQkJCWludCBzY2FsZUZhY3RvciA9IHByaW50ZXJEUEkueCAvIHNjcmVlbkRQSS54OwotCQkJUmVjdGFuZ2xlIHRyaW0gPSBwcmludGVyLmNvbXB1dGVUcmltKDAsIDAsIDAsIDApOwotCQkJaWYgKHByaW50ZXIuc3RhcnRKb2IoY3VycmVudE5hbWUpKSB7Ci0JCQkJaWYgKHByaW50ZXIuc3RhcnRQYWdlKCkpIHsKLQkJCQkJR0MgZ2MgPSBuZXcgR0MocHJpbnRlcik7Ci0JCQkJCWludCB0cmFuc3BhcmVudFBpeGVsID0gaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWw7Ci0JCQkJCWlmICh0cmFuc3BhcmVudFBpeGVsICE9IC0xICYmICF0cmFuc3BhcmVudCkgewotCQkJCQkJaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSAtMTsKLQkJCQkJfQotCQkJCQlJbWFnZSBwcmludGVySW1hZ2UgPSBuZXcgSW1hZ2UocHJpbnRlciwgaW1hZ2VEYXRhKTsKLQkJCQkJZ2MuZHJhd0ltYWdlKAotCQkJCQkJcHJpbnRlckltYWdlLAotCQkJCQkJMCwKLQkJCQkJCTAsCi0JCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJCQkJLXRyaW0ueCwKLQkJCQkJCS10cmltLnksCi0JCQkJCQlzY2FsZUZhY3RvciAqIGltYWdlRGF0YS53aWR0aCwKLQkJCQkJCXNjYWxlRmFjdG9yICogaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCWlmICh0cmFuc3BhcmVudFBpeGVsICE9IC0xICYmICF0cmFuc3BhcmVudCkgewotCQkJCQkJaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSB0cmFuc3BhcmVudFBpeGVsOwotCQkJCQl9Ci0JCQkJCXByaW50ZXJJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQkJcHJpbnRlci5lbmRQYWdlKCk7Ci0JCQkJfQotCQkJCXByaW50ZXIuZW5kSm9iKCk7Ci0JCQl9Ci0JCQlwcmludGVyLmRpc3Bvc2UoKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCQkJYm94LnNldE1lc3NhZ2UoYnVuZGxlLmdldFN0cmluZygiUHJpbnRpbmdfZXJyb3IiKSArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCWJveC5vcGVuKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIG1lbnVSZW9wZW4oKSB7Ci0JCWlmIChjdXJyZW50TmFtZSA9PSBudWxsKSByZXR1cm47Ci0JCWFuaW1hdGUgPSBmYWxzZTsgLy8gc3RvcCBhbnkgYW5pbWF0aW9uIGluIHByb2dyZXNzCi0JCUN1cnNvciB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCWltYWdlQ2FudmFzLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJdHJ5IHsKLQkJCWxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCUltYWdlRGF0YVtdIG5ld0ltYWdlRGF0YTsKLQkJCWlmIChmaWxlTmFtZSA9PSBudWxsKSB7Ci0JCQkJVVJMIHVybCA9IG5ldyBVUkwoY3VycmVudE5hbWUpOwotCQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQkJbmV3SW1hZ2VEYXRhID0gbG9hZGVyLmxvYWQoc3RyZWFtKTsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmV3SW1hZ2VEYXRhID0gbG9hZGVyLmxvYWQoZmlsZU5hbWUpOwotCQkJfQotCQkJbG9hZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZTsKLQkJCWltYWdlRGF0YUluZGV4ID0gMDsKLQkJCWRpc3BsYXlJbWFnZShuZXdJbWFnZURhdGFbaW1hZ2VEYXRhSW5kZXhdKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIlJlbG9hZGluZ19sYyIpLCBjdXJyZW50TmFtZSwgZSk7Ci0JCX0gZmluYWxseSB7CQotCQkJc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotCQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKGNyb3NzQ3Vyc29yKTsKLQkJCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCXZvaWQgY2hhbmdlQmFja2dyb3VuZCgpIHsKLQkJU3RyaW5nIGJhY2tncm91bmQgPSBiYWNrZ3JvdW5kQ29tYm8uZ2V0VGV4dCgpOwotCQlpZiAoYmFja2dyb3VuZC5lcXVhbHMoYnVuZGxlLmdldFN0cmluZygiV2hpdGUiKSkpIHsKLQkJCWltYWdlQ2FudmFzLnNldEJhY2tncm91bmQod2hpdGVDb2xvcik7Ci0JCX0gZWxzZSBpZiAoYmFja2dyb3VuZC5lcXVhbHMoYnVuZGxlLmdldFN0cmluZygiQmxhY2siKSkpIHsKLQkJCWltYWdlQ2FudmFzLnNldEJhY2tncm91bmQoYmxhY2tDb2xvcik7Ci0JCX0gZWxzZSBpZiAoYmFja2dyb3VuZC5lcXVhbHMoYnVuZGxlLmdldFN0cmluZygiUmVkIikpKSB7Ci0JCQlpbWFnZUNhbnZhcy5zZXRCYWNrZ3JvdW5kKHJlZENvbG9yKTsKLQkJfSBlbHNlIGlmIChiYWNrZ3JvdW5kLmVxdWFscyhidW5kbGUuZ2V0U3RyaW5nKCJHcmVlbiIpKSkgewotCQkJaW1hZ2VDYW52YXMuc2V0QmFja2dyb3VuZChncmVlbkNvbG9yKTsKLQkJfSBlbHNlIGlmIChiYWNrZ3JvdW5kLmVxdWFscyhidW5kbGUuZ2V0U3RyaW5nKCJCbHVlIikpKSB7Ci0JCQlpbWFnZUNhbnZhcy5zZXRCYWNrZ3JvdW5kKGJsdWVDb2xvcik7Ci0JCX0gZWxzZSB7Ci0JCQlpbWFnZUNhbnZhcy5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIFNjYWxlWCBjb21ibyBzZWxlY3Rpb24gY2hhbmdlcy4KLQkgKi8KLQl2b2lkIHNjYWxlWCgpIHsKLQkJdHJ5IHsKLQkJCXhzY2FsZSA9IEZsb2F0LnBhcnNlRmxvYXQoc2NhbGVYQ29tYm8uZ2V0VGV4dCgpKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXhzY2FsZSA9IDE7Ci0JCQlzY2FsZVhDb21iby5zZWxlY3Qoc2NhbGVYQ29tYm8uaW5kZXhPZigiMSIpKTsKLQkJfQotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJcmVzaXplU2Nyb2xsQmFycygpOwotCQkJaW1hZ2VDYW52YXMucmVkcmF3KCk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgU2NhbGVZIGNvbWJvIHNlbGVjdGlvbiBjaGFuZ2VzLgotCSAqLwotCXZvaWQgc2NhbGVZKCkgewotCQl0cnkgewotCQkJeXNjYWxlID0gRmxvYXQucGFyc2VGbG9hdChzY2FsZVlDb21iby5nZXRUZXh0KCkpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJeXNjYWxlID0gMTsKLQkJCXNjYWxlWUNvbWJvLnNlbGVjdChzY2FsZVlDb21iby5pbmRleE9mKCIxIikpOwotCQl9Ci0JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQlyZXNpemVTY3JvbGxCYXJzKCk7Ci0JCQlpbWFnZUNhbnZhcy5yZWRyYXcoKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIENhbGxlZCB3aGVuIHRoZSBBbHBoYSBjb21ibyBzZWxlY3Rpb24gY2hhbmdlcy4KLQkgKi8KLQl2b2lkIGFscGhhKCkgewotCQl0cnkgewotCQkJYWxwaGEgPSBJbnRlZ2VyLnBhcnNlSW50KGFscGhhQ29tYm8uZ2V0VGV4dCgpKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCWFscGhhQ29tYm8uc2VsZWN0KGFscGhhQ29tYm8uaW5kZXhPZigiMjU1IikpOwotCQkJYWxwaGEgPSAyNTU7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgbW91c2UgbW92ZXMgaW4gdGhlIGltYWdlIGNhbnZhcy4KLQkgKiBTaG93IHRoZSBjb2xvciBvZiB0aGUgaW1hZ2UgYXQgdGhlIHBvaW50IHVuZGVyIHRoZSBtb3VzZS4KLQkgKi8KLQl2b2lkIHNob3dDb2xvckF0KGludCBteCwgaW50IG15KSB7Ci0JCWludCB4ID0gbXggLSBpbWFnZURhdGEueCAtIGl4OwotCQlpbnQgeSA9IG15IC0gaW1hZ2VEYXRhLnkgLSBpeTsKLQkJc2hvd0NvbG9yRm9yUGl4ZWwoeCwgeSk7Ci0JfQotCQotCS8qCi0JICogQ2FsbGVkIHdoZW4gYSBtb3VzZSBkb3duIG9yIGtleSBwcmVzcyBpcyBkZXRlY3RlZAotCSAqIGluIHRoZSBkYXRhIHRleHQuIFNob3cgdGhlIGNvbG9yIG9mIHRoZSBwaXhlbCBhdAotCSAqIHRoZSBjYXJldCBwb3NpdGlvbiBpbiB0aGUgZGF0YSB0ZXh0LgotCSAqLwotCXZvaWQgc2hvd0NvbG9yRm9yRGF0YSgpIHsKLQkJaW50IGRlbGltaXRlckxlbmd0aCA9IGRhdGFUZXh0LmdldExpbmVEZWxpbWl0ZXIoKS5sZW5ndGgoKTsKLQkJaW50IGNoYXJhY3RlcnNQZXJMaW5lID0gNiArIDMgKiBpbWFnZURhdGEuYnl0ZXNQZXJMaW5lICsgZGVsaW1pdGVyTGVuZ3RoOwotCQlpbnQgcG9zaXRpb24gPSBkYXRhVGV4dC5nZXRDYXJldE9mZnNldCgpOwotCQlpbnQgeSA9IHBvc2l0aW9uIC8gY2hhcmFjdGVyc1BlckxpbmU7Ci0JCWlmICgocG9zaXRpb24gLSB5ICogY2hhcmFjdGVyc1BlckxpbmUpIDwgNiB8fCAoKHkgKyAxKSAqIGNoYXJhY3RlcnNQZXJMaW5lIC0gcG9zaXRpb24pIDw9IGRlbGltaXRlckxlbmd0aCkgewotCQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGRhdGFQb3NpdGlvbiA9IHBvc2l0aW9uIC0gNiAqICh5ICsgMSkgLSBkZWxpbWl0ZXJMZW5ndGggKiB5OwotCQlpbnQgYnl0ZU51bWJlciA9IGRhdGFQb3NpdGlvbiAvIDM7Ci0JCWludCB3aGVyZSA9IGRhdGFQb3NpdGlvbiAtIGJ5dGVOdW1iZXIgKiAzOwotCQlpbnQgeEJ5dGUgPSBieXRlTnVtYmVyICUgaW1hZ2VEYXRhLmJ5dGVzUGVyTGluZTsKLQkJaW50IHggPSAtMTsKLQkJaW50IGRlcHRoID0gaW1hZ2VEYXRhLmRlcHRoOwotCQlpZiAoZGVwdGggPT0gMSkgeyAvLyA4IHBpeGVscyBwZXIgYnl0ZSAoY2FuIG9ubHkgc2hvdyAzIG9mIDgpCi0JCQlpZiAod2hlcmUgPT0gMCkgeCA9IHhCeXRlICogODsKLQkJCWlmICh3aGVyZSA9PSAxKSB4ID0geEJ5dGUgKiA4ICsgMzsKLQkJCWlmICh3aGVyZSA9PSAyKSB4ID0geEJ5dGUgKiA4ICsgNzsKLQkJfQotCQlpZiAoZGVwdGggPT0gMikgeyAvLyA0IHBpeGVscyBwZXIgYnl0ZSAoY2FuIG9ubHkgc2hvdyAzIG9mIDQpCi0JCQlpZiAod2hlcmUgPT0gMCkgeCA9IHhCeXRlICogNDsKLQkJCWlmICh3aGVyZSA9PSAxKSB4ID0geEJ5dGUgKiA0ICsgMTsKLQkJCWlmICh3aGVyZSA9PSAyKSB4ID0geEJ5dGUgKiA0ICsgMzsKLQkJfQotCQlpZiAoZGVwdGggPT0gNCkgeyAvLyAyIHBpeGVscyBwZXIgYnl0ZQotCQkJaWYgKHdoZXJlID09IDApIHggPSB4Qnl0ZSAqIDI7Ci0JCQlpZiAod2hlcmUgPT0gMSkgeCA9IHhCeXRlICogMjsKLQkJCWlmICh3aGVyZSA9PSAyKSB4ID0geEJ5dGUgKiAyICsgMTsKLQkJfQotCQlpZiAoZGVwdGggPT0gOCkgeyAvLyAxIGJ5dGUgcGVyIHBpeGVsCi0JCQl4ID0geEJ5dGU7Ci0JCX0KLQkJaWYgKGRlcHRoID09IDE2KSB7IC8vIDIgYnl0ZXMgcGVyIHBpeGVsCi0JCQl4ID0geEJ5dGUgLyAyOwotCQl9Ci0JCWlmIChkZXB0aCA9PSAyNCkgeyAvLyAzIGJ5dGVzIHBlciBwaXhlbAotCQkJeCA9IHhCeXRlIC8gMzsKLQkJfQotCQlpZiAoZGVwdGggPT0gMzIpIHsgLy8gNCBieXRlcyBwZXIgcGl4ZWwKLQkJCXggPSB4Qnl0ZSAvIDQ7Ci0JCX0KLQkJaWYgKHggIT0gLTEpIHsKLQkJCXNob3dDb2xvckZvclBpeGVsKHgsIHkpOwotCQl9IGVsc2UgewotCQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiIik7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBTZXQgdGhlIHN0YXR1cyBsYWJlbCB0byBzaG93IGNvbG9yIGluZm9ybWF0aW9uCi0JICogZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgaW4gdGhlIGltYWdlLgotCSAqLwotCXZvaWQgc2hvd0NvbG9yRm9yUGl4ZWwoaW50IHgsIGludCB5KSB7Ci0JCWlmICh4ID49IDAgJiYgeCA8IGltYWdlRGF0YS53aWR0aCAmJiB5ID49IDAgJiYgeSA8IGltYWdlRGF0YS5oZWlnaHQpIHsKLQkJCWludCBwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbCh4LCB5KTsKLQkJCVJHQiByZ2IgPSBpbWFnZURhdGEucGFsZXR0ZS5nZXRSR0IocGl4ZWwpOwotCQkJYm9vbGVhbiBoYXNBbHBoYSA9IGZhbHNlOwotCQkJaW50IGFscGhhVmFsdWUgPSAwOwotCQkJaWYgKGltYWdlRGF0YS5hbHBoYURhdGEgIT0gbnVsbCAmJiBpbWFnZURhdGEuYWxwaGFEYXRhLmxlbmd0aCA+IDApIHsKLQkJCQloYXNBbHBoYSA9IHRydWU7Ci0JCQkJYWxwaGFWYWx1ZSA9IGltYWdlRGF0YS5nZXRBbHBoYSh4LCB5KTsKLQkJCX0KLQkJCVN0cmluZyByZ2JNZXNzYWdlRm9ybWF0ID0gYnVuZGxlLmdldFN0cmluZyhoYXNBbHBoYSA/ICJSR0JBIiA6ICJSR0IiKTsKLQkJCU9iamVjdFtdIHJnYkFyZ3MgPSB7Ci0JCQkJCUludGVnZXIudG9TdHJpbmcocmdiLnJlZCksCi0JCQkJCUludGVnZXIudG9TdHJpbmcocmdiLmdyZWVuKSwKLQkJCQkJSW50ZWdlci50b1N0cmluZyhyZ2IuYmx1ZSksCi0JCQkJCUludGVnZXIudG9TdHJpbmcoYWxwaGFWYWx1ZSkKLQkJCX07Ci0JCQlPYmplY3RbXSByZ2JIZXhBcmdzID0gewotCQkJCQlJbnRlZ2VyLnRvSGV4U3RyaW5nKHJnYi5yZWQpLAotCQkJCQlJbnRlZ2VyLnRvSGV4U3RyaW5nKHJnYi5ncmVlbiksCi0JCQkJCUludGVnZXIudG9IZXhTdHJpbmcocmdiLmJsdWUpLAotCQkJCQlJbnRlZ2VyLnRvSGV4U3RyaW5nKGFscGhhVmFsdWUpCi0JCQl9OwotCQkJT2JqZWN0W10gYXJncyA9IHsKLQkJCQkJbmV3IEludGVnZXIoeCksCi0JCQkJCW5ldyBJbnRlZ2VyKHkpLAotCQkJCQluZXcgSW50ZWdlcihwaXhlbCksCi0JCQkJCUludGVnZXIudG9IZXhTdHJpbmcocGl4ZWwpLAotCQkJCQljcmVhdGVNc2cocmdiTWVzc2FnZUZvcm1hdCwgcmdiQXJncyksCi0JCQkJCWNyZWF0ZU1zZyhyZ2JNZXNzYWdlRm9ybWF0LCByZ2JIZXhBcmdzKSwKLQkJCQkJKHBpeGVsID09IGltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoIkNvbG9yX2F0X3RyYW5zcGFyZW50IikgOiAiIn07Ci0JCQlzdGF0dXNMYWJlbC5zZXRUZXh0KGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJDb2xvcl9hdCIpLCBhcmdzKSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0dXNMYWJlbC5zZXRUZXh0KCIiKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIENhbGxlZCB3aGVuIHRoZSBBbmltYXRlIGJ1dHRvbiBpcyBwcmVzc2VkLgotCSAqLwotCXZvaWQgYW5pbWF0ZSgpIHsKLQkJYW5pbWF0ZSA9ICFhbmltYXRlOwotCQlpZiAoYW5pbWF0ZSAmJiBpbWFnZSAhPSBudWxsICYmIGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEpIHsKLQkJCWFuaW1hdGVUaHJlYWQgPSBuZXcgVGhyZWFkKGJ1bmRsZS5nZXRTdHJpbmcoIkFuaW1hdGlvbiIpKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkvLyBQcmUtYW5pbWF0aW9uIHdpZGdldCBzZXR1cC4KLQkJCQkJcHJlQW5pbWF0aW9uKCk7Ci0JCQkJCQotCQkJCQkvLyBBbmltYXRlLgotCQkJCQl0cnkgewotCQkJCQkJYW5pbWF0ZUxvb3AoKTsKLQkJCQkJfSBjYXRjaCAoZmluYWwgU1dURXhjZXB0aW9uIGUpIHsKLQkJCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJc2hvd0Vycm9yRGlhbG9nKGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJDcmVhdGluZ19pbWFnZSIpLCAKLQkJCQkJCQkJCQkgICAgbmV3IEludGVnZXIoaW1hZ2VEYXRhSW5kZXgrMSkpLAotCQkJCQkJCQkJCSAgICBjdXJyZW50TmFtZSwgZSk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIFBvc3QgYW5pbWF0aW9uIHdpZGdldCByZXNldC4KLQkJCQkJcG9zdEFuaW1hdGlvbigpOwotCQkJCX0KLQkJCX07Ci0JCQlhbmltYXRlVGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJCWFuaW1hdGVUaHJlYWQuc3RhcnQoKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIGltYWdlcyBpbiBhIG11bHRpLWltYWdlIGZpbGUKLQkgKiBhbmQgZGlzcGxheSB0aGVtIG9uZSBhZnRlciBhbm90aGVyLgotCSAqLwotCXZvaWQgYW5pbWF0ZUxvb3AoKSB7Ci0JCS8vIENyZWF0ZSBhbiBvZmYtc2NyZWVuIGltYWdlIHRvIGRyYXcgb24sIGFuZCBhIEdDIHRvIGRyYXcgd2l0aC4KLQkJLy8gQm90aCBhcmUgZGlzcG9zZWQgYWZ0ZXIgdGhlIGFuaW1hdGlvbi4KLQkJSW1hZ2Ugb2ZmU2NyZWVuSW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgbG9hZGVyLmxvZ2ljYWxTY3JlZW5XaWR0aCwgbG9hZGVyLmxvZ2ljYWxTY3JlZW5IZWlnaHQpOwotCQlHQyBvZmZTY3JlZW5JbWFnZUdDID0gbmV3IEdDKG9mZlNjcmVlbkltYWdlKTsKLQkJCi0JCXRyeSB7Ci0JCQkvLyBVc2Ugc3luY0V4ZWMgdG8gZ2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBpbWFnZUNhbnZhcy4KLQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJY2FudmFzQmFja2dyb3VuZCA9IGltYWdlQ2FudmFzLmdldEJhY2tncm91bmQoKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJLy8gRmlsbCB0aGUgb2ZmLXNjcmVlbiBpbWFnZSB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBjYW52YXMuCi0JCQlvZmZTY3JlZW5JbWFnZUdDLnNldEJhY2tncm91bmQoY2FudmFzQmFja2dyb3VuZCk7Ci0JCQlvZmZTY3JlZW5JbWFnZUdDLmZpbGxSZWN0YW5nbGUoCi0JCQkJMCwKLQkJCQkwLAotCQkJCWxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGgsCi0JCQkJbG9hZGVyLmxvZ2ljYWxTY3JlZW5IZWlnaHQpOwotCQkJCQkKLQkJCS8vIERyYXcgdGhlIGN1cnJlbnQgaW1hZ2Ugb250byB0aGUgb2ZmLXNjcmVlbiBpbWFnZS4KLQkJCW9mZlNjcmVlbkltYWdlR0MuZHJhd0ltYWdlKAotCQkJCWltYWdlLAotCQkJCTAsCi0JCQkJMCwKLQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQlpbWFnZURhdGEueCwKLQkJCQlpbWFnZURhdGEueSwKLQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJaW1hZ2VEYXRhLmhlaWdodCk7Ci0KLQkJCWludCByZXBlYXRDb3VudCA9IGxvYWRlci5yZXBlYXRDb3VudDsKLQkJCXdoaWxlIChhbmltYXRlICYmIChsb2FkZXIucmVwZWF0Q291bnQgPT0gMCB8fCByZXBlYXRDb3VudCA+IDApKSB7Ci0JCQkJaWYgKGltYWdlRGF0YS5kaXNwb3NhbE1ldGhvZCA9PSBTV1QuRE1fRklMTF9CQUNLR1JPVU5EKSB7Ci0JCQkJCS8vIEZpbGwgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvciBiZWZvcmUgZHJhd2luZy4KLQkJCQkJQ29sb3IgYmdDb2xvciA9IG51bGw7Ci0JCQkJCWludCBiYWNrZ3JvdW5kUGl4ZWwgPSBsb2FkZXIuYmFja2dyb3VuZFBpeGVsOwotCQkJCQlpZiAoc2hvd0JhY2tncm91bmQgJiYgYmFja2dyb3VuZFBpeGVsICE9IC0xKSB7Ci0JCQkJCQkvLyBGaWxsIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IuCi0JCQkJCQlSR0IgYmFja2dyb3VuZFJHQiA9IGltYWdlRGF0YS5wYWxldHRlLmdldFJHQihiYWNrZ3JvdW5kUGl4ZWwpOwotCQkJCQkJYmdDb2xvciA9IG5ldyBDb2xvcihudWxsLCBiYWNrZ3JvdW5kUkdCKTsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5zZXRCYWNrZ3JvdW5kKGJnQ29sb3IgIT0gbnVsbCA/IGJnQ29sb3IgOiBjYW52YXNCYWNrZ3JvdW5kKTsKLQkJCQkJCW9mZlNjcmVlbkltYWdlR0MuZmlsbFJlY3RhbmdsZSgKLQkJCQkJCQlpbWFnZURhdGEueCwKLQkJCQkJCQlpbWFnZURhdGEueSwKLQkJCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZiAoYmdDb2xvciAhPSBudWxsKSBiZ0NvbG9yLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoaW1hZ2VEYXRhLmRpc3Bvc2FsTWV0aG9kID09IFNXVC5ETV9GSUxMX1BSRVZJT1VTKSB7Ci0JCQkJCS8vIFJlc3RvcmUgdGhlIHByZXZpb3VzIGltYWdlIGJlZm9yZSBkcmF3aW5nLgotCQkJCQlvZmZTY3JlZW5JbWFnZUdDLmRyYXdJbWFnZSgKLQkJCQkJCWltYWdlLAotCQkJCQkJMCwKLQkJCQkJCTAsCi0JCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJCQkJaW1hZ2VEYXRhLngsCi0JCQkJCQlpbWFnZURhdGEueSwKLQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCQkJCX0KLQkJCQkJCQkJCQotCQkJCS8vIEdldCB0aGUgbmV4dCBpbWFnZSBkYXRhLgotCQkJCWltYWdlRGF0YUluZGV4ID0gKGltYWdlRGF0YUluZGV4ICsgMSkgJSBpbWFnZURhdGFBcnJheS5sZW5ndGg7Ci0JCQkJaW1hZ2VEYXRhID0gaW1hZ2VEYXRhQXJyYXlbaW1hZ2VEYXRhSW5kZXhdOwotCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQkJCQotCQkJCS8vIERyYXcgdGhlIG5ldyBpbWFnZSBkYXRhLgotCQkJCW9mZlNjcmVlbkltYWdlR0MuZHJhd0ltYWdlKAotCQkJCQlpbWFnZSwKLQkJCQkJMCwKLQkJCQkJMCwKLQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJCQlpbWFnZURhdGEueCwKLQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCi0JCQkJLy8gRHJhdyB0aGUgb2ZmLXNjcmVlbiBpbWFnZSB0byB0aGUgc2NyZWVuLgotCQkJCWltYWdlQ2FudmFzR0MuZHJhd0ltYWdlKG9mZlNjcmVlbkltYWdlLCAwLCAwKTsKLQkJCQkKLQkJCQkvLyBTbGVlcCBmb3IgdGhlIHNwZWNpZmllZCBkZWxheSB0aW1lIGJlZm9yZSBkcmF3aW5nIGFnYWluLgotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCh2aXNpYmxlRGVsYXkoaW1hZ2VEYXRhLmRlbGF5VGltZSAqIDEwKSk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQkKLQkJCQkvLyBJZiB3ZSBoYXZlIGp1c3QgZHJhd24gdGhlIGxhc3QgaW1hZ2UgaW4gdGhlIHNldCwKLQkJCQkvLyB0aGVuIGRlY3JlbWVudCB0aGUgcmVwZWF0IGNvdW50LgotCQkJCWlmIChpbWFnZURhdGFJbmRleCA9PSBpbWFnZURhdGFBcnJheS5sZW5ndGggLSAxKSByZXBlYXRDb3VudC0tOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJb2ZmU2NyZWVuSW1hZ2UuZGlzcG9zZSgpOwotCQkJb2ZmU2NyZWVuSW1hZ2VHQy5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFByZSBhbmltYXRpb24gc2V0dXAuCi0JICovCi0Jdm9pZCBwcmVBbmltYXRpb24oKSB7Ci0JCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIENoYW5nZSB0aGUgbGFiZWwgb2YgdGhlIEFuaW1hdGUgYnV0dG9uIHRvICdTdG9wJy4KLQkJCQlhbmltYXRlQnV0dG9uLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiU3RvcCIpKTsKLQkJCQkKLQkJCQkvLyBEaXNhYmxlIGFueXRoaW5nIHdlIGRvbid0IHdhbnQgdGhlIHVzZXIKLQkJCQkvLyB0byBzZWxlY3QgZHVyaW5nIHRoZSBhbmltYXRpb24uCi0JCQkJcHJldmlvdXNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJbmV4dEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQliYWNrZ3JvdW5kQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJc2NhbGVYQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJc2NhbGVZQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJYWxwaGFDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlpbmNyZW1lbnRhbENoZWNrLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXRyYW5zcGFyZW50Q2hlY2suc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJbWFza0NoZWNrLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCS8vIGxlYXZlIGJhY2tncm91bmRDaGVjayBlbmFibGVkCi0JCQkKLQkJCQkvLyBSZXNldCB0aGUgc2NhbGUgY29tYm9zIGFuZCBzY3JvbGxiYXJzLgotCQkJCXJlc2V0U2NhbGVDb21ib3MoKTsKLQkJCQlyZXNldFNjcm9sbEJhcnMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoKLQkgKiBQb3N0IGFuaW1hdGlvbiByZXNldC4KLQkgKi8KLQl2b2lkIHBvc3RBbmltYXRpb24oKSB7Ci0JCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIEVuYWJsZSBhbnl0aGluZyB3ZSBkaXNhYmxlZCBiZWZvcmUgdGhlIGFuaW1hdGlvbi4KLQkJCQlwcmV2aW91c0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCW5leHRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQliYWNrZ3JvdW5kQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlzY2FsZVhDb21iby5zZXRFbmFibGVkKHRydWUpOwotCQkJCXNjYWxlWUNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJYWxwaGFDb21iby5zZXRFbmFibGVkKHRydWUpOwotCQkJCWluY3JlbWVudGFsQ2hlY2suc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl0cmFuc3BhcmVudENoZWNrLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJbWFza0NoZWNrLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkKLQkJCQkvLyBSZXNldCB0aGUgbGFiZWwgb2YgdGhlIEFuaW1hdGUgYnV0dG9uLgotCQkJCWFuaW1hdGVCdXR0b24uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJBbmltYXRlIikpOwotCQkJCi0JCQkJaWYgKGFuaW1hdGUpIHsKLQkJCQkJLy8gSWYgYW5pbWF0ZSBpcyBzdGlsbCB0cnVlLCB3ZSBmaW5pc2hlZCB0aGUKLQkJCQkJLy8gZnVsbCBudW1iZXIgb2YgcmVwZWF0cy4gTGVhdmUgdGhlIGltYWdlIGFzLWlzLgotCQkJCQlhbmltYXRlID0gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gUmVkaXNwbGF5IHRoZSBjdXJyZW50IGltYWdlIGFuZCBpdHMgcGFsZXR0ZS4KLQkJCQkJZGlzcGxheUltYWdlKGltYWdlRGF0YUFycmF5W2ltYWdlRGF0YUluZGV4XSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKgotCSAqIENhbGxlZCB3aGVuIHRoZSBQcmV2aW91cyBidXR0b24gaXMgcHJlc3NlZC4KLQkgKiBEaXNwbGF5IHRoZSBwcmV2aW91cyBpbWFnZSBpbiBhIG11bHRpLWltYWdlIGZpbGUuCi0JICovCi0Jdm9pZCBwcmV2aW91cygpIHsKLQkJaWYgKGltYWdlICE9IG51bGwgJiYgaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMSkgewotCQkJaWYgKGltYWdlRGF0YUluZGV4ID09IDApIHsKLQkJCQlpbWFnZURhdGFJbmRleCA9IGltYWdlRGF0YUFycmF5Lmxlbmd0aDsKLQkJCX0KLQkJCWltYWdlRGF0YUluZGV4ID0gaW1hZ2VEYXRhSW5kZXggLSAxOwotCQkJZGlzcGxheUltYWdlKGltYWdlRGF0YUFycmF5W2ltYWdlRGF0YUluZGV4XSk7Ci0JCX0JCi0JfQotCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgTmV4dCBidXR0b24gaXMgcHJlc3NlZC4KLQkgKiBEaXNwbGF5IHRoZSBuZXh0IGltYWdlIGluIGEgbXVsdGktaW1hZ2UgZmlsZS4KLQkgKi8KLQl2b2lkIG5leHQoKSB7Ci0JCWlmIChpbWFnZSAhPSBudWxsICYmIGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEpIHsKLQkJCWltYWdlRGF0YUluZGV4ID0gKGltYWdlRGF0YUluZGV4ICsgMSkgJSBpbWFnZURhdGFBcnJheS5sZW5ndGg7Ci0JCQlkaXNwbGF5SW1hZ2UoaW1hZ2VEYXRhQXJyYXlbaW1hZ2VEYXRhSW5kZXhdKTsKLQkJfQkKLQl9Ci0KLQl2b2lkIGRpc3BsYXlJbWFnZShJbWFnZURhdGEgbmV3SW1hZ2VEYXRhKSB7Ci0JCXJlc2V0U2NhbGVDb21ib3MoKTsKLQkJaWYgKGluY3JlbWVudGFsICYmIGluY3JlbWVudGFsVGhyZWFkICE9IG51bGwpIHsKLQkJCS8vIFRlbGwgdGhlIGluY3JlbWVudGFsIHRocmVhZCB0byBzdG9wIGRyYXdpbmcuCi0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpbmNyZW1lbnRhbEV2ZW50cyA9IG51bGw7Ci0JCQl9Ci0JCQkKLQkJCS8vIFdhaXQgdW50aWwgdGhlIGluY3JlbWVudGFsIHRocmVhZCBpcyBkb25lLgotCQkJd2hpbGUgKGluY3JlbWVudGFsVGhyZWFkLmlzQWxpdmUoKSkgewotCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQl9Ci0JCQkJCQotCQkvLyBEaXNwb3NlIG9mIHRoZSBvbGQgaW1hZ2UsIGlmIHRoZXJlIHdhcyBvbmUuCi0JCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0KLQkJdHJ5IHsKLQkJCS8vIENhY2hlIHRoZSBuZXcgaW1hZ2UgYW5kIGltYWdlRGF0YS4KLQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIG5ld0ltYWdlRGF0YSk7Ci0JCQlpbWFnZURhdGEgPSBuZXdJbWFnZURhdGE7Ci0KLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJDcmVhdGluZ19mcm9tIikgKyAiICIsIGN1cnJlbnROYW1lLCBlKTsKLQkJCWltYWdlID0gbnVsbDsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFVwZGF0ZSB0aGUgd2lkZ2V0cyB3aXRoIHRoZSBuZXcgaW1hZ2UgaW5mby4KLQkJU3RyaW5nIHN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJBbmFseXplcl9vbiIpLCBjdXJyZW50TmFtZSk7Ci0JCXNoZWxsLnNldFRleHQoc3RyaW5nKTsKLQotCQlpZiAoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMSkgewotCQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIlR5cGVfaW5kZXgiKSwgCi0JCQkgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtmaWxlVHlwZVN0cmluZyhpbWFnZURhdGEudHlwZSksCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihpbWFnZURhdGFJbmRleCArIDEpLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoKX0pOwotCQl9IGVsc2UgewotCQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIlR5cGVfc3RyaW5nIiksIGZpbGVUeXBlU3RyaW5nKGltYWdlRGF0YS50eXBlKSk7Ci0JCX0KLQkJdHlwZUxhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiU2l6ZV92YWx1ZSIpLCAKLQkJCQkJIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoaW1hZ2VEYXRhLndpZHRoKSwKLQkJCQkJCQkgICBuZXcgSW50ZWdlcihpbWFnZURhdGEuaGVpZ2h0KX0pOwotCQlzaXplTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJEZXB0aF92YWx1ZSIpLCBuZXcgSW50ZWdlcihpbWFnZURhdGEuZGVwdGgpKTsKLQkJZGVwdGhMYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIlRyYW5zcGFyZW50X3BpeGVsX3ZhbHVlIiksIHBpeGVsSW5mbyhpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCkpOwotCQl0cmFuc3BhcmVudFBpeGVsTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJUaW1lX3RvX2xvYWRfdmFsdWUiKSwgbmV3IExvbmcobG9hZFRpbWUpKTsKLQkJdGltZVRvTG9hZExhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiQW5pbWF0aW9uX3NpemVfdmFsdWUiKSwgCi0JCSAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGgpLAotCQkJCQkJCQluZXcgSW50ZWdlcihsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCl9KTsKLQkJc2NyZWVuU2l6ZUxhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiQmFja2dyb3VuZF9waXhlbF92YWx1ZSIpLCBwaXhlbEluZm8obG9hZGVyLmJhY2tncm91bmRQaXhlbCkpOwotCQliYWNrZ3JvdW5kUGl4ZWxMYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkltYWdlX2xvY2F0aW9uX3ZhbHVlIiksIAotCQkgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihpbWFnZURhdGEueCksIG5ldyBJbnRlZ2VyKGltYWdlRGF0YS55KX0pOwotCQlsb2NhdGlvbkxhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiRGlzcG9zYWxfdmFsdWUiKSwKLQkJICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoaW1hZ2VEYXRhLmRpc3Bvc2FsTWV0aG9kKSwKLQkJCQkJCQkgICAgICBkaXNwb3NhbFN0cmluZyhpbWFnZURhdGEuZGlzcG9zYWxNZXRob2QpfSk7Ci0JCWRpc3Bvc2FsTWV0aG9kTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCWludCBkZWxheSA9IGltYWdlRGF0YS5kZWxheVRpbWUgKiAxMDsKLQkJaW50IGRlbGF5VXNlZCA9IHZpc2libGVEZWxheShkZWxheSk7Ci0JCWlmIChkZWxheSAhPSBkZWxheVVzZWQpIHsKLQkJCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJEZWxheV92YWx1ZSIpLCAKLQkJCSAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGRlbGF5KSwgbmV3IEludGVnZXIoZGVsYXlVc2VkKX0pOwotCQl9IGVsc2UgewotCQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkRlbGF5X3VzZWQiKSwgbmV3IEludGVnZXIoZGVsYXkpKTsKLQkJfQotCQlkZWxheVRpbWVMYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJaWYgKGxvYWRlci5yZXBlYXRDb3VudCA9PSAwKSB7Ci0JCQlzdHJpbmcgPSBjcmVhdGVNc2coIGJ1bmRsZS5nZXRTdHJpbmcoIlJlcGVhdHNfZm9yZXZlciIpLCBuZXcgSW50ZWdlcihsb2FkZXIucmVwZWF0Q291bnQpKTsKLQkJfSBlbHNlIHsKLQkJCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJSZXBlYXRzX3ZhbHVlIiksIG5ldyBJbnRlZ2VyKGxvYWRlci5yZXBlYXRDb3VudCkpOwotCQl9Ci0JCXJlcGVhdENvdW50TGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCWlmIChpbWFnZURhdGEucGFsZXR0ZS5pc0RpcmVjdCkgewotCQkJc3RyaW5nID0gYnVuZGxlLmdldFN0cmluZygiUGFsZXR0ZV9kaXJlY3QiKTsKLQkJfSBlbHNlIHsKLQkJCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJQYWxldHRlX3ZhbHVlIiksIG5ldyBJbnRlZ2VyKGltYWdlRGF0YS5wYWxldHRlLmdldFJHQnMoKS5sZW5ndGgpKTsKLQkJfQotCQlwYWxldHRlTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJQaXhlbF9kYXRhX3ZhbHVlIiksIAotCQkJCQkgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihpbWFnZURhdGEuYnl0ZXNQZXJMaW5lKSwKLQkJCQkJCSAgICAgICAgIG5ldyBJbnRlZ2VyKGltYWdlRGF0YS5zY2FubGluZVBhZCksCi0JCQkJCQkJICAgZGVwdGhJbmZvKGltYWdlRGF0YS5kZXB0aCl9KTsKLQkJZGF0YUxhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlTdHJpbmcgZGF0YSA9IGRhdGFIZXhEdW1wKGRhdGFUZXh0LmdldExpbmVEZWxpbWl0ZXIoKSk7Ci0JCWRhdGFUZXh0LnNldFRleHQoZGF0YSk7Ci0JCQotCQkvLyBib2xkIHRoZSBmaXJzdCBjb2x1bW4gYWxsIHRoZSB3YXkgZG93bgotCQlpbnQgaW5kZXggPSAwOwotCQl3aGlsZSgoaW5kZXggPSBkYXRhLmluZGV4T2YoJzonLCBpbmRleCsxKSkgIT0gLTEpIHsKLQkJCWludCBzdGFydCA9IGluZGV4IC0gSU5ERVhfRElHSVRTOwotCQkJaW50IGxlbmd0aCA9IElOREVYX0RJR0lUUzsKLQkJCWlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoZGF0YS5jaGFyQXQoaW5kZXgtMSkpKSB7Ci0JCQkJc3RhcnQgPSBpbmRleCAtIEFMUEhBX0NIQVJTOwotCQkJCWxlbmd0aCA9IEFMUEhBX0NIQVJTOwotCQkJfQotCQkJZGF0YVRleHQuc2V0U3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShzdGFydCwgbGVuZ3RoLCBkYXRhVGV4dC5nZXRGb3JlZ3JvdW5kKCksIGRhdGFUZXh0LmdldEJhY2tncm91bmQoKSwgU1dULkJPTEQpKTsKLQkJfQotCi0JCXN0YXR1c0xhYmVsLnNldFRleHQoIiIpOwotCi0JCS8vIFJlZHJhdyBib3RoIGNhbnZhc2VzLgotCQlyZXNldFNjcm9sbEJhcnMoKTsKLQkJcGFsZXR0ZUNhbnZhcy5yZWRyYXcoKTsKLQkJaW1hZ2VDYW52YXMucmVkcmF3KCk7Ci0JfQotCi0Jdm9pZCBwYWludEltYWdlKFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJSW1hZ2UgcGFpbnRJbWFnZSA9IGltYWdlOwotCQkKLQkJLyogSWYgdGhlIHVzZXIgd2FudHMgdG8gc2VlIHRoZSB0cmFuc3BhcmVudCBwaXhlbCBpbiBpdHMgYWN0dWFsIGNvbG9yLAotCQkgKiB0aGVuIHRlbXBvcmFyaWx5IHR1cm4gb2ZmIHRyYW5zcGFyZW5jeS4KLQkJICovCi0JCWludCB0cmFuc3BhcmVudFBpeGVsID0gaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWw7Ci0JCWlmICh0cmFuc3BhcmVudFBpeGVsICE9IC0xICYmICF0cmFuc3BhcmVudCkgewotCQkJaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSAtMTsKLQkJCXBhaW50SW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJfQotCQkKLQkJLyogU2NhbGUgdGhlIGltYWdlIHdoZW4gZHJhd2luZywgdXNpbmcgdGhlIHVzZXIncyBzZWxlY3RlZCBzY2FsaW5nIGZhY3Rvci4gKi8KLQkJaW50IHcgPSBNYXRoLnJvdW5kKGltYWdlRGF0YS53aWR0aCAqIHhzY2FsZSk7Ci0JCWludCBoID0gTWF0aC5yb3VuZChpbWFnZURhdGEuaGVpZ2h0ICogeXNjYWxlKTsKLQkJCi0JCS8qIElmIGFueSBvZiB0aGUgYmFja2dyb3VuZCBpcyB2aXNpYmxlLCBmaWxsIGl0IHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IuICovCi0JCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZUNhbnZhcy5nZXRCb3VuZHMoKTsKLQkJaWYgKGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lUeXBlKCkgIT0gU1dULlRSQU5TUEFSRU5DWV9OT05FKSB7Ci0JCQkvKiBJZiB0aGVyZSBpcyBhbnkgdHJhbnNwYXJlbmN5IGF0IGFsbCwgZmlsbCB0aGUgd2hvbGUgYmFja2dyb3VuZC4gKi8KLQkJCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJfSBlbHNlIHsKLQkJCS8qIE90aGVyd2lzZSwganVzdCBmaWxsIGluIHRoZSBiYWNrd2FyZHMgTC4gKi8KLQkJCWlmIChpeCArIHcgPCBib3VuZHMud2lkdGgpIGdjLmZpbGxSZWN0YW5nbGUoaXggKyB3LCAwLCBib3VuZHMud2lkdGggLSAoaXggKyB3KSwgYm91bmRzLmhlaWdodCk7Ci0JCQlpZiAoaXkgKyBoIDwgYm91bmRzLmhlaWdodCkgZ2MuZmlsbFJlY3RhbmdsZSgwLCBpeSArIGgsIGl4ICsgdywgYm91bmRzLmhlaWdodCAtIChpeSArIGgpKTsKLQkJfQotCQkKLQkJLyogRHJhdyB0aGUgaW1hZ2UgKi8KLQkJZ2MuZHJhd0ltYWdlKAotCQkJcGFpbnRJbWFnZSwKLQkJCTAsCi0JCQkwLAotCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCWl4ICsgaW1hZ2VEYXRhLngsCi0JCQlpeSArIGltYWdlRGF0YS55LAotCQkJdywKLQkJCWgpOwotCQkKLQkJLyogSWYgdGhlcmUgaXMgYSBtYXNrIGFuZCB0aGUgdXNlciB3YW50cyB0byBzZWUgaXQsIGRyYXcgaXQuICovCi0JCWlmIChzaG93TWFzayAmJiAoaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeVR5cGUoKSAhPSBTV1QuVFJBTlNQQVJFTkNZX05PTkUpKSB7Ci0JCQlJbWFnZURhdGEgbWFza0ltYWdlRGF0YSA9IGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JCQlJbWFnZSBtYXNrSW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgbWFza0ltYWdlRGF0YSk7Ci0JCQlnYy5kcmF3SW1hZ2UoCi0JCQkJbWFza0ltYWdlLAotCQkJCTAsCi0JCQkJMCwKLQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQl3ICsgMTAgKyBpeCArIGltYWdlRGF0YS54LAotCQkJCWl5ICsgaW1hZ2VEYXRhLnksCi0JCQkJdywKLQkJCQloKTsKLQkJCW1hc2tJbWFnZS5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCS8qIElmIHRyYW5zcGFyZW5jeSB3YXMgdGVtcG9yYXJpbHkgZGlzYWJsZWQsIHJlc3RvcmUgaXQuICovCi0JCWlmICh0cmFuc3BhcmVudFBpeGVsICE9IC0xICYmICF0cmFuc3BhcmVudCkgewotCQkJaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSB0cmFuc3BhcmVudFBpeGVsOwotCQkJcGFpbnRJbWFnZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHBhaW50UGFsZXR0ZShQYWludEV2ZW50IGV2ZW50KSB7Ci0JCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCWdjLmZpbGxSZWN0YW5nbGUocGFsZXR0ZUNhbnZhcy5nZXRDbGllbnRBcmVhKCkpOwotCQlpZiAoaW1hZ2VEYXRhLnBhbGV0dGUuaXNEaXJlY3QpIHsKLQkJCS8vIEZvciBhIGRpcmVjdCBwYWxldHRlLCBkaXNwbGF5IHRoZSBtYXNrcy4KLQkJCWludCB5ID0gcHkgKyAxMDsKLQkJCWludCB4VGFiID0gNTA7Ci0JCQlnYy5kcmF3U3RyaW5nKCJyTXNrIiwgMTAsIHksIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZyh0b0hleDRCeXRlU3RyaW5nKGltYWdlRGF0YS5wYWxldHRlLnJlZE1hc2spLCB4VGFiLCB5LCB0cnVlKTsKLQkJCWdjLmRyYXdTdHJpbmcoImdNc2siLCAxMCwgeSs9MTIsIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZyh0b0hleDRCeXRlU3RyaW5nKGltYWdlRGF0YS5wYWxldHRlLmdyZWVuTWFzayksIHhUYWIsIHksIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZygiYk1zayIsIDEwLCB5Kz0xMiwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKHRvSGV4NEJ5dGVTdHJpbmcoaW1hZ2VEYXRhLnBhbGV0dGUuYmx1ZU1hc2spLCB4VGFiLCB5LCB0cnVlKTsKLQkJCWdjLmRyYXdTdHJpbmcoInJTaGYiLCAxMCwgeSs9MTIsIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZyhJbnRlZ2VyLnRvU3RyaW5nKGltYWdlRGF0YS5wYWxldHRlLnJlZFNoaWZ0KSwgeFRhYiwgeSwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKCJnU2hmIiwgMTAsIHkrPTEyLCB0cnVlKTsKLQkJCWdjLmRyYXdTdHJpbmcoSW50ZWdlci50b1N0cmluZyhpbWFnZURhdGEucGFsZXR0ZS5ncmVlblNoaWZ0KSwgeFRhYiwgeSwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKCJiU2hmIiwgMTAsIHkrPTEyLCB0cnVlKTsKLQkJCWdjLmRyYXdTdHJpbmcoSW50ZWdlci50b1N0cmluZyhpbWFnZURhdGEucGFsZXR0ZS5ibHVlU2hpZnQpLCB4VGFiLCB5LCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCS8vIEZvciBhbiBpbmRleGVkIHBhbGV0dGUsIGRpc3BsYXkgdGhlIHBhbGV0dGUgY29sb3JzIGFuZCBpbmRpY2VzLgotCQkJUkdCW10gcmdicyA9IGltYWdlRGF0YS5wYWxldHRlLmdldFJHQnMoKTsKLQkJCWlmIChyZ2JzICE9IG51bGwpIHsKLQkJCQlpbnQgeFRhYjEgPSA0MCwgeFRhYjIgPSAxMDA7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZ2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWludCB5ID0gKGkrMSkgKiAxMCArIHB5OwotCQkJCQlnYy5kcmF3U3RyaW5nKFN0cmluZy52YWx1ZU9mKGkpLCAxMCwgeSwgdHJ1ZSk7Ci0JCQkJCWdjLmRyYXdTdHJpbmcodG9IZXhCeXRlU3RyaW5nKHJnYnNbaV0ucmVkKSArIHRvSGV4Qnl0ZVN0cmluZyhyZ2JzW2ldLmdyZWVuKSArIHRvSGV4Qnl0ZVN0cmluZyhyZ2JzW2ldLmJsdWUpLCB4VGFiMSwgeSwgdHJ1ZSk7Ci0JCQkJCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIHJnYnNbaV0pOwotCQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJCQkJZ2MuZmlsbFJlY3RhbmdsZSh4VGFiMiwgeSsyLCAxMCwgMTApOwotCQkJCQljb2xvci5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXZvaWQgcmVzaXplU2hlbGwoQ29udHJvbEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJcmVzaXplU2Nyb2xsQmFycygpOwotCX0KLQotCS8vIFJlc2V0IHRoZSBzY2FsZSBjb21ib3MgdG8gMS4KLQl2b2lkIHJlc2V0U2NhbGVDb21ib3MoKSB7Ci0JCXhzY2FsZSA9IDE7IHlzY2FsZSA9IDE7Ci0JCXNjYWxlWENvbWJvLnNlbGVjdChzY2FsZVhDb21iby5pbmRleE9mKCIxIikpOwotCQlzY2FsZVlDb21iby5zZWxlY3Qoc2NhbGVZQ29tYm8uaW5kZXhPZigiMSIpKTsKLQl9Ci0JCi0JLy8gUmVzZXQgdGhlIHNjcm9sbCBiYXJzIHRvIDAuCi0Jdm9pZCByZXNldFNjcm9sbEJhcnMoKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSByZXR1cm47Ci0JCWl4ID0gMDsgaXkgPSAwOyBweSA9IDA7Ci0JCXJlc2l6ZVNjcm9sbEJhcnMoKTsKLQkJaW1hZ2VDYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpLnNldFNlbGVjdGlvbigwKTsKLQkJaW1hZ2VDYW52YXMuZ2V0VmVydGljYWxCYXIoKS5zZXRTZWxlY3Rpb24oMCk7Ci0JCXBhbGV0dGVDYW52YXMuZ2V0VmVydGljYWxCYXIoKS5zZXRTZWxlY3Rpb24oMCk7Ci0JfQotCQotCXZvaWQgcmVzaXplU2Nyb2xsQmFycygpIHsKLQkJLy8gU2V0IHRoZSBtYXggYW5kIHRodW1iIGZvciB0aGUgaW1hZ2UgY2FudmFzIHNjcm9sbCBiYXJzLgotCQlTY3JvbGxCYXIgaG9yaXpvbnRhbCA9IGltYWdlQ2FudmFzLmdldEhvcml6b250YWxCYXIoKTsKLQkJU2Nyb2xsQmFyIHZlcnRpY2FsID0gaW1hZ2VDYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQkJUmVjdGFuZ2xlIGNhbnZhc0JvdW5kcyA9IGltYWdlQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5yb3VuZChpbWFnZURhdGEud2lkdGggKiB4c2NhbGUpOwotCQlpZiAod2lkdGggPiBjYW52YXNCb3VuZHMud2lkdGgpIHsKLQkJCS8vIFRoZSBpbWFnZSBpcyB3aWRlciB0aGFuIHRoZSBjYW52YXMuCi0JCQlob3Jpem9udGFsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlob3Jpem9udGFsLnNldE1heGltdW0od2lkdGgpOwotCQkJaG9yaXpvbnRhbC5zZXRUaHVtYihjYW52YXNCb3VuZHMud2lkdGgpOwotCQkJaG9yaXpvbnRhbC5zZXRQYWdlSW5jcmVtZW50KGNhbnZhc0JvdW5kcy53aWR0aCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUaGUgY2FudmFzIGlzIHdpZGVyIHRoYW4gdGhlIGltYWdlLgotCQkJaG9yaXpvbnRhbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWlmIChpeCAhPSAwKSB7Ci0JCQkJLy8gTWFrZSBzdXJlIHRoZSBpbWFnZSBpcyBjb21wbGV0ZWx5IHZpc2libGUuCi0JCQkJaXggPSAwOwotCQkJCWltYWdlQ2FudmFzLnJlZHJhdygpOwotCQkJfQotCQl9Ci0JCWludCBoZWlnaHQgPSBNYXRoLnJvdW5kKGltYWdlRGF0YS5oZWlnaHQgKiB5c2NhbGUpOwotCQlpZiAoaGVpZ2h0ID4gY2FudmFzQm91bmRzLmhlaWdodCkgewotCQkJLy8gVGhlIGltYWdlIGlzIHRhbGxlciB0aGFuIHRoZSBjYW52YXMuCi0JCQl2ZXJ0aWNhbC5zZXRFbmFibGVkKHRydWUpOwotCQkJdmVydGljYWwuc2V0TWF4aW11bShoZWlnaHQpOwotCQkJdmVydGljYWwuc2V0VGh1bWIoY2FudmFzQm91bmRzLmhlaWdodCk7Ci0JCQl2ZXJ0aWNhbC5zZXRQYWdlSW5jcmVtZW50KGNhbnZhc0JvdW5kcy5oZWlnaHQpOwotCQl9IGVsc2UgewotCQkJLy8gVGhlIGNhbnZhcyBpcyB0YWxsZXIgdGhhbiB0aGUgaW1hZ2UuCi0JCQl2ZXJ0aWNhbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWlmIChpeSAhPSAwKSB7Ci0JCQkJLy8gTWFrZSBzdXJlIHRoZSBpbWFnZSBpcyBjb21wbGV0ZWx5IHZpc2libGUuCi0JCQkJaXkgPSAwOwotCQkJCWltYWdlQ2FudmFzLnJlZHJhdygpOwotCQkJfQotCQl9Ci0KLQkJLy8gU2V0IHRoZSBtYXggYW5kIHRodW1iIGZvciB0aGUgcGFsZXR0ZSBjYW52YXMgc2Nyb2xsIGJhci4KLQkJdmVydGljYWwgPSBwYWxldHRlQ2FudmFzLmdldFZlcnRpY2FsQmFyKCk7Ci0JCWlmIChpbWFnZURhdGEucGFsZXR0ZS5pc0RpcmVjdCkgewotCQkJdmVydGljYWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7IC8vIGluZGV4ZWQgcGFsZXR0ZQotCQkJY2FudmFzQm91bmRzID0gcGFsZXR0ZUNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCQlpbnQgcGFsZXR0ZUhlaWdodCA9IGltYWdlRGF0YS5wYWxldHRlLmdldFJHQnMoKS5sZW5ndGggKiAxMCArIDIwOyAvLyAxMCBwaXhlbHMgZWFjaCBpbmRleCArIDIwIGZvciBtYXJnaW5zLgotCQkJdmVydGljYWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXZlcnRpY2FsLnNldE1heGltdW0ocGFsZXR0ZUhlaWdodCk7Ci0JCQl2ZXJ0aWNhbC5zZXRUaHVtYihjYW52YXNCb3VuZHMuaGVpZ2h0KTsKLQkJCXZlcnRpY2FsLnNldFBhZ2VJbmNyZW1lbnQoY2FudmFzQm91bmRzLmhlaWdodCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENhbGxlZCB3aGVuIHRoZSBpbWFnZSBjYW52YXMnIGhvcml6b250YWwgc2Nyb2xsYmFyIGlzIHNlbGVjdGVkLgotCSAqLwotCXZvaWQgc2Nyb2xsSG9yaXpvbnRhbGx5KFNjcm9sbEJhciBzY3JvbGxCYXIpIHsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybjsKLQkJUmVjdGFuZ2xlIGNhbnZhc0JvdW5kcyA9IGltYWdlQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5yb3VuZChpbWFnZURhdGEud2lkdGggKiB4c2NhbGUpOwotCQlpbnQgaGVpZ2h0ID0gTWF0aC5yb3VuZChpbWFnZURhdGEuaGVpZ2h0ICogeXNjYWxlKTsKLQkJaWYgKHdpZHRoID4gY2FudmFzQm91bmRzLndpZHRoKSB7Ci0JCQkvLyBPbmx5IHNjcm9sbCBpZiB0aGUgaW1hZ2UgaXMgYmlnZ2VyIHRoYW4gdGhlIGNhbnZhcy4KLQkJCWludCB4ID0gLXNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmICh4ICsgd2lkdGggPCBjYW52YXNCb3VuZHMud2lkdGgpIHsKLQkJCQkvLyBEb24ndCBzY3JvbGwgcGFzdCB0aGUgZW5kIG9mIHRoZSBpbWFnZS4KLQkJCQl4ID0gY2FudmFzQm91bmRzLndpZHRoIC0gd2lkdGg7Ci0JCQl9Ci0JCQlpbWFnZUNhbnZhcy5zY3JvbGwoeCwgaXksIGl4LCBpeSwgd2lkdGgsIGhlaWdodCwgZmFsc2UpOwotCQkJaXggPSB4OwotCQl9Ci0JfQotCQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIGltYWdlIGNhbnZhcycgdmVydGljYWwgc2Nyb2xsYmFyIGlzIHNlbGVjdGVkLgotCSAqLwotCXZvaWQgc2Nyb2xsVmVydGljYWxseShTY3JvbGxCYXIgc2Nyb2xsQmFyKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSByZXR1cm47Ci0JCVJlY3RhbmdsZSBjYW52YXNCb3VuZHMgPSBpbWFnZUNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCWludCB3aWR0aCA9IE1hdGgucm91bmQoaW1hZ2VEYXRhLndpZHRoICogeHNjYWxlKTsKLQkJaW50IGhlaWdodCA9IE1hdGgucm91bmQoaW1hZ2VEYXRhLmhlaWdodCAqIHlzY2FsZSk7Ci0JCWlmIChoZWlnaHQgPiBjYW52YXNCb3VuZHMuaGVpZ2h0KSB7Ci0JCQkvLyBPbmx5IHNjcm9sbCBpZiB0aGUgaW1hZ2UgaXMgYmlnZ2VyIHRoYW4gdGhlIGNhbnZhcy4KLQkJCWludCB5ID0gLXNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmICh5ICsgaGVpZ2h0IDwgY2FudmFzQm91bmRzLmhlaWdodCkgewotCQkJCS8vIERvbid0IHNjcm9sbCBwYXN0IHRoZSBlbmQgb2YgdGhlIGltYWdlLgotCQkJCXkgPSBjYW52YXNCb3VuZHMuaGVpZ2h0IC0gaGVpZ2h0OwotCQkJfQotCQkJaW1hZ2VDYW52YXMuc2Nyb2xsKGl4LCB5LCBpeCwgaXksIHdpZHRoLCBoZWlnaHQsIGZhbHNlKTsKLQkJCWl5ID0geTsKLQkJfQotCX0KLQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIHBhbGV0dGUgY2FudmFzJyB2ZXJ0aWNhbCBzY3JvbGxiYXIgaXMgc2VsZWN0ZWQuCi0JICovCi0Jdm9pZCBzY3JvbGxQYWxldHRlKFNjcm9sbEJhciBzY3JvbGxCYXIpIHsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybjsKLQkJUmVjdGFuZ2xlIGNhbnZhc0JvdW5kcyA9IHBhbGV0dGVDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQlpbnQgcGFsZXR0ZUhlaWdodCA9IGltYWdlRGF0YS5wYWxldHRlLmdldFJHQnMoKS5sZW5ndGggKiAxMCArIDIwOwotCQlpZiAocGFsZXR0ZUhlaWdodCA+IGNhbnZhc0JvdW5kcy5oZWlnaHQpIHsKLQkJCS8vIE9ubHkgc2Nyb2xsIGlmIHRoZSBwYWxldHRlIGlzIGJpZ2dlciB0aGFuIHRoZSBjYW52YXMuCi0JCQlpbnQgeSA9IC1zY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoeSArIHBhbGV0dGVIZWlnaHQgPCBjYW52YXNCb3VuZHMuaGVpZ2h0KSB7Ci0JCQkJLy8gRG9uJ3Qgc2Nyb2xsIHBhc3QgdGhlIGVuZCBvZiB0aGUgcGFsZXR0ZS4KLQkJCQl5ID0gY2FudmFzQm91bmRzLmhlaWdodCAtIHBhbGV0dGVIZWlnaHQ7Ci0JCQl9Ci0JCQlwYWxldHRlQ2FudmFzLnNjcm9sbCgwLCB5LCAwLCBweSwgcGFsZXR0ZVdpZHRoLCBwYWxldHRlSGVpZ2h0LCBmYWxzZSk7Ci0JCQlweSA9IHk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFJldHVybiBhIFN0cmluZyBjb250YWluaW5nIGEgbGluZS1ieS1saW5lIGR1bXAgb2YKLQkgKiB0aGUgZGF0YSBpbiB0aGUgY3VycmVudCBpbWFnZURhdGEuIFRoZSBsaW5lRGVsaW1pdGVyCi0JICogcGFyYW1ldGVyIG11c3QgYmUgYSBzdHJpbmcgb2YgbGVuZ3RoIDEgb3IgMi4KLQkgKi8KLQlTdHJpbmcgZGF0YUhleER1bXAoU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHsKLQkJZmluYWwgaW50IE1BWF9EVU1QID0gMTAyNCAqIDEwMjQ7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSByZXR1cm4gIiI7Ci0JCWJvb2xlYW4gdHJ1bmNhdGVkID0gZmFsc2U7Ci0JCWNoYXJbXSBkdW1wID0gbnVsbDsKLQkJYnl0ZVtdIGFscGhhcyA9IGltYWdlRGF0YS5hbHBoYURhdGE7Ci0JCXRyeSB7Ci0JCQlpbnQgbGVuZ3RoID0gaW1hZ2VEYXRhLmhlaWdodCAqICg2ICsgMyAqIGltYWdlRGF0YS5ieXRlc1BlckxpbmUgKyBsaW5lRGVsaW1pdGVyLmxlbmd0aCgpKTsKLQkJCWlmIChhbHBoYXMgIT0gbnVsbCAmJiBhbHBoYXMubGVuZ3RoID4gMCkgewotCQkJCWxlbmd0aCArPSBpbWFnZURhdGEuaGVpZ2h0ICogKDYgKyAzICogaW1hZ2VEYXRhLndpZHRoICsgbGluZURlbGltaXRlci5sZW5ndGgoKSkgKyA2ICsgbGluZURlbGltaXRlci5sZW5ndGgoKTsKLQkJCX0KLQkJCWR1bXAgPSBuZXcgY2hhcltsZW5ndGhdOwotCQl9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGUpIHsKLQkJCS8qIFRvbyBtdWNoIGRhdGEgdG8gZHVtcCAtIHRydW5jYXRlLiAqLwotCQkJZHVtcCA9IG5ldyBjaGFyW01BWF9EVU1QXTsKLQkJCXRydW5jYXRlZCA9IHRydWU7Ci0JCX0KLQkJaW50IGluZGV4ID0gMDsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VEYXRhLmRhdGEubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAlIGltYWdlRGF0YS5ieXRlc1BlckxpbmUgPT0gMCkgewotCQkJCQlpbnQgbGluZSA9IGkgLyBpbWFnZURhdGEuYnl0ZXNQZXJMaW5lOwotCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgLyAxMDAwICUgMTAsIDEwKTsKLQkJCQkJZHVtcFtpbmRleCsrXSA9IENoYXJhY3Rlci5mb3JEaWdpdChsaW5lIC8gMTAwICUgMTAsIDEwKTsKLQkJCQkJZHVtcFtpbmRleCsrXSA9IENoYXJhY3Rlci5mb3JEaWdpdChsaW5lIC8gMTAgJSAxMCwgMTApOwotCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgJSAxMCwgMTApOwotCQkJCQlkdW1wW2luZGV4KytdID0gJzonOwotCQkJCQlkdW1wW2luZGV4KytdID0gJyAnOwotCQkJCX0KLQkJCQlieXRlIGIgPSBpbWFnZURhdGEuZGF0YVtpXTsKLQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KChiICYgMHhGMCkgPj4gNCwgMTYpOwotCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQoYiAmIDB4MEYsIDE2KTsKLQkJCQlkdW1wW2luZGV4KytdID0gJyAnOwotCQkJCWlmICgoaSArIDEpICUgaW1hZ2VEYXRhLmJ5dGVzUGVyTGluZSA9PSAwKSB7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgwKTsKLQkJCQkJaWYgKGxpbmVEZWxpbWl0ZXIubGVuZ3RoKCkgPiAxKSB7Ci0JCQkJCQlkdW1wW2luZGV4KytdID0gbGluZURlbGltaXRlci5jaGFyQXQoMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWxwaGFzICE9IG51bGwgJiYgYWxwaGFzLmxlbmd0aCA+IDApIHsKLQkJCQlkdW1wW2luZGV4KytdID0gbGluZURlbGltaXRlci5jaGFyQXQoMCk7Ci0JCQkJaWYgKGxpbmVEZWxpbWl0ZXIubGVuZ3RoKCkgPiAxKSB7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgxKTsKLQkJCQl9Ci0JCQkJU3lzdGVtLmFycmF5Y29weShuZXcgY2hhcltdeydBJywnbCcsJ3AnLCdoJywnYScsJzonfSwgMCwgZHVtcCwgaW5kZXgsIDYpOwotCQkJCWluZGV4ICs9NjsKLQkJCQlkdW1wW2luZGV4KytdID0gbGluZURlbGltaXRlci5jaGFyQXQoMCk7Ci0JCQkJaWYgKGxpbmVEZWxpbWl0ZXIubGVuZ3RoKCkgPiAxKSB7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgxKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbHBoYXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgJSBpbWFnZURhdGEud2lkdGggPT0gMCkgewotCQkJCQkJaW50IGxpbmUgPSBpIC8gaW1hZ2VEYXRhLndpZHRoOwotCQkJCQkJZHVtcFtpbmRleCsrXSA9IENoYXJhY3Rlci5mb3JEaWdpdChsaW5lIC8gMTAwMCAlIDEwLCAxMCk7Ci0JCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgLyAxMDAgJSAxMCwgMTApOwotCQkJCQkJZHVtcFtpbmRleCsrXSA9IENoYXJhY3Rlci5mb3JEaWdpdChsaW5lIC8gMTAgJSAxMCwgMTApOwotCQkJCQkJZHVtcFtpbmRleCsrXSA9IENoYXJhY3Rlci5mb3JEaWdpdChsaW5lICUgMTAsIDEwKTsKLQkJCQkJCWR1bXBbaW5kZXgrK10gPSAnOic7Ci0JCQkJCQlkdW1wW2luZGV4KytdID0gJyAnOwotCQkJCQl9Ci0JCQkJCWJ5dGUgYiA9IGFscGhhc1tpXTsKLQkJCQkJZHVtcFtpbmRleCsrXSA9IENoYXJhY3Rlci5mb3JEaWdpdCgoYiAmIDB4RjApID4+IDQsIDE2KTsKLQkJCQkJZHVtcFtpbmRleCsrXSA9IENoYXJhY3Rlci5mb3JEaWdpdChiICYgMHgwRiwgMTYpOwotCQkJCQlkdW1wW2luZGV4KytdID0gJyAnOwotCQkJCQlpZiAoKGkgKyAxKSAlIGltYWdlRGF0YS53aWR0aCA9PSAwKSB7Ci0JCQkJCQlkdW1wW2luZGV4KytdID0gbGluZURlbGltaXRlci5jaGFyQXQoMCk7Ci0JCQkJCQlpZiAobGluZURlbGltaXRlci5sZW5ndGgoKSA+IDEpIHsKLQkJCQkJCQlkdW1wW2luZGV4KytdID0gbGluZURlbGltaXRlci5jaGFyQXQoMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkge30KLQkJU3RyaW5nIHJlc3VsdCA9ICIiOwotCQl0cnkgewotCQkJcmVzdWx0ID0gbmV3IFN0cmluZyhkdW1wKTsKLQkJfSBjYXRjaCAoT3V0T2ZNZW1vcnlFcnJvciBlKSB7Ci0JCQkvKiBUb28gbXVjaCBkYXRhIHRvIGRpc3BsYXkgaW4gdGhlIHRleHQgd2lkZ2V0IC0gdHJ1bmNhdGUuICovCi0JCQlyZXN1bHQgPSBuZXcgU3RyaW5nKGR1bXAsIDAsIE1BWF9EVU1QKTsKLQkJCXRydW5jYXRlZCA9IHRydWU7Ci0JCX0KLQkJaWYgKHRydW5jYXRlZCkgcmVzdWx0ICs9ICJcbiAuLi5kYXRhIGR1bXAgdHJ1bmNhdGVkIGF0ICIgKyBNQVhfRFVNUCArICJieXRlcy4uLiI7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qCi0JICogT3BlbiBhbiBlcnJvciBkaWFsb2cgZGlzcGxheWluZyB0aGUgc3BlY2lmaWVkIGluZm9ybWF0aW9uLgotCSAqLwotCXZvaWQgc2hvd0Vycm9yRGlhbG9nKFN0cmluZyBvcGVyYXRpb24sIFN0cmluZyBmaWxlbmFtZSwgVGhyb3dhYmxlIGUpIHsKLQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCQlTdHJpbmcgbWVzc2FnZSA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJFcnJvciIpLCBuZXcgU3RyaW5nW10ge29wZXJhdGlvbiwgZmlsZW5hbWV9KTsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9ICIiOwotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFNXVEV4Y2VwdGlvbikgewotCQkJCVNXVEV4Y2VwdGlvbiBzd3RlID0gKFNXVEV4Y2VwdGlvbikgZTsKLQkJCQllcnJvck1lc3NhZ2UgPSBzd3RlLmdldE1lc3NhZ2UoKTsKLQkJCQlpZiAoc3d0ZS50aHJvd2FibGUgIT0gbnVsbCkgewotCQkJCQllcnJvck1lc3NhZ2UgKz0gIjpcbiIgKyBzd3RlLnRocm93YWJsZS50b1N0cmluZygpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFNXVEVycm9yKSB7Ci0JCQkJU1dURXJyb3Igc3d0ZSA9IChTV1RFcnJvcikgZTsKLQkJCQllcnJvck1lc3NhZ2UgPSBzd3RlLmdldE1lc3NhZ2UoKTsKLQkJCQlpZiAoc3d0ZS50aHJvd2FibGUgIT0gbnVsbCkgewotCQkJCQllcnJvck1lc3NhZ2UgKz0gIjpcbiIgKyBzd3RlLnRocm93YWJsZS50b1N0cmluZygpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gZS50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCWJveC5zZXRNZXNzYWdlKG1lc3NhZ2UgKyBlcnJvck1lc3NhZ2UpOwotCQlib3gub3BlbigpOwotCX0KLQkKLQkvKgotCSAqIE9wZW4gYSBkaWFsb2cgYXNraW5nIHRoZSB1c2VyIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSB0eXBlIG9mIEJNUCBmaWxlIHRvIHNhdmUuCi0JICovCi0JaW50IHNob3dCTVBEaWFsb2coKSB7Ci0JCWZpbmFsIGludCBbXSBibXBUeXBlID0gbmV3IGludFsxXTsKLQkJYm1wVHlwZVswXSA9IFNXVC5JTUFHRV9CTVA7Ci0JCVNlbGVjdGlvbkxpc3RlbmVyIHJhZGlvU2VsZWN0ZWQgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlCdXR0b24gcmFkaW8gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0JCQkJaWYgKHJhZGlvLmdldFNlbGVjdGlvbigpKSBibXBUeXBlWzBdID0gKChJbnRlZ2VyKXJhZGlvLmdldERhdGEoKSkuaW50VmFsdWUoKTsKLQkJCX0KLQkJfTsKLQkJLy8gbmVlZCB0byBleHRlcm5hbGl6ZSBzdHJpbmdzCi0JCWZpbmFsIFNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbChzaGVsbCwgU1dULkRJQUxPR19UUklNKTsKLQotCQlkaWFsb2cuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJTYXZlX2FzX3R5cGUiKSk7Ci0JCWRpYWxvZy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkaWFsb2csIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJTYXZlX2FzX3R5cGVfbGFiZWwiKSk7Ci0JCQotCQlCdXR0b24gcmFkaW8gPSBuZXcgQnV0dG9uKGRpYWxvZywgU1dULlJBRElPKTsKLQkJcmFkaW8uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJTYXZlX2FzX3R5cGVfbm9fY29tcHJlc3MiKSk7Ci0JCXJhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJcmFkaW8uc2V0RGF0YShuZXcgSW50ZWdlcihTV1QuSU1BR0VfQk1QKSk7Ci0JCXJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHJhZGlvU2VsZWN0ZWQpOwotCi0JCXJhZGlvID0gbmV3IEJ1dHRvbihkaWFsb2csIFNXVC5SQURJTyk7Ci0JCXJhZGlvLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiU2F2ZV9hc190eXBlX3JsZV9jb21wcmVzcyIpKTsKLQkJcmFkaW8uc2V0RGF0YShuZXcgSW50ZWdlcihTV1QuSU1BR0VfQk1QX1JMRSkpOwotCQlyYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihyYWRpb1NlbGVjdGVkKTsKLQkJCi0JCXJhZGlvID0gbmV3IEJ1dHRvbihkaWFsb2csIFNXVC5SQURJTyk7Ci0JCXJhZGlvLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiU2F2ZV9hc190eXBlX29zMiIpKTsKLQkJcmFkaW8uc2V0RGF0YShuZXcgSW50ZWdlcihTV1QuSU1BR0VfT1MyX0JNUCkpOwotCQlyYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihyYWRpb1NlbGVjdGVkKTsKLQotCQlsYWJlbCA9IG5ldyBMYWJlbChkaWFsb2csIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJQnV0dG9uIG9rID0gbmV3IEJ1dHRvbihkaWFsb2csIFNXVC5QVVNIKTsKLQkJb2suc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJPSyIpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlkYXRhLndpZHRoSGludCA9IDc1OwotCQlvay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlvay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlkaWFsb2cuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlkaWFsb2cucGFjaygpOwotCQlkaWFsb2cub3BlbigpOwotCQl3aGlsZSAoIWRpYWxvZy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCXJldHVybiBibXBUeXBlWzBdOwotCX0JCi0JCi0JLyoKLQkgKiBSZXR1cm4gYSBTdHJpbmcgZGVzY3JpYmluZyBob3cgdG8gYW5hbHl6ZSB0aGUgYnl0ZXMKLQkgKiBpbiB0aGUgaGV4IGR1bXAuCi0JICovCi0Jc3RhdGljIFN0cmluZyBkZXB0aEluZm8oaW50IGRlcHRoKSB7Ci0JCU9iamVjdFtdIGFyZ3MgPSB7bmV3IEludGVnZXIoZGVwdGgpLCAiIn07Ci0JCXN3aXRjaCAoZGVwdGgpIHsKLQkJCWNhc2UgMToKLQkJCQlhcmdzWzFdID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIk11bHRpX3BpeGVscyIpLCAKLQkJCQkgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoOCksICIgWzAxMjM0NTY3XSJ9KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQlhcmdzWzFdID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIk11bHRpX3BpeGVscyIpLAotCQkJCSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcig0KSwgIlswMDExMjIzM10ifSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkJYXJnc1sxXSA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJNdWx0aV9waXhlbHMiKSwKLQkJCQkgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoMiksICJbMDAwMDExMTFdIn0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSA4OgotCQkJCWFyZ3NbMV0gPSBidW5kbGUuZ2V0U3RyaW5nKCJPbmVfYnl0ZSIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxNjoKLQkJCQlhcmdzWzFdID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIk11bHRpX2J5dGVzIiksIG5ldyBJbnRlZ2VyKDIpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjQ6Ci0JCQkJYXJnc1sxXSA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJNdWx0aV9ieXRlcyIpLCBuZXcgSW50ZWdlcigzKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDMyOgotCQkJCWFyZ3NbMV0gPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiTXVsdGlfYnl0ZXMiKSwgbmV3IEludGVnZXIoNCkpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlhcmdzWzFdID0gYnVuZGxlLmdldFN0cmluZygiVW5zdXBwb3J0ZWRfbGMiKTsKLQkJfQotCQlyZXR1cm4gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkRlcHRoX2luZm8iKSwgYXJncyk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4KLQkgKiBJZiB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXMgdG9vIHNtYWxsCi0JICogdG8gc2VlIGEgdmlzdWFsIGNoYW5nZSwgdGhlbiByZXR1cm4gYSBoaWdoZXIgbnVtYmVyLgotCSAqLwotCXN0YXRpYyBpbnQgdmlzaWJsZURlbGF5KGludCBtcykgewotCQlpZiAobXMgPCAyMCkgcmV0dXJuIG1zICsgMzA7Ci0JCWlmIChtcyA8IDMwKSByZXR1cm4gbXMgKyAxMDsKLQkJcmV0dXJuIG1zOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgYnl0ZSB2YWx1ZSBhcyBhIGhleCBzdHJpbmcsCi0JICogcHJlc2VydmluZyBsZWFkaW5nIDAncy4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIHRvSGV4Qnl0ZVN0cmluZyhpbnQgaSkgewotCQlpZiAoaSA8PSAweDBmKQotCQkJcmV0dXJuICIwIiArIEludGVnZXIudG9IZXhTdHJpbmcoaSk7Ci0JCXJldHVybiBJbnRlZ2VyLnRvSGV4U3RyaW5nKGkgJiAweGZmKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIDQtYnl0ZSB2YWx1ZSBhcyBhIGhleCBzdHJpbmcsCi0JICogcHJlc2VydmluZyBsZWFkaW5nIDAncy4KLQkgKiAoYSBiaXQgJ2JydXRlIGZvcmNlJy4uLiBzaG91bGQgcHJvYmFibHkgdXNlIGEgbG9vcC4uLikKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIHRvSGV4NEJ5dGVTdHJpbmcoaW50IGkpIHsKLQkJU3RyaW5nIGhleCA9IEludGVnZXIudG9IZXhTdHJpbmcoaSk7Ci0JCWlmIChoZXgubGVuZ3RoKCkgPT0gMSkKLQkJCXJldHVybiAiMDAwMDAwMCIgKyBoZXg7Ci0JCWlmIChoZXgubGVuZ3RoKCkgPT0gMikKLQkJCXJldHVybiAiMDAwMDAwIiArIGhleDsKLQkJaWYgKGhleC5sZW5ndGgoKSA9PSAzKQotCQkJcmV0dXJuICIwMDAwMCIgKyBoZXg7Ci0JCWlmIChoZXgubGVuZ3RoKCkgPT0gNCkKLQkJCXJldHVybiAiMDAwMCIgKyBoZXg7Ci0JCWlmIChoZXgubGVuZ3RoKCkgPT0gNSkKLQkJCXJldHVybiAiMDAwIiArIGhleDsKLQkJaWYgKGhleC5sZW5ndGgoKSA9PSA2KQotCQkJcmV0dXJuICIwMCIgKyBoZXg7Ci0JCWlmIChoZXgubGVuZ3RoKCkgPT0gNykKLQkJCXJldHVybiAiMCIgKyBoZXg7Ci0JCXJldHVybiBoZXg7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgU3RyaW5nIGRlc2NyaWJpbmcgdGhlIHNwZWNpZmllZAotCSAqIHRyYW5zcGFyZW50IG9yIGJhY2tncm91bmQgcGl4ZWwuCi0JICovCi0Jc3RhdGljIFN0cmluZyBwaXhlbEluZm8oaW50IHBpeGVsKSB7Ci0JCWlmIChwaXhlbCA9PSAtMSkKLQkJCXJldHVybiBwaXhlbCArICIgKCIgKyBidW5kbGUuZ2V0U3RyaW5nKCJOb25lX2xjIikgKyAiKSI7Ci0JCWVsc2UKLQkJCXJldHVybiBwaXhlbCArICIgKDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcocGl4ZWwpICsgIikiOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIFN0cmluZyBkZXNjcmliaW5nIHRoZSBzcGVjaWZpZWQgZGlzcG9zYWwgbWV0aG9kLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZGlzcG9zYWxTdHJpbmcoaW50IGRpc3Bvc2FsTWV0aG9kKSB7Ci0JCXN3aXRjaCAoZGlzcG9zYWxNZXRob2QpIHsKLQkJCWNhc2UgU1dULkRNX0ZJTExfTk9ORTogcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoIk5vbmVfbGMiKTsKLQkJCWNhc2UgU1dULkRNX0ZJTExfQkFDS0dST1VORDogcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoIkJhY2tncm91bmRfbGMiKTsKLQkJCWNhc2UgU1dULkRNX0ZJTExfUFJFVklPVVM6IHJldHVybiBidW5kbGUuZ2V0U3RyaW5nKCJQcmV2aW91c19sYyIpOwotCQl9Ci0JCXJldHVybiBidW5kbGUuZ2V0U3RyaW5nKCJVbnNwZWNpZmllZF9sYyIpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIFN0cmluZyBkZXNjcmliaW5nIHRoZSBzcGVjaWZpZWQgaW1hZ2UgZmlsZSB0eXBlLgotCSAqLwotCVN0cmluZyBmaWxlVHlwZVN0cmluZyhpbnQgZmlsZXR5cGUpIHsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9CTVApCi0JCQlyZXR1cm4gIkJNUCI7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfQk1QX1JMRSkKLQkJCXJldHVybiAiUkxFIiArIGltYWdlRGF0YS5kZXB0aCArICIgQk1QIjsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9PUzJfQk1QKQotCQkJcmV0dXJuICJPUy8yIEJNUCI7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfR0lGKQotCQkJcmV0dXJuICJHSUYiOwotCQlpZiAoZmlsZXR5cGUgPT0gU1dULklNQUdFX0lDTykKLQkJCXJldHVybiAiSUNPIjsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9KUEVHKQotCQkJcmV0dXJuICJKUEVHIjsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9QTkcpCi0JCQlyZXR1cm4gIlBORyI7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfVElGRikKLQkJCXJldHVybiAiVElGRiI7Ci0JCXJldHVybiBidW5kbGUuZ2V0U3RyaW5nKCJVbmtub3duX2FjIik7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZmlsZSdzIGltYWdlIHR5cGUsIGJhc2VkIG9uIGl0cyBleHRlbnNpb24uCi0JICogTm90ZSB0aGF0IHRoaXMgaXMgbm90IGEgdmVyeSByb2J1c3Qgd2F5IHRvIGRldGVybWluZSBpbWFnZSB0eXBlLAotCSAqIGFuZCBpdCBpcyBvbmx5IHRvIGJlIHVzZWQgaW4gdGhlIGFic2VuY2Ugb2YgYW55IGJldHRlciBtZXRob2QuCi0JICovCi0JaW50IGRldGVybWluZUZpbGVUeXBlKFN0cmluZyBmaWxlbmFtZSkgewotCQlTdHJpbmcgZXh0ID0gZmlsZW5hbWUuc3Vic3RyaW5nKGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJaWYgKGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJibXAiKSkgewotCQkJcmV0dXJuIHNob3dCTVBEaWFsb2coKTsKLQkJfQotCQlpZiAoZXh0LmVxdWFsc0lnbm9yZUNhc2UoImdpZiIpKQotCQkJcmV0dXJuIFNXVC5JTUFHRV9HSUY7Ci0JCWlmIChleHQuZXF1YWxzSWdub3JlQ2FzZSgiaWNvIikpCi0JCQlyZXR1cm4gU1dULklNQUdFX0lDTzsKLQkJaWYgKGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJqcGciKSB8fCBleHQuZXF1YWxzSWdub3JlQ2FzZSgianBlZyIpIHx8IGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJqZmlmIikpCi0JCQlyZXR1cm4gU1dULklNQUdFX0pQRUc7Ci0JCWlmIChleHQuZXF1YWxzSWdub3JlQ2FzZSgicG5nIikpCi0JCQlyZXR1cm4gU1dULklNQUdFX1BORzsKLQkJaWYgKGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJ0aWYiKSB8fCBleHQuZXF1YWxzSWdub3JlQ2FzZSgidGlmZiIpKQotCQkJcmV0dXJuIFNXVC5JTUFHRV9USUZGOwotCQlyZXR1cm4gU1dULklNQUdFX1VOREVGSU5FRDsKLQl9Ci0JCi0Jc3RhdGljIFN0cmluZyBjcmVhdGVNc2coU3RyaW5nIG1zZywgT2JqZWN0W10gYXJncykgewotCQlNZXNzYWdlRm9ybWF0IGZvcm1hdHRlciA9IG5ldyBNZXNzYWdlRm9ybWF0KG1zZyk7Ci0JCXJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KGFyZ3MpOwotCX0KLQkKLQlzdGF0aWMgU3RyaW5nIGNyZWF0ZU1zZyhTdHJpbmcgbXNnLCBPYmplY3QgYXJnKSB7Ci0JCU1lc3NhZ2VGb3JtYXQgZm9ybWF0dGVyID0gbmV3IE1lc3NhZ2VGb3JtYXQobXNnKTsKLQkJcmV0dXJuIGZvcm1hdHRlci5mb3JtYXQobmV3IE9iamVjdFtde2FyZ30pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2phdmF2aWV3ZXIvSmF2YUxpbmVTdHlsZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2phdmF2aWV3ZXIvSmF2YUxpbmVTdHlsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTRlY2JkMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9qYXZhdmlld2VyL0phdmFMaW5lU3R5bGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5qYXZhdmlld2VyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLWNsYXNzIEphdmFMaW5lU3R5bGVyIGltcGxlbWVudHMgTGluZVN0eWxlTGlzdGVuZXIgewotCUphdmFTY2FubmVyIHNjYW5uZXIgPSBuZXcgSmF2YVNjYW5uZXIoKTsKLQlpbnRbXSB0b2tlbkNvbG9yczsKLQlDb2xvcltdIGNvbG9yczsKLQlWZWN0b3IgYmxvY2tDb21tZW50cyA9IG5ldyBWZWN0b3IoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVPRj0gLTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9MPSAxMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdPUkQ9CQkwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdISVRFPQkJMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVk9CQkJMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NRU5UPQkJMzsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HPQkJNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVEhFUj0JCTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVNQkVSPQkJNzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fVE9LRU49IDg7Ci0KLXB1YmxpYyBKYXZhTGluZVN0eWxlcigpIHsKLQlpbml0aWFsaXplQ29sb3JzKCk7Ci0Jc2Nhbm5lciA9IG5ldyBKYXZhU2Nhbm5lcigpOwotfQotCi1Db2xvciBnZXRDb2xvcihpbnQgdHlwZSkgewotCWlmICh0eXBlIDwgMCB8fCB0eXBlID49IHRva2VuQ29sb3JzLmxlbmd0aCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIGNvbG9yc1t0b2tlbkNvbG9yc1t0eXBlXV07Ci19Ci0KLWJvb2xlYW4gaW5CbG9ja0NvbW1lbnQoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JZm9yIChpbnQgaT0wOyBpPGJsb2NrQ29tbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJaW50W10gb2Zmc2V0cyA9IChpbnRbXSlibG9ja0NvbW1lbnRzLmVsZW1lbnRBdChpKTsKLQkJLy8gc3RhcnQgb2YgY29tbWVudCBpbiB0aGUgbGluZQotCQlpZiAoKG9mZnNldHNbMF0gPj0gc3RhcnQpICYmIChvZmZzZXRzWzBdIDw9IGVuZCkpIHJldHVybiB0cnVlOwotCQkvLyBlbmQgb2YgY29tbWVudCBpbiB0aGUgbGluZQotCQlpZiAoKG9mZnNldHNbMV0gPj0gc3RhcnQpICYmIChvZmZzZXRzWzFdIDw9IGVuZCkpIHJldHVybiB0cnVlOwotCQlpZiAoKG9mZnNldHNbMF0gPD0gc3RhcnQpICYmIChvZmZzZXRzWzFdID49IGVuZCkpIHJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgaW5pdGlhbGl6ZUNvbG9ycygpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQljb2xvcnM9IG5ldyBDb2xvcltdIHsKLQkJbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMCwgMCwgMCkpLAkJLy8gYmxhY2sKLQkJbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMjU1LCAwLCAwKSksCS8vIHJlZAotCQluZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigwLCAyNTUsIDApKSwJLy8gZ3JlZW4KLQkJbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMCwgICAwLCAyNTUpKQkvLyBibHVlCi0JfTsKLQl0b2tlbkNvbG9ycz0gbmV3IGludFtNQVhJTVVNX1RPS0VOXTsKLQl0b2tlbkNvbG9yc1tXT1JEXT0JCTA7Ci0JdG9rZW5Db2xvcnNbV0hJVEVdPQkJMDsKLQl0b2tlbkNvbG9yc1tLRVldPQkJMzsgCi0JdG9rZW5Db2xvcnNbQ09NTUVOVF09CTE7IAotCXRva2VuQ29sb3JzW1NUUklOR109IAkyOyAKLQl0b2tlbkNvbG9yc1tPVEhFUl09CQkwOwotCXRva2VuQ29sb3JzW05VTUJFUl09CTA7Ci19Ci0KLXZvaWQgZGlzcG9zZUNvbG9ycygpIHsKLQlmb3IgKGludCBpPTA7aTxjb2xvcnMubGVuZ3RoO2krKykgewotCQljb2xvcnNbaV0uZGlzcG9zZSgpOwotCX0KLX0KLQotLyoqCi0gKiBFdmVudC5kZXRhaWwJCQlsaW5lIHN0YXJ0IG9mZnNldCAoaW5wdXQpCQotICogRXZlbnQudGV4dCAJCQlsaW5lIHRleHQgKGlucHV0KQotICogTGluZVN0eWxlRXZlbnQuc3R5bGVzIAlFbnVtZXJhdGlvbiBvZiBTdHlsZVJhbmdlcywgbmVlZCB0byBiZSBpbiBvcmRlci4gKG91dHB1dCkKLSAqIExpbmVTdHlsZUV2ZW50LmJhY2tncm91bmQgCWxpbmUgYmFja2dyb3VuZCBjb2xvciAob3V0cHV0KQotICovCi1wdWJsaWMgdm9pZCBsaW5lR2V0U3R5bGUoTGluZVN0eWxlRXZlbnQgZXZlbnQpIHsKLQlWZWN0b3Igc3R5bGVzID0gbmV3IFZlY3RvcigpOwotCWludCB0b2tlbjsKLQlTdHlsZVJhbmdlIGxhc3RTdHlsZTsKLQkvLyBJZiB0aGUgbGluZSBpcyBwYXJ0IG9mIGEgYmxvY2sgY29tbWVudCwgY3JlYXRlIG9uZSBzdHlsZSBmb3IgdGhlIGVudGlyZSBsaW5lLgotCWlmIChpbkJsb2NrQ29tbWVudChldmVudC5saW5lT2Zmc2V0LCBldmVudC5saW5lT2Zmc2V0ICsgZXZlbnQubGluZVRleHQubGVuZ3RoKCkpKSB7Ci0JCXN0eWxlcy5hZGRFbGVtZW50KG5ldyBTdHlsZVJhbmdlKGV2ZW50LmxpbmVPZmZzZXQsIGV2ZW50LmxpbmVUZXh0Lmxlbmd0aCgpLCBnZXRDb2xvcihDT01NRU5UKSwgbnVsbCkpOwotCQlldmVudC5zdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVtzdHlsZXMuc2l6ZSgpXTsKLQkJc3R5bGVzLmNvcHlJbnRvKGV2ZW50LnN0eWxlcyk7Ci0JCXJldHVybjsKLQl9Ci0JQ29sb3IgZGVmYXVsdEZnQ29sb3IgPSAoKENvbnRyb2wpZXZlbnQud2lkZ2V0KS5nZXRGb3JlZ3JvdW5kKCk7Ci0Jc2Nhbm5lci5zZXRSYW5nZShldmVudC5saW5lVGV4dCk7Ci0JdG9rZW4gPSBzY2FubmVyLm5leHRUb2tlbigpOwotCXdoaWxlICh0b2tlbiAhPSBFT0YpIHsKLQkJaWYgKHRva2VuID09IE9USEVSKSB7Ci0JCQkvLyBkbyBub3RoaW5nIGZvciBub24tY29sb3JlZCB0b2tlbnMKLQkJfSBlbHNlIGlmICh0b2tlbiAhPSBXSElURSkgewotCQkJQ29sb3IgY29sb3IgPSBnZXRDb2xvcih0b2tlbik7Ci0JCQkvLyBPbmx5IGNyZWF0ZSBhIHN0eWxlIGlmIHRoZSB0b2tlbiBjb2xvciBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgCi0JCQkvLyB3aWRnZXQncyBkZWZhdWx0IGZvcmVncm91bmQgY29sb3IgYW5kIHRoZSB0b2tlbidzIHN0eWxlIGlzIG5vdCAKLQkJCS8vIGJvbGQuICBLZXl3b3JkcyBhcmUgYm9sZGVkLgotCQkJaWYgKCghY29sb3IuZXF1YWxzKGRlZmF1bHRGZ0NvbG9yKSkgfHwgKHRva2VuID09IEtFWSkpIHsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2Uoc2Nhbm5lci5nZXRTdGFydE9mZnNldCgpICsgZXZlbnQubGluZU9mZnNldCwgc2Nhbm5lci5nZXRMZW5ndGgoKSwgY29sb3IsIG51bGwpOwotCQkJCWlmICh0b2tlbiA9PSBLRVkpIHsKLQkJCQkJc3R5bGUuZm9udFN0eWxlID0gU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChzdHlsZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCXN0eWxlcy5hZGRFbGVtZW50KHN0eWxlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBNZXJnZSBzaW1pbGFyIHN0eWxlcy4gIERvaW5nIHNvIHdpbGwgaW1wcm92ZSBwZXJmb3JtYW5jZS4KLQkJCQkJbGFzdFN0eWxlID0gKFN0eWxlUmFuZ2Upc3R5bGVzLmxhc3RFbGVtZW50KCk7Ci0JCQkJCWlmIChsYXN0U3R5bGUuc2ltaWxhclRvKHN0eWxlKSAmJiAobGFzdFN0eWxlLnN0YXJ0ICsgbGFzdFN0eWxlLmxlbmd0aCA9PSBzdHlsZS5zdGFydCkpIHsKLQkJCQkJCWxhc3RTdHlsZS5sZW5ndGggKz0gc3R5bGUubGVuZ3RoOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3R5bGVzLmFkZEVsZW1lbnQoc3R5bGUpOyAKLQkJCQkJfQotCQkJCX0gCi0JCQl9IAotCQl9IGVsc2UgaWYgKCghc3R5bGVzLmlzRW1wdHkoKSkgJiYgKChsYXN0U3R5bGU9KFN0eWxlUmFuZ2Upc3R5bGVzLmxhc3RFbGVtZW50KCkpLmZvbnRTdHlsZSA9PSBTV1QuQk9MRCkpIHsKLQkJCWludCBzdGFydCA9IHNjYW5uZXIuZ2V0U3RhcnRPZmZzZXQoKSArIGV2ZW50LmxpbmVPZmZzZXQ7Ci0JCQlsYXN0U3R5bGUgPSAoU3R5bGVSYW5nZSlzdHlsZXMubGFzdEVsZW1lbnQoKTsKLQkJCS8vIEEgZm9udCBzdHlsZSBvZiBTV1QuQk9MRCBpbXBsaWVzIHRoYXQgdGhlIGxhc3Qgc3R5bGUKLQkJCS8vIHJlcHJlc2VudHMgYSBqYXZhIGtleXdvcmQuCi0JCQlpZiAobGFzdFN0eWxlLnN0YXJ0ICsgbGFzdFN0eWxlLmxlbmd0aCA9PSBzdGFydCkgewotCQkJCS8vIEhhdmUgdGhlIHdoaXRlIHNwYWNlIHRha2Ugb24gdGhlIHN0eWxlIGJlZm9yZSBpdCB0byAKLQkJCQkvLyBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIHN0eWxlIHJhbmdlcyBjcmVhdGVkIGFuZCB0aGUKLQkJCQkvLyBudW1iZXIgb2YgZm9udCBzdHlsZSBjaGFuZ2VzIGR1cmluZyByZW5kZXJpbmcuCi0JCQkJbGFzdFN0eWxlLmxlbmd0aCArPSBzY2FubmVyLmdldExlbmd0aCgpOwotCQkJfQotCQl9IAotCQl0b2tlbj0gc2Nhbm5lci5uZXh0VG9rZW4oKTsKLQl9Ci0JZXZlbnQuc3R5bGVzID0gbmV3IFN0eWxlUmFuZ2Vbc3R5bGVzLnNpemUoKV07Ci0Jc3R5bGVzLmNvcHlJbnRvKGV2ZW50LnN0eWxlcyk7Ci19Ci1wdWJsaWMgdm9pZCBwYXJzZUJsb2NrQ29tbWVudHMoU3RyaW5nIHRleHQpIHsKLQlibG9ja0NvbW1lbnRzID0gbmV3IFZlY3RvcigpOwotCVN0cmluZ1JlYWRlciBidWZmZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHRleHQpOwotCWludCBjaDsKLQlib29sZWFuIGJsa0NvbW1lbnQgPSBmYWxzZTsKLQlpbnQgY250ID0gMDsKLQlpbnRbXSBvZmZzZXRzID0gbmV3IGludFsyXTsKLQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkKLQl0cnkgewotCXdoaWxlICghZG9uZSkgewotCQlzd2l0Y2ggKGNoID0gYnVmZmVyLnJlYWQoKSkgewotCQkJY2FzZSAtMSA6IHsKLQkJCQlpZiAoYmxrQ29tbWVudCkgewotCQkJCQlvZmZzZXRzWzFdID0gY250OwotCQkJCQlibG9ja0NvbW1lbnRzLmFkZEVsZW1lbnQob2Zmc2V0cyk7Ci0JCQkJfQotCQkJCWRvbmUgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSAnLycgOiB7Ci0JCQkJY2ggPSBidWZmZXIucmVhZCgpOwotCQkJCWlmICgoY2ggPT0gJyonKSAmJiAoIWJsa0NvbW1lbnQpKSB7Ci0JCQkJCW9mZnNldHMgPSBuZXcgaW50WzJdOwotCQkJCQlvZmZzZXRzWzBdID0gY250OwotCQkJCQlibGtDb21tZW50ID0gdHJ1ZTsKLQkJCQkJY250Kys7CQotCQkJCX0gZWxzZSB7Ci0JCQkJCWNudCsrOwotCQkJCX0JCQkJCQkKLQkJCQljbnQrKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgJyonIDogewotCQkJCWlmIChibGtDb21tZW50KSB7Ci0JCQkJCWNoID0gYnVmZmVyLnJlYWQoKTsKLQkJCQkJY250Kys7Ci0JCQkJCWlmIChjaCA9PSAnLycpIHsKLQkJCQkJCWJsa0NvbW1lbnQgPSBmYWxzZTsJCi0JCQkJCQlvZmZzZXRzWzFdID0gY250OwotCQkJCQkJYmxvY2tDb21tZW50cy5hZGRFbGVtZW50KG9mZnNldHMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNudCsrOwkKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJY250Kys7CQkJCQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQkJCi0JfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCS8vIGlnbm9yZSBlcnJvcnMKLQl9Ci19Ci0KLS8qKgotICogQSBzaW1wbGUgZnV6enkgc2Nhbm5lciBmb3IgSmF2YQotICovCi1wdWJsaWMgY2xhc3MgSmF2YVNjYW5uZXIgewotCi0JcHJvdGVjdGVkIEhhc2h0YWJsZSBmZ0tleXM9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBmQnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JcHJvdGVjdGVkIFN0cmluZyBmRG9jOwotCXByb3RlY3RlZCBpbnQgZlBvczsKLQlwcm90ZWN0ZWQgaW50IGZFbmQ7Ci0JcHJvdGVjdGVkIGludCBmU3RhcnRUb2tlbjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmRW9mU2Vlbj0gZmFsc2U7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGZnS2V5d29yZHM9IHsgCi0JCSJhYnN0cmFjdCIsCi0JCSJib29sZWFuIiwgImJyZWFrIiwgImJ5dGUiLAotCQkiY2FzZSIsICJjYXRjaCIsICJjaGFyIiwgImNsYXNzIiwgImNvbnRpbnVlIiwKLQkJImRlZmF1bHQiLCAiZG8iLCAiZG91YmxlIiwKLQkJImVsc2UiLCAiZXh0ZW5kcyIsCi0JCSJmYWxzZSIsICJmaW5hbCIsICJmaW5hbGx5IiwgImZsb2F0IiwgImZvciIsCi0JCSJpZiIsICJpbXBsZW1lbnRzIiwgImltcG9ydCIsICJpbnN0YW5jZW9mIiwgImludCIsICJpbnRlcmZhY2UiLAotCQkibG9uZyIsCi0JCSJuYXRpdmUiLCAibmV3IiwgIm51bGwiLAotCQkicGFja2FnZSIsICJwcml2YXRlIiwgInByb3RlY3RlZCIsICJwdWJsaWMiLAotCQkicmV0dXJuIiwKLQkJInNob3J0IiwgInN0YXRpYyIsICJzdXBlciIsICJzd2l0Y2giLCAic3luY2hyb25pemVkIiwKLQkJInRoaXMiLCAidGhyb3ciLCAidGhyb3dzIiwgInRyYW5zaWVudCIsICJ0cnVlIiwgInRyeSIsCi0JCSJ2b2lkIiwgInZvbGF0aWxlIiwKLQkJIndoaWxlIgotCX07Ci0KLQlwdWJsaWMgSmF2YVNjYW5uZXIoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmRpbmcgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgdG9rZW4gaW4gdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlBvcyAtIGZTdGFydFRva2VuOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGxvb2t1cCB0YWJsZS4KLQkgKi8KLQl2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZnS2V5cz0gbmV3IEhhc2h0YWJsZSgpOwotCQlJbnRlZ2VyIGs9IG5ldyBJbnRlZ2VyKEtFWSk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBmZ0tleXdvcmRzLmxlbmd0aDsgaSsrKQotCQkJZmdLZXlzLnB1dChmZ0tleXdvcmRzW2ldLCBrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCB0b2tlbiBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGZpbmFsIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGZTdGFydFRva2VuOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5leHQgbGV4aWNhbCB0b2tlbiBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGludCBuZXh0VG9rZW4oKSB7Ci0JCWludCBjOwotCQlmU3RhcnRUb2tlbj0gZlBvczsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCXN3aXRjaCAoYz0gcmVhZCgpKSB7CQkJCi0JCQljYXNlIEVPRjoKLQkJCQlyZXR1cm4gRU9GOwkJCQkKLQkJCWNhc2UgJy8nOgkvLyBjb21tZW50Ci0JCQkJYz0gcmVhZCgpOwotCQkJCWlmIChjID09ICcvJykgewotCQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQkJYz0gcmVhZCgpOwotCQkJCQkJaWYgKChjID09IEVPRikgfHwgKGMgPT0gRU9MKSkgewotCQkJCQkJCXVucmVhZChjKTsKLQkJCQkJCQlyZXR1cm4gQ09NTUVOVDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXVucmVhZChjKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIE9USEVSOwotCQkJY2FzZSAnXCcnOgkvLyBjaGFyIGNvbnN0Ci0JCQkJY2hhcmFjdGVyOiBmb3IoOzspIHsKLQkJCQkJYz0gcmVhZCgpOwotCQkJCQlzd2l0Y2ggKGMpIHsKLQkJCQkJCWNhc2UgJ1wnJzoKLQkJCQkJCQlyZXR1cm4gU1RSSU5HOwotCQkJCQkJY2FzZSBFT0Y6Ci0JCQkJCQkJdW5yZWFkKGMpOwotCQkJCQkJCXJldHVybiBTVFJJTkc7Ci0JCQkJCQljYXNlICdcXCc6Ci0JCQkJCQkJYz0gcmVhZCgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCX0KLQotCQkJY2FzZSAnIic6CS8vIHN0cmluZwotCQkJCXN0cmluZzogZm9yICg7OykgewotCQkJCQljPSByZWFkKCk7Ci0JCQkJCXN3aXRjaCAoYykgewotCQkJCQkJY2FzZSAnIic6Ci0JCQkJCQkJcmV0dXJuIFNUUklORzsKLQkJCQkJCWNhc2UgRU9GOgotCQkJCQkJCXVucmVhZChjKTsKLQkJCQkJCQlyZXR1cm4gU1RSSU5HOwotCQkJCQkJY2FzZSAnXFwnOgotCQkJCQkJCWM9IHJlYWQoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQl9Ci0KLQkJCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLQkJCWNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLQkJCQlkbyB7Ci0JCQkJCWM9IHJlYWQoKTsKLQkJCQl9IHdoaWxlKENoYXJhY3Rlci5pc0RpZ2l0KChjaGFyKWMpKTsKLQkJCQl1bnJlYWQoYyk7Ci0JCQkJcmV0dXJuIE5VTUJFUjsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpYykpIHsKLQkJCQkJZG8gewotCQkJCQkJYz0gcmVhZCgpOwotCQkJCQl9IHdoaWxlKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpYykpOwotCQkJCQl1bnJlYWQoYyk7Ci0JCQkJCXJldHVybiBXSElURTsKLQkJCQl9Ci0JCQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoKGNoYXIpYykpIHsKLQkJCQkJZkJ1ZmZlci5zZXRMZW5ndGgoMCk7Ci0JCQkJCWRvIHsKLQkJCQkJCWZCdWZmZXIuYXBwZW5kKChjaGFyKWMpOwotCQkJCQkJYz0gcmVhZCgpOwotCQkJCQl9IHdoaWxlKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydCgoY2hhciljKSk7Ci0JCQkJCXVucmVhZChjKTsKLQkJCQkJSW50ZWdlciBpPSAoSW50ZWdlcikgZmdLZXlzLmdldChmQnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCQlpZiAoaSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGkuaW50VmFsdWUoKTsKLQkJCQkJCXJldHVybiBXT1JEOwotCQkJCX0KLQkJCQlyZXR1cm4gT1RIRVI7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG5leHQgY2hhcmFjdGVyLgotCSAqLwotCXByb3RlY3RlZCBpbnQgcmVhZCgpIHsKLQkJaWYgKGZQb3MgPD0gZkVuZCkgewotCQkJcmV0dXJuIGZEb2MuY2hhckF0KGZQb3MrKyk7Ci0JCX0KLQkJcmV0dXJuIEVPRjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSYW5nZShTdHJpbmcgdGV4dCkgewotCQlmRG9jPSB0ZXh0OwotCQlmUG9zPSAwOwotCQlmRW5kPSBmRG9jLmxlbmd0aCgpIC0xOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVucmVhZChpbnQgYykgewotCQlpZiAoYyAhPSBFT0YpCi0JICAgIAlmUG9zLS07Ci0JfQotfQotCi0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2phdmF2aWV3ZXIvSmF2YVZpZXdlci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvamF2YXZpZXdlci9KYXZhVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwZjhhYmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvamF2YXZpZXdlci9KYXZhVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5qYXZhdmlld2VyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVmlld2VyIHsgIAotCVNoZWxsIHNoZWxsOwotCVN0eWxlZFRleHQgdGV4dDsKLQlKYXZhTGluZVN0eWxlciBsaW5lU3R5bGVyID0gbmV3IEphdmFMaW5lU3R5bGVyKCk7Ci0JRmlsZURpYWxvZyBmaWxlRGlhbG9nOwotCXN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZXMgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2phdmF2aWV3ZXIiKTsKLQotTWVudSBjcmVhdGVGaWxlTWVudSgpIHsKLQlNZW51IGJhciA9IHNoZWxsLmdldE1lbnVCYXIgKCk7Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUgKGJhcik7Ci0JTWVudUl0ZW0gaXRlbTsKLQotCS8vIE9wZW4gCi0JaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULkNBU0NBREUpOwotCWl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiT3Blbl9tZW51aXRlbSIpKTsKLQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ08nKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJb3BlbkZpbGUoKTsKLQkJfQotCX0pOwotCi0JLy8gRXhpdAotCWl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKHJlc291cmNlcy5nZXRTdHJpbmcoIkV4aXRfbWVudWl0ZW0iKSk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJbWVudUZpbGVFeGl0ICgpOwotCQl9Ci0JfSk7Ci0JcmV0dXJuIG1lbnU7Ci19Ci0KLXZvaWQgY3JlYXRlTWVudUJhciAoKSB7Ci0JTWVudSBiYXIgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIgKGJhcik7Ci0KLQlNZW51SXRlbSBmaWxlSXRlbSA9IG5ldyBNZW51SXRlbSAoYmFyLCBTV1QuQ0FTQ0FERSk7Ci0JZmlsZUl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiRmlsZV9tZW51aXRlbSIpKTsKLQlmaWxlSXRlbS5zZXRNZW51IChjcmVhdGVGaWxlTWVudSAoKSk7Ci0KLX0KLQotdm9pZCBjcmVhdGVTaGVsbCAoRGlzcGxheSBkaXNwbGF5KSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQgKHJlc291cmNlcy5nZXRTdHJpbmcoIldpbmRvd190aXRsZSIpKTsJCi0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyIChuZXcgU2hlbGxBZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgc2hlbGxDbG9zZWQgKFNoZWxsRXZlbnQgZSkgewotCQkJbGluZVN0eWxlci5kaXNwb3NlQ29sb3JzKCk7Ci0JCQl0ZXh0LnJlbW92ZUxpbmVTdHlsZUxpc3RlbmVyKGxpbmVTdHlsZXIpOwotCQl9Ci0JfSk7Ci19Ci12b2lkIGNyZWF0ZVN0eWxlZFRleHQoKSB7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YSgpOwotCXNwZWMuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0Jc3BlYy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQlzcGVjLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQlzcGVjLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQl0ZXh0LnNldExheW91dERhdGEoc3BlYyk7Ci0JdGV4dC5hZGRMaW5lU3R5bGVMaXN0ZW5lcihsaW5lU3R5bGVyKTsKLQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQlDb2xvciBiZyA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKTsKLQl0ZXh0LnNldEJhY2tncm91bmQoYmcpOwotfQotCi12b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgbXNnKSB7Ci0JTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCWJveC5zZXRNZXNzYWdlKG1zZyk7Ci0JYm94Lm9wZW4oKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlKYXZhVmlld2VyIGV4YW1wbGUgPSBuZXcgSmF2YVZpZXdlciAoKTsKLQlTaGVsbCBzaGVsbCA9IGV4YW1wbGUub3BlbiAoZGlzcGxheSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKQotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotcHVibGljIFNoZWxsIG9wZW4gKERpc3BsYXkgZGlzcGxheSkgewotCWNyZWF0ZVNoZWxsIChkaXNwbGF5KTsKLQljcmVhdGVNZW51QmFyICgpOwotCWNyZWF0ZVN0eWxlZFRleHQgKCk7Ci0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci0KLXZvaWQgb3BlbkZpbGUoKSB7CQotCWlmIChmaWxlRGlhbG9nID09IG51bGwpIHsKLQkJZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0JfQotCi0JZmlsZURpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IiouamF2YSIsICIqLioifSk7Ci0JU3RyaW5nIG5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLQkKLQlvcGVuKG5hbWUpOwotfQotCi12b2lkIG9wZW4oU3RyaW5nIG5hbWUpIHsKLQlmaW5hbCBTdHJpbmcgdGV4dFN0cmluZzsKLQkKLQlpZiAoKG5hbWUgPT0gbnVsbCkgfHwgKG5hbWUubGVuZ3RoKCkgPT0gMCkpIHJldHVybjsKLQotCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5hbWUpOwotCWlmICghZmlsZS5leGlzdHMoKSkgewotCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHJlc291cmNlcy5nZXRTdHJpbmcoIkVycl9maWxlX25vX2V4aXN0IiksIG5ldyBTdHJpbmdbXSB7ZmlsZS5nZXROYW1lKCl9KTsKLQkJZGlzcGxheUVycm9yKG1lc3NhZ2UpOwotCQlyZXR1cm47Ci0JfQotCi0JdHJ5IHsKLQkJRmlsZUlucHV0U3RyZWFtIHN0cmVhbT0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlLmdldFBhdGgoKSk7Ci0JCXRyeSB7Ci0JCQlSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSkpOwotCQkJY2hhcltdIHJlYWRCdWZmZXI9IG5ldyBjaGFyWzIwNDhdOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcigoaW50KSBmaWxlLmxlbmd0aCgpKTsKLQkJCWludCBuOwotCQkJd2hpbGUgKChuID0gaW4ucmVhZChyZWFkQnVmZmVyKSkgPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChyZWFkQnVmZmVyLCAwLCBuKTsKLQkJCX0KLQkJCXRleHRTdHJpbmcgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBFcnJfZmlsZV9pbwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJFcnJfZmlsZV9pbyIpLCBuZXcgU3RyaW5nW10ge2ZpbGUuZ2V0TmFtZSgpfSk7Ci0JCQlkaXNwbGF5RXJyb3IobWVzc2FnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQocmVzb3VyY2VzLmdldFN0cmluZygiRXJyX25vdF9mb3VuZCIpLCBuZXcgU3RyaW5nW10ge2ZpbGUuZ2V0TmFtZSgpfSk7Ci0JCWRpc3BsYXlFcnJvcihtZXNzYWdlKTsKLQkJcmV0dXJuOwotCX0KLQkvLyBHdWFyZCBhZ2FpbnN0IHN1cGVyZmx1b3VzIG1vdXNlIG1vdmUgZXZlbnRzIC0tIGRlZmVyIGFjdGlvbiB1bnRpbCBsYXRlcgotCURpc3BsYXkgZGlzcGxheSA9IHRleHQuZ2V0RGlzcGxheSgpOwotCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCQl9Ci0JfSk7CQotCQotCS8vIHBhcnNlIHRoZSBibG9jayBjb21tZW50cyB1cCBmcm9udCBzaW5jZSBibG9jayBjb21tZW50cyBjYW4gZ28gYWNyb3NzCi0JLy8gbGluZXMgLSBpbmVmZmljaWVudCB3YXkgb2YgZG9pbmcgdGhpcwotCWxpbmVTdHlsZXIucGFyc2VCbG9ja0NvbW1lbnRzKHRleHRTdHJpbmcpOwotfQotCi12b2lkIG1lbnVGaWxlRXhpdCAoKSB7Ci0Jc2hlbGwuY2xvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL0ZpbGxMYXlvdXRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvRmlsbExheW91dFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODRiMDY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvRmlsbExheW91dFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0ZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgRmlsbExheW91dFRhYiBleHRlbmRzIFRhYiB7Ci0JLyogQ29udHJvbHMgZm9yIHNldHRpbmcgbGF5b3V0IHBhcmFtZXRlcnMgKi8KLQlCdXR0b24gaG9yaXpvbnRhbCwgdmVydGljYWw7Ci0JLyogVGhlIGV4YW1wbGUgbGF5b3V0IGluc3RhbmNlICovCi0JRmlsbExheW91dCBmaWxsTGF5b3V0OwotCS8qIFRhYmxlRWRpdG9ycyBhbmQgcmVsYXRlZCBjb250cm9scyovCi0JVGFibGVFZGl0b3IgY29tYm9FZGl0b3I7Ci0JQ0NvbWJvIGNvbWJvOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBMYXlvdXRFeGFtcGxlLgotCSAqLwotCUZpbGxMYXlvdXRUYWIoTGF5b3V0RXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgaW4gdGhlICJjaGlsZCIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVDaGlsZFdpZGdldHMgKCkgewotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNoaWxkV2lkZ2V0cyAoKTsKLQkJCi0JCS8qIEFkZCBUYWJsZUVkaXRvcnMgKi8KLQkJY29tYm9FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQlpbmRleCA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4ICgpOwotCQkJCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuOwotCQkJCVRhYmxlSXRlbSBvbGRJdGVtID0gY29tYm9FZGl0b3IuZ2V0SXRlbSAoKTsKLQkJCQluZXdJdGVtID0gdGFibGUuZ2V0SXRlbSAoaW5kZXgpOwotCQkJCWlmIChuZXdJdGVtID09IG9sZEl0ZW0gfHwgbmV3SXRlbSAhPSBsYXN0U2VsZWN0ZWQpIHsKLQkJCQkJbGFzdFNlbGVjdGVkID0gbmV3SXRlbTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl0YWJsZS5zaG93U2VsZWN0aW9uICgpOwotCQkJCQotCQkJCWNvbWJvID0gbmV3IENDb21ibyAodGFibGUsIFNXVC5SRUFEX09OTFkpOwotCQkJCWNyZWF0ZUNvbWJvRWRpdG9yIChjb21ibywgY29tYm9FZGl0b3IpOwotCQkJfQotCQl9KTsKLQkJCi0JCQotCQkvKiBBZGQgbGlzdGVuZXIgdG8gYWRkIGFuIGVsZW1lbnQgdG8gdGhlIHRhYmxlICovCi0JCWFkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgMCk7Ci0JCQkJaXRlbS5zZXRUZXh0ICgwLCBTdHJpbmcudmFsdWVPZiAodGFibGUuaW5kZXhPZiAoaXRlbSkpKTsKLQkJCQlpdGVtLnNldFRleHQgKDEsICJCdXR0b24iKTsKLQkJCQlkYXRhLmFkZEVsZW1lbnQgKCJCdXR0b24iKTsKLQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9sIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCS8qIENvbnRyb2xzIHRoZSB0eXBlIG9mIEZpbGxMYXlvdXQgKi8KLQkJR3JvdXAgdHlwZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJdHlwZUdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJUeXBlIikpOwotCQl0eXBlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXR5cGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlob3Jpem9udGFsID0gbmV3IEJ1dHRvbiAodHlwZUdyb3VwLCBTV1QuUkFESU8pOwotCQlob3Jpem9udGFsLnNldFRleHQgKCJTV1QuSE9SSVpPTlRBTCIpOwotCQlob3Jpem9udGFsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJaG9yaXpvbnRhbC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWhvcml6b250YWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdmVydGljYWwgPSBuZXcgQnV0dG9uICh0eXBlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXZlcnRpY2FsLnNldFRleHQgKCJTV1QuVkVSVElDQUwiKTsKLQkJdmVydGljYWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl2ZXJ0aWNhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOyAKLQkJCi0JCS8qIEFkZCBjb21tb24gY29udHJvbHMgKi8KLQkJc3VwZXIuY3JlYXRlQ29udHJvbFdpZGdldHMgKCk7Ci0JCQotCQkvKiBQb3NpdGlvbiB0aGUgc2FzaCAqLwotCQlzYXNoLnNldFdlaWdodHMgKG5ldyBpbnQgW10gezQsMX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBleGFtcGxlIGxheW91dC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUxheW91dCAoKSB7Ci0JCWZpbGxMYXlvdXQgPSBuZXcgRmlsbExheW91dCAoKTsKLQkJbGF5b3V0Q29tcG9zaXRlLnNldExheW91dCAoZmlsbExheW91dCk7Ci0JfQotCQotCS8qKiAKLQkgKiBEaXNwb3NlcyB0aGUgZWRpdG9ycyB3aXRob3V0IHBsYWNpbmcgdGhlaXIgY29udGVudHMKLQkgKiBpbnRvIHRoZSB0YWJsZS4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFZGl0b3JzICgpIHsKLQkJY29tYm9FZGl0b3Iuc2V0RWRpdG9yIChudWxsLCBudWxsLCAtMSk7Ci0JCWNvbWJvLmRpc3Bvc2UgKCk7Ci0JfQotCi0JCi0JLyoqCi0JICogR2VuZXJhdGVzIGNvZGUgZm9yIHRoZSBleGFtcGxlIGxheW91dC4KLQkgKi8KLQlTdHJpbmdCdWZmZXIgZ2VuZXJhdGVMYXlvdXRDb2RlICgpIHsKLQkJU3RyaW5nQnVmZmVyIGNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyICgpOwotCQljb2RlLmFwcGVuZCAoIlx0XHRGaWxsTGF5b3V0IGZpbGxMYXlvdXQgPSBuZXcgRmlsbExheW91dCAoKTtcbiIpOwotCQlpZiAoZmlsbExheW91dC50eXBlID09IFNXVC5WRVJUSUNBTCkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0ZmlsbExheW91dC50eXBlID0gU1dULlZFUlRJQ0FMO1xuIik7Ci0JCX0KLQkJY29kZS5hcHBlbmQgKCJcdFx0c2hlbGwuc2V0TGF5b3V0IChmaWxsTGF5b3V0KTtcbiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb250cm9sIGNvbnRyb2wgPSBjaGlsZHJlbiBbaV07Ci0JCQljb2RlLmFwcGVuZCAoZ2V0Q2hpbGRDb2RlIChjb250cm9sLCBpKSk7Ci0JCX0KLQkJcmV0dXJuIGNvZGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhIGZpZWxkIG5hbWVzLgotCSAqLwotCVN0cmluZyBbXSBnZXRMYXlvdXREYXRhRmllbGROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10geyIiLCJDb250cm9sIn07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkZpbGxMYXlvdXQiOwotCX0KLQkKLQkvKioKLQkgKiBUYWtlcyBpbmZvcm1hdGlvbiBmcm9tIFRhYmxlRWRpdG9ycyBhbmQgc3RvcmVzIGl0LgotCSAqLwotCXZvaWQgcmVzZXRFZGl0b3JzICgpIHsKLQkJVGFibGVJdGVtIG9sZEl0ZW0gPSBjb21ib0VkaXRvci5nZXRJdGVtICgpOwotCQljb21ib0VkaXRvci5zZXRFZGl0b3IgKG51bGwsIG51bGwsIC0xKTsKLQkJaWYgKG9sZEl0ZW0gIT0gbnVsbCkgewotCQkJaW50IHJvdyA9IHRhYmxlLmluZGV4T2YgKG9sZEl0ZW0pOwotCQkJZGF0YS5pbnNlcnRFbGVtZW50QXQgKGNvbWJvLmdldFRleHQgKCksIHJvdyk7Ci0JCQlvbGRJdGVtLnNldFRleHQgKDEsIGRhdGEuZWxlbWVudEF0IChyb3cpLnRvU3RyaW5nICgpKTsKLQkJCWNvbWJvLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJc2V0TGF5b3V0U3RhdGUgKCk7Ci0JCXJlZnJlc2hMYXlvdXRDb21wb3NpdGUgKCk7Ci0JCWxheW91dENvbXBvc2l0ZS5sYXlvdXQgKHRydWUpOwotCQlsYXlvdXRHcm91cC5sYXlvdXQgKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0U3RhdGUgKCkgewotCQlpZiAodmVydGljYWwuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWZpbGxMYXlvdXQudHlwZSA9IFNXVC5WRVJUSUNBTDsKLQkJfSBlbHNlIHsKLQkJCWZpbGxMYXlvdXQudHlwZSA9IFNXVC5IT1JJWk9OVEFMOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9Gb3JtTGF5b3V0VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL0Zvcm1MYXlvdXRUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyZDNhYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL0Zvcm1MYXlvdXRUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLWNsYXNzIEZvcm1MYXlvdXRUYWIgZXh0ZW5kcyBUYWIgewotCS8qIENvbnRyb2xzIGZvciBzZXR0aW5nIGxheW91dCBwYXJhbWV0ZXJzICovCi0JQ29tYm8gbWFyZ2luSGVpZ2h0LCBtYXJnaW5XaWR0aDsKLQkvKiBUaGUgZXhhbXBsZSBsYXlvdXQgaW5zdGFuY2UgKi8KLQlGb3JtTGF5b3V0IGZvcm1MYXlvdXQ7Ci0JLyogVGFibGVFZGl0b3JzIGFuZCByZWxhdGVkIGNvbnRyb2xzKi8KLQlUYWJsZUVkaXRvciBjb21ib0VkaXRvciwgd2lkdGhFZGl0b3IsIGhlaWdodEVkaXRvcjsKLQlUYWJsZUVkaXRvciBsZWZ0RWRpdG9yLCByaWdodEVkaXRvciwgdG9wRWRpdG9yLCBib3R0b21FZGl0b3I7Ci0JQ0NvbWJvIGNvbWJvOwotCVRleHQgd2lkdGhUZXh0LCBoZWlnaHRUZXh0OwotCUJ1dHRvbiBsZWZ0QXR0YWNoLCByaWdodEF0dGFjaCwgdG9wQXR0YWNoLCBib3R0b21BdHRhY2g7Ci0JCi0JLyogQ29uc3RhbnRzICovCi0JZmluYWwgaW50IENPTUJPX0NPTCA9IDE7Ci0JZmluYWwgaW50IFdJRFRIX0NPTCA9IDI7Ci0JZmluYWwgaW50IEhFSUdIVF9DT0wgPSAzOwotCWZpbmFsIGludCBMRUZUX0NPTCA9IDQ7Ci0JZmluYWwgaW50IFJJR0hUX0NPTCA9IDU7Ci0JZmluYWwgaW50IFRPUF9DT0wgPSA2OwotCWZpbmFsIGludCBCT1RUT01fQ09MID0gNzsKLQkKLQlmaW5hbCBpbnQgTU9ESUZZX0NPTFMgPSA0OwkvLyBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgd2l0aCBjb21ibyBvciB0ZXh0IGVkaXRvcnMKLQlmaW5hbCBpbnQgVE9UQUxfQ09MUyA9IDg7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgTGF5b3V0RXhhbXBsZS4KLQkgKi8KLQlGb3JtTGF5b3V0VGFiKExheW91dEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb25zdGFudCBmb3IgdGhlIGFsaWdubWVudCBmb3IgYW4KLQkgKiBhdHRhY2htZW50IGdpdmVuIGEgc3RyaW5nLgotCSAqLwotCWludCBhbGlnbm1lbnRDb25zdGFudCAoU3RyaW5nIGFsaWduKSB7Ci0JCWlmIChhbGlnbi5lcXVhbHMoIkxFRlQiKSkgcmV0dXJuIFNXVC5MRUZUOwotCQlpZiAoYWxpZ24uZXF1YWxzKCJSSUdIVCIpKSByZXR1cm4gU1dULlJJR0hUOwotCQlpZiAoYWxpZ24uZXF1YWxzKCJUT1AiKSkgcmV0dXJuIFNXVC5UT1A7Ci0JCWlmIChhbGlnbi5lcXVhbHMoIkJPVFRPTSIpKSByZXR1cm4gU1dULkJPVFRPTTsKLQkJaWYgKGFsaWduLmVxdWFscygiQ0VOVEVSIikpIHJldHVybiBTV1QuQ0VOVEVSOwotCQlyZXR1cm4gU1dULkRFRkFVTFQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBhbGlnbm1lbnQgZm9yIGFuCi0JICogYXR0YWNobWVudCBnaXZlbiBhIGNvbnN0YW50LgotCSAqLwotCVN0cmluZyBhbGlnbm1lbnRTdHJpbmcgKGludCBhbGlnbikgewotCQlzd2l0Y2ggKGFsaWduKSB7Ci0JCQljYXNlIFNXVC5MRUZUOiByZXR1cm4gIkxFRlQiOwotCQkJY2FzZSBTV1QuUklHSFQ6IHJldHVybiAiUklHSFQiOwotCQkJY2FzZSBTV1QuVE9QOiByZXR1cm4gIlRPUCI7Ci0JCQljYXNlIFNXVC5CT1RUT006IHJldHVybiAiQk9UVE9NIjsKLQkJCWNhc2UgU1dULkNFTlRFUjogcmV0dXJuICJDRU5URVIiOwotCQl9Ci0JCXJldHVybiAiREVGQVVMVCI7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgYXR0YWNobWVudCBmaWVsZCBpbiBjYXNlIHRoZSB0eXBlIG9mIGNvbnRyb2wKLQkgKiBoYXMgY2hhbmdlZC4gCi0JICovCi0JU3RyaW5nIGNoZWNrQXR0YWNobWVudCAoU3RyaW5nIG9sZEF0dGFjaCwgRm9ybUF0dGFjaG1lbnQgbmV3QXR0YWNoKSB7Ci0JCVN0cmluZyBjb250cm9sQ2xhc3MgPSBuZXdBdHRhY2guY29udHJvbC5nZXRDbGFzcygpLnRvU3RyaW5nICgpOwotCQlTdHJpbmcgY29udHJvbFR5cGUgPSBjb250cm9sQ2xhc3Muc3Vic3RyaW5nIChjb250cm9sQ2xhc3MubGFzdEluZGV4T2YgKCcuJykgKyAxKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IG9sZEF0dGFjaC5sZW5ndGggKCkgJiYgIUNoYXJhY3Rlci5pc0RpZ2l0KG9sZEF0dGFjaC5jaGFyQXQgKGkpKSkgewotCQkJaSsrOwotCQl9Ci0JCVN0cmluZyBpbmRleCA9IG9sZEF0dGFjaC5zdWJzdHJpbmcgKGksIG9sZEF0dGFjaC5pbmRleE9mICgnLCcpKTsKLQkJcmV0dXJuIGNvbnRyb2xUeXBlICsgaW5kZXggKyAiLCIgKyBuZXdBdHRhY2gub2Zmc2V0ICsgIjoiICsgYWxpZ25tZW50U3RyaW5nIChuZXdBdHRhY2guYWxpZ25tZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyBpbiB0aGUgImNoaWxkIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNoaWxkV2lkZ2V0cyAoKSB7Ci0JCS8qIEFkZCBjb21tb24gY29udHJvbHMgKi8KLQkJc3VwZXIuY3JlYXRlQ2hpbGRXaWRnZXRzICgpOwotCQkKLQkJLyogUmVzaXplIHRoZSBjb2x1bW5zICovCi0JCXRhYmxlLmdldENvbHVtbiAoTEVGVF9DT0wpLnNldFdpZHRoICgxMDApOwotCQl0YWJsZS5nZXRDb2x1bW4gKFJJR0hUX0NPTCkuc2V0V2lkdGggKDEwMCk7Ci0JCXRhYmxlLmdldENvbHVtbiAoVE9QX0NPTCkuc2V0V2lkdGggKDEwMCk7Ci0JCXRhYmxlLmdldENvbHVtbiAoQk9UVE9NX0NPTCkuc2V0V2lkdGggKDEwMCk7Ci0JCQkJCi0JCS8qIEFkZCBUYWJsZUVkaXRvcnMgKi8JCQkKLQkJY29tYm9FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJd2lkdGhFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJaGVpZ2h0RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCWxlZnRFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJcmlnaHRFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJdG9wRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCWJvdHRvbUVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQl0YWJsZS5hZGRNb3VzZUxpc3RlbmVyIChuZXcgTW91c2VBZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCQlyZXNldEVkaXRvcnMoKTsKLQkJCQlpbmRleCA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4ICgpOwotCQkJCVBvaW50IHB0ID0gbmV3IFBvaW50IChlLngsIGUueSk7Ci0gICAgICAgICAgICAgICAgbmV3SXRlbSA9IHRhYmxlLmdldEl0ZW0gKHB0KTsKLSAgICAgICAgICAgICAgICBpZiAobmV3SXRlbSA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgICAgICAgICAgVGFibGVJdGVtIG9sZEl0ZW0gPSBjb21ib0VkaXRvci5nZXRJdGVtICgpOwotICAgICAgICAgICAgICAgIGlmIChuZXdJdGVtID09IG9sZEl0ZW0gfHwgbmV3SXRlbSAhPSBsYXN0U2VsZWN0ZWQpIHsKLQkJCQkJbGFzdFNlbGVjdGVkID0gbmV3SXRlbTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl0YWJsZS5zaG93U2VsZWN0aW9uICgpOwotCQkJCQotCQkJCWNvbWJvID0gbmV3IENDb21ibyAodGFibGUsIFNXVC5SRUFEX09OTFkpOwotCQkJCWNyZWF0ZUNvbWJvRWRpdG9yIChjb21ibywgY29tYm9FZGl0b3IpOwotCQkJCQotCQkJCXdpZHRoVGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJd2lkdGhUZXh0LnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtXSURUSF9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yICh3aWR0aFRleHQsIHdpZHRoRWRpdG9yLCBXSURUSF9DT0wpOwotCQkJCQotCQkJCWhlaWdodFRleHQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCWhlaWdodFRleHQuc2V0VGV4dCAoKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKGluZGV4KSkgW0hFSUdIVF9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yIChoZWlnaHRUZXh0LCBoZWlnaHRFZGl0b3IsIEhFSUdIVF9DT0wpOwotCQkJCQotCQkJCWxlZnRBdHRhY2ggPSBuZXcgQnV0dG9uICh0YWJsZSwgU1dULlBVU0gpOwotCQkJCWxlZnRBdHRhY2guc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkF0dGFjaF9FZGl0IikpOwotCQkJCWxlZnRFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCWxlZnRFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkJCWxlZnRFZGl0b3IubWluaW11bVdpZHRoID0gbGVmdEF0dGFjaC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQkJCWxlZnRFZGl0b3Iuc2V0RWRpdG9yIChsZWZ0QXR0YWNoLCBuZXdJdGVtLCBMRUZUX0NPTCk7Ci0JCQkJbGVmdEF0dGFjaC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJU2hlbGwgc2hlbGwgPSB0YWJGb2xkZXJQYWdlLmdldFNoZWxsICgpOwotCQkJCQkJQXR0YWNoRGlhbG9nIGRpYWxvZyA9IG5ldyBBdHRhY2hEaWFsb2cgKHNoZWxsKTsKLQkJCQkJCWRpYWxvZy5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiTGVmdF9BdHRhY2htZW50IikpOwotCQkJCQkJZGlhbG9nLnNldENvbHVtbiAoTEVGVF9DT0wpOwotCQkJCQkJU3RyaW5nIGF0dGFjaCA9IGRpYWxvZy5vcGVuICgpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0IChMRUZUX0NPTCwgYXR0YWNoKTsKLQkJCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCQotCQkJCXJpZ2h0QXR0YWNoID0gbmV3IEJ1dHRvbiAodGFibGUsIFNXVC5QVVNIKTsKLQkJCQlyaWdodEF0dGFjaC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQXR0YWNoX0VkaXQiKSk7Ci0JCQkJcmlnaHRFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCXJpZ2h0RWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCQlyaWdodEVkaXRvci5taW5pbXVtV2lkdGggPSByaWdodEF0dGFjaC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQkJCXJpZ2h0RWRpdG9yLnNldEVkaXRvciAocmlnaHRBdHRhY2gsIG5ld0l0ZW0sIFJJR0hUX0NPTCk7Ci0JCQkJcmlnaHRBdHRhY2guYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCVNoZWxsIHNoZWxsID0gdGFiRm9sZGVyUGFnZS5nZXRTaGVsbCAoKTsKLQkJCQkJCUF0dGFjaERpYWxvZyBkaWFsb2cgPSBuZXcgQXR0YWNoRGlhbG9nIChzaGVsbCk7Ci0JCQkJCQlkaWFsb2cuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlJpZ2h0X0F0dGFjaG1lbnQiKSk7Ci0JCQkJCQlkaWFsb2cuc2V0Q29sdW1uIChSSUdIVF9DT0wpOwotCQkJCQkJU3RyaW5nIGF0dGFjaCA9IGRpYWxvZy5vcGVuICgpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0IChSSUdIVF9DT0wsIGF0dGFjaCk7Ci0JCQkJCQlpZiAobmV3SXRlbS5nZXRUZXh0IChMRUZUX0NPTCkuZW5kc1dpdGggKCIpIikpIG5ld0l0ZW0uc2V0VGV4dCAoTEVGVF9DT0wsICIiKTsKLQkJCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCQotCQkJCXRvcEF0dGFjaCA9IG5ldyBCdXR0b24gKHRhYmxlLCBTV1QuUFVTSCk7Ci0JCQkJdG9wQXR0YWNoLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJBdHRhY2hfRWRpdCIpKTsKLQkJCQl0b3BFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCXRvcEVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCQkJdG9wRWRpdG9yLm1pbmltdW1XaWR0aCA9IHRvcEF0dGFjaC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQkJCXRvcEVkaXRvci5zZXRFZGl0b3IgKHRvcEF0dGFjaCwgbmV3SXRlbSwgVE9QX0NPTCk7Ci0JCQkJdG9wQXR0YWNoLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlTaGVsbCBzaGVsbCA9IHRhYkZvbGRlclBhZ2UuZ2V0U2hlbGwgKCk7Ci0JCQkJCQlBdHRhY2hEaWFsb2cgZGlhbG9nID0gbmV3IEF0dGFjaERpYWxvZyAoc2hlbGwpOwotCQkJCQkJZGlhbG9nLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJUb3BfQXR0YWNobWVudCIpKTsKLQkJCQkJCWRpYWxvZy5zZXRDb2x1bW4gKFRPUF9DT0wpOwotCQkJCQkJU3RyaW5nIGF0dGFjaCA9IGRpYWxvZy5vcGVuICgpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0IChUT1BfQ09MLCBhdHRhY2gpOwotCQkJCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYm90dG9tQXR0YWNoID0gbmV3IEJ1dHRvbiAodGFibGUsIFNXVC5QVVNIKTsKLQkJCQlib3R0b21BdHRhY2guc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkF0dGFjaF9FZGl0IikpOwotCQkJCWJvdHRvbUVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCQkJYm90dG9tRWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCQlib3R0b21FZGl0b3IubWluaW11bVdpZHRoID0gYm90dG9tQXR0YWNoLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCQkJYm90dG9tRWRpdG9yLnNldEVkaXRvciAoYm90dG9tQXR0YWNoLCBuZXdJdGVtLCBCT1RUT01fQ09MKTsKLQkJCQlib3R0b21BdHRhY2guYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCVNoZWxsIHNoZWxsID0gdGFiRm9sZGVyUGFnZS5nZXRTaGVsbCAoKTsKLQkJCQkJCUF0dGFjaERpYWxvZyBkaWFsb2cgPSBuZXcgQXR0YWNoRGlhbG9nIChzaGVsbCk7Ci0JCQkJCQlkaWFsb2cuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkJvdHRvbV9BdHRhY2htZW50IikpOwotCQkJCQkJZGlhbG9nLnNldENvbHVtbiAoQk9UVE9NX0NPTCk7Ci0JCQkJCQlTdHJpbmcgYXR0YWNoID0gZGlhbG9nLm9wZW4gKCk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQgKEJPVFRPTV9DT0wsIGF0dGFjaCk7Ci0JCQkJCQlpZiAobmV3SXRlbS5nZXRUZXh0IChUT1BfQ09MKS5lbmRzV2l0aCAoIikiKSkgbmV3SXRlbS5zZXRUZXh0IChUT1BfQ09MLCAiIik7Ci0JCQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dGFibGUuZ2V0Q29sdW1uQ291bnQgKCk7IGkrKykgewotICAgICAgICAgICAgICAgIAlSZWN0YW5nbGUgcmVjdCA9IG5ld0l0ZW0uZ2V0Qm91bmRzIChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3QuY29udGFpbnMgKHB0KSkgewotICAgICAgICAgICAgICAgICAgICAJc3dpdGNoIChpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAkJY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICAJCQlyZXNldEVkaXRvcnMgKCk7Ci0gICAgICAgICAgICAgICAgICAgIAkJCWJyZWFrOwotCQkJCQkJCWNhc2UgQ09NQk9fQ09MIDoKLQkJCQkJCQkJY29tYm8uc2V0Rm9jdXMgKCk7CQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFdJRFRIX0NPTCA6CQotCQkJCQkJCQl3aWR0aFRleHQuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSEVJR0hUX0NPTCA6Ci0JCQkJCQkJCWhlaWdodFRleHQuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gCi0JCQl9Ci0JCX0pOwotCQkKLQkJLyogQWRkIGxpc3RlbmVyIHRvIGFkZCBhbiBlbGVtZW50IHRvIHRoZSB0YWJsZSAqLwotCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIDApOwotCQkJCVN0cmluZyBbXSBpbnNlcnQgPSBuZXcgU3RyaW5nIFtdIHsKLQkJCQkJU3RyaW5nLnZhbHVlT2YgKHRhYmxlLmluZGV4T2YgKGl0ZW0pKSwgIkJ1dHRvbiIsICItMSIsICItMSIsCi0JCQkJCSIwLDAgKCIgKyBMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiRGVmYXVsdCIpICsgIikiLCAiIiwgCi0JCQkJCSIwLDAgKCIgKyBMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiRGVmYXVsdCIpICsgIikiLCAiIn07Ci0JCQkJaXRlbS5zZXRUZXh0IChpbnNlcnQpOwotCQkJCWRhdGEuYWRkRWxlbWVudCAoaW5zZXJ0KTsKLQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRyb2wgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkJLyogQ29udHJvbHMgdGhlIG1hcmdpbnMgYW5kIHNwYWNpbmcgb2YgdGhlIEZvcm1MYXlvdXQgKi8KLQkJU3RyaW5nIFtdIG1hcmdpblZhbHVlcyA9IG5ldyBTdHJpbmcgW10geyIwIiwiMyIsIjUiLCIxMCJ9OwotCQlHcm91cCBtYXJnaW5Hcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hcmdpbkdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJNYXJnaW5zIikpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCW1hcmdpbkdyb3VwLnNldExheW91dCAobGF5b3V0KTsKLQkJbWFyZ2luR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbmV3IExhYmVsIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJtYXJnaW5IZWlnaHQiKTsKLQkJbWFyZ2luSGVpZ2h0ID0gbmV3IENvbWJvIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpOwotCQltYXJnaW5IZWlnaHQuc2V0SXRlbXMgKG1hcmdpblZhbHVlcyk7Ci0JCW1hcmdpbkhlaWdodC5zZWxlY3QgKDApOwotCQltYXJnaW5IZWlnaHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbWFyZ2luSGVpZ2h0LmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDYwOwotCQltYXJnaW5IZWlnaHQuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCW5ldyBMYWJlbCAobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgibWFyZ2luV2lkdGgiKTsKLQkJbWFyZ2luV2lkdGggPSBuZXcgQ29tYm8gKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hcmdpbldpZHRoLnNldEl0ZW1zIChtYXJnaW5WYWx1ZXMpOwotCQltYXJnaW5XaWR0aC5zZWxlY3QgKDApOwotCQltYXJnaW5XaWR0aC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQltYXJnaW5XaWR0aC5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSA2MDsKLQkJbWFyZ2luV2lkdGguc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCQotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpOwotCQkKLQkJLyogUG9zaXRpb24gdGhlIHNhc2ggKi8KLQkJc2FzaC5zZXRXZWlnaHRzIChuZXcgaW50IFtdIHs2LDR9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBjcmVhdGVMYXlvdXQgKCkgewotCQlmb3JtTGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQgKCk7Ci0JCWxheW91dENvbXBvc2l0ZS5zZXRMYXlvdXQgKGZvcm1MYXlvdXQpOwotCX0KLQkKLQkvKiogCi0JICogRGlzcG9zZXMgdGhlIGVkaXRvcnMgd2l0aG91dCBwbGFjaW5nIHRoZWlyIGNvbnRlbnRzCi0JICogaW50byB0aGUgdGFibGUuCi0JICovCi0Jdm9pZCBkaXNwb3NlRWRpdG9ycyAoKSB7Ci0JCWNvbWJvRWRpdG9yLnNldEVkaXRvciAobnVsbCwgbnVsbCwgLTEpOwotCQljb21iby5kaXNwb3NlICgpOwotCQl3aWR0aFRleHQuZGlzcG9zZSAoKTsKLQkJaGVpZ2h0VGV4dC5kaXNwb3NlICgpOwotCQlsZWZ0QXR0YWNoLmRpc3Bvc2UgKCk7Ci0JCXJpZ2h0QXR0YWNoLmRpc3Bvc2UgKCk7Ci0JCXRvcEF0dGFjaC5kaXNwb3NlICgpOwotCQlib3R0b21BdHRhY2guZGlzcG9zZSAoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgY29kZSBmb3IgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqLwkKLQlTdHJpbmdCdWZmZXIgZ2VuZXJhdGVMYXlvdXRDb2RlICgpIHsKLQkJU3RyaW5nQnVmZmVyIGNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyICgpOwotCQljb2RlLmFwcGVuZCAoIlx0XHRGb3JtTGF5b3V0IGZvcm1MYXlvdXQgPSBuZXcgRm9ybUxheW91dCAoKTtcbiIpOwotCQlpZiAoZm9ybUxheW91dC5tYXJnaW5IZWlnaHQgIT0gMCkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Zm9ybUxheW91dC5tYXJnaW5IZWlnaHQgPSAiICsgZm9ybUxheW91dC5tYXJnaW5IZWlnaHQgKyAiO1xuIik7Ci0JCX0KLQkJaWYgKGZvcm1MYXlvdXQubWFyZ2luV2lkdGggIT0gMCkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Zm9ybUxheW91dC5tYXJnaW5XaWR0aCA9ICIgKyBmb3JtTGF5b3V0Lm1hcmdpbldpZHRoICsgIjtcbiIpOwotCQl9Ci0JCWNvZGUuYXBwZW5kICgiXHRcdHNoZWxsLnNldExheW91dCAoZm9ybUxheW91dCk7XG4iKTsKLQkJCi0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb250cm9sIGNvbnRyb2wgPSBjaGlsZHJlbiBbaV07Ci0JCQljb2RlLmFwcGVuZCAoZ2V0Q2hpbGRDb2RlIChjb250cm9sLCBpKSk7Ci0JCQlGb3JtRGF0YSBkYXRhID0gKEZvcm1EYXRhKSBjb250cm9sLmdldExheW91dERhdGEgKCk7Ci0JCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0Iik7Ci0JCQkJaWYgKGZpcnN0KSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiRm9ybURhdGEgIik7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWNvZGUuYXBwZW5kICgiZGF0YSA9IG5ldyBGb3JtRGF0YSAoKTtcbiIpOwkKLQkJCQlpZiAoZGF0YS53aWR0aCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLndpZHRoID0gIiArIGRhdGEud2lkdGggKyAiO1xuIik7Ci0JCQkJfQotCQkJCWlmIChkYXRhLmhlaWdodCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmhlaWdodCA9ICIgKyBkYXRhLmhlaWdodCArICI7XG4iKTsKLQkJCQl9Ci0JCQkJaWYgKGRhdGEubGVmdCAhPSBudWxsKSB7Ci0JCQkJCWlmIChkYXRhLmxlZnQuY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGkpOwotCQkJCQkJU3RyaW5nIGNvbnRyb2xTdHJpbmcgPSBpdGVtLmdldFRleHQgKExFRlRfQ09MKTsKLQkJCQkJCWludCBpbmRleCA9IG5ldyBJbnRlZ2VyIChjb250cm9sU3RyaW5nLnN1YnN0cmluZyAoY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpIC0gMSwgY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpKSkuaW50VmFsdWUgKCk7Ci0JCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKCIgKyBuYW1lcyBbaW5kZXhdICsgIiwgIiArIGRhdGEubGVmdC5vZmZzZXQgKyAiLCBTV1QuIiArIGFsaWdubWVudFN0cmluZyAoZGF0YS5sZWZ0LmFsaWdubWVudCkgKyAiKTtcbiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKGRhdGEucmlnaHQgIT0gbnVsbCB8fCAoZGF0YS5sZWZ0Lm51bWVyYXRvciAhPSAwIHx8ZGF0YS5sZWZ0Lm9mZnNldCAhPSAwKSkgewotCQkJCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoIiArIGRhdGEubGVmdC5udW1lcmF0b3IgKyAiLCAiICsgZGF0YS5sZWZ0Lm9mZnNldCArICIpO1xuIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRhdGEucmlnaHQgIT0gbnVsbCkgewotCQkJCQlpZiAoZGF0YS5yaWdodC5jb250cm9sICE9IG51bGwpIHsKLQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoaSk7Ci0JCQkJCQlTdHJpbmcgY29udHJvbFN0cmluZyA9IGl0ZW0uZ2V0VGV4dCAoUklHSFRfQ09MKTsKLQkJCQkJCWludCBpbmRleCA9IG5ldyBJbnRlZ2VyIChjb250cm9sU3RyaW5nLnN1YnN0cmluZyAoY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpIC0gMSwgY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpKSkuaW50VmFsdWUgKCk7Ci0JCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgiICsgbmFtZXMgW2luZGV4XSArICIsICIgKyBkYXRhLnJpZ2h0Lm9mZnNldCArICIsIFNXVC4iICsgYWxpZ25tZW50U3RyaW5nIChkYXRhLnJpZ2h0LmFsaWdubWVudCkgKyAiKTtcbiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoIiArIGRhdGEucmlnaHQubnVtZXJhdG9yICsgIiwgIiArIGRhdGEucmlnaHQub2Zmc2V0ICsgIik7XG4iKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZGF0YS50b3AgIT0gbnVsbCkgewotCQkJCQlpZiAoZGF0YS50b3AuY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGkpOwotCQkJCQkJU3RyaW5nIGNvbnRyb2xTdHJpbmcgPSBpdGVtLmdldFRleHQgKFRPUF9DT0wpOwotCQkJCQkJaW50IGluZGV4ID0gbmV3IEludGVnZXIgKGNvbnRyb2xTdHJpbmcuc3Vic3RyaW5nIChjb250cm9sU3RyaW5nLmluZGV4T2YgKCcsJykgLSAxLCBjb250cm9sU3RyaW5nLmluZGV4T2YgKCcsJykpKS5pbnRWYWx1ZSAoKTsKLQkJCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50ICgiICsgbmFtZXMgW2luZGV4XSArICIsICIgKyBkYXRhLnRvcC5vZmZzZXQgKyAiLCBTV1QuIiArIGFsaWdubWVudFN0cmluZyAoZGF0YS50b3AuYWxpZ25tZW50KSArICIpO1xuIik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoZGF0YS5ib3R0b20gIT0gbnVsbCB8fCAoZGF0YS50b3AubnVtZXJhdG9yICE9IDAgfHxkYXRhLnRvcC5vZmZzZXQgIT0gMCkpIHsKLQkJCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCAoIiArIGRhdGEudG9wLm51bWVyYXRvciArICIsICIgKyBkYXRhLnRvcC5vZmZzZXQgKyAiKTtcbiIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChkYXRhLmJvdHRvbSAhPSBudWxsKSB7Ci0JCQkJCWlmIChkYXRhLmJvdHRvbS5jb250cm9sICE9IG51bGwpIHsKLQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoaSk7Ci0JCQkJCQlTdHJpbmcgY29udHJvbFN0cmluZyA9IGl0ZW0uZ2V0VGV4dCAoQk9UVE9NX0NPTCk7Ci0JCQkJCQlpbnQgaW5kZXggPSBuZXcgSW50ZWdlciAoY29udHJvbFN0cmluZy5zdWJzdHJpbmcgKGNvbnRyb2xTdHJpbmcuaW5kZXhPZiAoJywnKSAtIDEsIGNvbnRyb2xTdHJpbmcuaW5kZXhPZiAoJywnKSkpLmludFZhbHVlICgpOwotCQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKCIgKyBuYW1lcyBbaW5kZXhdICsgIiwgIiArIGRhdGEuYm90dG9tLm9mZnNldCArICIsIFNXVC4iICsgYWxpZ25tZW50U3RyaW5nIChkYXRhLmJvdHRvbS5hbGlnbm1lbnQpICsgIik7XG4iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50ICgiICsgZGF0YS5ib3R0b20ubnVtZXJhdG9yICsgIiwgIiArIGRhdGEuYm90dG9tLm9mZnNldCArICIpO1xuIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0IiArIG5hbWVzIFtpXSArICIuc2V0TGF5b3V0RGF0YSAoZGF0YSk7XG4iKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29kZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGF5b3V0IGRhdGEgZmllbGQgbmFtZXMuCi0JICovCi0JU3RyaW5nIFtdIGdldExheW91dERhdGFGaWVsZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7Ci0JCQkiIiwKLQkJCSJDb250cm9sIiwgCi0JCQkid2lkdGgiLCAKLQkJCSJoZWlnaHQiLCAKLQkJCSJsZWZ0IiwgCi0JCQkicmlnaHQiLCAKLQkJCSJ0b3AiLCAKLQkJCSJib3R0b20iCi0JCX07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkZvcm1MYXlvdXQiOwotCX0KLQkKLQkvKioKLQkgKiBUYWtlcyBpbmZvcm1hdGlvbiBmcm9tIFRhYmxlRWRpdG9ycyBhbmQgc3RvcmVzIGl0LgotCSAqLwotCXZvaWQgcmVzZXRFZGl0b3JzICgpIHsKLQkJcmVzZXRFZGl0b3JzIChmYWxzZSk7Ci0JfQotCQotCXZvaWQgcmVzZXRFZGl0b3JzIChib29sZWFuIHRhYikgewotCQlUYWJsZUl0ZW0gb2xkSXRlbSA9IGNvbWJvRWRpdG9yLmdldEl0ZW0gKCk7Ci0JCWlmIChvbGRJdGVtICE9IG51bGwpIHsKLQkJCWludCByb3cgPSB0YWJsZS5pbmRleE9mIChvbGRJdGVtKTsKLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKHdpZHRoVGV4dC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJd2lkdGhUZXh0LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoV0lEVEhfQ09MKSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyIChoZWlnaHRUZXh0LmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQloZWlnaHRUZXh0LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoSEVJR0hUX0NPTCkpOwotCQkJfQotCQkJU3RyaW5nIFtdIGluc2VydCA9IG5ldyBTdHJpbmcgW10ge1N0cmluZy52YWx1ZU9mIChyb3cpLCBjb21iby5nZXRUZXh0ICgpLCB3aWR0aFRleHQuZ2V0VGV4dCAoKSwgaGVpZ2h0VGV4dC5nZXRUZXh0ICgpfTsKLQkJCWRhdGEuc2V0RWxlbWVudEF0IChpbnNlcnQsIHJvdyk7Ci0JCQlmb3IgKGludCBpID0gMCA7IGkgPCBNT0RJRllfQ09MUzsgaSsrKSB7Ci0JCQkJb2xkSXRlbS5zZXRUZXh0IChpLCAoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAocm93KSkgW2ldKTsKLQkJCX0KLQkJCWlmICghdGFiKSBkaXNwb3NlRWRpdG9ycyAoKTsKLQkJfQotCQlzZXRMYXlvdXRTdGF0ZSAoKTsKLQkJcmVmcmVzaExheW91dENvbXBvc2l0ZSAoKTsKLQkJc2V0TGF5b3V0RGF0YSAoKTsKLQkJbGF5b3V0Q29tcG9zaXRlLmxheW91dCAodHJ1ZSk7Ci0JCWxheW91dEdyb3VwLmxheW91dCAodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgYW4gYXR0YWNobWVudCB0byB0aGUgZWRnZSBvZiBhIHdpZGdldCB1c2luZyB0aGUKLQkgKiBpbmZvcm1hdGlvbiBpbiB0aGUgdGFibGUuCi0JICovCi0JRm9ybUF0dGFjaG1lbnQgc2V0QXR0YWNobWVudCAoU3RyaW5nIGF0dGFjaG1lbnQpIHsKLQkJU3RyaW5nIGNvbnRyb2wsIGFsaWduOwotCQlpbnQgcG9zaXRpb24sIG9mZnNldDsKLQkJaW50IGNvbW1hID0gYXR0YWNobWVudC5pbmRleE9mICgnLCcpOwotCQljaGFyIGZpcnN0ID0gYXR0YWNobWVudC5jaGFyQXQgKDApOwotCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGZpcnN0KSkgewotCQkJLyogQ2FzZSB3aGVyZSB0aGVyZSBpcyBhIGNvbnRyb2wgKi8KLQkJCWNvbnRyb2wgPSBhdHRhY2htZW50LnN1YnN0cmluZyAoMCwgY29tbWEpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCBjb250cm9sLmxlbmd0aCAoKSAmJiAhQ2hhcmFjdGVyLmlzRGlnaXQgKGNvbnRyb2wuY2hhckF0IChpKSkpIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCQlTdHJpbmcgZW5kID0gY29udHJvbC5zdWJzdHJpbmcgKGkpOwotCQkJaW50IGluZGV4ID0gbmV3IEludGVnZXIgKGVuZCkuaW50VmFsdWUgKCk7Ci0JCQlDb250cm9sIGF0dGFjaENvbnRyb2wgPSBjaGlsZHJlbiBbaW5kZXhdOwotCQkJaW50IGNvbG9uID0gYXR0YWNobWVudC5pbmRleE9mICgnOicpOwotCQkJdHJ5IHsKLQkJCQlvZmZzZXQgPSBuZXcgSW50ZWdlciAoYXR0YWNobWVudC5zdWJzdHJpbmcgKGNvbW1hICsgMSwgY29sb24pKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJb2Zmc2V0ID0gMDsKLQkJCX0KLQkJCWFsaWduID0gYXR0YWNobWVudC5zdWJzdHJpbmcgKGNvbG9uICsgMSk7Ci0JCQlyZXR1cm4gbmV3IEZvcm1BdHRhY2htZW50IChhdHRhY2hDb250cm9sLCBvZmZzZXQsIGFsaWdubWVudENvbnN0YW50IChhbGlnbikpOwotCQl9IGVsc2UgewotCQkJLyogQ2FzZSB3aGVyZSB0aGVyZSBpcyBhIHBvc2l0aW9uICovCi0JCQl0cnkgewotCQkJCXBvc2l0aW9uID0gbmV3IEludGVnZXIgKGF0dGFjaG1lbnQuc3Vic3RyaW5nICgwLGNvbW1hKSkuaW50VmFsdWUgKCk7CQotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQlwb3NpdGlvbiA9IDA7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW9mZnNldCA9IG5ldyBJbnRlZ2VyIChhdHRhY2htZW50LnN1YnN0cmluZyAoY29tbWEgKyAxKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCW9mZnNldCA9IDA7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IEZvcm1BdHRhY2htZW50IChwb3NpdGlvbiwgb2Zmc2V0KTsJCQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGxheW91dCBkYXRhIGZvciB0aGUgY2hpbGRyZW4gb2YgdGhlIGxheW91dC4KLQkgKi8KLQl2b2lkIHNldExheW91dERhdGEgKCkgewotCQlDb250cm9sIFtdIGNoaWxkcmVuID0gbGF5b3V0Q29tcG9zaXRlLmdldENoaWxkcmVuICgpOwotCQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcyAoKTsKLQkJRm9ybURhdGEgZGF0YTsKLQkJaW50IHdpZHRoLCBoZWlnaHQ7Ci0JCVN0cmluZyBsZWZ0LCByaWdodCwgdG9wLCBib3R0b207Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXdpZHRoID0gbmV3IEludGVnZXIgKGl0ZW1zIFtpXS5nZXRUZXh0IChXSURUSF9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCWhlaWdodCA9IG5ldyBJbnRlZ2VyIChpdGVtcyBbaV0uZ2V0VGV4dCAoSEVJR0hUX0NPTCkpLmludFZhbHVlICgpOwotCQkJZGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQkJCWlmICh3aWR0aCA+IDApIGRhdGEud2lkdGggPSB3aWR0aDsKLQkJCWlmIChoZWlnaHQgPiAwKSBkYXRhLmhlaWdodCA9IGhlaWdodDsKLQkJCQotCQkJbGVmdCA9IGl0ZW1zIFtpXS5nZXRUZXh0IChMRUZUX0NPTCk7Ci0JCQlpZiAobGVmdC5sZW5ndGggKCkgPiAwKSB7Ci0JCQkJZGF0YS5sZWZ0ID0gc2V0QXR0YWNobWVudCAobGVmdCk7Ci0JCQkJaWYgKGRhdGEubGVmdC5jb250cm9sICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGF0dGFjaG1lbnQgPSBjaGVja0F0dGFjaG1lbnQgKGxlZnQsIGRhdGEubGVmdCk7Ci0JCQkJCWl0ZW1zIFtpXS5zZXRUZXh0IChMRUZUX0NPTCwgYXR0YWNobWVudCk7Ci0JCQkJfQotCQkJfQotCQkJcmlnaHQgPSBpdGVtcyBbaV0uZ2V0VGV4dCAoUklHSFRfQ09MKTsKLQkJCWlmIChyaWdodC5sZW5ndGggKCkgPiAwKSB7Ci0JCQkJZGF0YS5yaWdodCA9IHNldEF0dGFjaG1lbnQgKHJpZ2h0KTsKLQkJCQlpZiAoZGF0YS5yaWdodC5jb250cm9sICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGF0dGFjaG1lbnQgPSBjaGVja0F0dGFjaG1lbnQgKHJpZ2h0LCBkYXRhLnJpZ2h0KTsKLQkJCQkJaXRlbXMgW2ldLnNldFRleHQgKFJJR0hUX0NPTCwgYXR0YWNobWVudCk7Ci0JCQkJfQotCQkJfQotCQkJdG9wID0gaXRlbXMgW2ldLmdldFRleHQgKFRPUF9DT0wpOwotCQkJaWYgKHRvcC5sZW5ndGggKCkgPiAwICkgewotCQkJCWRhdGEudG9wID0gc2V0QXR0YWNobWVudCAodG9wKTsKLQkJCQlpZiAoZGF0YS50b3AuY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBhdHRhY2htZW50ID0gY2hlY2tBdHRhY2htZW50ICh0b3AsIGRhdGEudG9wKTsKLQkJCQkJaXRlbXMgW2ldLnNldFRleHQgKFRPUF9DT0wsIGF0dGFjaG1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWJvdHRvbSA9IGl0ZW1zIFtpXS5nZXRUZXh0IChCT1RUT01fQ09MKTsKLQkJCWlmIChib3R0b20ubGVuZ3RoICgpID4gMCkgewotCQkJCWRhdGEuYm90dG9tID0gc2V0QXR0YWNobWVudCAoYm90dG9tKTsKLQkJCQlpZiAoZGF0YS5ib3R0b20uY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBhdHRhY2htZW50ID0gY2hlY2tBdHRhY2htZW50IChib3R0b20sIGRhdGEuYm90dG9tKTsKLQkJCQkJaXRlbXMgW2ldLnNldFRleHQgKEJPVFRPTV9DT0wsIGF0dGFjaG1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWNoaWxkcmVuIFtpXS5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0U3RhdGUgKCkgewotCQkvKiBTZXQgdGhlIG1hcmdpbnMgYW5kIHNwYWNpbmcgKi8KLQkJdHJ5IHsKLQkJCWZvcm1MYXlvdXQubWFyZ2luSGVpZ2h0ID0gbmV3IEludGVnZXIgKG1hcmdpbkhlaWdodC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCWZvcm1MYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCW1hcmdpbkhlaWdodC5zZWxlY3QgKDApOwotCQl9Ci0JCXRyeSB7Ci0JCQlmb3JtTGF5b3V0Lm1hcmdpbldpZHRoID0gbmV3IEludGVnZXIgKG1hcmdpbldpZHRoLmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJZm9ybUxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQltYXJnaW5XaWR0aC5zZWxlY3QgKDApOwotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIDxjb2RlPkF0dGFjaERpYWxvZzwvY29kZT4gaXMgdGhlIGNsYXNzIHRoYXQgY3JlYXRlcyBhCi0JICogZGlhbG9nIHNwZWNpZmljIGZvciB0aGlzIGV4YW1wbGUuIEl0IGNyZWF0ZXMgYSBkaWFsb2cKLQkgKiB3aXRoIGNvbnRyb2xzIHRvIHNldCB0aGUgdmFsdWVzIGluIGEgRm9ybUF0dGFjaG1lbnQuCi0JICovCi0JcHVibGljIGNsYXNzIEF0dGFjaERpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JCVN0cmluZyByZXN1bHQgPSAiIjsKLQkJU3RyaW5nIGNvbnRyb2xJbnB1dCwgcG9zaXRpb25JbnB1dCwgYWxpZ25tZW50SW5wdXQsIG9mZnNldElucHV0OwotCQlpbnQgY29sID0gMDsKLQkJCi0JCXB1YmxpYyBBdHRhY2hEaWFsb2cgKFNoZWxsIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCQlzdXBlciAocGFyZW50LCBzdHlsZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBdHRhY2hEaWFsb2cgKFNoZWxsIHBhcmVudCkgewotCQkJdGhpcyAocGFyZW50LCAwKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0Q29sdW1uIChpbnQgY29sKSB7Ci0JCQl0aGlzLmNvbCA9IGNvbDsKLQkJfQotCSAKLQkJcHVibGljIFN0cmluZyBvcGVuICgpIHsKLQkJCVNoZWxsIHBhcmVudCA9IGdldFBhcmVudCAoKTsKLQkJCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChwYXJlbnQsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCQlzaGVsbC5zZXRUZXh0IChnZXRUZXh0ICgpKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQgKCk7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJCXNoZWxsLnNldExheW91dCAobGF5b3V0KTsKLQkJCQotCQkJLyogRmluZCBvdXQgd2hhdCB3YXMgcHJldmlvdXNseSBzZXQgYXMgYW4gYXR0YWNobWVudCAqLwotCQkJVGFibGVJdGVtIG5ld0l0ZW0gPSBsZWZ0RWRpdG9yLmdldEl0ZW0gKCk7Ci0JCQlyZXN1bHQgPSBuZXdJdGVtLmdldFRleHQgKGNvbCk7Ci0JCQlTdHJpbmcgb2xkQXR0YWNoID0gcmVzdWx0OwotCQkJU3RyaW5nIG9sZFBvcyA9ICIwIiwgb2xkQ29udHJvbCA9ICIiLCBvbGRBbGlnbiA9ICJERUZBVUxUIiwgb2xkT2Zmc2V0ID0gIjAiOwotCQkJYm9vbGVhbiBpc0NvbnRyb2wgPSBmYWxzZTsKLQkJCWlmIChvbGRBdHRhY2gubGVuZ3RoICgpICE9IDApIHsKLQkJCQljaGFyIGZpcnN0ID0gb2xkQXR0YWNoLmNoYXJBdCAoMCk7Ci0JCQkJaWYgKENoYXJhY3Rlci5pc0xldHRlcihmaXJzdCkpIHsKLQkJCQkJLyogV2UgaGF2ZSBhIGNvbnRyb2wgKi8KLQkJCQkJaXNDb250cm9sID0gdHJ1ZTsKLQkJCQkJb2xkQ29udHJvbCA9IG9sZEF0dGFjaC5zdWJzdHJpbmcgKDAsIG9sZEF0dGFjaC5pbmRleE9mICgnLCcpKTsKLQkJCQkJb2xkQWxpZ24gPSBvbGRBdHRhY2guc3Vic3RyaW5nIChvbGRBdHRhY2guaW5kZXhPZiAoJzonKSArIDEpOwotCQkJCQlvbGRPZmZzZXQgPSBvbGRBdHRhY2guc3Vic3RyaW5nIChvbGRBdHRhY2guaW5kZXhPZiAoJywnKSArIDEsIG9sZEF0dGFjaC5pbmRleE9mICgnOicpKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiBXZSBoYXZlIGEgcG9zaXRpb24gKi8KLQkJCQkJb2xkUG9zID0gb2xkQXR0YWNoLnN1YnN0cmluZyAoMCwgb2xkQXR0YWNoLmluZGV4T2YgKCcsJykpOwotCQkJCQlvbGRPZmZzZXQgPSBvbGRBdHRhY2guc3Vic3RyaW5nIChvbGRBdHRhY2guaW5kZXhPZiAoJywnKSArIDEpOwotCQkJCQlpZiAob2xkT2Zmc2V0LmVuZHNXaXRoICgiKSIpKSB7IC8vIGkuZS4gKERlZmF1bHQpCi0JCQkJCQlvbGRPZmZzZXQgPSBvbGRPZmZzZXQuc3Vic3RyaW5nICgwLCBvbGRPZmZzZXQuaW5kZXhPZiAoJyAnKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8qIEFkZCBwb3NpdGlvbiBmaWVsZCAqLwotCQkJZmluYWwgQnV0dG9uIHBvc0J1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUkFESU8pOwotCQkJcG9zQnV0dG9uLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJQb3NpdGlvbiIpKTsKLQkJCXBvc0J1dHRvbi5zZXRTZWxlY3Rpb24gKCFpc0NvbnRyb2wpOwkJCQotCQkJZmluYWwgQ29tYm8gcG9zaXRpb24gPSBuZXcgQ29tYm8gKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlwb3NpdGlvbi5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IjAiLCIyNSIsIjUwIiwiNzUiLCIxMDAifSk7Ci0JCQlwb3NpdGlvbi5zZXRUZXh0IChvbGRQb3MpOwotCQkJcG9zaXRpb24uc2V0RW5hYmxlZCAoIWlzQ29udHJvbCk7CQkJCi0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlwb3NpdGlvbi5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJCQotCQkJLyogQWRkIGNvbnRyb2wgZmllbGQgKi8KLQkJCWZpbmFsIEJ1dHRvbiBjb250QnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5SQURJTyk7Ci0JCQljb250QnV0dG9uLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDb250cm9sIikpOwotCQkJY29udEJ1dHRvbi5zZXRTZWxlY3Rpb24gKGlzQ29udHJvbCk7Ci0JCQlmaW5hbCBDb21ibyBjb250cm9sID0gbmV3IENvbWJvIChzaGVsbCwgU1dULlJFQURfT05MWSk7Ci0JCQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcyAoKTsKLQkJCVRhYmxlSXRlbSBjdXJyZW50SXRlbSA9IGxlZnRFZGl0b3IuZ2V0SXRlbSAoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFibGUuZ2V0SXRlbUNvdW50ICgpOyBpKyspIHsKLQkJCQlpZiAoaXRlbXMgW2ldLmdldFRleHQgKDApLmxlbmd0aCgpID4gMCkgewotCQkJCQlpZiAoaXRlbXMgW2ldICE9IGN1cnJlbnRJdGVtKSB7Ci0JCQkJCQljb250cm9sLmFkZCAoaXRlbXMgW2ldLmdldFRleHQgKENPTUJPX0NPTCkgKyBpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChvbGRDb250cm9sLmxlbmd0aCAoKSAhPSAwKSBjb250cm9sLnNldFRleHQgKG9sZENvbnRyb2wpOwotCQkJZWxzZSBjb250cm9sLnNlbGVjdCAoMCk7Ci0JCQljb250cm9sLnNldEVuYWJsZWQgKGlzQ29udHJvbCk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQljb250cm9sLnNldExheW91dERhdGEgKGRhdGEpOwotCQkJCi0JCQkvKiBBZGQgYWxpZ25tZW50IGZpZWxkICovCi0JCQluZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSkuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkFsaWdubWVudCIpKTsKLQkJCWZpbmFsIENvbWJvIGFsaWdubWVudCA9IG5ldyBDb21ibyAoc2hlbGwsIFNXVC5OT05FKTsKLQkJCVN0cmluZ1tdIGFsaWdubWVudFZhbHVlczsKLQkJCWlmIChjb2wgPT0gTEVGVF9DT0wgfHwgY29sID09IFJJR0hUX0NPTCkgewotCQkJCWFsaWdubWVudFZhbHVlcyA9IG5ldyBTdHJpbmcgW10geyJTV1QuTEVGVCIsICJTV1QuUklHSFQiLCAiU1dULkNFTlRFUiIsICJTV1QuREVGQVVMVCJ9OwotCQkJfSBlbHNlIHsKLQkJCQkvLyBjb2wgPT0gVE9QX0NPTCB8fCBjb2wgPT0gQk9UVE9NX0NPTAotCQkJCWFsaWdubWVudFZhbHVlcyA9IG5ldyBTdHJpbmcgW10geyJTV1QuVE9QIiwgIlNXVC5CT1RUT00iLCAiU1dULkNFTlRFUiIsICJTV1QuREVGQVVMVCJ9OwotCQkJfQotCQkJYWxpZ25tZW50LnNldEl0ZW1zIChhbGlnbm1lbnRWYWx1ZXMpOwotCQkJYWxpZ25tZW50LnNldFRleHQgKCJTV1QuIiArIG9sZEFsaWduKTsKLQkJCWFsaWdubWVudC5zZXRFbmFibGVkIChpc0NvbnRyb2wpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJYWxpZ25tZW50LnNldExheW91dERhdGEgKGRhdGEpOwotCQkJCi0JCQkvKiBBZGQgb2Zmc2V0IGZpZWxkICovCi0JCQluZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSkuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIk9mZnNldCIpKTsKLQkJCWZpbmFsIFRleHQgb2Zmc2V0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlvZmZzZXQuc2V0VGV4dCAob2xkT2Zmc2V0KTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCW9mZnNldC5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJCQotCQkJLyogQWRkIGxpc3RlbmVycyBmb3IgY2hvb3NpbmcgYmV0d2VlbiBwb3NpdGlvbiBhbmQgY29udHJvbCAqLwotCQkJcG9zQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJcG9zaXRpb24uc2V0RW5hYmxlZCAodHJ1ZSk7Ci0JCQkJCWNvbnRyb2wuc2V0RW5hYmxlZCAoZmFsc2UpOwotCQkJCQlhbGlnbm1lbnQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQljb250QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJcG9zaXRpb24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQkJCQljb250cm9sLnNldEVuYWJsZWQgKHRydWUpOwotCQkJCQlhbGlnbm1lbnQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJQnV0dG9uIGNsZWFyID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQkJCWNsZWFyLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDbGVhciIpKTsKLQkJCWNsZWFyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJCWNsZWFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJcmVzdWx0ID0gIiI7Ci0JCQkJCXNoZWxsLmNsb3NlICgpOwotCQkJCX0KLQkJCX0pOwotCQkJLyogT0sgYnV0dG9uIHNldHMgZGF0YSBpbnRvIHRhYmxlICovCi0JCQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCQkJb2suc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIk9LIikpOwotCQkJb2suc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUikpOwotCQkJb2suYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQljb250cm9sSW5wdXQgPSBjb250cm9sLmdldFRleHQgKCk7Ci0JCQkJCWFsaWdubWVudElucHV0ID0gYWxpZ25tZW50LmdldFRleHQgKCkuc3Vic3RyaW5nICg0KTsKLQkJCQkJcG9zaXRpb25JbnB1dCA9IHBvc2l0aW9uLmdldFRleHQgKCk7Ci0JCQkJCWlmIChwb3NpdGlvbklucHV0Lmxlbmd0aCAoKSA9PSAwKSBwb3NpdGlvbklucHV0ID0gIjAiOwotCQkJCQl0cnkgewotCQkJCQkJbmV3IEludGVnZXIgKHBvc2l0aW9uSW5wdXQpLmludFZhbHVlICgpOwotCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjZXB0KSB7Ci0JCQkJCQlwb3NpdGlvbklucHV0ID0gIjAiOwotCQkJCQl9Ci0JCQkJCW9mZnNldElucHV0ID0gb2Zmc2V0LmdldFRleHQgKCk7Ci0JCQkJCWlmIChvZmZzZXRJbnB1dC5sZW5ndGggKCkgPT0gMCkgb2Zmc2V0SW5wdXQgPSAiMCI7Ci0JCQkJCXRyeSB7Ci0JCQkJCQluZXcgSW50ZWdlciAob2Zmc2V0SW5wdXQpLmludFZhbHVlICgpOwotCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjZXB0KSB7Ci0JCQkJCQlvZmZzZXRJbnB1dCA9ICIwIjsKLQkJCQkJfQotCQkJCQlpZiAocG9zQnV0dG9uLmdldFNlbGVjdGlvbigpIHx8IGNvbnRyb2xJbnB1dC5sZW5ndGggKCkgPT0gMCkgewotCQkJCQkJcmVzdWx0ID0gcG9zaXRpb25JbnB1dCArICIsIiArIG9mZnNldElucHV0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzdWx0ID0gY29udHJvbElucHV0ICsgIiwiICsgb2Zmc2V0SW5wdXQgKyAiOiIgKyBhbGlnbm1lbnRJbnB1dDsKLQkJCQkJfQotCQkJCQlzaGVsbC5jbG9zZSAoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCUJ1dHRvbiBjYW5jZWwgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCQkJY2FuY2VsLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDYW5jZWwiKSk7Ci0JCQljYW5jZWwuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCQkJY2FuY2VsLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJc2hlbGwuY2xvc2UgKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCXNoZWxsLnNldERlZmF1bHRCdXR0b24gKG9rKTsKLQkJCXNoZWxsLnBhY2sgKCk7Ci0JCQkvKiBDZW50ZXIgdGhlIGRpYWxvZyAqLwotCQkJUG9pbnQgY2VudGVyID0gcGFyZW50LmdldExvY2F0aW9uICgpOwotCQkJY2VudGVyLnggPSBjZW50ZXIueCArIChwYXJlbnQuZ2V0Qm91bmRzICgpLndpZHRoIC8gMikgLSAoc2hlbGwuZ2V0Qm91bmRzICgpLndpZHRoIC8gMik7Ci0JCQljZW50ZXIueSA9IGNlbnRlci55ICsgKHBhcmVudC5nZXRCb3VuZHMgKCkuaGVpZ2h0IC8gMikgLSAoc2hlbGwuZ2V0Qm91bmRzICgpLmhlaWdodCAvIDIpOwotCQkJc2hlbGwuc2V0TG9jYXRpb24gKGNlbnRlcik7Ci0JCQlzaGVsbC5vcGVuICgpOwotCQkJRGlzcGxheSBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSAoKTsKLQkJCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQkJCWlmIChkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvR3JpZExheW91dFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9HcmlkTGF5b3V0VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OTAxY2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9HcmlkTGF5b3V0VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1jbGFzcyBHcmlkTGF5b3V0VGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBDb250cm9scyBmb3Igc2V0dGluZyBsYXlvdXQgcGFyYW1ldGVycyAqLwotCVRleHQgbnVtQ29sdW1uczsKLQlCdXR0b24gbWFrZUNvbHVtbnNFcXVhbFdpZHRoOwotCUNvbWJvIG1hcmdpbkhlaWdodCwgbWFyZ2luV2lkdGgsIGhvcml6b250YWxTcGFjaW5nLCB2ZXJ0aWNhbFNwYWNpbmc7Ci0JLyogVGhlIGV4YW1wbGUgbGF5b3V0IGluc3RhbmNlICovCi0JR3JpZExheW91dCBncmlkTGF5b3V0OwotCS8qIFRhYmxlRWRpdG9ycyBhbmQgcmVsYXRlZCBjb250cm9scyovCi0JVGFibGVFZGl0b3IgY29tYm9FZGl0b3IsIHdpZHRoRWRpdG9yLCBoZWlnaHRFZGl0b3I7Ci0JVGFibGVFZGl0b3IgdkFsaWduRWRpdG9yLCBoQWxpZ25FZGl0b3IsIGhJbmRlbnRFZGl0b3I7Ci0JVGFibGVFZGl0b3IgaFNwYW5FZGl0b3IsIHZTcGFuRWRpdG9yLCBoR3JhYkVkaXRvciwgdkdyYWJFZGl0b3I7Ci0JQ0NvbWJvIGNvbWJvLCB2QWxpZ24sIGhBbGlnbiwgaEdyYWIsIHZHcmFiOwotCVRleHQgd2lkdGhUZXh0LCBoZWlnaHRUZXh0LCBoSW5kZW50LCBoU3BhbiwgdlNwYW47Ci0JCi0JLyogQ29uc3RhbnRzICovCi0JZmluYWwgaW50IENPTUJPX0NPTCA9IDE7Ci0JZmluYWwgaW50IFdJRFRIX0NPTCA9IDI7Ci0JZmluYWwgaW50IEhFSUdIVF9DT0wgPSAzOwotCWZpbmFsIGludCBIQUxJR05fQ09MID0gNDsKLQlmaW5hbCBpbnQgVkFMSUdOX0NPTCA9IDU7Ci0JZmluYWwgaW50IEhJTkRFTlRfQ09MID0gNjsKLQlmaW5hbCBpbnQgSFNQQU5fQ09MID0gNzsKLQlmaW5hbCBpbnQgVlNQQU5fQ09MID0gODsKLQlmaW5hbCBpbnQgSEdSQUJfQ09MID0gOTsKLQlmaW5hbCBpbnQgVkdSQUJfQ09MID0gMTA7Ci0JCi0JZmluYWwgaW50IFRPVEFMX0NPTFMgPSAxMTsKLQkJCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIExheW91dEV4YW1wbGUuCi0JICovCi0JR3JpZExheW91dFRhYihMYXlvdXRFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyBpbiB0aGUgImNoaWxkIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNoaWxkV2lkZ2V0cyAoKSB7Ci0JCS8qIENyZWF0ZSB0aGUgVHJhdmVyc2VMaXN0ZW5lciAqLwotCQlmaW5hbCBUcmF2ZXJzZUxpc3RlbmVyIHRyYXZlcnNlTGlzdGVuZXIgPSBuZXcgVHJhdmVyc2VMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQgKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfUkVUVVJOIHx8IGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCkKLQkJCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfRVNDQVBFKQotCQkJCQlkaXNwb3NlRWRpdG9ycyAoKTsKLQkJCX0KLQkJfTsKLQkJCi0JCS8qIEFkZCBjb21tb24gY29udHJvbHMgKi8KLQkJc3VwZXIuY3JlYXRlQ2hpbGRXaWRnZXRzICgpOwotCQkJCi0JCS8qIEFkZCBUYWJsZUVkaXRvcnMgKi8JCQotCQljb21ib0VkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQl3aWR0aEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQloZWlnaHRFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJdkFsaWduRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCWhBbGlnbkVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQloSW5kZW50RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCWhTcGFuRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXZTcGFuRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCWhHcmFiRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXZHcmFiRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXRhYmxlLmFkZE1vdXNlTGlzdGVuZXIgKG5ldyBNb3VzZUFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCXJlc2V0RWRpdG9ycygpOwotCQkJCWluZGV4ID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0JCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQgKGUueCwgZS55KTsKLSAgICAgICAgICAgICAgICBuZXdJdGVtID0gdGFibGUuZ2V0SXRlbSAocHQpOwotICAgICAgICAgICAgICAgIGlmIChuZXdJdGVtID09IG51bGwpIHJldHVybjsKLSAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gb2xkSXRlbSA9IGNvbWJvRWRpdG9yLmdldEl0ZW0gKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW0gPT0gb2xkSXRlbSB8fCBuZXdJdGVtICE9IGxhc3RTZWxlY3RlZCkgewotCQkJCQlsYXN0U2VsZWN0ZWQgPSBuZXdJdGVtOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXRhYmxlLnNob3dTZWxlY3Rpb24gKCk7Ci0JCQkJCi0JCQkJY29tYm8gPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULlJFQURfT05MWSk7Ci0JCQkJY3JlYXRlQ29tYm9FZGl0b3IgKGNvbWJvLCBjb21ib0VkaXRvcik7Ci0JCQkJCi0JCQkJd2lkdGhUZXh0ID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQl3aWR0aFRleHQuc2V0VGV4dCAoKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKGluZGV4KSkgW1dJRFRIX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKHdpZHRoVGV4dCwgd2lkdGhFZGl0b3IsIFdJRFRIX0NPTCk7Ci0JCQkJCi0JCQkJaGVpZ2h0VGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJaGVpZ2h0VGV4dC5zZXRUZXh0ICgoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAoaW5kZXgpKSBbSEVJR0hUX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKGhlaWdodFRleHQsIGhlaWdodEVkaXRvciwgSEVJR0hUX0NPTCk7Ci0JCQkJU3RyaW5nIFtdIGFsaWduVmFsdWVzID0gbmV3IFN0cmluZyBbXSB7IkJFR0lOTklORyIsIkNFTlRFUiIsIkVORCIsIkZJTEwifTsKLQkJCQloQWxpZ24gPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCWhBbGlnbi5zZXRJdGVtcyAoYWxpZ25WYWx1ZXMpOwotCQkJCWhBbGlnbi5zZXRUZXh0IChuZXdJdGVtLmdldFRleHQgKEhBTElHTl9DT0wpKTsKLQkJCQloQWxpZ25FZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCWhBbGlnbkVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCQkJaEFsaWduRWRpdG9yLm1pbmltdW1XaWR0aCA9IDUwOwotCQkJCWhBbGlnbkVkaXRvci5zZXRFZGl0b3IgKGhBbGlnbiwgbmV3SXRlbSwgSEFMSUdOX0NPTCk7Ci0JCQkJaEFsaWduLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotCQkJCQotCQkJCXZBbGlnbiA9IG5ldyBDQ29tYm8gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJdkFsaWduLnNldEl0ZW1zIChhbGlnblZhbHVlcyk7Ci0JCQkJdkFsaWduLnNldFRleHQgKG5ld0l0ZW0uZ2V0VGV4dCAoVkFMSUdOX0NPTCkpOwotCQkJCXZBbGlnbkVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCQkJdkFsaWduRWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCQl2QWxpZ25FZGl0b3IubWluaW11bVdpZHRoID0gNTA7Ci0JCQkJdkFsaWduRWRpdG9yLnNldEVkaXRvciAodkFsaWduLCBuZXdJdGVtLCBWQUxJR05fQ09MKTsKLQkJCQl2QWxpZ24uYWRkVHJhdmVyc2VMaXN0ZW5lciAodHJhdmVyc2VMaXN0ZW5lcik7Ci0JCQkJCi0JCQkJaEluZGVudCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJaEluZGVudC5zZXRUZXh0ICgoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAoaW5kZXgpKSBbSElOREVOVF9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yIChoSW5kZW50LCBoSW5kZW50RWRpdG9yLCBISU5ERU5UX0NPTCk7Ci0JCQkJCi0JCQkJaFNwYW4gPSBuZXcgVGV4dCAodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCWhTcGFuLnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtIU1BBTl9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yIChoU3BhbiwgaFNwYW5FZGl0b3IsIEhTUEFOX0NPTCk7Ci0JCQkJCi0JCQkJdlNwYW4gPSBuZXcgVGV4dCAodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCXZTcGFuLnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtWU1BBTl9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yICh2U3BhbiwgdlNwYW5FZGl0b3IsIFZTUEFOX0NPTCk7Ci0JCQkJCi0JCQkJU3RyaW5nIFtdIGJvb2xWYWx1ZXMgPSBuZXcgU3RyaW5nIFtdIHsiZmFsc2UiLCJ0cnVlIn07Ci0JCQkJaEdyYWIgPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCWhHcmFiLnNldEl0ZW1zIChib29sVmFsdWVzKTsKLQkJCQloR3JhYi5zZXRUZXh0IChuZXdJdGVtLmdldFRleHQgKEhHUkFCX0NPTCkpOwotCQkJCWhHcmFiRWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJCQloR3JhYkVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCQkJaEdyYWJFZGl0b3IubWluaW11bVdpZHRoID0gNTA7Ci0JCQkJaEdyYWJFZGl0b3Iuc2V0RWRpdG9yIChoR3JhYiwgbmV3SXRlbSwgSEdSQUJfQ09MKTsKLQkJCQloR3JhYi5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLQkJCQkKLQkJCQl2R3JhYiA9IG5ldyBDQ29tYm8gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJdkdyYWIuc2V0SXRlbXMgKGJvb2xWYWx1ZXMpOwotCQkJCXZHcmFiLnNldFRleHQgKG5ld0l0ZW0uZ2V0VGV4dCAoVkdSQUJfQ09MKSk7Ci0JCQkJdkdyYWJFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCXZHcmFiRWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCQl2R3JhYkVkaXRvci5taW5pbXVtV2lkdGggPSA1MDsKLQkJCQl2R3JhYkVkaXRvci5zZXRFZGl0b3IgKHZHcmFiLCBuZXdJdGVtLCBWR1JBQl9DT0wpOwotCQkJCXZHcmFiLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTx0YWJsZS5nZXRDb2x1bW5Db3VudCAoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgCVJlY3RhbmdsZSByZWN0ID0gbmV3SXRlbS5nZXRCb3VuZHMgKGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVjdC5jb250YWlucyAocHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAlzd2l0Y2ggKGkpIHsKLQkJCQkJCQljYXNlIENPTUJPX0NPTCA6Ci0JCQkJCQkJCWNvbWJvLnNldEZvY3VzICgpOwkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBXSURUSF9DT0wgOgkKLQkJCQkJCQkJd2lkdGhUZXh0LnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIEhFSUdIVF9DT0wgOgotCQkJCQkJCQloZWlnaHRUZXh0LnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIEhBTElHTl9DT0wgOgotCQkJCQkJCQloQWxpZ24uc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgVkFMSUdOX0NPTCA6Ci0JCQkJCQkJCXZBbGlnbi5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBISU5ERU5UX0NPTCA6Ci0JCQkJCQkJCWhJbmRlbnQuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSFNQQU5fQ09MIDoKLQkJCQkJCQkJaFNwYW4uc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgVlNQQU5fQ09MIDoKLQkJCQkJCQkJdlNwYW4uc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSEdSQUJfQ09MIDoKLQkJCQkJCQkJaEdyYWIuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgVkdSQUJfQ09MIDoKLQkJCQkJCQkJdkdyYWIuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAKLQkJCX0KLQkJfSk7Ci0JCQotCQkvKiBBZGQgbGlzdGVuZXIgdG8gYWRkIGFuIGVsZW1lbnQgdG8gdGhlIHRhYmxlICovCi0JCWFkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgMCk7Ci0JCQkJU3RyaW5nIFtdIGluc2VydCA9IG5ldyBTdHJpbmcgW10geyAKLQkJCQkJU3RyaW5nLnZhbHVlT2YgKHRhYmxlLmluZGV4T2YgKGl0ZW0pKSwgIkJ1dHRvbiIsCi0JCQkJCSItMSIsIi0xIiwiQkVHSU5OSU5HIiwiQ0VOVEVSIiwKLQkJCQkJIjAiLCIxIiwiMSIsImZhbHNlIiwiZmFsc2UifTsKLQkJCQlpdGVtLnNldFRleHQgKGluc2VydCk7Ci0JCQkJZGF0YS5hZGRFbGVtZW50IChpbnNlcnQpOwotCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbCB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCQkvKiBSZWFycmFuZ2UgdGhlIGxheW91dCBvZiB0aGUgY29udHJvbCBncm91cCAqLwotCQlzaXplLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoKSk7Ci0JCQotCQkvKiBDb250cm9scyB0aGUgbWFyZ2lucyBhbmQgc3BhY2luZyBvZiB0aGUgR3JpZExheW91dCAqLwotCQlTdHJpbmcgW10gbWFyZ2luVmFsdWVzID0gbmV3IFN0cmluZyBbXSB7IjAiLCIzIiwiNSIsIjEwIn07Ci0JCUdyb3VwIG1hcmdpbkdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJbWFyZ2luR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIk1hcmdpbnNfU3BhY2luZyIpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS52ZXJ0aWNhbFNwYW4gPSAyOwotCQltYXJnaW5Hcm91cC5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQltYXJnaW5Hcm91cC5zZXRMYXlvdXQgKGxheW91dCk7Ci0JCW5ldyBMYWJlbCAobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgibWFyZ2luSGVpZ2h0Iik7Ci0JCW1hcmdpbkhlaWdodCA9IG5ldyBDb21ibyAobWFyZ2luR3JvdXAsIFNXVC5OT05FKTsKLQkJbWFyZ2luSGVpZ2h0LnNldEl0ZW1zIChtYXJnaW5WYWx1ZXMpOwotCQltYXJnaW5IZWlnaHQuc2VsZWN0ICgyKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSA2MDsKLQkJbWFyZ2luSGVpZ2h0LnNldExheW91dERhdGEgKGRhdGEpOwotCQltYXJnaW5IZWlnaHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbWFyZ2luSGVpZ2h0LmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoIm1hcmdpbldpZHRoIik7Ci0JCW1hcmdpbldpZHRoID0gbmV3IENvbWJvIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpOwotCQltYXJnaW5XaWR0aC5zZXRJdGVtcyAobWFyZ2luVmFsdWVzKTsKLQkJbWFyZ2luV2lkdGguc2VsZWN0ICgyKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSA2MDsKLQkJbWFyZ2luV2lkdGguc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCW1hcmdpbldpZHRoLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW1hcmdpbldpZHRoLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoImhvcml6b250YWxTcGFjaW5nIik7Ci0JCWhvcml6b250YWxTcGFjaW5nID0gbmV3IENvbWJvIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpOwotCQlob3Jpem9udGFsU3BhY2luZy5zZXRJdGVtcyAobWFyZ2luVmFsdWVzKTsKLQkJaG9yaXpvbnRhbFNwYWNpbmcuc2VsZWN0ICgyKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSA2MDsKLQkJaG9yaXpvbnRhbFNwYWNpbmcuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCWhvcml6b250YWxTcGFjaW5nLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWhvcml6b250YWxTcGFjaW5nLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoInZlcnRpY2FsU3BhY2luZyIpOwotCQl2ZXJ0aWNhbFNwYWNpbmcgPSBuZXcgQ29tYm8gKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXZlcnRpY2FsU3BhY2luZy5zZXRJdGVtcyAobWFyZ2luVmFsdWVzKTsKLQkJdmVydGljYWxTcGFjaW5nLnNlbGVjdCAoMik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gNjA7Ci0JCXZlcnRpY2FsU3BhY2luZy5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJdmVydGljYWxTcGFjaW5nLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXZlcnRpY2FsU3BhY2luZy5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLSAgICAgICAgCi0gICAgICAgIC8qIENvbnRyb2xzIHRoZSBjb2x1bW5zIGluIHRoZSBHcmlkTGF5b3V0ICovCi0JCUdyb3VwIGNvbHVtbkdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJY29sdW1uR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNvbHVtbnMiKSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbHVtbkdyb3VwLnNldExheW91dCAobGF5b3V0KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWNvbHVtbkdyb3VwLnNldExheW91dERhdGEgKGRhdGEpOwotCQludW1Db2x1bW5zID0gbmV3IFRleHQgKGNvbHVtbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbnVtQ29sdW1ucy5zZXRUZXh0ICgiMSIpOwotCQludW1Db2x1bW5zLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW51bUNvbHVtbnMuYWRkVHJhdmVyc2VMaXN0ZW5lciAodHJhdmVyc2VMaXN0ZW5lcik7Ci0gICAgICAgCWRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgCWRhdGEud2lkdGhIaW50ID0gMTU7Ci0gICAgICAgCW51bUNvbHVtbnMuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0gICAgICAgCW5ldyBMYWJlbCAoY29sdW1uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgibnVtQ29sdW1ucyIpOwotCQltYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBuZXcgQnV0dG9uIChjb2x1bW5Hcm91cCwgU1dULkNIRUNLKTsKLQkJbWFrZUNvbHVtbnNFcXVhbFdpZHRoLnNldFRleHQgKCJtYWtlQ29sdW1uc0VxdWFsV2lkdGgiKTsKLQkJbWFrZUNvbHVtbnNFcXVhbFdpZHRoLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxNDsKLQkJbWFrZUNvbHVtbnNFcXVhbFdpZHRoLnNldExheW91dERhdGEgKGRhdGEpOwotCi0JCS8qIEFkZCBjb21tb24gY29udHJvbHMgKi8KLQkJc3VwZXIuY3JlYXRlQ29udHJvbFdpZGdldHMgKCk7Ci0JCWNvbnRyb2xHcm91cC5wYWNrKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqLwotCXZvaWQgY3JlYXRlTGF5b3V0ICgpIHsKLQkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQlsYXlvdXRDb21wb3NpdGUuc2V0TGF5b3V0IChncmlkTGF5b3V0KTsKLQl9Ci0JCi0JLyoqIAotCSAqIERpc3Bvc2VzIHRoZSBlZGl0b3JzIHdpdGhvdXQgcGxhY2luZyB0aGVpciBjb250ZW50cwotCSAqIGludG8gdGhlIHRhYmxlLgotCSAqLwotCXZvaWQgZGlzcG9zZUVkaXRvcnMgKCkgewotCQljb21ib0VkaXRvci5zZXRFZGl0b3IgKG51bGwsIG51bGwsIC0xKTsKLQkJY29tYm8uZGlzcG9zZSAoKTsKLQkJd2lkdGhUZXh0LmRpc3Bvc2UgKCk7Ci0JCWhlaWdodFRleHQuZGlzcG9zZSAoKTsKLQkJaEFsaWduLmRpc3Bvc2UgKCk7Ci0JCXZBbGlnbi5kaXNwb3NlICgpOwotCQloSW5kZW50LmRpc3Bvc2UgKCk7Ci0JCWhTcGFuLmRpc3Bvc2UgKCk7Ci0JCXZTcGFuLmRpc3Bvc2UgKCk7Ci0JCWhHcmFiLmRpc3Bvc2UgKCk7Ci0JCXZHcmFiLmRpc3Bvc2UgKCk7Ci0JfQotCQotCS8qKgotCSAqIEdlbmVyYXRlcyBjb2RlIGZvciB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCQotCVN0cmluZ0J1ZmZlciBnZW5lcmF0ZUxheW91dENvZGUgKCkgewotCQlTdHJpbmdCdWZmZXIgY29kZSA9IG5ldyBTdHJpbmdCdWZmZXIgKCk7Ci0JCWNvZGUuYXBwZW5kICgiXHRcdEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpO1xuIik7Ci0JCWlmIChncmlkTGF5b3V0Lm51bUNvbHVtbnMgIT0gMSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Z3JpZExheW91dC5udW1Db2x1bW5zID0gIiArIGdyaWRMYXlvdXQubnVtQ29sdW1ucyArICI7XG4iKTsKLQkJfQotCQlpZiAoZ3JpZExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGgpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTtcbiIpOwotCQl9Ci0JCWlmIChncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCAhPSA1KSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9ICIgKyBncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCArICI7XG4iKTsKLQkJfQotCQlpZiAoZ3JpZExheW91dC5tYXJnaW5XaWR0aCAhPSA1KSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gIiArIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggKyAiO1xuIik7Ci0JCX0KLQkJaWYgKGdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgIT0gNSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Z3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9ICIgKyBncmlkTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nICsgIjtcbiIpOwotCQl9Ci0JCWlmIChncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyAhPSA1KSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9ICIgKyBncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyArICI7XG4iKTsKLQkJfQotCQljb2RlLmFwcGVuZCAoIlx0XHRzaGVsbC5zZXRMYXlvdXQgKGdyaWRMYXlvdXQpO1xuIik7Ci0JCQotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJQ29udHJvbCBjb250cm9sID0gY2hpbGRyZW4gW2ldOwotCQkJY29kZS5hcHBlbmQgKGdldENoaWxkQ29kZSAoY29udHJvbCwgaSkpOwotCQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29udHJvbC5nZXRMYXlvdXREYXRhICgpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCWNvZGUuYXBwZW5kICgiXHRcdCIpOwotCQkJCWlmIChmaXJzdCkgewotCQkJCQljb2RlLmFwcGVuZCAoIkdyaWREYXRhICIpOwotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCX0KLQkJCQljb2RlLmFwcGVuZCAoImRhdGEgPSBuZXcgR3JpZERhdGEgKCk7XG4iKTsJCi0JCQkJaWYgKGRhdGEud2lkdGhIaW50ICE9IFNXVC5ERUZBVUxUKSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEud2lkdGhIaW50ID0gIiArIGRhdGEud2lkdGhIaW50ICsgIjtcbiIpOwotCQkJCX0KLQkJCQlpZiAoZGF0YS5oZWlnaHRIaW50ICE9IFNXVC5ERUZBVUxUKSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEuaGVpZ2h0SGludCA9ICIgKyBkYXRhLmhlaWdodEhpbnQgKyAiO1xuIik7Ci0JCQkJfQotCQkJCWlmIChkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgIT0gR3JpZERhdGEuQkVHSU5OSU5HKSB7Ci0JCQkJCVN0cmluZyBhbGlnbm1lbnQ7Ci0JCQkJCWludCBoQWxpZ25tZW50ID0gZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50OwotCQkJCQlpZiAoaEFsaWdubWVudCA9PSBHcmlkRGF0YS5DRU5URVIpIGFsaWdubWVudCA9ICJHcmlkRGF0YS5DRU5URVIiOwotCQkJCQllbHNlIGlmIChoQWxpZ25tZW50ID09IEdyaWREYXRhLkVORCkgYWxpZ25tZW50ID0gIkdyaWREYXRhLkVORCI7Ci0JCQkJCWVsc2UgYWxpZ25tZW50ID0gIkdyaWREYXRhLkZJTEwiOwotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSAiICsgYWxpZ25tZW50ICsgIjtcbiIpOwotCQkJCX0KLQkJCQlpZiAoZGF0YS52ZXJ0aWNhbEFsaWdubWVudCAhPSBHcmlkRGF0YS5DRU5URVIpIHsKLQkJCQkJU3RyaW5nIGFsaWdubWVudDsKLQkJCQkJaW50IHZBbGlnbm1lbnQgPSBkYXRhLnZlcnRpY2FsQWxpZ25tZW50OwotCQkJCQlpZiAodkFsaWdubWVudCA9PSBHcmlkRGF0YS5CRUdJTk5JTkcpIGFsaWdubWVudCA9ICJHcmlkRGF0YS5CRUdJTk5JTkciOwotCQkJCQllbHNlIGlmICh2QWxpZ25tZW50ID09IEdyaWREYXRhLkVORCkgYWxpZ25tZW50ID0gIkdyaWREYXRhLkVORCI7Ci0JCQkJCWVsc2UgYWxpZ25tZW50ID0gIkdyaWREYXRhLkZJTEwiOwotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gIiArIGFsaWdubWVudCArICI7XG4iKTsKLQkJCQl9CQotCQkJCWlmIChkYXRhLmhvcml6b250YWxJbmRlbnQgIT0gMCkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmhvcml6b250YWxJbmRlbnQgPSAiICsgZGF0YS5ob3Jpem9udGFsSW5kZW50ICsgIjtcbiIpOwotCQkJCX0KLQkJCQlpZiAoZGF0YS5ob3Jpem9udGFsU3BhbiAhPSAxKSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAiICsgZGF0YS5ob3Jpem9udGFsU3BhbiArICI7XG4iKTsKLQkJCQl9Ci0JCQkJaWYgKGRhdGEudmVydGljYWxTcGFuICE9IDEpIHsKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS52ZXJ0aWNhbFNwYW4gPSAiICsgZGF0YS52ZXJ0aWNhbFNwYW4gKyAiO1xuIik7Ci0JCQkJfQotCQkJCWlmIChkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UpIHsKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTtcbiIpOwotCQkJCX0KLQkJCQlpZiAoZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTtcbiIpOwotCQkJCX0KLQkJCQlpZiAoY29kZS5zdWJzdHJpbmcgKGNvZGUubGVuZ3RoICgpIC0gMzMpLmVxdWFscyAoIkdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEgKCk7XG4iKSkgewotCQkJCQljb2RlLmRlbGV0ZSAoY29kZS5sZW5ndGggKCkgLSAzMywgY29kZS5sZW5ndGggKCkpOwotCQkJCQlmaXJzdCA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmIChjb2RlLnN1YnN0cmluZyAoY29kZS5sZW5ndGggKCkgLSAyNCkuZXF1YWxzICgiZGF0YSA9IG5ldyBHcmlkRGF0YSAoKTtcbiIpKSB7IAotCQkJCQljb2RlLmRlbGV0ZSAoY29kZS5sZW5ndGggKCkgLSAyNCwgY29kZS5sZW5ndGggKCkpOwotCQkJCX0gZWxzZSB7CQotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHQiICsgbmFtZXMgW2ldICsgIi5zZXRMYXlvdXREYXRhIChkYXRhKTtcbiIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29kZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGF5b3V0IGRhdGEgZmllbGQgbmFtZXMuCi0JICovCi0JU3RyaW5nIFtdIGdldExheW91dERhdGFGaWVsZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7Ci0JCQkiIiwKLQkJCSJDb250cm9sIiwgCi0JCQkid2lkdGgiLCAKLQkJCSJoZWlnaHQiLCAKLQkJCSJob3Jpem9udGFsQWxpZ25tZW50IiwgCi0JCQkidmVydGljYWxBbGlnbm1lbnQiLCAKLQkJCSJob3Jpem9udGFsSW5kZW50IiwgCi0JCQkiaG9yaXpvbnRhbFNwYW4iLAotCQkJInZlcnRpY2FsU3BhbiIsIAotCQkJImdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UiLCAKLQkJCSJncmFiRXhjZXNzVmVydGljYWxTcGFjZSIKLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiR3JpZExheW91dCI7Ci0JfQotCQotCS8qKgotCSAqIFRha2VzIGluZm9ybWF0aW9uIGZyb20gVGFibGVFZGl0b3JzIGFuZCBzdG9yZXMgaXQuCi0JICovCi0Jdm9pZCByZXNldEVkaXRvcnMgKCkgewotCQlyZXNldEVkaXRvcnMgKGZhbHNlKTsKLQl9Ci0JCi0Jdm9pZCByZXNldEVkaXRvcnMgKGJvb2xlYW4gdGFiKSB7Ci0JCVRhYmxlSXRlbSBvbGRJdGVtID0gY29tYm9FZGl0b3IuZ2V0SXRlbSAoKTsKLQkJaWYgKG9sZEl0ZW0gIT0gbnVsbCkgewotCQkJaW50IHJvdyA9IHRhYmxlLmluZGV4T2YgKG9sZEl0ZW0pOwotCQkJdHJ5IHsKLQkJCQluZXcgSW50ZWdlciAod2lkdGhUZXh0LmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQl3aWR0aFRleHQuc2V0VGV4dCAob2xkSXRlbS5nZXRUZXh0IChXSURUSF9DT0wpKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKGhlaWdodFRleHQuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCWhlaWdodFRleHQuc2V0VGV4dCAob2xkSXRlbS5nZXRUZXh0IChIRUlHSFRfQ09MKSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyIChoSW5kZW50LmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQloSW5kZW50LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoSElOREVOVF9DT0wpKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKGhTcGFuLmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQloU3Bhbi5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKEhTUEFOX0NPTCkpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQluZXcgSW50ZWdlciAodlNwYW4uZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXZTcGFuLnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoVlNQQU5fQ09MKSk7Ci0JCQl9Ci0JCQlTdHJpbmcgW10gaW5zZXJ0ID0gbmV3IFN0cmluZyBbXSB7Ci0JCQkJU3RyaW5nLnZhbHVlT2YgKHJvdyksIGNvbWJvLmdldFRleHQgKCksIHdpZHRoVGV4dC5nZXRUZXh0ICgpLCBoZWlnaHRUZXh0LmdldFRleHQgKCksCi0JCQkJaEFsaWduLmdldFRleHQgKCksIHZBbGlnbi5nZXRUZXh0ICgpLCBoSW5kZW50LmdldFRleHQgKCksIAotCQkJCWhTcGFuLmdldFRleHQgKCksIHZTcGFuLmdldFRleHQgKCksIGhHcmFiLmdldFRleHQgKCksIHZHcmFiLmdldFRleHQgKCkKLQkJCX07Ci0JCQlkYXRhLnNldEVsZW1lbnRBdCAoaW5zZXJ0LCByb3cpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBUT1RBTF9DT0xTOyBpKyspIHsKLQkJCQlvbGRJdGVtLnNldFRleHQgKGksICgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChyb3cpKSBbaV0pOwotCQkJfQotCQkJaWYgKCF0YWIpIGRpc3Bvc2VFZGl0b3JzICgpOwotCQl9Ci0JCXNldExheW91dFN0YXRlICgpOwkJCi0JCXJlZnJlc2hMYXlvdXRDb21wb3NpdGUgKCk7Ci0JCXNldExheW91dERhdGEgKCk7Ci0JCWxheW91dENvbXBvc2l0ZS5sYXlvdXQgKHRydWUpOwotCQlsYXlvdXRHcm91cC5sYXlvdXQgKHRydWUpOwotCX0JCi0JCi0JLyoqCi0JICogU2V0cyB0aGUgbGF5b3V0IGRhdGEgZm9yIHRoZSBjaGlsZHJlbiBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0RGF0YSAoKSB7Ci0JCUNvbnRyb2wgW10gY2hpbGRyZW4gPSBsYXlvdXRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4gKCk7Ci0JCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zICgpOwotCQlHcmlkRGF0YSBkYXRhOwotCQlpbnQgaEluZGVudCwgaFNwYW4sIHZTcGFuOwotCQlTdHJpbmcgdkFsaWduLCBoQWxpZ24sIHZHcmFiLCBoR3JhYjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoKTsKLQkJCS8qIFNldCB3aWR0aEhpbnQgYW5kIGhlaWdodEhpbnQgKi8KLQkJCWRhdGEud2lkdGhIaW50ID0gbmV3IEludGVnZXIgKGl0ZW1zIFtpXS5nZXRUZXh0IChXSURUSF9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCWRhdGEuaGVpZ2h0SGludCA9IG5ldyBJbnRlZ2VyIChpdGVtcyBbaV0uZ2V0VGV4dCAoSEVJR0hUX0NPTCkpLmludFZhbHVlICgpOwotCQkJLyogU2V0IHZlcnRpY2FsIGFsaWdubWVudCBhbmQgaG9yaXpvbnRhbCBhbGlnbm1lbnQgKi8KLQkJCWhBbGlnbiA9IGl0ZW1zIFtpXS5nZXRUZXh0IChIQUxJR05fQ09MKTsKLQkJCWlmIChoQWxpZ24uZXF1YWxzICgiQ0VOVEVSIikpIHsKLQkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0JCQl9IGVsc2UgaWYgKGhBbGlnbi5lcXVhbHMgKCJFTkQiKSkgewotCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkVORDsKLQkJCX0gZWxzZSBpZiAoaEFsaWduLmVxdWFscyAoIkZJTEwiKSkgewotCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJCX0KLQkJCXZBbGlnbiA9IGl0ZW1zIFtpXS5nZXRUZXh0IChWQUxJR05fQ09MKTsKLQkJCWlmICh2QWxpZ24uZXF1YWxzICgiQkVHSU5OSU5HIikpIHsKLQkJCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQkJfSBlbHNlIGlmICh2QWxpZ24uZXF1YWxzICgiRU5EIikpIHsKLQkJCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRU5EOwotCQkJfSBlbHNlIGlmICh2QWxpZ24uZXF1YWxzICgiRklMTCIpKSB7Ci0JCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0JCQl9Ci0JCQkvKiBTZXQgaW5kZW50cyBhbmQgc3BhbnMgKi8KLQkJCWhJbmRlbnQgPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKEhJTkRFTlRfQ09MKSkuaW50VmFsdWUgKCk7Ci0JCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSBoSW5kZW50OwotCQkJaFNwYW4gPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKEhTUEFOX0NPTCkpLmludFZhbHVlICgpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IGhTcGFuOwotCQkJdlNwYW4gPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKFZTUEFOX0NPTCkpLmludFZhbHVlICgpOwotCQkJZGF0YS52ZXJ0aWNhbFNwYW4gPSB2U3BhbjsKLQkJCS8qIFNldCBncmFiYmVycyAqLwotCQkJaEdyYWIgPSBpdGVtcyBbaV0uZ2V0VGV4dCAoSEdSQUJfQ09MKTsKLQkJCWlmIChoR3JhYi5lcXVhbHMgKCJ0cnVlIikpIHsKLQkJCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJCX0KLQkJCXZHcmFiID0gaXRlbXMgW2ldLmdldFRleHQgKFZHUkFCX0NPTCk7Ci0JCQlpZiAodkdyYWIuZXF1YWxzICgidHJ1ZSIpKSB7Ci0JCQkJZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsKLQkJCX0KLQkJCWNoaWxkcmVuIFtpXS5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0U3RhdGUgKCkgewotCQkvKiBTZXQgdGhlIGNvbHVtbnMgZm9yIHRoZSBsYXlvdXQgKi8KLQkJdHJ5IHsKLQkJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IG5ldyBJbnRlZ2VyIChudW1Db2x1bW5zLmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLQkJfQotCQlncmlkTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IG1ha2VDb2x1bW5zRXF1YWxXaWR0aC5nZXRTZWxlY3Rpb24gKCk7Ci0JCQotCQkvKiBTZXQgdGhlIG1hcmdpbnMgYW5kIHNwYWNpbmcgKi8KLQkJdHJ5IHsKLQkJCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gbmV3IEludGVnZXIgKG1hcmdpbkhlaWdodC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKLQkJCW1hcmdpbkhlaWdodC5zZWxlY3QgKDIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gbmV3IEludGVnZXIgKG1hcmdpbldpZHRoLmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDU7Ci0JCQltYXJnaW5XaWR0aC5zZWxlY3QgKDIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlncmlkTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gbmV3IEludGVnZXIgKGhvcml6b250YWxTcGFjaW5nLmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDU7Ci0JCQlob3Jpem9udGFsU3BhY2luZy5zZWxlY3QgKDIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IG5ldyBJbnRlZ2VyICh2ZXJ0aWNhbFNwYWNpbmcuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7Ci0JCQl2ZXJ0aWNhbFNwYWNpbmcuc2VsZWN0ICgyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvTGF5b3V0RXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9MYXlvdXRFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZjcyNTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9MYXlvdXRFeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIExheW91dEV4YW1wbGUgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19sYXlvdXQiKTsKLQlwcml2YXRlIFRhYkZvbGRlciB0YWJGb2xkZXI7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIExheW91dEV4YW1wbGUgZW1iZWRkZWQgaW5zaWRlCi0JICogdGhlIHN1cHBsaWVkIHBhcmVudCBDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgY29udGFpbmVyIG9mIHRoZSBleGFtcGxlCi0JICovCi0JcHVibGljIExheW91dEV4YW1wbGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0YWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyIChwYXJlbnQsIFNXVC5OT05FKTsKLQkJVGFiIFtdIHRhYnMgPSBuZXcgVGFiIFtdIHsKLQkJCW5ldyBGaWxsTGF5b3V0VGFiICh0aGlzKSwKLQkJCW5ldyBSb3dMYXlvdXRUYWIgKHRoaXMpLAotCQkJbmV3IEdyaWRMYXlvdXRUYWIgKHRoaXMpLAotCQkJbmV3IEZvcm1MYXlvdXRUYWIgKHRoaXMpLAotCQl9OwotCQlmb3IgKGludCBpPTA7IGk8dGFicy5sZW5ndGg7IGkrKykgewotCQkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0gKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkgICAgaXRlbS5zZXRUZXh0ICh0YWJzIFtpXS5nZXRUYWJUZXh0ICgpKTsKLQkJICAgIGl0ZW0uc2V0Q29udHJvbCAodGFicyBbaV0uY3JlYXRlVGFiRm9sZGVyUGFnZSAodGFiRm9sZGVyKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR3JhYnMgaW5wdXQgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXRhYkZvbGRlci5zZXRGb2N1cygpOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwb3NlcyBvZiBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIKLQkgKiBpbnN0YW5jZSBvZiB0aGUgTGF5b3V0RXhhbXBsZS4KLQkgKi8JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGFiRm9sZGVyID0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogSW52b2tlcyBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCW5ldyBMYXlvdXRFeGFtcGxlKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygid2luZG93LnRpdGxlIikpOwotCQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyIChuZXcgU2hlbGxBZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkgewotCQkJCVNoZWxsIFtdIHNoZWxscyA9IGRpc3BsYXkuZ2V0U2hlbGxzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaGVsbHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHNoZWxscyBbaV0gIT0gc2hlbGwpIHNoZWxscyBbaV0uY2xvc2UgKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoISBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghIGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqIFdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggYmVjYXVzZSBvZiBhIG1pc3NpbmcgU3RyaW5nLgotCSAqIFJldHVybnMgdGhlIGtleSBpZiBub3QgZm91bmQuCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgYW5kIGJpbmRzIGl0Ci0JICogd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwKLQkgKiByZXR1cm4gdGhlIGtleS4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL1Jvd0xheW91dFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9Sb3dMYXlvdXRUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQzNzM1Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL1Jvd0xheW91dFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0ZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotY2xhc3MgUm93TGF5b3V0VGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBDb250cm9scyBmb3Igc2V0dGluZyBsYXlvdXQgcGFyYW1ldGVycyAqLwotCUJ1dHRvbiBob3Jpem9udGFsLCB2ZXJ0aWNhbDsKLQlCdXR0b24gd3JhcCwgcGFjaywganVzdGlmeTsKLQlDb21ibyBtYXJnaW5SaWdodCwgbWFyZ2luTGVmdCwgbWFyZ2luVG9wLCBtYXJnaW5Cb3R0b20sIHNwYWNpbmc7Ci0JLyogVGhlIGV4YW1wbGUgbGF5b3V0IGluc3RhbmNlICovCi0JUm93TGF5b3V0IHJvd0xheW91dDsKLQkvKiBUYWJsZUVkaXRvcnMgYW5kIHJlbGF0ZWQgY29udHJvbHMqLwotCVRhYmxlRWRpdG9yIGNvbWJvRWRpdG9yLCB3aWR0aEVkaXRvciwgaGVpZ2h0RWRpdG9yOwotCUNDb21ibyBjb21ibzsKLQlUZXh0IHdpZHRoVGV4dCwgaGVpZ2h0VGV4dDsKLQkKLQkvKiBDb25zdGFudHMgKi8KLQlmaW5hbCBpbnQgQ09NQk9fQ09MID0gMTsKLQlmaW5hbCBpbnQgV0lEVEhfQ09MID0gMjsKLQlmaW5hbCBpbnQgSEVJR0hUX0NPTCA9IDM7Ci0JCi0JZmluYWwgaW50IFRPVEFMX0NPTFMgPSA0OwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBMYXlvdXRFeGFtcGxlLgotCSAqLwotCVJvd0xheW91dFRhYihMYXlvdXRFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyBpbiB0aGUgImNoaWxkIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNoaWxkV2lkZ2V0cyAoKSB7Ci0JCS8qIEFkZCBjb21tb24gY29udHJvbHMgKi8KLQkJc3VwZXIuY3JlYXRlQ2hpbGRXaWRnZXRzICgpOwotCQkKLQkJLyogQWRkIFRhYmxlRWRpdG9ycyAqLwkJCQotCQljb21ib0VkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQl3aWR0aEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQloZWlnaHRFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJdGFibGUuYWRkTW91c2VMaXN0ZW5lciAobmV3IE1vdXNlQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJcmVzZXRFZGl0b3JzKCk7Ci0JCQkJaW5kZXggPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCAoKTsKLQkJCQlQb2ludCBwdCA9IG5ldyBQb2ludCAoZS54LCBlLnkpOwotICAgICAgICAgICAgICAgIG5ld0l0ZW0gPSB0YWJsZS5nZXRJdGVtIChwdCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW0gPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBvbGRJdGVtID0gY29tYm9FZGl0b3IuZ2V0SXRlbSAoKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3SXRlbSA9PSBvbGRJdGVtIHx8IG5ld0l0ZW0gIT0gbGFzdFNlbGVjdGVkKSB7Ci0JCQkJCWxhc3RTZWxlY3RlZCA9IG5ld0l0ZW07Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdGFibGUuc2hvd1NlbGVjdGlvbiAoKTsKLQkJCQkKLQkJCQljb21ibyA9IG5ldyBDQ29tYm8gKHRhYmxlLCBTV1QuUkVBRF9PTkxZKTsKLQkJCQljcmVhdGVDb21ib0VkaXRvciAoY29tYm8sIGNvbWJvRWRpdG9yKTsKLQkJCQkKLQkJCQl3aWR0aFRleHQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCXdpZHRoVGV4dC5zZXRUZXh0ICgoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAoaW5kZXgpKSBbV0lEVEhfQ09MXSk7Ci0JCQkJY3JlYXRlVGV4dEVkaXRvciAod2lkdGhUZXh0LCB3aWR0aEVkaXRvciwgV0lEVEhfQ09MKTsKLQkJCQkKLQkJCQloZWlnaHRUZXh0ID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQloZWlnaHRUZXh0LnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtIRUlHSFRfQ09MXSk7Ci0JCQkJY3JlYXRlVGV4dEVkaXRvciAoaGVpZ2h0VGV4dCwgaGVpZ2h0RWRpdG9yLCBIRUlHSFRfQ09MKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dGFibGUuZ2V0Q29sdW1uQ291bnQgKCk7IGkrKykgewotICAgICAgICAgICAgICAgIAlSZWN0YW5nbGUgcmVjdCA9IG5ld0l0ZW0uZ2V0Qm91bmRzIChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3QuY29udGFpbnMgKHB0KSkgewotICAgICAgICAgICAgICAgICAgICAJc3dpdGNoIChpKSB7Ci0JCQkJCQkJY2FzZSBDT01CT19DT0wgOgotCQkJCQkJCQljb21iby5zZXRGb2N1cyAoKTsJCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgV0lEVEhfQ09MIDoJCi0JCQkJCQkJCXdpZHRoVGV4dC5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBIRUlHSFRfQ09MIDoKLQkJCQkJCQkJaGVpZ2h0VGV4dC5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IAotCQkJfQotCQl9KTsKLQkJCi0JCS8qIEFkZCBsaXN0ZW5lciB0byBhZGQgYW4gZWxlbWVudCB0byB0aGUgdGFibGUgKi8KLQkJYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCAwKTsKLQkJCQlTdHJpbmcgW10gaW5zZXJ0ID0gbmV3IFN0cmluZyBbXSB7IAotCQkJCQlTdHJpbmcudmFsdWVPZiAodGFibGUuaW5kZXhPZiAoaXRlbSkpLAotCQkJCQkiQnV0dG9uIiwgIi0xIiwgIi0xIn07Ci0JCQkJaXRlbS5zZXRUZXh0IChpbnNlcnQpOwotCQkJCWRhdGEuYWRkRWxlbWVudCAoaW5zZXJ0KTsKLQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9sIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCS8qIENvbnRyb2xzIHRoZSB0eXBlIG9mIFJvd0xheW91dCAqLwotCQlHcm91cCB0eXBlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQl0eXBlR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlR5cGUiKSk7Ci0JCXR5cGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJdHlwZUdyb3VwLnNldExheW91dERhdGEgKGRhdGEpOwotCQlob3Jpem9udGFsID0gbmV3IEJ1dHRvbiAodHlwZUdyb3VwLCBTV1QuUkFESU8pOwotCQlob3Jpem9udGFsLnNldFRleHQgKCJTV1QuSE9SSVpPTlRBTCIpOwotCQlob3Jpem9udGFsLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7IAotCQlob3Jpem9udGFsLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJaG9yaXpvbnRhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl2ZXJ0aWNhbCA9IG5ldyBCdXR0b24gKHR5cGVHcm91cCwgU1dULlJBRElPKTsKLQkJdmVydGljYWwuc2V0VGV4dCAoIlNXVC5WRVJUSUNBTCIpOwotCQl2ZXJ0aWNhbC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOyAKLQkJdmVydGljYWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCi0JCS8qIENvbnRyb2xzIHRoZSBtYXJnaW5zIGFuZCBzcGFjaW5nIG9mIHRoZSBSb3dMYXlvdXQgKi8KLQkJU3RyaW5nIFtdIG1hcmdpblZhbHVlcyA9IG5ldyBTdHJpbmcgW10geyIwIiwiMyIsIjUiLCIxMCJ9OwotCQlHcm91cCBtYXJnaW5Hcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hcmdpbkdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJNYXJnaW5zX1NwYWNpbmciKSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEudmVydGljYWxTcGFuID0gMjsKLQkJbWFyZ2luR3JvdXAuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQgKCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbWFyZ2luR3JvdXAuc2V0TGF5b3V0IChsYXlvdXQpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoIm1hcmdpblJpZ2h0Iik7Ci0JCW1hcmdpblJpZ2h0ID0gbmV3IENvbWJvIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpOwotCQltYXJnaW5SaWdodC5zZXRJdGVtcyAobWFyZ2luVmFsdWVzKTsKLQkJbWFyZ2luUmlnaHQuc2VsZWN0ICgxKTsKLQkJbWFyZ2luUmlnaHQuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQltYXJnaW5SaWdodC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQltYXJnaW5SaWdodC5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLQkJbmV3IExhYmVsIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJtYXJnaW5MZWZ0Iik7Ci0JCW1hcmdpbkxlZnQgPSBuZXcgQ29tYm8gKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hcmdpbkxlZnQuc2V0SXRlbXMgKG1hcmdpblZhbHVlcyk7Ci0JCW1hcmdpbkxlZnQuc2VsZWN0ICgxKTsKLQkJbWFyZ2luTGVmdC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCW1hcmdpbkxlZnQuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbWFyZ2luTGVmdC5hZGRUcmF2ZXJzZUxpc3RlbmVyKHRyYXZlcnNlTGlzdGVuZXIpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoIm1hcmdpblRvcCIpOwotCQltYXJnaW5Ub3AgPSBuZXcgQ29tYm8gKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hcmdpblRvcC5zZXRJdGVtcyAobWFyZ2luVmFsdWVzKTsKLQkJbWFyZ2luVG9wLnNlbGVjdCAoMSk7Ci0JCW1hcmdpblRvcC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCW1hcmdpblRvcC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQltYXJnaW5Ub3AuYWRkVHJhdmVyc2VMaXN0ZW5lcih0cmF2ZXJzZUxpc3RlbmVyKTsKLQkJbmV3IExhYmVsIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJtYXJnaW5Cb3R0b20iKTsKLQkJbWFyZ2luQm90dG9tID0gbmV3IENvbWJvIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpOwotCQltYXJnaW5Cb3R0b20uc2V0SXRlbXMgKG1hcmdpblZhbHVlcyk7Ci0JCW1hcmdpbkJvdHRvbS5zZWxlY3QgKDEpOwotCQltYXJnaW5Cb3R0b20uc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQltYXJnaW5Cb3R0b20uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbWFyZ2luQm90dG9tLmFkZFRyYXZlcnNlTGlzdGVuZXIodHJhdmVyc2VMaXN0ZW5lcik7Ci0JCW5ldyBMYWJlbCAobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgic3BhY2luZyIpOwotCQlzcGFjaW5nID0gbmV3IENvbWJvIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpOwotCQlzcGFjaW5nLnNldEl0ZW1zIChtYXJnaW5WYWx1ZXMpOwotCQlzcGFjaW5nLnNlbGVjdCAoMSk7Ci0JCXNwYWNpbmcuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzcGFjaW5nLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXNwYWNpbmcuYWRkVHJhdmVyc2VMaXN0ZW5lcih0cmF2ZXJzZUxpc3RlbmVyKTsKLQkJCi0JCS8qIENvbnRyb2xzIG90aGVyIHBhcmFtZXRlcnMgb2YgdGhlIFJvd0xheW91dCAqLwotCQlHcm91cCBzcGVjR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlzcGVjR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlByb3BlcnRpZXMiKSk7Ci0JCXNwZWNHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzcGVjR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXdyYXAgPSBuZXcgQnV0dG9uIChzcGVjR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXdyYXAuc2V0VGV4dCAoIndyYXAiKTsKLQkJd3JhcC5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQl3cmFwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7IAotCQl3cmFwLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXBhY2sgPSBuZXcgQnV0dG9uIChzcGVjR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXBhY2suc2V0VGV4dCAoInBhY2siKTsKLQkJcGFjay5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOyAKLQkJcGFjay5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQlwYWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWp1c3RpZnkgPSBuZXcgQnV0dG9uIChzcGVjR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWp1c3RpZnkuc2V0VGV4dCAoImp1c3RpZnkiKTsKLQkJanVzdGlmeS5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOyAKLQkJanVzdGlmeS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQkKLQkJLyogQWRkIGNvbW1vbiBjb250cm9scyAqLwotCQlzdXBlci5jcmVhdGVDb250cm9sV2lkZ2V0cyAoKTsKLQkJCi0JCS8qIFBvc2l0aW9uIHRoZSBzYXNoICovCi0JCXNhc2guc2V0V2VpZ2h0cyAobmV3IGludCBbXSB7Niw1fSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqLwotCXZvaWQgY3JlYXRlTGF5b3V0ICgpIHsKLQkJcm93TGF5b3V0ID0gbmV3IFJvd0xheW91dCAoKTsKLQkJbGF5b3V0Q29tcG9zaXRlLnNldExheW91dCAocm93TGF5b3V0KTsKLQl9Ci0JCQotCS8qKiAKLQkgKiBEaXNwb3NlcyB0aGUgZWRpdG9ycyB3aXRob3V0IHBsYWNpbmcgdGhlaXIgY29udGVudHMKLQkgKiBpbnRvIHRoZSB0YWJsZS4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFZGl0b3JzICgpIHsKLQkJY29tYm9FZGl0b3Iuc2V0RWRpdG9yIChudWxsLCBudWxsLCAtMSk7Ci0JCWNvbWJvLmRpc3Bvc2UgKCk7Ci0JCXdpZHRoVGV4dC5kaXNwb3NlICgpOwotCQloZWlnaHRUZXh0LmRpc3Bvc2UgKCk7Ci0JfQotCQotCS8qKgotCSAqIEdlbmVyYXRlcyBjb2RlIGZvciB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCQotCVN0cmluZ0J1ZmZlciBnZW5lcmF0ZUxheW91dENvZGUgKCkgewotCQlTdHJpbmdCdWZmZXIgY29kZSA9IG5ldyBTdHJpbmdCdWZmZXIgKCk7Ci0JCWNvZGUuYXBwZW5kICgiXHRcdFJvd0xheW91dCByb3dMYXlvdXQgPSBuZXcgUm93TGF5b3V0ICgpO1xuIik7Ci0JCWlmIChyb3dMYXlvdXQudHlwZSA9PSBTV1QuVkVSVElDQUwpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdHJvd0xheW91dC50eXBlID0gU1dULlZFUlRJQ0FMO1xuIik7Ci0JCX0KLQkJaWYgKHJvd0xheW91dC53cmFwID09IGZhbHNlKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQud3JhcCA9IGZhbHNlO1xuIik7Ci0JCX0gCi0JCWlmIChyb3dMYXlvdXQucGFjayA9PSBmYWxzZSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0cm93TGF5b3V0LnBhY2sgPSBmYWxzZTtcbiIpOwotCQl9Ci0JCWlmIChyb3dMYXlvdXQuanVzdGlmeSA9PSB0cnVlKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQuanVzdGlmeSA9IHRydWU7XG4iKTsKLQkJfQotCQlpZiAocm93TGF5b3V0Lm1hcmdpbkxlZnQgIT0gMykgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0cm93TGF5b3V0Lm1hcmdpbkxlZnQgPSAiICsgcm93TGF5b3V0Lm1hcmdpbkxlZnQgKyAiO1xuIik7Ci0JCX0KLQkJaWYgKHJvd0xheW91dC5tYXJnaW5SaWdodCAhPSAzKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQubWFyZ2luUmlnaHQgPSAiICsgcm93TGF5b3V0Lm1hcmdpblJpZ2h0ICsgIjtcbiIpOwotCQl9Ci0JCWlmIChyb3dMYXlvdXQubWFyZ2luVG9wICE9IDMpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdHJvd0xheW91dC5tYXJnaW5Ub3AgPSAiICsgcm93TGF5b3V0Lm1hcmdpblRvcCArICI7XG4iKTsKLQkJfQotCQlpZiAocm93TGF5b3V0Lm1hcmdpbkJvdHRvbSAhPSAzKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQubWFyZ2luQm90dG9tID0gIiArIHJvd0xheW91dC5tYXJnaW5Cb3R0b20gKyAiO1xuIik7Ci0JCX0KLQkJaWYgKHJvd0xheW91dC5zcGFjaW5nICE9IDMpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdHJvd0xheW91dC5zcGFjaW5nID0gIiArIHJvd0xheW91dC5zcGFjaW5nICsgIjtcbiIpOwotCQl9Ci0JCWNvZGUuYXBwZW5kICgiXHRcdHNoZWxsLnNldExheW91dCAocm93TGF5b3V0KTtcbiIpOwotCQkKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUNvbnRyb2wgY29udHJvbCA9IGNoaWxkcmVuIFtpXTsKLQkJCWNvZGUuYXBwZW5kIChnZXRDaGlsZENvZGUgKGNvbnRyb2wsaSkpOwotCQkJUm93RGF0YSBkYXRhID0gKFJvd0RhdGEpIGNvbnRyb2wuZ2V0TGF5b3V0RGF0YSAoKTsKLQkJCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCQlpZiAoZGF0YS53aWR0aCAhPSAtMSB8fCBkYXRhLmhlaWdodCAhPSAtMSkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHQiKTsKLQkJCQkJaWYgKGZpcnN0KSB7Ci0JCQkJCQljb2RlLmFwcGVuZCAoIlJvd0RhdGEgIik7Ci0JCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWlmIChkYXRhLndpZHRoID09IC0xKSB7Ci0JCQkJCQljb2RlLmFwcGVuZCAoImRhdGEgPSBuZXcgUm93RGF0YSAoU1dULkRFRkFVTFQsICIgKyBkYXRhLmhlaWdodCArICIpO1xuIik7Ci0JCQkJCX0gZWxzZSBpZiAoZGF0YS5oZWlnaHQgPT0gLTEpIHsKLQkJCQkJCWNvZGUuYXBwZW5kICgiZGF0YSA9IG5ldyBSb3dEYXRhICgiICsgZGF0YS53aWR0aCArICIsIFNXVC5ERUZBVUxUKTtcbiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29kZS5hcHBlbmQgKCJkYXRhID0gbmV3IFJvd0RhdGEgKCIgKyBkYXRhLndpZHRoICsgIiwgIiArIGRhdGEuaGVpZ2h0ICsgIik7XG4iKTsJCQkJCi0JCQkJCX0KLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0IiArIG5hbWVzIFtpXSArICIuc2V0TGF5b3V0RGF0YSAoZGF0YSk7XG4iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvZGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhIGZpZWxkIG5hbWVzLgotCSAqLwotCVN0cmluZyBbXSBnZXRMYXlvdXREYXRhRmllbGROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10geyAKLQkJCSIiLAotCQkJIkNvbnRyb2wiLAotCQkJIndpZHRoIiwgCi0JCQkiaGVpZ2h0IgotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJSb3dMYXlvdXQiOwotCX0KLQkKLQkvKioKLQkgKiBUYWtlcyBpbmZvcm1hdGlvbiBmcm9tIFRhYmxlRWRpdG9ycyBhbmQgc3RvcmVzIGl0LgotCSAqLwotCXZvaWQgcmVzZXRFZGl0b3JzICgpIHsKLQkJcmVzZXRFZGl0b3JzIChmYWxzZSk7Ci0JfQotCQotCXZvaWQgcmVzZXRFZGl0b3JzIChib29sZWFuIHRhYikgewotCQlUYWJsZUl0ZW0gb2xkSXRlbSA9IGNvbWJvRWRpdG9yLmdldEl0ZW0gKCk7Ci0JCWlmIChvbGRJdGVtICE9IG51bGwpIHsKLQkJCWludCByb3cgPSB0YWJsZS5pbmRleE9mIChvbGRJdGVtKTsKLQkJCS8qIE1ha2Ugc3VyZSB1c2VyIGhhcyBlbnRlcmVkIHZhbGlkIGRhdGEgKi8KLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKHdpZHRoVGV4dC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJd2lkdGhUZXh0LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoV0lEVEhfQ09MKSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyIChoZWlnaHRUZXh0LmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQloZWlnaHRUZXh0LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoSEVJR0hUX0NPTCkpOwotCQkJfQotCQkJU3RyaW5nIFtdIGluc2VydCA9IG5ldyBTdHJpbmcgW10gewotCQkJCVN0cmluZy52YWx1ZU9mIChyb3cpLCBjb21iby5nZXRUZXh0ICgpLCB3aWR0aFRleHQuZ2V0VGV4dCAoKSwgaGVpZ2h0VGV4dC5nZXRUZXh0ICgpfTsKLQkJCWRhdGEuc2V0RWxlbWVudEF0IChpbnNlcnQsIHJvdyk7Ci0JCQlmb3IgKGludCBpID0gMCA7IGkgPCBUT1RBTF9DT0xTOyBpKyspIHsKLQkJCQlvbGRJdGVtLnNldFRleHQgKGksICgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChyb3cpKSBbaV0pOwotCQkJfQotCQkJaWYgKCF0YWIpIGRpc3Bvc2VFZGl0b3JzICgpOwotCQl9Ci0JCXNldExheW91dFN0YXRlICgpOwotCQlyZWZyZXNoTGF5b3V0Q29tcG9zaXRlICgpOwotCQlzZXRMYXlvdXREYXRhICgpOwotCQlsYXlvdXRDb21wb3NpdGUubGF5b3V0ICh0cnVlKTsKLQkJbGF5b3V0R3JvdXAubGF5b3V0ICh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbGF5b3V0IGRhdGEgZm9yIHRoZSBjaGlsZHJlbiBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0RGF0YSAoKSB7Ci0JCUNvbnRyb2wgW10gY2hpbGRyZW4gPSBsYXlvdXRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4gKCk7Ci0JCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zICgpOwotCQlSb3dEYXRhIGRhdGE7Ci0JCWludCB3aWR0aCwgaGVpZ2h0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQl3aWR0aCA9IG5ldyBJbnRlZ2VyIChpdGVtcyBbaV0uZ2V0VGV4dCAoV0lEVEhfQ09MKSkuaW50VmFsdWUgKCk7Ci0JCQloZWlnaHQgPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKEhFSUdIVF9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCWRhdGEgPSBuZXcgUm93RGF0YSAod2lkdGgsIGhlaWdodCk7Ci0JCQljaGlsZHJlbiBbaV0uc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBzZXRMYXlvdXRTdGF0ZSAoKSB7Ci0JCS8qIFNldCB0aGUgdHlwZSBvZiBsYXlvdXQgKi8KLQkJaWYgKHZlcnRpY2FsLmdldFNlbGVjdGlvbiAoKSkgewotCQkJcm93TGF5b3V0LnR5cGUgPSBTV1QuVkVSVElDQUw7Ci0JCX0gZWxzZSB7Ci0JCQlyb3dMYXlvdXQudHlwZSA9IFNXVC5IT1JJWk9OVEFMOwotCQl9Ci0JCQotCQkvKiBTZXQgdGhlIG1hcmdpbnMgYW5kIHNwYWNpbmcgKi8KLQkJdHJ5IHsKLQkJCXJvd0xheW91dC5tYXJnaW5SaWdodCA9IG5ldyBJbnRlZ2VyIChtYXJnaW5SaWdodC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJvd0xheW91dC5tYXJnaW5SaWdodCA9IDM7Ci0JCQltYXJnaW5SaWdodC5zZWxlY3QgKDEpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyb3dMYXlvdXQubWFyZ2luTGVmdCA9IG5ldyBJbnRlZ2VyIChtYXJnaW5MZWZ0LmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcm93TGF5b3V0Lm1hcmdpbkxlZnQgPSAzOwotCQkJbWFyZ2luTGVmdC5zZWxlY3QgKDEpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyb3dMYXlvdXQubWFyZ2luVG9wID0gbmV3IEludGVnZXIgKG1hcmdpblRvcC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJvd0xheW91dC5tYXJnaW5Ub3AgPSAzOwotCQkJbWFyZ2luVG9wLnNlbGVjdCAoMSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJvd0xheW91dC5tYXJnaW5Cb3R0b20gPSBuZXcgSW50ZWdlciAobWFyZ2luQm90dG9tLmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcm93TGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDM7Ci0JCQltYXJnaW5Cb3R0b20uc2VsZWN0ICgxKTsKLQkJfQotCQl0cnkgewotCQkJcm93TGF5b3V0LnNwYWNpbmcgPSBuZXcgSW50ZWdlciAoc3BhY2luZy5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJvd0xheW91dC5zcGFjaW5nID0gMzsKLQkJCXNwYWNpbmcuc2VsZWN0ICgxKTsKLQkJfQotCQkKLQkJLyogU2V0IHRoZSBvdGhlciBsYXlvdXQgcHJvcGVydGllcyAqLwotCQlyb3dMYXlvdXQud3JhcCA9IHdyYXAuZ2V0U2VsZWN0aW9uICgpOwotCQlyb3dMYXlvdXQucGFjayA9IHBhY2suZ2V0U2VsZWN0aW9uICgpOwotCQlyb3dMYXlvdXQuanVzdGlmeSA9IGp1c3RpZnkuZ2V0U2VsZWN0aW9uICgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWVmZTdkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRleGFtcGxlOwotCi0gCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogPGNvZGU+VGFiPC9jb2RlPiBpcyB0aGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBldmVyeSBwYWdlCi0gKiBpbiB0aGUgZXhhbXBsZSdzIHRhYiBmb2xkZXIuICBFYWNoIHBhZ2UgaW4gdGhlIHRhYiBmb2xkZXIKLSAqIGRpc3BsYXlzIGEgbGF5b3V0LCBhbmQgYWxsb3dzIHRoZSB1c2VyIHRvIG1hbmlwdWxhdGUgdGhlCi0gKiBsYXlvdXQuCi0gKgotICogQSB0eXBpY2FsIHBhZ2UgaW4gYSBUYWIgY29udGFpbnMgYSB0d28gY29sdW1uIGNvbXBvc2l0ZS4KLSAqIFRoZSBsZWZ0IGNvbHVtbiBjb250YWlucyB0aGUgbGF5b3V0IGdyb3VwLCB3aGljaCBjb250YWlucwotICogdGhlICJsYXlvdXQgY29tcG9zaXRlIiAodGhlIG9uZSB0aGF0IGhhcyB0aGUgZXhhbXBsZSBsYXlvdXQpLgotICogVGhlIHJpZ2h0IGNvbHVtbiBjb250YWlucyB0aGUgImNvbnRyb2wiIGdyb3VwLiBUaGUgImNvbnRyb2wiCi0gKiBncm91cCBhbGxvd3MgdGhlIHVzZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgZXhhbXBsZS4gVHlwaWNhbAotICogb3BlcmF0aW9ucyBhcmUgbW9kaWZ5aW5nIGxheW91dCBwYXJhbWV0ZXJzLCBhZGRpbmcgY2hpbGRyZW4KLSAqIHRvIHRoZSAibGF5b3V0IGNvbXBvc2l0ZSIsIGFuZCBtb2RpZnlpbmcgY2hpbGQgbGF5b3V0IGRhdGEuCi0gKiBUaGUgIkNvZGUiIGJ1dHRvbiBpbiB0aGUgImNvbnRyb2wiIGdyb3VwIG9wZW5zIGEgbmV3IHdpbmRvdwotICogY29udGFpbmluZyBjb2RlIHRoYXQgd2lsbCByZWdlbmVyYXRlIHRoZSBsYXlvdXQuIFRoaXMgY29kZQotICogKG9yIHBhcnRzIG9mIGl0KSBjYW4gYmUgc2VsZWN0ZWQgYW5kIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLgotICovCi1hYnN0cmFjdCBjbGFzcyBUYWIgewkKLQkvKiBDb21tb24gZ3JvdXBzIGFuZCBjb21wb3NpdGVzICovCi0JQ29tcG9zaXRlIHRhYkZvbGRlclBhZ2U7Ci0JU2FzaEZvcm0gc2FzaDsKLQlHcm91cCBsYXlvdXRHcm91cCwgY29udHJvbEdyb3VwLCBjaGlsZEdyb3VwOwotCS8qIFRoZSBjb21wb3NpdGUgdGhhdCBjb250YWlucyB0aGUgZXhhbXBsZSBsYXlvdXQgKi8KLQlDb21wb3NpdGUgbGF5b3V0Q29tcG9zaXRlOwotCS8qIENvbW1vbiBjb250cm9scyBmb3IgbW9kaWZ5aW5nIHRoZSBleGFtcGxlIGxheW91dCAqLwotCVN0cmluZyBbXSBuYW1lczsKLQlDb250cm9sIFtdIGNoaWxkcmVuOwotCUJ1dHRvbiBzaXplLCBhZGQsIGRlbGV0ZSwgY2xlYXIsIGNvZGU7Ci0JLyogQ29tbW9uIHZhbHVlcyBmb3Igd29ya2luZyB3aXRoIFRhYmxlRWRpdG9ycyAqLwotCVRhYmxlIHRhYmxlOwotCWludCBpbmRleDsKLQlUYWJsZUl0ZW0gbmV3SXRlbSwgbGFzdFNlbGVjdGVkOwotCVZlY3RvciBkYXRhID0gbmV3IFZlY3RvciAoKTsKLQkvKiBDb250cm9sbGluZyBpbnN0YW5jZSAqLwotCWZpbmFsIExheW91dEV4YW1wbGUgaW5zdGFuY2U7Ci0KLQkvKiBMaXN0ZW5lcnMgKi8KLQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJfQotCX07Ci0JCQotCVRyYXZlcnNlTGlzdGVuZXIgdHJhdmVyc2VMaXN0ZW5lciA9IG5ldyBUcmF2ZXJzZUxpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkIChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfUkVUVVJOKSB7Ci0JCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBMYXlvdXRFeGFtcGxlLgotCSAqLwotCVRhYihMYXlvdXRFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgImNoaWxkIiBncm91cC4gVGhpcyBpcyB0aGUgZ3JvdXAgdGhhdCBhbGxvd3MKLQkgKiB5b3UgdG8gYWRkIGNoaWxkcmVuIHRvIHRoZSBsYXlvdXQuIEl0IGV4aXN0cyB3aXRoaW4gdGhlCi0JICogY29udHJvbEdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlQ2hpbGRHcm91cCAoKSB7Ci0JCWNoaWxkR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQljaGlsZEdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNoaWxkcmVuIikpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWNoaWxkR3JvdXAuc2V0TGF5b3V0IChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJY2hpbGRHcm91cC5zZXRMYXlvdXREYXRhIChkYXRhKTsgCi0JCWNyZWF0ZUNoaWxkV2lkZ2V0cyAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbHMgZm9yIG1vZGlmeWluZyB0aGUgImNoaWxkcmVuIiAKLQkgKiB0YWJsZSwgYW5kIHRoZSB0YWJsZSBpdHNlbGYuCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBhdWdtZW50IHRoZQotCSAqIHN0YW5kYXJkIHRhYmxlLgotCSAqLwotCXZvaWQgY3JlYXRlQ2hpbGRXaWRnZXRzICgpIHsKLQkJLyogQ29udHJvbHMgZm9yIGFkZGluZyBhbmQgcmVtb3ZpbmcgY2hpbGRyZW4gKi8KLQkJYWRkID0gbmV3IEJ1dHRvbiAoY2hpbGRHcm91cCwgU1dULlBVU0gpOwotCQlhZGQuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkFkZCIpKTsKLQkJYWRkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZGVsZXRlID0gbmV3IEJ1dHRvbiAoY2hpbGRHcm91cCwgU1dULlBVU0gpOwotCQlkZWxldGUuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkRlbGV0ZSIpKTsKLQkJZGVsZXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZGVsZXRlLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQlpbnQgW10gc2VsZWN0ZWQgPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzICgpOwotCQkJCXRhYmxlLnJlbW92ZSAoc2VsZWN0ZWQpOwotCQkJCS8qIFJlZnJlc2ggdGhlIGNvbnRyb2wgaW5kaWNlcyBvZiB0aGUgdGFibGUgKi8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlLmdldEl0ZW1Db3VudCgpOyBpKyspIHsKLQkJCQkJdGFibGUuZ2V0SXRlbSAoaSkuc2V0VGV4dCAoMCwgU3RyaW5nLnZhbHVlT2YgKGkpKTsKLQkJCQl9Ci0JCQkJcmVmcmVzaExheW91dENvbXBvc2l0ZSAoKTsKLQkJCQlsYXlvdXRDb21wb3NpdGUubGF5b3V0ICh0cnVlKTsKLQkJCQlsYXlvdXRHcm91cC5sYXlvdXQgKHRydWUpOwotCQkJfQotCQl9KTsKLQkJY2xlYXIgPSBuZXcgQnV0dG9uIChjaGlsZEdyb3VwLCBTV1QuUFVTSCk7Ci0JCWNsZWFyLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDbGVhciIpKTsKLQkJY2xlYXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljbGVhci5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJY2hpbGRyZW4gPSBsYXlvdXRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4gKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQljaGlsZHJlbiBbaV0uZGlzcG9zZSAoKTsKLQkJCQl9Ci0JCQkJdGFibGUucmVtb3ZlQWxsICgpOwotCQkJCWRhdGEuY2xlYXIgKCk7Ci0JCQkJY2hpbGRyZW4gPSBuZXcgQ29udHJvbCBbMF07Ci0JCQkJbGF5b3V0R3JvdXAubGF5b3V0ICh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCS8qIENyZWF0ZSB0aGUgImNoaWxkcmVuIiB0YWJsZSAqLwotCQl0YWJsZSA9IG5ldyBUYWJsZSAoY2hpbGRHcm91cCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5ISURFX1NFTEVDVElPTik7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUgKHRydWUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTUwOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhIChncmlkRGF0YSk7Ci0JCXRhYmxlLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotCQkKLQkJLyogQWRkIGNvbHVtbnMgdG8gdGhlIHRhYmxlICovCi0JCVN0cmluZyBbXSBjb2x1bW5IZWFkZXJzID0gZ2V0TGF5b3V0RGF0YUZpZWxkTmFtZXMgKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uSGVhZGVycy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQljb2x1bW4uc2V0VGV4dCAoY29sdW1uSGVhZGVycyBbaV0pOwotCQkJaWYgKGkgPT0gMCkgY29sdW1uLnNldFdpZHRoICgyMCk7Ci0JCQllbHNlIGlmIChpID09IDEpIGNvbHVtbi5zZXRXaWR0aCAoODApOwotCQkJZWxzZSBjb2x1bW4ucGFjayAoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYmxlRWRpdG9yIHdpdGggYSBDQ29tYm8gaW4gdGhlIGZpcnN0IGNvbHVtbgotCSAqIG9mIHRoZSB0YWJsZS4gVGhpcyBDQ29tYm8gbGlzdHMgYWxsIHRoZSBjb250cm9scyB0aGF0Ci0JICogdGhlIHVzZXIgY2FuIHNlbGVjdCB0byBwbGFjZSBvbiB0aGVpciBsYXlvdXQuCi0JICovCi0Jdm9pZCBjcmVhdGVDb21ib0VkaXRvciAoQ0NvbWJvIGNvbWJvLCBUYWJsZUVkaXRvciBjb21ib0VkaXRvcikgewotCQljb21iby5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7Ci0JCQkiQnV0dG9uIiwgIkNhbnZhcyIsICJDb21ibyIsICJDb21wb3NpdGUiLAotCQkJIkNvb2xCYXIiLCAiR3JvdXAiLCAiTGFiZWwiLCAiTGlzdCIsCi0JCQkiUHJvZ3Jlc3NCYXIiLCAiU2NhbGUiLCAiU2xpZGVyIiwgIlN0eWxlZFRleHQiLAotCQkJIlRhYmxlIiwgIlRleHQiLCAiVG9vbEJhciIsICJUcmVlIn0pOwotCQljb21iby5zZXRUZXh0IChuZXdJdGVtLmdldFRleHQgKDEpKTsKLQkJCi0JCS8qIFNldCB1cCBlZGl0b3IgKi8KLQkJY29tYm9FZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQljb21ib0VkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCWNvbWJvRWRpdG9yLm1pbmltdW1XaWR0aCA9IDUwOwotCQljb21ib0VkaXRvci5zZXRFZGl0b3IgKGNvbWJvLCBuZXdJdGVtLCAxKTsKLQkJCi0JCS8qIEFkZCBsaXN0ZW5lciAqLwotCQljb21iby5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotICAgICAgICAJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotICAgICAgICAgICAgCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX05FWFQgfHwgZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotICAgICAgICAgICAgICAgICAgICByZXNldEVkaXRvcnMgKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfRVNDQVBFKSB7Ci0gICAgICAgICAgICAgICAgCWRpc3Bvc2VFZGl0b3JzICgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJjb250cm9sIiBncm91cC4gVGhpcyBpcyB0aGUgZ3JvdXAgb24gdGhlCi0JICogcmlnaHQgaGFsZiBvZiBlYWNoIGV4YW1wbGUgdGFiLiBJdCBjb250YWlucyBjb250cm9scwotCSAqIGZvciBhZGRpbmcgbmV3IGNoaWxkcmVuIHRvIHRoZSBsYXlvdXRDb21wb3NpdGUsIGFuZAotCSAqIGZvciBtb2RpZnlpbmcgdGhlIGNoaWxkcmVuJ3MgbGF5b3V0IGRhdGEuCi0JICovCQotCXZvaWQgY3JlYXRlQ29udHJvbEdyb3VwICgpIHsKLQkJY29udHJvbEdyb3VwID0gbmV3IEdyb3VwIChzYXNoLCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXJhbWV0ZXJzIikpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXQgKGxheW91dCk7Ci0JCXNpemUgPSBuZXcgQnV0dG9uIChjb250cm9sR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNpemUuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlByZWZlcnJlZF9TaXplIikpOwotCQlzaXplLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQlzaXplLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQlpZiAoc2l6ZS5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCQkJbGF5b3V0Q29tcG9zaXRlLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoKSk7Ci0JCQkJCWxheW91dEdyb3VwLmxheW91dCAodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGF5b3V0Q29tcG9zaXRlLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQkJCWxheW91dEdyb3VwLmxheW91dCAodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNpemUuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCWNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpOwotCX0KLQkJCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgImNvbnRyb2wiIHdpZGdldCBjaGlsZHJlbi4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGF1Z21lbnQKLQkgKiB0aGUgc3RhbmRhcmQgY29udHJvbHMgY3JlYXRlZC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkJY3JlYXRlQ2hpbGRHcm91cCAoKTsKLQkJY29kZSA9IG5ldyBCdXR0b24gKGNvbnRyb2xHcm91cCwgU1dULlBVU0gpOwotCQljb2RlLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDb2RlIikpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWNvZGUuc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQljb2RlLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsICgpOwkKLQkJCQlzaGVsbC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiR2VuZXJhdGVkX0NvZGUiKSk7Ci0JCQkJc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JCQkJZmluYWwgU3R5bGVkVGV4dCB0ZXh0ID0gbmV3IFN0eWxlZFRleHQgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJCQlTdHJpbmcgbGF5b3V0Q29kZSA9IGdlbmVyYXRlQ29kZSAoKS50b1N0cmluZyAoKTsKLQkJCQlpZiAobGF5b3V0Q29kZS5sZW5ndGggKCkgPT0gMCkgcmV0dXJuOwotCQkJCXRleHQuc2V0VGV4dCAobGF5b3V0Q29kZSk7Ci0JCQkJCi0JCQkJTWVudSBiYXIgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5CQVIpOwotCQkJCXNoZWxsLnNldE1lbnVCYXIgKGJhcik7Ci0JCQkJTWVudUl0ZW0gZWRpdEl0ZW0gPSBuZXcgTWVudUl0ZW0gKGJhciwgU1dULkNBU0NBREUpOwotCQkJCWVkaXRJdGVtLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJFZGl0IikpOwotCQkJCU1lbnUgbWVudSA9IG5ldyBNZW51IChiYXIpOwotCQkJCU1lbnVJdGVtIHNlbGVjdCA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCQkJCXNlbGVjdC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU2VsZWN0X0FsbCIpKTsKLQkJCQlzZWxlY3Quc2V0QWNjZWxlcmF0b3IgKFNXVC5NT0QxICsgJ0EnKTsKLQkJCQlzZWxlY3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXRleHQuc2VsZWN0QWxsICgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJTWVudUl0ZW0gY29weSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCQkJCWNvcHkuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNvcHkiKSk7Ci0JCQkJY29weS5zZXRBY2NlbGVyYXRvciAoU1dULk1PRDEgKyAnQycpOwotCQkJCWNvcHkuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXRleHQuY29weSAoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCU1lbnVJdGVtIGV4aXQgPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQkJCQlleGl0LnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJFeGl0IikpOwotCQkJCWV4aXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXNoZWxsLmNsb3NlICgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJZWRpdEl0ZW0uc2V0TWVudSAobWVudSk7Ci0JCQkJCi0JCQkJc2hlbGwucGFjayAoKTsKLQkJCQlzaGVsbC5zZXRTaXplICg0MDAsIDUwMCk7Ci0JCQkJc2hlbGwub3BlbiAoKTsKLQkJCQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5ICgpOwotCQkJCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkKLQkJCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0Jdm9pZCBjcmVhdGVMYXlvdXQgKCkgewotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb21wb3NpdGUgdGhhdCBjb250YWlucyB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBjcmVhdGVMYXlvdXRDb21wb3NpdGUgKCkgewotCQlsYXlvdXRDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChsYXlvdXRHcm91cCwgU1dULkJPUkRFUik7Ci0JCWxheW91dENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljcmVhdGVMYXlvdXQgKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxheW91dCBncm91cC4gVGhpcyBpcyB0aGUgZ3JvdXAgb24gdGhlCi0JICogbGVmdCBoYWxmIG9mIGVhY2ggZXhhbXBsZSB0YWIuCi0JICovCi0Jdm9pZCBjcmVhdGVMYXlvdXRHcm91cCAoKSB7Ci0JCWxheW91dEdyb3VwID0gbmV3IEdyb3VwIChzYXNoLCBTV1QuTk9ORSk7Ci0JCWxheW91dEdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxheW91dCIpKTsKLQkJbGF5b3V0R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWNyZWF0ZUxheW91dENvbXBvc2l0ZSAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFiIGZvbGRlciBwYWdlLgotCSAqCi0JICogQHBhcmFtIHRhYkZvbGRlciBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGFnZSBmb3IgdGhlIHRhYiBmb2xkZXIKLQkgKi8KLQlDb21wb3NpdGUgY3JlYXRlVGFiRm9sZGVyUGFnZSAoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQkvKiBDcmVhdGUgYSB0d28gY29sdW1uIHBhZ2Ugd2l0aCBhIFNhc2hGb3JtKi8KLQkJdGFiRm9sZGVyUGFnZSA9IG5ldyBDb21wb3NpdGUgKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQl0YWJGb2xkZXJQYWdlLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCQlzYXNoID0gbmV3IFNhc2hGb3JtICh0YWJGb2xkZXJQYWdlLCBTV1QuSE9SSVpPTlRBTCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgImxheW91dCIgYW5kICJjb250cm9sIiBjb2x1bW5zICovCi0JCWNyZWF0ZUxheW91dEdyb3VwICgpOwotCQljcmVhdGVDb250cm9sR3JvdXAgKCk7Ci0JCQotCQlyZXR1cm4gdGFiRm9sZGVyUGFnZTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFibGVFZGl0b3Igd2l0aCBhIFRleHQgaW4gdGhlIGdpdmVuIGNvbHVtbgotCSAqIG9mIHRoZSB0YWJsZS4KLQkgKi8KLQl2b2lkIGNyZWF0ZVRleHRFZGl0b3IgKFRleHQgdGV4dCwgVGFibGVFZGl0b3IgdGV4dEVkaXRvciwgaW50IGNvbHVtbikgewotCQl0ZXh0LnNldEZvbnQgKHRhYmxlLmdldEZvbnQgKCkpOwotCQl0ZXh0LnNlbGVjdEFsbCAoKTsKLQkJdGV4dEVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCXRleHRFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQl0ZXh0RWRpdG9yLnNldEVkaXRvciAodGV4dCwgbmV3SXRlbSwgY29sdW1uKTsKLQkJCi0JCXRleHQuYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgIAlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc2V0RWRpdG9ycyAodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfRVNDQVBFKSB7Ci0gICAgICAgICAgICAgICAgCWRpc3Bvc2VFZGl0b3JzICgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0JfQotCQotCS8qKiAKLQkgKiBEaXNwb3NlcyB0aGUgZWRpdG9ycyB3aXRob3V0IHBsYWNpbmcgdGhlaXIgY29udGVudHMKLQkgKiBpbnRvIHRoZSB0YWJsZS4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXZvaWQgZGlzcG9zZUVkaXRvcnMgKCkgewotCX0KLQkKLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIGNvZGUgbmVlZGVkIHRvIHByb2R1Y2UgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqLwkKLQlTdHJpbmdCdWZmZXIgZ2VuZXJhdGVDb2RlICgpIHsKLQkJLyogTWFrZSBzdXJlIGFsbCBpbmZvcm1hdGlvbiBiZWluZyBlbnRlcmVkIGlzIHN0b3JlZCBpbiB0aGUgdGFibGUgKi8KLQkJcmVzZXRFZGl0b3JzICgpOwotCQkKLQkJLyogR2V0IG5hbWVzIGZvciBjb250cm9scyBpbiB0aGUgbGF5b3V0ICovCi0JCW5hbWVzID0gbmV3IFN0cmluZyBbY2hpbGRyZW4ubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJQ29udHJvbCBjb250cm9sID0gY2hpbGRyZW4gW2ldOwotCQkJU3RyaW5nIGNvbnRyb2xDbGFzcyA9IGNvbnRyb2wuZ2V0Q2xhc3MgKCkudG9TdHJpbmcgKCk7Ci0JCQlTdHJpbmcgY29udHJvbFR5cGUgPSBjb250cm9sQ2xhc3Muc3Vic3RyaW5nIChjb250cm9sQ2xhc3MubGFzdEluZGV4T2YgKCcuJykgKyAxKTsKLQkJCW5hbWVzIFtpXSA9IGNvbnRyb2xUeXBlLnRvTG93ZXJDYXNlICgpICsgaTsKLQkJfQotCQotCQkvKiBDcmVhdGUgU3RyaW5nQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvZGUgKi8KLQkJU3RyaW5nQnVmZmVyIGNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyICgpOwotCQljb2RlLmFwcGVuZCAoImltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjtcbiIpOwotCQljb2RlLmFwcGVuZCAoImltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7XG4iKTsKLQkJY29kZS5hcHBlbmQgKCJpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7XG4iKTsKLQkJY29kZS5hcHBlbmQgKCJpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qO1xuIik7Ci0JCWNvZGUuYXBwZW5kICgiaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7XG5cbiIpOwotCQljb2RlLmFwcGVuZCAoInB1YmxpYyBjbGFzcyBNeUxheW91dCB7XG4iKTsKLQkJY29kZS5hcHBlbmQgKCJcdHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykge1xuIik7Ci0JCWNvZGUuYXBwZW5kICgiXHRcdERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpO1xuIik7Ci0JCWNvZGUuYXBwZW5kICgiXHRcdFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTtcbiIpOwotCQkKLQkJLyogR2V0IGxheW91dCBzcGVjaWZpYyBjb2RlICovCi0JCWNvZGUuYXBwZW5kIChnZW5lcmF0ZUxheW91dENvZGUgKCkpOwotCQkKLQkJY29kZS5hcHBlbmQgKCJcblx0XHRzaGVsbC5wYWNrICgpO1xuXHRcdHNoZWxsLm9wZW4gKCk7XG5cbiIpOwotCQljb2RlLmFwcGVuZCAoIlx0XHR3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHtcbiIpOwotCQljb2RlLmFwcGVuZCAoIlx0XHRcdGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpXG4iKTsKLQkJY29kZS5hcHBlbmQgKCJcdFx0XHRcdGRpc3BsYXkuc2xlZXAgKCk7XG5cdFx0fVxuXHRcdGRpc3BsYXkuZGlzcG9zZSAoKTtcblx0fVxufSIpOwotCQkKLQkJcmV0dXJuIGNvZGU7Ci0JfQotCQotCS8qKgotCSAqIEdlbmVyYXRlcyBsYXlvdXQgc3BlY2lmaWMgY29kZSBmb3IgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JU3RyaW5nQnVmZmVyIGdlbmVyYXRlTGF5b3V0Q29kZSAoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyICgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBTdHJpbmdCdWZmZXIgZm9yIHRoZSBjb2RlIHdoaWNoIHdpbGwgCi0JICogY3JlYXRlIGEgY2hpbGQgY29udHJvbC4KLQkgKi8KLQlTdHJpbmdCdWZmZXIgZ2V0Q2hpbGRDb2RlIChDb250cm9sIGNvbnRyb2wsIGludCBpKSB7Ci0JCVN0cmluZ0J1ZmZlciBjb2RlID0gbmV3IFN0cmluZ0J1ZmZlciAoKTsKLQkJLyogRmluZCB0aGUgdHlwZSBvZiBjb250cm9sICovCi0JCVN0cmluZyBjb250cm9sQ2xhc3MgPSBjb250cm9sLmdldENsYXNzKCkudG9TdHJpbmcgKCk7Ci0JCVN0cmluZyBjb250cm9sVHlwZSA9IGNvbnRyb2xDbGFzcy5zdWJzdHJpbmcgKGNvbnRyb2xDbGFzcy5sYXN0SW5kZXhPZiAoJy4nKSArIDEpOwotCQkvKiBGaW5kIHRoZSBzdHlsZSBvZiB0aGUgY29udHJvbCAqLwotCQlTdHJpbmcgc3R5bGVTdHJpbmc7Ci0JCWlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJCdXR0b24iKSkgewotCQkJc3R5bGVTdHJpbmcgPSAiU1dULlBVU0giOwotCQl9IGVsc2UgaWYgKGNvbnRyb2xUeXBlLmVxdWFscyAoIlRleHQiKSkgewotCQkJc3R5bGVTdHJpbmcgPSAiU1dULkJPUkRFUiI7Ci0JCX0gZWxzZSBpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiU3R5bGVkVGV4dCIpKSB7Ci0JCQlzdHlsZVN0cmluZyA9ICJTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIjsKLQkJfSBlbHNlIGlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJDYW52YXMiKSB8fCBjb250cm9sVHlwZS5lcXVhbHMgKCJDb21wb3NpdGUiKSB8fCAKLQkJCQkJY29udHJvbFR5cGUuZXF1YWxzICgiVGFibGUiKSB8fCBjb250cm9sVHlwZS5lcXVhbHMgKCJTdHlsZWRUZXh0IikgfHwKLQkJCQkJY29udHJvbFR5cGUuZXF1YWxzICgiVG9vbEJhciIpIHx8IGNvbnRyb2xUeXBlLmVxdWFscyAoIlRyZWUiKSB8fAotCQkJCQljb250cm9sVHlwZS5lcXVhbHMgKCJMaXN0IikpIHsKLQkJCXN0eWxlU3RyaW5nID0gIlNXVC5CT1JERVIiOwotCQl9IGVsc2Ugc3R5bGVTdHJpbmcgPSAiU1dULk5PTkUiOwotCQkvKiBXcml0ZSBvdXQgdGhlIGNvbnRyb2wgYmVpbmcgZGVjbGFyZWQgKi8KLQkJY29kZS5hcHBlbmQgKCJcblx0XHQiICsgY29udHJvbFR5cGUgKyAiICIgKyBuYW1lcyBbaV0gKyAKLQkJCQkJICIgPSBuZXcgIiArIGNvbnRyb2xUeXBlICsgIiAoc2hlbGwsICIgKyBzdHlsZVN0cmluZyArICIpO1xuIik7Ci0JCS8qIEFkZCBpdGVtcyB0byB0aG9zZSBjb250cm9scyB0aGF0IG5lZWQgaXRlbXMgKi8KLQkJaWYgKGNvbnRyb2xUeXBlLmVxdWFscyAoIkNvbWJvIikgfHwgY29udHJvbFR5cGUuZXF1YWxzICgiTGlzdCIpKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHQiICsgbmFtZXMgW2ldICsgIi5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7XCJJdGVtIDFcIiwgXCJJdGVtIDJcIiwgXCJJdGVtIDJcIn0pO1xuIik7Ci0JCX0gZWxzZSBpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiVGFibGUiKSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0IiArIG5hbWVzIFtpXSArICIuc2V0TGluZXNWaXNpYmxlICh0cnVlKTtcbiIpOwotCQkJZm9yIChpbnQgaiA9IDE7IGogPCAzOyBqKyspIHsKLQkJCQljb2RlLmFwcGVuZCAoIlx0XHRUYWJsZUl0ZW0gdGFibGVJdGVtIiArIGogKyAiID0gbmV3IFRhYmxlSXRlbSAoIiArIG5hbWVzIFtpXSArICIsIFNXVC5OT05FKTtcbiIpOwotCQkJCWNvZGUuYXBwZW5kICgiXHRcdHRhYmxlSXRlbSIgKyBqICsgIi5zZXRUZXh0IChcIkl0ZW0iICsgaiArICJcIik7XG4iKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJUcmVlIikpIHsKLQkJCWZvciAoaW50IGogPSAxOyBqIDwgMzsgaisrKSB7Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0VHJlZUl0ZW0gdHJlZUl0ZW0iICsgaiArICIgPSBuZXcgVHJlZUl0ZW0gKCIgKyBuYW1lcyBbaV0gKyAiLCBTV1QuTk9ORSk7XG4iKTsKLQkJCQljb2RlLmFwcGVuZCAoIlx0XHR0cmVlSXRlbSIgKyBqICsgIi5zZXRUZXh0IChcIkl0ZW0iICsgaiArICJcIik7XG4iKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJUb29sQmFyIikpIHsKLQkJCWZvciAoaW50IGogPSAxOyBqIDwgMzsgaisrKSB7Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0VG9vbEl0ZW0gdG9vbEl0ZW0iICsgaiArICIgPSBuZXcgVG9vbEl0ZW0gKCIgKyBuYW1lcyBbaV0gKyAiLCBTV1QuTk9ORSk7XG4iKTsKLQkJCQljb2RlLmFwcGVuZCAoIlx0XHR0b29sSXRlbSIgKyBqICsgIi5zZXRUZXh0IChcIkl0ZW0iICsgaiArICJcIik7XG4iKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJDb29sQmFyIikpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdFRvb2xCYXIgY29vbFRvb2xCYXIgPSBuZXcgVG9vbEJhciAoIiArIG5hbWVzIFtpXSArICIsIFNXVC5CT1JERVIpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRUb29sSXRlbSBjb29sVG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGNvb2xUb29sQmFyLCBTV1QuTk9ORSk7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xUb29sSXRlbS5zZXRUZXh0IChcIkl0ZW0gMVwiKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbFRvb2xJdGVtID0gbmV3IFRvb2xJdGVtIChjb29sVG9vbEJhciwgU1dULk5PTkUpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sVG9vbEl0ZW0uc2V0VGV4dCAoXCJJdGVtIDJcIik7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdENvb2xJdGVtIGNvb2xJdGVtMSA9IG5ldyBDb29sSXRlbSAoIiArIG5hbWVzIFtpXSArICIsIFNXVC5OT05FKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbEl0ZW0xLnNldENvbnRyb2wgKGNvb2xUb29sQmFyKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0UG9pbnQgc2l6ZSA9IGNvb2xUb29sQmFyLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sSXRlbTEuc2V0U2l6ZSAoY29vbEl0ZW0xLmNvbXB1dGVTaXplIChzaXplLngsIHNpemUueSkpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sVG9vbEJhciA9IG5ldyBUb29sQmFyICgiICsgbmFtZXMgW2ldICsgIiwgU1dULkJPUkRFUik7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xUb29sSXRlbSA9IG5ldyBUb29sSXRlbSAoY29vbFRvb2xCYXIsIFNXVC5OT05FKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbFRvb2xJdGVtLnNldFRleHQgKFwiSXRlbSAzXCIpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sVG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGNvb2xUb29sQmFyLCBTV1QuTk9ORSk7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xUb29sSXRlbS5zZXRUZXh0IChcIkl0ZW0gNFwiKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Q29vbEl0ZW0gY29vbEl0ZW0yID0gbmV3IENvb2xJdGVtICgiICsgbmFtZXMgW2ldICsgIiwgU1dULk5PTkUpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sSXRlbTIuc2V0Q29udHJvbCAoY29vbFRvb2xCYXIpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRzaXplID0gY29vbFRvb2xCYXIuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xJdGVtMi5zZXRTaXplIChjb29sSXRlbTIuY29tcHV0ZVNpemUgKHNpemUueCwgc2l6ZS55KSk7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdCIgKyBuYW1lcyBbaV0gKyAiLnNldFNpemUgKCIgKyBuYW1lcyBbaV0gKyAiLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTtcbiIpOwotCQl9IGVsc2UgaWYgKGNvbnRyb2xUeXBlLmVxdWFscyAoIlByb2dyZXNzQmFyIikpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdCIgKyBuYW1lcyBbaV0gKyAiLnNldFNlbGVjdGlvbiAoNTApO1xuIik7Ci0JCX0gCi0JCS8qIFNldCB0ZXh0IGZvciB0aG9zZSBjb250cm9scyB0aGF0IHN1cHBvcnQgaXQgKi8JCQkgCi0JCWlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJCdXR0b24iKSB8fAotCQkJY29udHJvbFR5cGUuZXF1YWxzICgiQ29tYm8iKSB8fAotCQkJY29udHJvbFR5cGUuZXF1YWxzICgiR3JvdXAiKSB8fAotCQkJY29udHJvbFR5cGUuZXF1YWxzICgiTGFiZWwiKSB8fAotCQkJY29udHJvbFR5cGUuZXF1YWxzICgiU3R5bGVkVGV4dCIpIHx8Ci0JCQljb250cm9sVHlwZS5lcXVhbHMgKCJUZXh0IikpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdCIgKyBuYW1lcyBbaV0gKyAiLnNldFRleHQgKFwiIiArIG5hbWVzIFtpXSArICJcIik7XG4iKTsKLQkJfQotCQlyZXR1cm4gY29kZTsKLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhIGZpZWxkIG5hbWVzLgotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JU3RyaW5nIFtdIGdldExheW91dERhdGFGaWVsZE5hbWVzICgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10ge307Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0JCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBjb21wb3NpdGUgYW5kIGRyYXdzIGFsbCBjb250cm9scwotCSAqIGluIHRoZSBsYXlvdXQgZXhhbXBsZS4KLQkgKi8KLQl2b2lkIHJlZnJlc2hMYXlvdXRDb21wb3NpdGUgKCkgewotCQkvKiBSZW1vdmUgY2hpbGRyZW4gdGhhdCBhcmUgYWxyZWFkeSBsYWlkIG91dCAqLwotCQljaGlsZHJlbiA9IGxheW91dENvbXBvc2l0ZS5nZXRDaGlsZHJlbiAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJY2hpbGRyZW4gW2ldLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJLyogQWRkIGFsbCBjaGlsZHJlbiBsaXN0ZWQgaW4gdGhlIHRhYmxlICovCi0JCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zICgpOwotCQljaGlsZHJlbiA9IG5ldyBDb250cm9sIFtpdGVtcy5sZW5ndGhdOwotCQlTdHJpbmcgW10gaXRlbVZhbHVlcyA9IG5ldyBTdHJpbmcgW10gewotCQkJTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIxIn0pLAotCQkJTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIyIn0pLAotCQkJTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIzIn0pfTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGNvbnRyb2wgPSBpdGVtcyBbaV0uZ2V0VGV4dCAoMSk7Ci0JCQlpZiAoY29udHJvbC5lcXVhbHMgKCJCdXR0b24iKSkgewotCQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChsYXlvdXRDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJCQlidXR0b24uc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkJ1dHRvbl9JbmRleCIsIG5ldyBTdHJpbmcgW10ge25ldyBJbnRlZ2VyIChpKS50b1N0cmluZyAoKX0pKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBidXR0b247Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiQ2FudmFzIikpIHsKLQkJCQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyAobGF5b3V0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBjYW52YXM7Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiQ29tYm8iKSkgewotCQkJCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvIChsYXlvdXRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQljb21iby5zZXRJdGVtcyAoaXRlbVZhbHVlcyk7Ci0JCQkJY29tYm8uc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNvbWJvX0luZGV4IiwgbmV3IFN0cmluZyBbXSB7bmV3IEludGVnZXIgKGkpLnRvU3RyaW5nICgpfSkpOwotCQkJCWNoaWxkcmVuIFtpXSA9IGNvbWJvOwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIkNvbXBvc2l0ZSIpKSB7IAotCQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChsYXlvdXRDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQkJCWNoaWxkcmVuIFtpXSA9IGNvbXBvc2l0ZTsKLQkJICAgIH0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJDb29sQmFyIikpIHsgCi0JCSAgICAJQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIgKGxheW91dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkgICAgCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyIChjb29sQmFyLCBTV1QuQk9SREVSKTsKLQkJCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCAwKTsKLQkJCQlpdGVtLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiMSJ9KSk7Ci0JCQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgMCk7Ci0JCQkJaXRlbS5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbSIsbmV3IFN0cmluZyBbXSB7IjIifSkpOwotCQkgICAgCUNvb2xJdGVtIGNvb2xJdGVtMSA9IG5ldyBDb29sSXRlbSAoY29vbEJhciwgMCk7Ci0JCSAgICAJY29vbEl0ZW0xLnNldENvbnRyb2wgKHRvb2xCYXIpOwotCQkJCXRvb2xCYXIgPSBuZXcgVG9vbEJhciAoY29vbEJhciwgU1dULkJPUkRFUik7Ci0JCQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgMCk7Ci0JCQkJaXRlbS5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbSIsbmV3IFN0cmluZyBbXSB7IjMifSkpOwotCQkJCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIDApOwotCQkJCWl0ZW0uc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyI0In0pKTsKLQkJICAgIAlDb29sSXRlbSBjb29sSXRlbTIgPSBuZXcgQ29vbEl0ZW0gKGNvb2xCYXIsIDApOwotCQkgICAgCWNvb2xJdGVtMi5zZXRDb250cm9sICh0b29sQmFyKTsKLQkJICAgIAlQb2ludCBzaXplID0gdG9vbEJhci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgICAgICAJCWNvb2xJdGVtMS5zZXRTaXplKGNvb2xJdGVtMS5jb21wdXRlU2l6ZSAoc2l6ZS54LCBzaXplLnkpKTsKLSAgICAgICAgCQljb29sSXRlbTIuc2V0U2l6ZShjb29sSXRlbTIuY29tcHV0ZVNpemUgKHNpemUueCwgc2l6ZS55KSk7Ci0gICAgICAgCQkJY29vbEJhci5zZXRTaXplKGNvb2xCYXIuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gY29vbEJhcjsKLQkJICAgIH0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJHcm91cCIpKSB7Ci0JCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAgKGxheW91dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCWdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJHcm91cF9JbmRleCIsIG5ldyBTdHJpbmcgW10ge25ldyBJbnRlZ2VyIChpKS50b1N0cmluZyAoKX0pKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBncm91cDsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJMYWJlbCIpKSB7Ci0JCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKGxheW91dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCWxhYmVsLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJMYWJlbF9JbmRleCIsIG5ldyBTdHJpbmcgW10ge25ldyBJbnRlZ2VyIChpKS50b1N0cmluZyAoKX0pKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBsYWJlbDsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJMaXN0IikpIHsKLQkJCQlMaXN0IGxpc3QgPSBuZXcgTGlzdCAobGF5b3V0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQlsaXN0LnNldEl0ZW1zIChpdGVtVmFsdWVzKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBsaXN0OwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIlByb2dyZXNzQmFyIikpIHsKLQkJCQlQcm9ncmVzc0JhciBwcm9ncmVzcyA9IG5ldyBQcm9ncmVzc0JhciAobGF5b3V0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJcHJvZ3Jlc3Muc2V0U2VsZWN0aW9uICg1MCk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gcHJvZ3Jlc3M7Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiU2NhbGUiKSkgewotCQkJCVNjYWxlIHNjYWxlID0gbmV3IFNjYWxlIChsYXlvdXRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBzY2FsZTsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJTbGlkZXIiKSkgewotCQkJCVNsaWRlciBzbGlkZXIgPSBuZXcgU2xpZGVyIChsYXlvdXRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBzbGlkZXI7Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiU3R5bGVkVGV4dCIpKSB7Ci0JCQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQgKGxheW91dENvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCQkJc3R5bGVkVGV4dC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU3R5bGVkVGV4dF9JbmRleCIsIG5ldyBTdHJpbmcgW10ge25ldyBJbnRlZ2VyIChpKS50b1N0cmluZyAoKX0pKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBzdHlsZWRUZXh0OwkJCQotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIlRhYmxlIikpIHsKLQkJCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAobGF5b3V0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUgKHRydWUpOwotCQkJCVRhYmxlSXRlbSBpdGVtMSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCAwKTsKLQkJCQlpdGVtMS5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbSIsbmV3IFN0cmluZyBbXSB7IjEifSkpOwotCQkJCVRhYmxlSXRlbSBpdGVtMiA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCAwKTsKLQkJCQlpdGVtMi5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbSIsbmV3IFN0cmluZyBbXSB7IjIifSkpOwotCQkJCWNoaWxkcmVuIFtpXSA9IHRhYmxlOwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIlRleHQiKSkgewotCQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0IChsYXlvdXRDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQkJCXRleHQuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlRleHRfSW5kZXgiLCBuZXcgU3RyaW5nIFtdIHtuZXcgSW50ZWdlciAoaSkudG9TdHJpbmcgKCl9KSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gdGV4dDsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJUb29sQmFyIikpIHsKLQkJCQlUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhciAobGF5b3V0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQlUb29sSXRlbSBpdGVtMSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgMCk7Ci0JCQkJaXRlbTEuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIxIn0pKTsKLQkJCQlUb29sSXRlbSBpdGVtMiA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgMCk7Ci0JCQkJaXRlbTIuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIyIn0pKTsKLQkJCQljaGlsZHJlbiBbaV0gPSB0b29sQmFyOwotCQkJfSBlbHNlIHsKLQkJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZSAobGF5b3V0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQlUcmVlSXRlbSBpdGVtMSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgMCk7Ci0JCQkJaXRlbTEuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIxIn0pKTsKLQkJCQlUcmVlSXRlbSBpdGVtMiA9IG5ldyBUcmVlSXRlbSAodHJlZSwgMCk7Ci0JCQkJaXRlbTIuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIyIn0pKTsKLQkJCQljaGlsZHJlbiBbaV0gPSB0cmVlOwotCQkJfSAKLQkJfQotCX0JCi0JCi0JLyoqCi0JICogVGFrZXMgaW5mb3JtYXRpb24gZnJvbSBUYWJsZUVkaXRvcnMgYW5kIHN0b3JlcyBpdC4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXZvaWQgcmVzZXRFZGl0b3JzICgpIHsKLQkJcmVzZXRFZGl0b3JzIChmYWxzZSk7Ci0JfQotCQotCXZvaWQgcmVzZXRFZGl0b3JzIChib29sZWFuIHRhYikgewotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBsYXlvdXQgZGF0YSBmb3IgdGhlIGNoaWxkcmVuIG9mIHRoZSBsYXlvdXQuIAotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0Jdm9pZCBzZXRMYXlvdXREYXRhICgpIHsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGxheW91dC4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXZvaWQgc2V0TGF5b3V0U3RhdGUgKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0FpcmJydXNoVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQWlyYnJ1c2hUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MmM2ZjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQWlyYnJ1c2hUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEFuIGFpcmJydXNoIHRvb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBBaXJicnVzaFRvb2wgZXh0ZW5kcyBDb250aW51b3VzUGFpbnRTZXNzaW9uIGltcGxlbWVudHMgUGFpbnRUb29sIHsKLQlwcml2YXRlIFRvb2xTZXR0aW5ncyBzZXR0aW5nczsKLQlwcml2YXRlIFJhbmRvbSByYW5kb207Ci0JcHJpdmF0ZSBpbnQgY2FjaGVkUmFkaXVzU3F1YXJlZDsKLQlwcml2YXRlIGludCBjYWNoZWROdW1Qb2ludHM7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFRvb2wuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKiBAcGFyYW0gcGFpbnRTdXJmYWNlIHRoZSBQYWludFN1cmZhY2Ugd2Ugd2lsbCByZW5kZXIgb24uCi0JICovCi0JcHVibGljIEFpcmJydXNoVG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXJhbmRvbSA9IG5ldyBSYW5kb20oKTsKLQkJc2V0UmV0cmlnZ2VyVGltZXIoMTApOwotCQlzZXQodG9vbFNldHRpbmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJLy8gY29tcHV0ZSB0aGluZ3Mgd2UgbmVlZCB0byBrbm93IGZvciBkcmF3aW5nCi0JCXNldHRpbmdzID0gdG9vbFNldHRpbmdzOwotCQljYWNoZWRSYWRpdXNTcXVhcmVkID0gc2V0dGluZ3MuYWlyYnJ1c2hSYWRpdXMgKiBzZXR0aW5ncy5haXJicnVzaFJhZGl1czsKLQkJY2FjaGVkTnVtUG9pbnRzID0gMzE0ICogc2V0dGluZ3MuYWlyYnJ1c2hJbnRlbnNpdHkgKiBjYWNoZWRSYWRpdXNTcXVhcmVkIC8gMjUwMDAwOwotCQlpZiAoY2FjaGVkTnVtUG9pbnRzID09IDAgJiYgc2V0dGluZ3MuYWlyYnJ1c2hJbnRlbnNpdHkgIT0gMCkKLQkJCWNhY2hlZE51bVBvaW50cyA9IDE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuQWlyYnJ1c2gubGFiZWwiKTsKLQl9Ci0KLQkvKgotCSAqIFRlbXBsYXRlIG1ldGhvZCBmb3IgZHJhd2luZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbmRlcihQb2ludCBwb2ludCkgewotCQkvLyBEcmF3cyBhIGJ1bmNoIChjYWNoZWROdW1Qb2ludHMpIG9mIHJhbmRvbSBwaXhlbHMgd2l0aGluIGEgc3BlY2lmaWVkIGNpcmNsZSAoY2FjaGVkUmFkaXVzU3F1YXJlZCkuCi0JCUNvbnRhaW5lckZpZ3VyZSBjZmlnID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVkTnVtUG9pbnRzOyArK2kpIHsKLQkJCWludCByYW5kWCwgcmFuZFk7Ci0JCQlkbyB7Ci0JCQkJcmFuZFggPSAoaW50KSAoKHJhbmRvbS5uZXh0RG91YmxlKCkgLSAwLjUpICogc2V0dGluZ3MuYWlyYnJ1c2hSYWRpdXMgKiAyLjApOwotCQkJCXJhbmRZID0gKGludCkgKChyYW5kb20ubmV4dERvdWJsZSgpIC0gMC41KSAqIHNldHRpbmdzLmFpcmJydXNoUmFkaXVzICogMi4wKTsKLQkJCX0gd2hpbGUgKHJhbmRYICogcmFuZFggKyByYW5kWSAqIHJhbmRZID4gY2FjaGVkUmFkaXVzU3F1YXJlZCk7Ci0JCQljZmlnLmFkZChuZXcgUG9pbnRGaWd1cmUoc2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yLCBwb2ludC54ICsgcmFuZFgsIHBvaW50LnkgKyByYW5kWSkpOwotCQl9Ci0JCWdldFBhaW50U3VyZmFjZSgpLmRyYXdGaWd1cmUoY2ZpZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQmFzaWNQYWludFNlc3Npb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0Jhc2ljUGFpbnRTZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMmZkZjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQmFzaWNQYWludFNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2ljUGFpbnRTZXNzaW9uIGltcGxlbWVudHMgUGFpbnRTZXNzaW9uIHsKLQkvKioKLQkgKiBUaGUgcGFpbnQgc3VyZmFjZQotCSAqLwotCXByaXZhdGUgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQYWludFNlc3Npb24uCi0JICogCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgZHJhd2luZyBzdXJmYWNlIHRvIHVzZQotCSAqLwotCXByb3RlY3RlZCBCYXNpY1BhaW50U2Vzc2lvbihQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXRoaXMucGFpbnRTdXJmYWNlID0gcGFpbnRTdXJmYWNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhaW50IHN1cmZhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFpbnQgc2Vzc2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIFBhaW50U3VyZmFjZQotCSAqLwotCXB1YmxpYyBQYWludFN1cmZhY2UgZ2V0UGFpbnRTdXJmYWNlKCkgewotCQlyZXR1cm4gcGFpbnRTdXJmYWNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0NvbnRhaW5lckZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQ29udGFpbmVyRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNzc1M2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQ29udGFpbmVyRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBDb250YWluZXIgZm9yIEZpZ3VyZSBvYmplY3RzIHdpdGggc3RhY2tpbmcgcHJldmlldyBtZWNoYW5pc20uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250YWluZXJGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX0FSUkFZX1NJWkUgPSAxNjsKLQkKLQlGaWd1cmVbXSAgIG9iamVjdFN0YWNrID0gbnVsbDsKLQlpbnQgICAgICBuZXh0SW5kZXggPSAwOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhbiBlbXB0eSBDb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyRmlndXJlKCkgewotCX0KLQkvKioKLQkgKiBBZGRzIGFuIG9iamVjdCB0byB0aGUgY29udGFpbmVyIGZvciBsYXRlciBkcmF3aW5nLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhZGQgdG8gdGhlIGRyYXdpbmcgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChGaWd1cmUgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3RTdGFjayA9PSBudWxsKSB7Ci0JCQlvYmplY3RTdGFjayA9IG5ldyBGaWd1cmVbSU5JVElBTF9BUlJBWV9TSVpFXTsKLQkJfSBlbHNlIGlmIChvYmplY3RTdGFjay5sZW5ndGggPD0gbmV4dEluZGV4KSB7Ci0JCQlGaWd1cmVbXSBuZXdPYmplY3RTdGFjayA9IG5ldyBGaWd1cmVbb2JqZWN0U3RhY2subGVuZ3RoICogMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9iamVjdFN0YWNrLCAwLCBuZXdPYmplY3RTdGFjaywgMCwgb2JqZWN0U3RhY2subGVuZ3RoKTsKLQkJCW9iamVjdFN0YWNrID0gbmV3T2JqZWN0U3RhY2s7Ci0JCX0KLQkJb2JqZWN0U3RhY2tbbmV4dEluZGV4XSA9IG9iamVjdDsKLQkJKytuZXh0SW5kZXg7Ci0JfQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIGNvbnRhaW5lciBpcyBlbXB0eS4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnRhaW5lciBpcyBlbXB0eQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBuZXh0SW5kZXggPT0gMDsKLQl9Ci0JLyoqCi0JICogQWRkcyBhbiBvYmplY3QgdG8gdGhlIGNvbnRhaW5lciBhbmQgZHJhd3MgaXRzIHByZXZpZXcgdGhlbiB1cGRhdGVzIHRoZSBzdXBwbGllZCBwcmV2aWV3IHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhZGQgdG8gdGhlIGRyYXdpbmcgbGlzdAotCSAqIEBwYXJhbSBnYyB0aGUgR0MgdG8gZHJhdyBvbgotCSAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0byBhZGQgdG8gdmlydHVhbCBjb29yZGluYXRlcyB0byBnZXQgZGlzcGxheSBjb29yZGluYXRlcwotCSAqIEBwYXJhbSByZW1lbWJlcmVkU3RhdGUgdGhlIHN0YXRlIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgZHJhd1ByZXZpZXcoKSBvciBhZGRBbmRQcmV2aWV3KCkKLQkgKiAgICAgICAgdXNpbmcgdGhpcyBDb250YWluZXIsIG1heSBiZSBudWxsIGlmIHRoZXJlIHdhcyBubyBzdWNoIHByZXZpb3VzIGNhbGwKLQkgKiBAcmV0dXJuIG9iamVjdCBzdGF0ZSB0aGF0IG11c3QgYmUgcGFzc2VkIHRvIGVyYXNlUHJldmlldygpIGxhdGVyIHRvIGVyYXNlIHRoaXMgb2JqZWN0Ci0JICovCi0vLwlwdWJsaWMgT2JqZWN0IGFkZEFuZFByZXZpZXcoRmlndXJlIG9iamVjdCwgR0MgZ2MsIFBvaW50IG9mZnNldCwgT2JqZWN0IHJlbWVtYmVyZWRTdGF0ZSkgewotLy8JCU9iamVjdFtdIHN0YXRlU3RhY2sgPSAoT2JqZWN0W10pIHJlbWVtYmVyZWRTdGF0ZTsKLS8vCQlpZiAoc3RhdGVTdGFjayA9PSBudWxsKSB7Ci0vLwkJCXN0YXRlU3RhY2sgPSBuZXcgT2JqZWN0W0lOSVRJQUxfQVJSQVlfU0laRV07Ci0vLwkJfSBlbHNlIGlmIChzdGF0ZVN0YWNrLmxlbmd0aCA8PSBuZXh0SW5kZXgpIHsKLS8vCQkJT2JqZWN0W10gbmV3U3RhdGVTdGFjayA9IG5ldyBPYmplY3Rbc3RhdGVTdGFjay5sZW5ndGggKiAyXTsKLS8vCQkJU3lzdGVtLmFycmF5Y29weShzdGF0ZVN0YWNrLCAwLCBuZXdTdGF0ZVN0YWNrLCAwLCBzdGF0ZVN0YWNrLmxlbmd0aCk7Ci0vLwkJCXN0YXRlU3RhY2sgPSBuZXdTdGF0ZVN0YWNrOwotLy8JCX0KLS8vCQlhZGQob2JqZWN0KTsKLS8vCQlzdGF0ZVN0YWNrW25leHRJbmRleCAtIDFdID0gb2JqZWN0LmRyYXdQcmV2aWV3KGdjLCBvZmZzZXQpOwotLy8JCXJldHVybiBzdGF0ZVN0YWNrOwotLy8JfQotCS8qKgotCSAqIENsZWFycyB0aGUgY29udGFpbmVyLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBlcmFzZVByZXZpZXcoKSBjYW5ub3QgYmUgY2FsbGVkIGFmdGVyIHRoaXMgcG9pbnQgdG8gZXJhc2UgYW55IHByZXZpb3VzCi0JICogZHJhd1ByZXZpZXcoKSdzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJd2hpbGUgKC0tbmV4dEluZGV4ID4gMCkgb2JqZWN0U3RhY2tbbmV4dEluZGV4XSA9IG51bGw7Ci0JCW5leHRJbmRleCA9IDA7Ci0JfQotCXB1YmxpYyB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dEluZGV4OyArK2kpIG9iamVjdFN0YWNrW2ldLmRyYXcoZmRjKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0SW5kZXg7ICsraSkgb2JqZWN0U3RhY2tbaV0uYWRkRGFtYWdlZFJlZ2lvbihmZGMsIHJlZ2lvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQ29udGludW91c1BhaW50U2Vzc2lvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQ29udGludW91c1BhaW50U2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE1MzUxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0NvbnRpbnVvdXNQYWludFNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGUgc3VwZXJjbGFzcyBmb3IgcGFpbnQgdG9vbHMgdGhhdCBkcmF3IGNvbnRpbnVvdXNseSBhbG9uZyB0aGUgcGF0aAotICogdHJhY2VkIGJ5IHRoZSBtb3VzZSdzIG1vdmVtZW50IHdoaWxlIHRoZSBidXR0b24gaXMgZGVwcmVzc2VkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250aW51b3VzUGFpbnRTZXNzaW9uIGV4dGVuZHMgQmFzaWNQYWludFNlc3Npb24gewotCS8qKgotCSAqIFRydWUgaWYgYSBjbGljay1kcmFnIGlzIGluIHByb2dyZXNzLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkcmFnSW5Qcm9ncmVzcyA9IGZhbHNlOwotCQotCS8qKgotCSAqIEEgY2FjaGVkIFBvaW50IGFycmF5IGZvciBkcmF3aW5nLgotCSAqLwotCXByaXZhdGUgUG9pbnRbXSBwb2ludHMgPSBuZXcgUG9pbnRbXSB7IG5ldyBQb2ludCgtMSwgLTEpLCBuZXcgUG9pbnQoLTEsIC0xKSB9OwotCi0JLyoqCi0JICogVGhlIHRpbWUgdG8gd2FpdCBiZXR3ZWVuIHJldHJpZ2dlcnMgaW4gbWlsbGlzZWNvbmRzLgotCSAqLwotCXByaXZhdGUgaW50IHJldHJpZ2dlckludGVydmFsID0gMDsKLQkKLQkvKioKLQkgKiBUaGUgY3VycmVudGx5IHZhbGlkIFJldHJpZ2dlckhhbmRsZXIKLQkgKi8KLQlwcm90ZWN0ZWQgUnVubmFibGUgcmV0cmlnZ2VySGFuZGxlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgQ29udGludW91c1BhaW50U2Vzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFpbnRTdXJmYWNlIHRoZSBkcmF3aW5nIHN1cmZhY2UgdG8gdXNlCi0JICovCi0JcHJvdGVjdGVkIENvbnRpbnVvdXNQYWludFNlc3Npb24oUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJldHJpZ2dlciB0aW1lci4KLQkgKiA8cD4KLQkgKiBBZnRlciB0aGUgdGltZXIgZWxhcHNlcywgaWYgdGhlIG1vdXNlIGlzIHN0aWxsIGhvdmVyaW5nIG92ZXIgdGhlIHNhbWUgcG9pbnQgd2l0aCB0aGUKLQkgKiBkcmFnIGJ1dHRvbiBwcmVzc2VkLCBhIG5ldyByZW5kZXIgb3JkZXIgaXMgaXNzdWVkIGFuZCB0aGUgdGltZXIgaXMgcmVzdGFydGVkLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gaW50ZXJ2YWwgdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmV0d2VlbiByZXRyaWdnZXJzLCAwIHRvIGRpc2FibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXRyaWdnZXJUaW1lcihpbnQgaW50ZXJ2YWwpIHsKLQkJcmV0cmlnZ2VySW50ZXJ2YWwgPSBpbnRlcnZhbDsKLQl9Ci0KLQkvKioKLQkgKiBBY3RpdmF0ZXMgdGhlIHRvb2wuCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5TZXNzaW9uKCkgewotCQlnZXRQYWludFN1cmZhY2UoKS4KLQkJCXNldFN0YXR1c01lc3NhZ2UoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJzZXNzaW9uLkNvbnRpbnVvdXNQYWludC5tZXNzYWdlIikpOwotCQlkcmFnSW5Qcm9ncmVzcyA9IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBEZWFjdGl2YXRlcyB0aGUgdG9vbC4KLSAgICAgKi8KLQlwdWJsaWMgdm9pZCBlbmRTZXNzaW9uKCkgewotCQlhYm9ydFJldHJpZ2dlcigpOwotCX0KLQkKLQkvKioKLQkgKiBBYm9ydHMgdGhlIGN1cnJlbnQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0U2Vzc2lvbigpIHsKLQkJYWJvcnRSZXRyaWdnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VEb3duIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0JCWlmIChkcmFnSW5Qcm9ncmVzcykgcmV0dXJuOyAvLyBzcHVyaW91cyBldmVudAotCQlkcmFnSW5Qcm9ncmVzcyA9IHRydWU7Ci0KLQkJcG9pbnRzWzBdLnggPSBldmVudC54OwotCQlwb2ludHNbMF0ueSA9IGV2ZW50Lnk7Ci0JCXJlbmRlcihwb2ludHNbMF0pOwotCQlwcmVwYXJlUmV0cmlnZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlRG91YmxlQ2xpY2sgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VVcCBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuYnV0dG9uICE9IDEpIHJldHVybjsKLQkJaWYgKCEgZHJhZ0luUHJvZ3Jlc3MpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJYWJvcnRSZXRyaWdnZXIoKTsKLQkJbW91c2VTZWdtZW50RmluaXNoZWQoZXZlbnQpOwotCQlkcmFnSW5Qcm9ncmVzcyA9IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VNb3ZlIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJZmluYWwgUGFpbnRTdXJmYWNlIHBzID0gZ2V0UGFpbnRTdXJmYWNlKCk7Ci0JCXBzLnNldFN0YXR1c0Nvb3JkKHBzLmdldEN1cnJlbnRQb3NpdGlvbigpKTsKLQkJaWYgKCEgZHJhZ0luUHJvZ3Jlc3MpIHJldHVybjsKLQkJbW91c2VTZWdtZW50RmluaXNoZWQoZXZlbnQpOwotCQlwcmVwYXJlUmV0cmlnZ2VyKCk7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZSBhIHJlbmRlcmluZyBzZWdtZW50Ci0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgbW91c2VTZWdtZW50RmluaXNoZWQoTW91c2VFdmVudCBldmVudCkgewotCQlpZiAocG9pbnRzWzBdLnggPT0gLTEpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJaWYgKHBvaW50c1swXS54ICE9IGV2ZW50LnggfHwgcG9pbnRzWzBdLnkgIT0gZXZlbnQueSkgewotCQkJLy8gZHJhdyBuZXcgc2VnbWVudAotCQkJcG9pbnRzWzFdLnggPSBldmVudC54OwotCQkJcG9pbnRzWzFdLnkgPSBldmVudC55OwotCQkJcmVuZGVyQ29udGludW91c1NlZ21lbnQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERyYXdzIGEgY29udGludW91cyBzZWdtZW50IGZyb20gcG9pbnRzWzBdIHRvIHBvaW50c1sxXS4KLQkgKiBBc3N1bWVzIHBvaW50c1swXSBoYXMgYmVlbiBkcmF3biBhbHJlYWR5LgotCSAqIAotCSAqIEBwb3N0IHBvaW50c1swXSB3aWxsIHJlZmVyIHRvIHRoZSBzYW1lIHBvaW50IGFzIHBvaW50c1sxXQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbmRlckNvbnRpbnVvdXNTZWdtZW50KCkgewotCQkvKiBBIGxhenkgYnV0IGVmZmVjdGl2ZSBsaW5lIGRyYXdpbmcgYWxnb3JpdGhtICovCi0JCWZpbmFsIGludCBkWCA9IHBvaW50c1sxXS54IC0gcG9pbnRzWzBdLng7Ci0JCWZpbmFsIGludCBkWSA9IHBvaW50c1sxXS55IC0gcG9pbnRzWzBdLnk7Ci0JCWludCBhYnNkWCA9IE1hdGguYWJzKGRYKTsKLQkJaW50IGFic2RZID0gTWF0aC5hYnMoZFkpOwotCi0JCWlmICgoZFggPT0gMCkgJiYgKGRZID09IDApKSByZXR1cm47Ci0JCQotCQlpZiAoYWJzZFkgPiBhYnNkWCkgewotCQkJZmluYWwgaW50IGluY2ZwWCA9IChkWCA8PCAxNikgLyBhYnNkWTsKLQkJCWZpbmFsIGludCBpbmNZID0gKGRZID4gMCkgPyAxIDogLTE7Ci0JCQlpbnQgZnBYID0gcG9pbnRzWzBdLnggPDwgMTY7IC8vIFggaW4gZml4ZWRwb2ludCBmb3JtYXQKLQotCQkJd2hpbGUgKC0tYWJzZFkgPj0gMCkgewotCQkJCXBvaW50c1swXS55ICs9IGluY1k7Ci0JCQkJcG9pbnRzWzBdLnggPSAoZnBYICs9IGluY2ZwWCkgPj4gMTY7Ci0JCQkJcmVuZGVyKHBvaW50c1swXSk7Ci0JCQl9Ci0JCQlpZiAocG9pbnRzWzBdLnggPT0gcG9pbnRzWzFdLngpIHJldHVybjsKLQkJCXBvaW50c1swXS54ID0gcG9pbnRzWzFdLng7Ci0JCX0gZWxzZSB7Ci0JCQlmaW5hbCBpbnQgaW5jZnBZID0gKGRZIDw8IDE2KSAvIGFic2RYOwotCQkJZmluYWwgaW50IGluY1ggPSAoZFggPiAwKSA/IDEgOiAtMTsKLQkJCWludCBmcFkgPSBwb2ludHNbMF0ueSA8PCAxNjsgLy8gWSBpbiBmaXhlZHBvaW50IGZvcm1hdAotCi0JCQl3aGlsZSAoLS1hYnNkWCA+PSAwKSB7Ci0JCQkJcG9pbnRzWzBdLnggKz0gaW5jWDsKLQkJCQlwb2ludHNbMF0ueSA9IChmcFkgKz0gaW5jZnBZKSA+PiAxNjsKLQkJCQlyZW5kZXIocG9pbnRzWzBdKTsKLQkJCX0KLQkJCWlmIChwb2ludHNbMF0ueSA9PSBwb2ludHNbMV0ueSkgcmV0dXJuOwotCQkJcG9pbnRzWzBdLnkgPSBwb2ludHNbMV0ueTsKLQkJfQotCQlyZW5kZXIocG9pbnRzWzBdKTsKLQl9CQkKLQotCS8qKgotCSAqIFByZXBhcmUgdGhlIHJldHJpZ2dlciB0aW1lcgotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBwcmVwYXJlUmV0cmlnZ2VyKCkgewotCQlpZiAocmV0cmlnZ2VySW50ZXJ2YWwgPiAwKSB7Ci0JCQkvKgotCQkJICogdGltZXJFeGVjKCkgcHJvdmlkZXMgYSBsaWdodHdlaWdodCBtZWNoYW5pc20gZm9yIHJ1bm5pbmcgY29kZSBhdCBpbnRlcnZhbHMgZnJvbSB3aXRoaW4KLQkJCSAqIHRoZSBldmVudCBsb29wIHdoZW4gdGltaW5nIGFjY3VyYWN5IGlzIG5vdCBpbXBvcnRhbnQuCi0JCQkgKgotCQkJICogU2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGNhbmNlbCBhIHRpbWVyRXhlYygpLCB3ZSByZW1lbWJlciB0aGUgUnVubmFibGUgdGhhdCBpcwotCQkJICogYWN0aXZlIGluIG9yZGVyIHRvIGRpc3Rpbmd1aXNoIHRoZSB2YWxpZCBvbmUgZnJvbSB0aGUgc3RhbGUgb25lcy4gIEluIHByYWN0aWNlLAotCQkJICogaWYgdGhlIGludGVydmFsIGlzIDEvMTAwdGggb2YgYSBzZWNvbmQsIHRoZW4gY3JlYXRpbmcgYSBmZXcgaHVuZHJlZCBuZXcgUmV0cmlnZ2VySGFuZGxlcnMKLQkJCSAqIGVhY2ggc2Vjb25kIHdpbGwgbm90IGNhdXNlIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaGl0LgotCQkJICovCi0JCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXRQYWludFN1cmZhY2UoKS5nZXREaXNwbGF5KCk7Ci0JCQlyZXRyaWdnZXJIYW5kbGVyID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKHJldHJpZ2dlckhhbmRsZXIgPT0gdGhpcykgewotCQkJCQkJcmVuZGVyKHBvaW50c1swXSk7Ci0JCQkJCQlwcmVwYXJlUmV0cmlnZ2VyKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwkJCQotCQkJZGlzcGxheS50aW1lckV4ZWMocmV0cmlnZ2VySW50ZXJ2YWwsIHJldHJpZ2dlckhhbmRsZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWJvcnRzIHRoZSByZXRyaWdnZXIgdGltZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYWJvcnRSZXRyaWdnZXIoKSB7Ci0JCXJldHJpZ2dlckhhbmRsZXIgPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBUZW1wbGF0ZSBtZXRob2Q6IFJlbmRlcnMgYSBwb2ludC4KLQkgKiBAcGFyYW0gcG9pbnQsIHRoZSBwb2ludCB0byByZW5kZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZW5kZXIoUG9pbnQgcG9pbnQpOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRHJhZ1BhaW50U2Vzc2lvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRHJhZ1BhaW50U2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDAxY2EyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0RyYWdQYWludFNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogVGhlIHN1cGVyY2xhc3MgZm9yIHBhaW50IHRvb2xzIHRoYXQgdXNlIGNsaWNrLWRyYWctcmVsZWFzZSBtb3Rpb25zIHRvCi0gKiBkcmF3IG9iamVjdHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEcmFnUGFpbnRTZXNzaW9uIGV4dGVuZHMgQmFzaWNQYWludFNlc3Npb24gewotCS8qKgotCSAqIFRydWUgaWYgYSBjbGljay1kcmFnIGlzIGluIHByb2dyZXNzCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGRyYWdJblByb2dyZXNzID0gZmFsc2U7Ci0JCi0JLyoqCi0JICogVGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjbGljayBpbiBhIGNsaWNrLWRyYWcKLQkgKi8KLQlwcml2YXRlIFBvaW50IGFuY2hvclBvc2l0aW9uID0gbmV3IFBvaW50KC0xLCAtMSk7Ci0KLQkvKioKLQkgKiBBIHRlbXBvcmFyeSBwb2ludAotCSAqLwotCXByaXZhdGUgUG9pbnQgdGVtcFBvc2l0aW9uID0gbmV3IFBvaW50KC0xLCAtMSk7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFBhaW50U2Vzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZ2V0UGFpbnRTdXJmYWNlKCkgdGhlIGRyYXdpbmcgc3VyZmFjZSB0byB1c2UKLQkgKi8KLQlwcm90ZWN0ZWQgRHJhZ1BhaW50U2Vzc2lvbihQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JfQotCi0JLyoqCi0JICogQWN0aXZhdGVzIHRoZSB0b29sLgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luU2Vzc2lvbigpIHsKLQkJZ2V0UGFpbnRTdXJmYWNlKCkuCi0JCQlzZXRTdGF0dXNNZXNzYWdlKFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygic2Vzc2lvbi5EcmFnSW50ZXJhY3RpdmVQYWludC5tZXNzYWdlIikpOwotCQlhbmNob3JQb3NpdGlvbi54ID0gLTE7Ci0JCWRyYWdJblByb2dyZXNzID0gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIERlYWN0aXZhdGVzIHRoZSB0b29sLgotICAgICAqLwotCXB1YmxpYyB2b2lkIGVuZFNlc3Npb24oKSB7Ci0JfQotCQotCS8qKgotCSAqIFJlc2V0cyB0aGUgdG9vbC4KLQkgKiBBYm9ydHMgYW55IG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCQlhbmNob3JQb3NpdGlvbi54ID0gLTE7Ci0JCWRyYWdJblByb2dyZXNzID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlRG93biBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5idXR0b24gIT0gMSkgcmV0dXJuOwotCQlpZiAoZHJhZ0luUHJvZ3Jlc3MpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJZHJhZ0luUHJvZ3Jlc3MgPSB0cnVlOwotCQkKLQkJYW5jaG9yUG9zaXRpb24ueCA9IGV2ZW50Lng7Ci0JCWFuY2hvclBvc2l0aW9uLnkgPSBldmVudC55OwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZURvdWJsZUNsaWNrIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlVXAgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSB7Ci0JCQlyZXNldFNlc3Npb24oKTsgLy8gYWJvcnQgaWYgcmlnaHQgb3IgbWlkZGxlIG1vdXNlIGJ1dHRvbiBwcmVzc2VkCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCEgZHJhZ0luUHJvZ3Jlc3MpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJZHJhZ0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJaWYgKGFuY2hvclBvc2l0aW9uLnggPT0gLTEpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJCi0JCWdldFBhaW50U3VyZmFjZSgpLmNvbW1pdFJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlTW92ZSBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWZpbmFsIFBhaW50U3VyZmFjZSBwcyA9IGdldFBhaW50U3VyZmFjZSgpOwotCQlpZiAoISBkcmFnSW5Qcm9ncmVzcykgewotCQkJcHMuc2V0U3RhdHVzQ29vcmQocHMuZ2V0Q3VycmVudFBvc2l0aW9uKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXBzLnNldFN0YXR1c0Nvb3JkUmFuZ2UoYW5jaG9yUG9zaXRpb24sIHBzLmdldEN1cnJlbnRQb3NpdGlvbigpKTsKLQkJcHMuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JCXRlbXBQb3NpdGlvbi54ID0gZXZlbnQueDsKLQkJdGVtcFBvc2l0aW9uLnkgPSBldmVudC55OwotCQlwcy5hZGRSdWJiZXJiYW5kU2VsZWN0aW9uKGNyZWF0ZUZpZ3VyZShhbmNob3JQb3NpdGlvbiwgdGVtcFBvc2l0aW9uKSk7Ci0JfQotCQotCS8qKgotCSAqIFRlbXBsYXRlIE1ldGhvZDogQ3JlYXRlcyBhIEZpZ3VyZSBmb3IgZHJhd2luZyBydWJiZXJiYW5kIGVudGl0aWVzIGFuZCB0aGUgZmluYWwgcHJvZHVjdAotCSAqIAotCSAqIEBwYXJhbSBhbmNob3IgdGhlIGFuY2hvciBwb2ludAotCSAqIEBwYXJhbSBjdXJzb3IgdGhlIHBvaW50IG1hcmtpbmcgdGhlIGN1cnJlbnQgcG9pbnRlciBsb2NhdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBGaWd1cmUgY3JlYXRlRmlndXJlKFBvaW50IGFuY2hvciwgUG9pbnQgY3Vyc29yKTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0VsbGlwc2VGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0VsbGlwc2VGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQwN2VmMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9FbGxpcHNlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBFbGxpcHNlIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgRWxsaXBzZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmRDb2xvcjsKLQlwcml2YXRlIGludCBsaW5lU3R5bGUsIHgxLCB5MSwgeDIsIHkyOwotCS8qKgotCSAqIENvbnN0cnVjdHMgYW4gRWxsaXBzZQotCSAqIFRoZXNlIG9iamVjdHMgYXJlIGRlZmluZWQgYnkgYW55IHR3byBkaWFtZXRyaWNhbGx5IG9wcG9zaW5nIGNvcm5lcnMgb2YgYSBib3gKLQkgKiBib3VuZGluZyB0aGUgZWxsaXBzZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSBsaW5lU3R5bGUgdGhlIGxpbmUgc3R5bGUgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHgxIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHkxIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHgyIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSB5MiB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKi8KLQlwdWJsaWMgRWxsaXBzZUZpZ3VyZShDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIENvbG9yIGJhY2tncm91bmRDb2xvciwgaW50IGxpbmVTdHlsZSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0JCXRoaXMuZm9yZWdyb3VuZENvbG9yID0gZm9yZWdyb3VuZENvbG9yOwotCQl0aGlzLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKLQkJdGhpcy5saW5lU3R5bGUgPSBsaW5lU3R5bGU7Ci0JCXRoaXMueDEgPSB4MTsgdGhpcy55MSA9IHkxOyB0aGlzLngyID0geDI7IHRoaXMueTIgPSB5MjsKLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJUmVjdGFuZ2xlIHIgPSBmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpOwotCQlmZGMuZ2Muc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOwotCQlmZGMuZ2Muc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotCQlmZGMuZ2Muc2V0TGluZVN0eWxlKGxpbmVTdHlsZSk7Ci0JCWZkYy5nYy5kcmF3T3ZhbChyLngsIHIueSwgci53aWR0aCAtIDEsIHIuaGVpZ2h0IC0gMSk7Ci0JCWZkYy5nYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfU09MSUQpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5MikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0VsbGlwc2VUb29sLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9FbGxpcHNlVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjExYzc2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0VsbGlwc2VUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBIGRyYXdpbmcgdG9vbC4KLSAqLwotcHVibGljIGNsYXNzIEVsbGlwc2VUb29sIGV4dGVuZHMgRHJhZ1BhaW50U2Vzc2lvbiBpbXBsZW1lbnRzIFBhaW50VG9vbCB7Ci0JcHJpdmF0ZSBUb29sU2V0dGluZ3Mgc2V0dGluZ3M7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgRWxsaXBzZVRvb2wuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKiBAcGFyYW0gcGFpbnRTdXJmYWNlIHRoZSBQYWludFN1cmZhY2Ugd2Ugd2lsbCByZW5kZXIgb24uCi0JICovCi0JcHVibGljIEVsbGlwc2VUb29sKFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MsIFBhaW50U3VyZmFjZSBwYWludFN1cmZhY2UpIHsKLQkJc3VwZXIocGFpbnRTdXJmYWNlKTsKLQkJc2V0KHRvb2xTZXR0aW5ncyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJc2V0dGluZ3MgPSB0b29sU2V0dGluZ3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyB0b29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5FbGxpcHNlLmxhYmVsIik7Ci0JfQotCi0JLyoKLQkgKiBUZW1wbGF0ZSBtZXRob2RzIGZvciBkcmF3aW5nCi0JICovCi0JcHJvdGVjdGVkIEZpZ3VyZSBjcmVhdGVGaWd1cmUoUG9pbnQgYSwgUG9pbnQgYikgewotCQlDb250YWluZXJGaWd1cmUgY29udGFpbmVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotCQlpZiAoc2V0dGluZ3MuY29tbW9uRmlsbFR5cGUgIT0gVG9vbFNldHRpbmdzLmZ0Tm9uZSkKLQkJCWNvbnRhaW5lci5hZGQobmV3IFNvbGlkRWxsaXBzZUZpZ3VyZShzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIGEueCwgYS55LCBiLngsIGIueSkpOwotCQlpZiAoc2V0dGluZ3MuY29tbW9uRmlsbFR5cGUgIT0gVG9vbFNldHRpbmdzLmZ0U29saWQpCi0JCQljb250YWluZXIuYWRkKG5ldyBFbGxpcHNlRmlndXJlKHNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25MaW5lU3R5bGUsCi0JCQkJYS54LCBhLnksIGIueCwgYi55KSk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9GaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZjZTdlNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9GaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIFN1cGVyaW50ZXJmYWNlIGZvciBhbGwgZHJhd2luZyBvYmplY3RzLgotICogQWxsIGRyYXdpbmcgb2JqZWN0cyBrbm93IGhvdyB0byByZW5kZXIgdGhlbXNlbHZlZCB0byB0aGUgc2NyZWVuIGFuZCBjYW4gZHJhdyBhCi0gKiB0ZW1wb3JhcnkgdmVyc2lvbiBvZiB0aGVtc2VsdmVzIGZvciBwcmV2aWV3aW5nIHRoZSBnZW5lcmFsIGFwcGVhcmFuY2Ugb2YgdGhlCi0gKiBvYmplY3Qgb25zY3JlZW4gYmVmb3JlIGl0IGdldHMgY29tbWl0dGVkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlndXJlIHsKLQkvKioKLQkgKiBEcmF3cyB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZmRjIGEgcGFyYW1ldGVyIGJsb2NrIHNwZWNpZnlpbmcgZHJhd2luZy1yZWxhdGVkIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpOwotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGRhbWFnZWQgc2NyZWVuIHJlZ2lvbiBjYXVzZWQgYnkgZHJhd2luZyB0aGlzIG9iamVjdCAoaW1wcmVjaXNlKSwgdGhlbgotCSAqIGFwcGVuZHMgaXQgdG8gdGhlIHN1cHBsaWVkIHJlZ2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmRjIGEgcGFyYW1ldGVyIGJsb2NrIHNwZWNpZnlpbmcgZHJhd2luZy1yZWxhdGVkIGluZm9ybWF0aW9uCi0JICogQHBhcmFtIHJlZ2lvbiBhIHJlZ2lvbiB0byB3aGljaCBhZGRpdGlvbmFsIGRhbWFnZSBhcmVhcyB3aWxsIGJlIGFkZGVkCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRmlndXJlRHJhd0NvbnRleHQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0ZpZ3VyZURyYXdDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YWIxOGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRmlndXJlRHJhd0NvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgRmlndXJlRHJhd0NvbnRleHQgewotCS8qCi0JICogPHA+Ci0JICogVGhlIEdDIG11c3QgYmUgc2V0IHVwIGFzIGZvbGxvd3MKLQkgKiAoaXQgd2lsbCBiZSByZXR1cm5lZCB0byB0aGlzIHN0YXRlIHVwb24gY29tcGxldGlvbiBvZiBkcmF3aW5nIG9wZXJhdGlvbnMpCi0JICogPHVsPgotCSAqICAgPGxpPnNldFhPUk1vZGUoZmFsc2UpCi0JICogPC91bD4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIEdDIGdjID0gbnVsbDsKLQlwdWJsaWMgaW50IHhPZmZzZXQgPSAwLCB5T2Zmc2V0ID0gMDsgLy8gc3Vic3RyYWN0IHRvIGdldCBHQyBjb29yZHMKLQlwdWJsaWMgaW50IHhTY2FsZSA9IDEsIHlTY2FsZSA9IDE7Ci0JCi0JcHVibGljIFJlY3RhbmdsZSB0b0NsaWVudFJlY3RhbmdsZShpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKLQkJcmV0dXJuIG5ldyBSZWN0YW5nbGUoCi0JCQlNYXRoLm1pbih4MSwgeDIpICogeFNjYWxlIC0geE9mZnNldCwKLQkJCU1hdGgubWluKHkxLCB5MikgKiB5U2NhbGUgLSB5T2Zmc2V0LAotCQkJKE1hdGguYWJzKHgyIC0geDEpICsgMSkgKiB4U2NhbGUsCi0JCQkoTWF0aC5hYnMoeTIgLSB5MSkgKyAxKSAqIHlTY2FsZSk7Ci0JfQotCXB1YmxpYyBQb2ludCB0b0NsaWVudFBvaW50KGludCB4LCBpbnQgeSkgewotCQlyZXR1cm4gbmV3IFBvaW50KHggKiB4U2NhbGUgLSB4T2Zmc2V0LCB5ICogeVNjYWxlIC0geU9mZnNldCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvTGluZUZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvTGluZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjNmZDE5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0xpbmVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIDJEIExpbmUgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBMaW5lRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yIGZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZENvbG9yOwotCXByaXZhdGUgaW50IGxpbmVTdHlsZSwgeDEsIHkxLCB4MiwgeTI7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIExpbmUKLQkgKiBUaGVzZSBvYmplY3RzIGFyZSBkZWZpbmVkIGJ5IHRoZWlyIHR3byBlbmQtcG9pbnRzLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIGxpbmVTdHlsZSB0aGUgbGluZSBzdHlsZSBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0geDEgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBlbmQtcG9pbnQKLQkgKiBAcGFyYW0geTEgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBlbmQtcG9pbnQKLQkgKiBAcGFyYW0geDIgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgZW5kLXBvaW50Ci0JICogQHBhcmFtIHkyIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGVuZC1wb2ludAotCSAqLwotCXB1YmxpYyBMaW5lRmlndXJlKENvbG9yIGZvcmVncm91bmRDb2xvciwgQ29sb3IgYmFja2dyb3VuZENvbG9yLCBpbnQgbGluZVN0eWxlLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKLQkJdGhpcy5mb3JlZ3JvdW5kQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7Ci0JCXRoaXMuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yOwotCQl0aGlzLmxpbmVTdHlsZSA9IGxpbmVTdHlsZTsKLQkJdGhpcy54MSA9IHgxOyB0aGlzLnkxID0geTE7IHRoaXMueDIgPSB4MjsgdGhpcy55MiA9IHkyOwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlQb2ludCBwMSA9IGZkYy50b0NsaWVudFBvaW50KHgxLCB5MSk7Ci0JCVBvaW50IHAyID0gZmRjLnRvQ2xpZW50UG9pbnQoeDIsIHkyKTsKLQkJZmRjLmdjLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLQkJZmRjLmdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLQkJZmRjLmdjLnNldExpbmVTdHlsZShsaW5lU3R5bGUpOwotCQlmZGMuZ2MuZHJhd0xpbmUocDEueCwgcDEueSwgcDIueCwgcDIueSk7Ci0JCWZkYy5nYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfU09MSUQpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5MikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0xpbmVUb29sLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9MaW5lVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGE2NGEyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0xpbmVUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBIGxpbmUgZHJhd2luZyB0b29sCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5lVG9vbCBleHRlbmRzIERyYWdQYWludFNlc3Npb24gaW1wbGVtZW50cyBQYWludFRvb2wgewotCXByaXZhdGUgVG9vbFNldHRpbmdzIHNldHRpbmdzOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIExpbmVUb29sLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgUGFpbnRTdXJmYWNlIHdlIHdpbGwgcmVuZGVyIG9uLgotCSAqLwotCXB1YmxpYyBMaW5lVG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXNldCh0b29sU2V0dGluZ3MpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sJ3Mgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncykgewotCQlzZXR0aW5ncyA9IHRvb2xTZXR0aW5nczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyB0b29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5MaW5lLmxhYmVsIik7Ci0JfQotCi0JLyoKLQkgKiBUZW1wbGF0ZSBtZXRob2RzIGZvciBkcmF3aW5nCi0JICovCi0JcHJvdGVjdGVkIEZpZ3VyZSBjcmVhdGVGaWd1cmUoUG9pbnQgYSwgUG9pbnQgYikgewotCQlyZXR1cm4gbmV3IExpbmVGaWd1cmUoc2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkxpbmVTdHlsZSwKLQkJCWEueCwgYS55LCBiLngsIGIueSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRFeGFtcGxlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludEV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhMTBhNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludEV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFBhaW50RXhhbXBsZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPQotCQlSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX3BhaW50Iik7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZTsKLQlwcml2YXRlIENhbnZhcyBhY3RpdmVGb3JlZ3JvdW5kQ29sb3JDYW52YXM7Ci0JcHJpdmF0ZSBDYW52YXMgYWN0aXZlQmFja2dyb3VuZENvbG9yQ2FudmFzOwotCXByaXZhdGUgQ29sb3IgcGFpbnRDb2xvckJsYWNrLCBwYWludENvbG9yV2hpdGU7IC8vIGFsaWFzIGZvciBwYWludENvbG9yc1swXSBhbmQgWzFdCi0JcHJpdmF0ZSBDb2xvcltdIHBhaW50Q29sb3JzOwotCXByaXZhdGUgRm9udCBwYWludERlZmF1bHRGb250OyAvLyBkbyBub3QgZnJlZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBudW1QYWxldHRlUm93cyA9IDM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG51bVBhbGV0dGVDb2xzID0gNTA7Ci0JcHJpdmF0ZSBUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzOyAvLyBjdXJyZW50IGFjdGl2ZSBzZXR0aW5ncwotCXByaXZhdGUgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZTsgLy8gcGFpbnQgc3VyZmFjZSBmb3IgZHJhd2luZwotCi0Jc3RhdGljIGZpbmFsIGludCBQZW5jaWxfdG9vbCA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBBaXJicnVzaF90b29sID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IExpbmVfdG9vbCA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBQb2x5TGluZV90b29sID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IFJlY3RhbmdsZV90b29sID0gNDsKLQlzdGF0aWMgZmluYWwgaW50IFJvdW5kZWRSZWN0YW5nbGVfdG9vbCA9IDU7Ci0Jc3RhdGljIGZpbmFsIGludCBFbGxpcHNlX3Rvb2wgPSA2OwotCXN0YXRpYyBmaW5hbCBpbnQgVGV4dF90b29sID0gNzsKLQlzdGF0aWMgZmluYWwgaW50IE5vbmVfZmlsbCA9IDg7Ci0Jc3RhdGljIGZpbmFsIGludCBPdXRsaW5lX2ZpbGwgPSA5OwotCXN0YXRpYyBmaW5hbCBpbnQgU29saWRfZmlsbCA9IDEwOwotCXN0YXRpYyBmaW5hbCBpbnQgU29saWRfbGluZXN0eWxlID0gMTE7Ci0Jc3RhdGljIGZpbmFsIGludCBEYXNoX2xpbmVzdHlsZSA9IDEyOwotCXN0YXRpYyBmaW5hbCBpbnQgRG90X2xpbmVzdHlsZSA9IDEzOwotCXN0YXRpYyBmaW5hbCBpbnQgRGFzaERvdF9saW5lc3R5bGUgPSAxNDsKLQlzdGF0aWMgZmluYWwgaW50IEZvbnRfb3B0aW9ucyA9IDE1OwotCQotCXN0YXRpYyBmaW5hbCBpbnQgRGVmYXVsdF90b29sID0gUGVuY2lsX3Rvb2w7Ci0Jc3RhdGljIGZpbmFsIGludCBEZWZhdWx0X2ZpbGwgPSBOb25lX2ZpbGw7Ci0Jc3RhdGljIGZpbmFsIGludCBEZWZhdWx0X2xpbmVzdHlsZSA9IFNvbGlkX2xpbmVzdHlsZTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRvb2xbXSB0b29scyA9IHsKLQkJbmV3IFRvb2woUGVuY2lsX3Rvb2wsICJQZW5jaWwiLCAidG9vbCIsIFNXVC5SQURJTyksCi0JCW5ldyBUb29sKEFpcmJydXNoX3Rvb2wsICJBaXJicnVzaCIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woTGluZV90b29sLCAiTGluZSIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woUG9seUxpbmVfdG9vbCwgIlBvbHlMaW5lIiwgInRvb2wiLCBTV1QuUkFESU8pLAotCQluZXcgVG9vbChSZWN0YW5nbGVfdG9vbCwgIlJlY3RhbmdsZSIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woUm91bmRlZFJlY3RhbmdsZV90b29sLCAiUm91bmRlZFJlY3RhbmdsZSIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woRWxsaXBzZV90b29sLCAiRWxsaXBzZSIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woVGV4dF90b29sLCAiVGV4dCIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woTm9uZV9maWxsLCAiTm9uZSIsICJmaWxsIiwgU1dULlJBRElPLCBuZXcgSW50ZWdlcihUb29sU2V0dGluZ3MuZnROb25lKSksCi0JCW5ldyBUb29sKE91dGxpbmVfZmlsbCwgIk91dGxpbmUiLCAiZmlsbCIsIFNXVC5SQURJTywgbmV3IEludGVnZXIoVG9vbFNldHRpbmdzLmZ0T3V0bGluZSkpLAotCQluZXcgVG9vbChTb2xpZF9maWxsLCAiU29saWQiLCAiZmlsbCIsIFNXVC5SQURJTywgbmV3IEludGVnZXIoVG9vbFNldHRpbmdzLmZ0U29saWQpKSwKLQkJbmV3IFRvb2woU29saWRfbGluZXN0eWxlLCAiU29saWQiLCAibGluZXN0eWxlIiwgU1dULlJBRElPLCBuZXcgSW50ZWdlcihTV1QuTElORV9TT0xJRCkpLAotCQluZXcgVG9vbChEYXNoX2xpbmVzdHlsZSwgIkRhc2giLCAibGluZXN0eWxlIiwgU1dULlJBRElPLCBuZXcgSW50ZWdlcihTV1QuTElORV9EQVNIKSksCi0JCW5ldyBUb29sKERvdF9saW5lc3R5bGUsICJEb3QiLCAibGluZXN0eWxlIiwgU1dULlJBRElPLCBuZXcgSW50ZWdlcihTV1QuTElORV9ET1QpKSwKLQkJbmV3IFRvb2woRGFzaERvdF9saW5lc3R5bGUsICJEYXNoRG90IiwgImxpbmVzdHlsZSIsIFNXVC5SQURJTywgbmV3IEludGVnZXIoU1dULkxJTkVfREFTSERPVCkpLAotCQluZXcgVG9vbChGb250X29wdGlvbnMsICJGb250IiwgIm9wdGlvbnMiLCBTV1QuUFVTSCkKLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIFBhaW50RXhhbXBsZSBlbWJlZGRlZCBpbnNpZGUKLQkgKiB0aGUgc3VwcGxpZWQgcGFyZW50IENvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb250YWluZXIgb2YgdGhlIGV4YW1wbGUKLQkgKi8KLQlwdWJsaWMgUGFpbnRFeGFtcGxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbWFpbkNvbXBvc2l0ZSA9IHBhcmVudDsKLQkJaW5pdFJlc291cmNlcygpOwotCQlpbml0QWN0aW9ucygpOwotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogSW52b2tlcyBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ3aW5kb3cudGl0bGUiKSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJUGFpbnRFeGFtcGxlIGluc3RhbmNlID0gbmV3IFBhaW50RXhhbXBsZShzaGVsbCk7Ci0JCWluc3RhbmNlLmNyZWF0ZVRvb2xCYXIoc2hlbGwpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWluc3RhbmNlLmNyZWF0ZUdVSShjb21wb3NpdGUpOwotCQlpbnN0YW5jZS5zZXREZWZhdWx0cygpOwotCQlzZXRTaGVsbFNpemUoZGlzcGxheSwgc2hlbGwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghIHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCEgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWluc3RhbmNlLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdG9vbGJhci4KLQkgKiBOb3RlOiBPbmx5IGNhbGxlZCBieSBzdGFuZGFsb25lLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUb29sQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVG9vbEJhciB0b29sYmFyID0gbmV3IFRvb2xCYXIgKHBhcmVudCwgU1dULk5PTkUpOwotCQlTdHJpbmcgZ3JvdXAgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUb29sIHRvb2wgPSB0b29sc1tpXTsKLQkJCWlmIChncm91cCAhPSBudWxsICYmICF0b29sLmdyb3VwLmVxdWFscyhncm91cCkpIHsKLQkJCQluZXcgVG9vbEl0ZW0gKHRvb2xiYXIsIFNXVC5TRVBBUkFUT1IpOwotCQkJfQotCQkJZ3JvdXAgPSB0b29sLmdyb3VwOwotCQkJVG9vbEl0ZW0gaXRlbSA9IGFkZFRvb2xJdGVtKHRvb2xiYXIsIHRvb2wpOwotCQkJaWYgKGkgPT0gRGVmYXVsdF90b29sIHx8IGkgPT0gRGVmYXVsdF9maWxsIHx8IGkgPT0gRGVmYXVsdF9saW5lc3R5bGUpIGl0ZW0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHRvb2wgaXRlbSB0byB0aGUgdG9vbGJhci4KLQkgKiBOb3RlOiBPbmx5IGNhbGxlZCBieSBzdGFuZGFsb25lLgotCSAqLwotCXByaXZhdGUgVG9vbEl0ZW0gYWRkVG9vbEl0ZW0oZmluYWwgVG9vbEJhciB0b29sYmFyLCBmaW5hbCBUb29sIHRvb2wpIHsKLQkJZmluYWwgU3RyaW5nIGlkID0gdG9vbC5ncm91cCArICcuJyArIHRvb2wubmFtZTsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbGJhciwgdG9vbC50eXBlKTsKLQkJaXRlbS5zZXRUZXh0IChnZXRSZXNvdXJjZVN0cmluZyhpZCArICIubGFiZWwiKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoaWQgKyAiLnRvb2x0aXAiKSk7Ci0JCWl0ZW0uc2V0SW1hZ2UodG9vbC5pbWFnZSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdG9vbC5hY3Rpb24ucnVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlmaW5hbCBpbnQgY2hpbGRJRCA9IHRvb2xiYXIuaW5kZXhPZihpdGVtKTsKLQkJdG9vbGJhci5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUob3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5jaGlsZElEID09IGNoaWxkSUQpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRSZXNvdXJjZVN0cmluZyhpZCArICIuZGVzY3JpcHRpb24iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZWZhdWx0IHRvb2wgaXRlbSBzdGF0ZXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0JCXNldFBhaW50VG9vbChEZWZhdWx0X3Rvb2wpOwotCQlzZXRGaWxsVHlwZShEZWZhdWx0X2ZpbGwpOwotCQlzZXRMaW5lU3R5bGUoRGVmYXVsdF9saW5lc3R5bGUpOwotCQlzZXRGb3JlZ3JvdW5kQ29sb3IocGFpbnRDb2xvckJsYWNrKTsKLQkJc2V0QmFja2dyb3VuZENvbG9yKHBhaW50Q29sb3JXaGl0ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgR1VJLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUdVSShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dDsKLQkJR3JpZERhdGEgZ3JpZERhdGE7Ci0KLQkJLyoqKiBDcmVhdGUgcHJpbmNpcGFsIEdVSSBsYXlvdXQgZWxlbWVudHMgKioqLwkJCi0JCUNvbXBvc2l0ZSBkaXNwbGF5QXJlYSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlkaXNwbGF5QXJlYS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJLy8gQ3JlYXRpbmcgdGhlc2UgZWxlbWVudHMgaGVyZSBhdm9pZHMgdGhlIG5lZWQgdG8gaW5zdGFudGlhdGUgdGhlIEdVSSBlbGVtZW50cwotCQkvLyBpbiBzdHJpY3QgbGF5b3V0IG9yZGVyLiAgVGhlIG5hdHVyYWwgbGF5b3V0IG9yZGVyaW5nIGlzIGFuIGFydGlmYWN0IG9mIHVzaW5nCi0JCS8vIFNXVCBsYXlvdXRzLCBidXQgdW5mb3J0dW5hdGVseSBpdCBpcyBub3QgdGhlIHNhbWUgb3JkZXIgYXMgdGhhdCByZXF1aXJlZCB0bwotCQkvLyBpbnN0YW50aWF0ZSBhbGwgb2YgdGhlIG5vbi1HVUkgYXBwbGljYXRpb24gZWxlbWVudHMgdG8gc2F0aXNmeSByZWZlcmVudGlhbAotCQkvLyBkZXBlbmRlbmNpZXMuICBJdCBpcyBwb3NzaWJsZSB0byByZW9yZGVyIHRoZSBpbml0aWFsaXphdGlvbiB0byBzb21lIGV4dGVudCwgYnV0Ci0JCS8vIHRoaXMgY2FuIGJlIHZlcnkgdGVkaW91cy4KLQkJCi0JCS8vIHBhaW50IGNhbnZhcwotCQlmaW5hbCBDYW52YXMgcGFpbnRDYW52YXMgPSBuZXcgQ2FudmFzKGRpc3BsYXlBcmVhLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwKLQkJCVNXVC5OT19SRURSQVdfUkVTSVpFIHwgU1dULk5PX0JBQ0tHUk9VTkQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJcGFpbnRDYW52YXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXBhaW50Q2FudmFzLnNldEJhY2tncm91bmQocGFpbnRDb2xvcldoaXRlKTsKLQkJCi0JCS8vIGNvbG9yIHNlbGVjdG9yIGZyYW1lCi0JCWZpbmFsIENvbXBvc2l0ZSBjb2xvckZyYW1lID0gbmV3IENvbXBvc2l0ZShkaXNwbGF5QXJlYSwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJY29sb3JGcmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyB0b29sIHNldHRpbmdzIGZyYW1lCi0JCWZpbmFsIENvbXBvc2l0ZSB0b29sU2V0dGluZ3NGcmFtZSA9IG5ldyBDb21wb3NpdGUoZGlzcGxheUFyZWEsIFNXVC5OT05FKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCXRvb2xTZXR0aW5nc0ZyYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIHN0YXR1cyB0ZXh0Ci0JCWZpbmFsIFRleHQgc3RhdHVzVGV4dCA9IG5ldyBUZXh0KGRpc3BsYXlBcmVhLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJc3RhdHVzVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvKioqIENyZWF0ZSB0aGUgcmVtYWluaW5nIGFwcGxpY2F0aW9uIGVsZW1lbnRzIGluc2lkZSB0aGUgcHJpbmNpcGFsIEdVSSBsYXlvdXQgZWxlbWVudHMgKioqLwkKLQkJLy8gcGFpbnRTdXJmYWNlCi0JCXBhaW50U3VyZmFjZSA9IG5ldyBQYWludFN1cmZhY2UocGFpbnRDYW52YXMsIHN0YXR1c1RleHQsIHBhaW50Q29sb3JXaGl0ZSk7Ci0KLQkJLy8gZmluaXNoIGluaXRpYWxpemluZyB0aGUgdG9vbCBkYXRhCi0JCXRvb2xzW1BlbmNpbF90b29sXS5kYXRhID0gbmV3IFBlbmNpbFRvb2wodG9vbFNldHRpbmdzLCBwYWludFN1cmZhY2UpOwotCQl0b29sc1tBaXJicnVzaF90b29sXS5kYXRhID0gbmV3IEFpcmJydXNoVG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0JCXRvb2xzW0xpbmVfdG9vbF0uZGF0YSA9IG5ldyBMaW5lVG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0JCXRvb2xzW1BvbHlMaW5lX3Rvb2xdLmRhdGEgPSBuZXcgUG9seUxpbmVUb29sKHRvb2xTZXR0aW5ncywgcGFpbnRTdXJmYWNlKTsKLQkJdG9vbHNbUmVjdGFuZ2xlX3Rvb2xdLmRhdGEgPSBuZXcgUmVjdGFuZ2xlVG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0JCXRvb2xzW1JvdW5kZWRSZWN0YW5nbGVfdG9vbF0uZGF0YSA9IG5ldyBSb3VuZGVkUmVjdGFuZ2xlVG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0JCXRvb2xzW0VsbGlwc2VfdG9vbF0uZGF0YSA9IG5ldyBFbGxpcHNlVG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0JCXRvb2xzW1RleHRfdG9vbF0uZGF0YSA9IG5ldyBUZXh0VG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0KLQkJLy8gY29sb3JGcmFtZQkJCi0JCWdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb2xvckZyYW1lLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQkvLyBhY3RpdmVGb3JlZ3JvdW5kQ29sb3JDYW52YXMsIGFjdGl2ZUJhY2tncm91bmRDb2xvckNhbnZhcwotCQlhY3RpdmVGb3JlZ3JvdW5kQ29sb3JDYW52YXMgPSBuZXcgQ2FudmFzKGNvbG9yRnJhbWUsIFNXVC5CT1JERVIpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMjQ7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDI0OwotCQlhY3RpdmVGb3JlZ3JvdW5kQ29sb3JDYW52YXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJYWN0aXZlQmFja2dyb3VuZENvbG9yQ2FudmFzID0gbmV3IENhbnZhcyhjb2xvckZyYW1lLCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDI0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAyNDsKLQkJYWN0aXZlQmFja2dyb3VuZENvbG9yQ2FudmFzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIHBhbGV0dGVDYW52YXMKLQkJZmluYWwgQ2FudmFzIHBhbGV0dGVDYW52YXMgPSBuZXcgQ2FudmFzKGNvbG9yRnJhbWUsIFNXVC5CT1JERVIgfCBTV1QuTk9fQkFDS0dST1VORCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAyNDsKLQkJcGFsZXR0ZUNhbnZhcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcGFsZXR0ZUNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHBhbGV0dGVDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCUNvbG9yIGNvbG9yID0gZ2V0Q29sb3JBdChib3VuZHMsIGUueCwgZS55KTsJCQkJCi0JCQkJCQotCQkJCWlmIChlLmJ1dHRvbiA9PSAxKSBzZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCQkJCWVsc2Ugc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKLQkJCX0KLQkJCXByaXZhdGUgQ29sb3IgZ2V0Q29sb3JBdChSZWN0YW5nbGUgYm91bmRzLCBpbnQgeCwgaW50IHkpIHsKLQkJCQlpZiAoYm91bmRzLmhlaWdodCA8PSAxICYmIGJvdW5kcy53aWR0aCA8PSAxKSByZXR1cm4gcGFpbnRDb2xvcldoaXRlOwotCQkJCWZpbmFsIGludCByb3cgPSAoeSAtIGJvdW5kcy55KSAqIG51bVBhbGV0dGVSb3dzIC8gYm91bmRzLmhlaWdodDsKLQkJCQlmaW5hbCBpbnQgY29sID0gKHggLSBib3VuZHMueCkgKiBudW1QYWxldHRlQ29scyAvIGJvdW5kcy53aWR0aDsKLQkJCQlyZXR1cm4gcGFpbnRDb2xvcnNbTWF0aC5taW4oTWF0aC5tYXgocm93ICogbnVtUGFsZXR0ZUNvbHMgKyBjb2wsIDApLCBwYWludENvbG9ycy5sZW5ndGggLSAxKV07Ci0JCQl9Ci0JCX0pOwotCQlMaXN0ZW5lciByZWZyZXNoTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKGUuZ2MgPT0gbnVsbCkgcmV0dXJuOwotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBwYWxldHRlQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJCQlmb3IgKGludCByb3cgPSAwOyByb3cgPCBudW1QYWxldHRlUm93czsgKytyb3cpIHsKLQkJCQkJZm9yIChpbnQgY29sID0gMDsgY29sIDwgbnVtUGFsZXR0ZUNvbHM7ICsrY29sKSB7Ci0JCQkJCQlmaW5hbCBpbnQgeCA9IGJvdW5kcy53aWR0aCAqIGNvbCAvIG51bVBhbGV0dGVDb2xzOwotCQkJCQkJZmluYWwgaW50IHkgPSBib3VuZHMuaGVpZ2h0ICogcm93IC8gbnVtUGFsZXR0ZVJvd3M7Ci0JCQkJCQlmaW5hbCBpbnQgd2lkdGggPSBNYXRoLm1heChib3VuZHMud2lkdGggKiAoY29sICsgMSkgLyBudW1QYWxldHRlQ29scyAtIHgsIDEpOwotCQkJCQkJZmluYWwgaW50IGhlaWdodCA9IE1hdGgubWF4KGJvdW5kcy5oZWlnaHQgKiAocm93ICsgMSkgLyBudW1QYWxldHRlUm93cyAtIHksIDEpOwotCQkJCQkJZS5nYy5zZXRCYWNrZ3JvdW5kKHBhaW50Q29sb3JzW3JvdyAqIG51bVBhbGV0dGVDb2xzICsgY29sXSk7Ci0JCQkJCQllLmdjLmZpbGxSZWN0YW5nbGUoYm91bmRzLnggKyB4LCBib3VuZHMueSArIHksIHdpZHRoLCBoZWlnaHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlwYWxldHRlQ2FudmFzLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIHJlZnJlc2hMaXN0ZW5lcik7Ci0JCXBhbGV0dGVDYW52YXMuYWRkTGlzdGVuZXIoU1dULlBhaW50LCByZWZyZXNoTGlzdGVuZXIpOwotCQkvL3BhbGV0dGVDYW52YXMucmVkcmF3KCk7Ci0JCQotCQkvLyB0b29sU2V0dGluZ3NGcmFtZQotCQlncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gNDsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJdG9vbFNldHRpbmdzRnJhbWUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRvb2xTZXR0aW5nc0ZyYW1lLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInNldHRpbmdzLkFpcmJydXNoUmFkaXVzLnRleHQiKSk7Ci0KLQkJZmluYWwgU2NhbGUgYWlyYnJ1c2hSYWRpdXNTY2FsZSA9IG5ldyBTY2FsZSh0b29sU2V0dGluZ3NGcmFtZSwgU1dULkhPUklaT05UQUwpOwotCQlhaXJicnVzaFJhZGl1c1NjYWxlLnNldE1pbmltdW0oNSk7Ci0JCWFpcmJydXNoUmFkaXVzU2NhbGUuc2V0TWF4aW11bSg1MCk7Ci0JCWFpcmJydXNoUmFkaXVzU2NhbGUuc2V0U2VsZWN0aW9uKHRvb2xTZXR0aW5ncy5haXJicnVzaFJhZGl1cyk7Ci0JCWFpcmJydXNoUmFkaXVzU2NhbGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlhaXJicnVzaFJhZGl1c1NjYWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRvb2xTZXR0aW5ncy5haXJicnVzaFJhZGl1cyA9IGFpcmJydXNoUmFkaXVzU2NhbGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJdXBkYXRlVG9vbFNldHRpbmdzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWxhYmVsID0gbmV3IExhYmVsKHRvb2xTZXR0aW5nc0ZyYW1lLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInNldHRpbmdzLkFpcmJydXNoSW50ZW5zaXR5LnRleHQiKSk7Ci0KLQkJZmluYWwgU2NhbGUgYWlyYnJ1c2hJbnRlbnNpdHlTY2FsZSA9IG5ldyBTY2FsZSh0b29sU2V0dGluZ3NGcmFtZSwgU1dULkhPUklaT05UQUwpOwotCQlhaXJicnVzaEludGVuc2l0eVNjYWxlLnNldE1pbmltdW0oMSk7Ci0JCWFpcmJydXNoSW50ZW5zaXR5U2NhbGUuc2V0TWF4aW11bSgxMDApOwotCQlhaXJicnVzaEludGVuc2l0eVNjYWxlLnNldFNlbGVjdGlvbih0b29sU2V0dGluZ3MuYWlyYnJ1c2hJbnRlbnNpdHkpOwotCQlhaXJicnVzaEludGVuc2l0eVNjYWxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJYWlyYnJ1c2hJbnRlbnNpdHlTY2FsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0b29sU2V0dGluZ3MuYWlyYnJ1c2hJbnRlbnNpdHkgPSBhaXJicnVzaEludGVuc2l0eVNjYWxlLmdldFNlbGVjdGlvbigpOwotCQkJCXVwZGF0ZVRvb2xTZXR0aW5ncygpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhcgotCSAqIGluc3RhbmNlIG9mIHRoZSBQYWludEV4YW1wbGUuCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChwYWludFN1cmZhY2UgIT0gbnVsbCkgcGFpbnRTdXJmYWNlLmRpc3Bvc2UoKTsJCQotCQlpZiAocGFpbnRDb2xvcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWludENvbG9ycy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIENvbG9yIGNvbG9yID0gcGFpbnRDb2xvcnNbaV07Ci0JCQkJaWYgKGNvbG9yICE9IG51bGwpIGNvbG9yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlwYWludERlZmF1bHRGb250ID0gbnVsbDsKLQkJcGFpbnRDb2xvcnMgPSBudWxsOwotCQlwYWludFN1cmZhY2UgPSBudWxsOwotCQlmcmVlUmVzb3VyY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogRnJlZXMgdGhlIHJlc291cmNlIGJ1bmRsZSByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgZnJlZVJlc291cmNlcygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b29scy5sZW5ndGg7ICsraSkgewotCQkJVG9vbCB0b29sID0gdG9vbHNbaV07Ci0JCQlmaW5hbCBJbWFnZSBpbWFnZSA9IHRvb2wuaW1hZ2U7Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJdG9vbC5pbWFnZSA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRGlzcGxheS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5IHdlJ3JlIHVzaW5nCi0JICovCi0JcHVibGljIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJcmV0dXJuIG1haW5Db21wb3NpdGUuZ2V0RGlzcGxheSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBhbmQgYmluZHMgaXQKLQkgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLAotCSAqIHJldHVybiB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGNvbG9ycywgZm9udHMsIGFuZCB0b29sIHNldHRpbmdzLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBtYWluQ29tcG9zaXRlLmdldERpc3BsYXkoKTsKLQkJCi0JCXBhaW50Q29sb3JXaGl0ZSA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDI1NSwgMjU1KTsKLQkJcGFpbnRDb2xvckJsYWNrID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDAsIDApOwotCQkKLQkJcGFpbnREZWZhdWx0Rm9udCA9IGRpc3BsYXkuZ2V0U3lzdGVtRm9udCgpOwotCi0JCXBhaW50Q29sb3JzID0gbmV3IENvbG9yW251bVBhbGV0dGVDb2xzICogbnVtUGFsZXR0ZVJvd3NdOwotCQlwYWludENvbG9yc1swXSA9IHBhaW50Q29sb3JCbGFjazsKLQkJcGFpbnRDb2xvcnNbMV0gPSBwYWludENvbG9yV2hpdGU7Ci0JCWZvciAoaW50IGkgPSAyOyBpIDwgcGFpbnRDb2xvcnMubGVuZ3RoOyBpKyspIHsKLQkJCXBhaW50Q29sb3JzW2ldID0gbmV3IENvbG9yKGRpc3BsYXksCi0JCQkJKChpKjcpJTI1NSksKChpKjIzKSUyNTUpLCAoKGkqNTEpJTI1NSkpOwotCQl9Ci0KLQkJdG9vbFNldHRpbmdzID0gbmV3IFRvb2xTZXR0aW5ncygpOwotCQl0b29sU2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yID0gcGFpbnRDb2xvckJsYWNrOwotCQl0b29sU2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yID0gcGFpbnRDb2xvcldoaXRlOwotCQl0b29sU2V0dGluZ3MuY29tbW9uRm9udCA9IHBhaW50RGVmYXVsdEZvbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWN0aW9uIGZpZWxkIG9mIHRoZSB0b29scwotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0QWN0aW9ucygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b29scy5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgVG9vbCB0b29sID0gdG9vbHNbaV07Ci0JCQlTdHJpbmcgZ3JvdXAgPSB0b29sLmdyb3VwOwotCQkJaWYgKGdyb3VwLmVxdWFscygidG9vbCIpKSB7Ci0JCQkJdG9vbC5hY3Rpb24gPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXNldFBhaW50VG9vbCh0b29sLmlkKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9IGVsc2UgaWYgKGdyb3VwLmVxdWFscygiZmlsbCIpKSB7Ci0JCQkJdG9vbC5hY3Rpb24gPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXNldEZpbGxUeXBlKHRvb2wuaWQpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0gZWxzZSBpZiAoZ3JvdXAuZXF1YWxzKCJsaW5lc3R5bGUiKSkgewotCQkJCXRvb2wuYWN0aW9uID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzZXRMaW5lU3R5bGUodG9vbC5pZCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfSBlbHNlIGlmIChncm91cC5lcXVhbHMoIm9wdGlvbnMiKSkgewotCQkJCXRvb2wuYWN0aW9uID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlGb250RGlhbG9nIGZvbnREaWFsb2cgPSBuZXcgRm9udERpYWxvZyhwYWludFN1cmZhY2UuZ2V0U2hlbGwoKSwgU1dULlBSSU1BUllfTU9EQUwpOwotCQkJCQkJRm9udERhdGFbXSBmb250RGF0dW0gPSB0b29sU2V0dGluZ3MuY29tbW9uRm9udC5nZXRGb250RGF0YSgpOwotCQkJCQkJaWYgKGZvbnREYXR1bSAhPSBudWxsICYmIGZvbnREYXR1bS5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJZm9udERpYWxvZy5zZXRGb250TGlzdChmb250RGF0dW0pOwotCQkJCQkJfQotCQkJCQkJZm9udERpYWxvZy5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJvcHRpb25zLkZvbnQuZGlhbG9nLnRpdGxlIikpOwotCi0JCQkJCQlwYWludFN1cmZhY2UuaGlkZVJ1YmJlcmJhbmQoKTsKLQkJCQkJCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuKCk7Ci0JCQkJCQlwYWludFN1cmZhY2Uuc2hvd1J1YmJlcmJhbmQoKTsKLQkJCQkJCWlmIChmb250RGF0YSAhPSBudWxsKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJRm9udCBmb250ID0gbmV3IEZvbnQobWFpbkNvbXBvc2l0ZS5nZXREaXNwbGF5KCksIGZvbnREYXRhKTsKLQkJCQkJCQkJdG9vbFNldHRpbmdzLmNvbW1vbkZvbnQgPSBmb250OwotCQkJCQkJCQl1cGRhdGVUb29sU2V0dGluZ3MoKTsKLQkJCQkJCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIGltYWdlIHJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0UmVzb3VyY2VzKCkgewotCQlmaW5hbCBDbGFzcyBjbGF6eiA9IFBhaW50RXhhbXBsZS5jbGFzczsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b29scy5sZW5ndGg7ICsraSkgewotCQkJCQlUb29sIHRvb2wgPSB0b29sc1tpXTsKLQkJCQkJU3RyaW5nIGlkID0gdG9vbC5ncm91cCArICcuJyArIHRvb2wubmFtZTsKLQkJCQkJSW5wdXRTdHJlYW0gc291cmNlU3RyZWFtID0gY2xhenouZ2V0UmVzb3VyY2VBc1N0cmVhbShnZXRSZXNvdXJjZVN0cmluZyhpZCArICIuaW1hZ2UiKSk7Ci0JCQkJCUltYWdlRGF0YSBzb3VyY2UgPSBuZXcgSW1hZ2VEYXRhKHNvdXJjZVN0cmVhbSk7Ci0JCQkJCUltYWdlRGF0YSBtYXNrID0gc291cmNlLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCQkJdG9vbC5pbWFnZSA9IG5ldyBJbWFnZShudWxsLCBzb3VyY2UsIG1hc2spOwotCQkJCQl0cnkgewotCQkJCQkJc291cmNlU3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCX0KLQkJfQotCQlTdHJpbmcgZXJyb3IgPSAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgPwotCQkJZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIpIDoKLQkJCSJVbmFibGUgdG8gbG9hZCByZXNvdXJjZXMiOwotCQlmcmVlUmVzb3VyY2VzKCk7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGVycm9yKTsKLQl9Ci0KLQkvKioKLQkgKiBHcmFicyBpbnB1dCBmb2N1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJbWFpbkNvbXBvc2l0ZS5zZXRGb2N1cygpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sIGZvcmVncm91bmQgY29sb3IuCi0JICogCi0JICogQHBhcmFtIGNvbG9yIHRoZSBuZXcgY29sb3IgdG8gdXNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWlmIChhY3RpdmVGb3JlZ3JvdW5kQ29sb3JDYW52YXMgIT0gbnVsbCkKLQkJCWFjdGl2ZUZvcmVncm91bmRDb2xvckNhbnZhcy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJdG9vbFNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciA9IGNvbG9yOwotCQl1cGRhdGVUb29sU2V0dGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRvb2wgYmFja2dyb3VuZCBjb2xvci4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIG5ldyBjb2xvciB0byB1c2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsKLQkJaWYgKGFjdGl2ZUJhY2tncm91bmRDb2xvckNhbnZhcyAhPSBudWxsKQotCQkJYWN0aXZlQmFja2dyb3VuZENvbG9yQ2FudmFzLnNldEJhY2tncm91bmQoY29sb3IpOwotCQl0b29sU2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yID0gY29sb3I7Ci0JCXVwZGF0ZVRvb2xTZXR0aW5ncygpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdHMgYSB0b29sIGdpdmVuIGl0cyBJRC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWludFRvb2woaW50IGlkKSB7Ci0JCVBhaW50VG9vbCBwYWludFRvb2wgPSAoUGFpbnRUb29sKSB0b29sc1tpZF0uZGF0YTsKLQkJcGFpbnRTdXJmYWNlLnNldFBhaW50U2Vzc2lvbihwYWludFRvb2wpOwotCQl1cGRhdGVUb29sU2V0dGluZ3MoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2VsZWN0cyBhIGZpbGx0eXBlIGdpdmVuIGl0cyBJRC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxsVHlwZShpbnQgaWQpIHsKLQkJSW50ZWdlciBmaWxsVHlwZSA9IChJbnRlZ2VyKSB0b29sc1tpZF0uZGF0YTsKLQkJdG9vbFNldHRpbmdzLmNvbW1vbkZpbGxUeXBlID0gZmlsbFR5cGUuaW50VmFsdWUoKTsKLQkJdXBkYXRlVG9vbFNldHRpbmdzKCk7CQkKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3RzIGxpbmUgdHlwZSBnaXZlbiBpdHMgSUQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGluZVN0eWxlKGludCBpZCkgewotCQlJbnRlZ2VyIGxpbmVUeXBlID0gKEludGVnZXIpIHRvb2xzW2lkXS5kYXRhOwotCQl0b29sU2V0dGluZ3MuY29tbW9uTGluZVN0eWxlID0gbGluZVR5cGUuaW50VmFsdWUoKTsKLQkJdXBkYXRlVG9vbFNldHRpbmdzKCk7CQkKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBzaGVsbCB0byBpdCdzICJwYWNrZWQiIHNpemUsCi0JICogdW5sZXNzIHRoYXQgbWFrZXMgaXQgYmlnZ2VyIHRoYW4gdGhlIGRpc3BsYXksCi0JICogaW4gd2hpY2ggY2FzZSBzZXQgaXQgdG8gOS8xMCBvZiBkaXNwbGF5IHNpemUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRTaGVsbFNpemUgKERpc3BsYXkgZGlzcGxheSwgU2hlbGwgc2hlbGwpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGRpc3BsYXkuZ2V0Qm91bmRzKCk7Ci0JCVBvaW50IHNpemUgPSBzaGVsbC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJaWYgKHNpemUueCA+IGJvdW5kcy53aWR0aCkgc2l6ZS54ID0gYm91bmRzLndpZHRoICogOSAvIDEwOwotCQlpZiAoc2l6ZS55ID4gYm91bmRzLmhlaWdodCkgc2l6ZS55ID0gYm91bmRzLmhlaWdodCAqIDkgLyAxMDsKLQkJc2hlbGwuc2V0U2l6ZSAoc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIHRvb2wgdGhhdCBpdHMgc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkLgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVUb29sU2V0dGluZ3MoKSB7Ci0JCWZpbmFsIFBhaW50VG9vbCBhY3RpdmVQYWludFRvb2wgPSBwYWludFN1cmZhY2UuZ2V0UGFpbnRUb29sKCk7Ci0JCWlmIChhY3RpdmVQYWludFRvb2wgPT0gbnVsbCkgcmV0dXJuOwotCQkKLQkJYWN0aXZlUGFpbnRUb29sLmVuZFNlc3Npb24oKTsKLQkJYWN0aXZlUGFpbnRUb29sLnNldCh0b29sU2V0dGluZ3MpOwotCQlhY3RpdmVQYWludFRvb2wuYmVnaW5TZXNzaW9uKCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFNlc3Npb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50U2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmE4NmY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50U2Vzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi0vKioKLSAqIE1hbmFnZXMgYW4gaW50ZXJhY3RpdmUgcGFpbnQgc2Vzc2lvbi4KLSAqIE5vdGUgdGhhdCB0aGUgY29vcmRpbmF0ZXMgcmVjZWl2ZWQgdmlhIHRoZSBsaXN0ZW5lciBpbnRlcmZhY2VzIGFyZSB2aXJ0dWFsaXplZCB0byB6ZXJvLW9yaWdpbgotICogcmVsYXRpdmUgdG8gdGhlIHBhaW50aW5nIHN1cmZhY2UuCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFBhaW50U2Vzc2lvbiBleHRlbmRzIE1vdXNlTGlzdGVuZXIsIE1vdXNlTW92ZUxpc3RlbmVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWludCBzdXJmYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhaW50IHNlc3Npb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIFBhaW50U3VyZmFjZQotCSAqLwotCXB1YmxpYyBQYWludFN1cmZhY2UgZ2V0UGFpbnRTdXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBBY3RpdmF0ZXMgdGhlIHNlc3Npb24uCi0JICogCi0JICogTm90ZTogV2hlbiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLCBjYWxsIHN1cGVyLmJlZ2luU2Vzc2lvbigpIGF0IG1ldGhvZCBzdGFydC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBiZWdpblNlc3Npb24oKTsKLQkKLQkvKioKLQkgKiBEZWFjdGl2YXRlcyB0aGUgc2Vzc2lvbi4KLSAgICAgKgotCSAqIE5vdGU6IFdoZW4gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCwgY2FsbCBzdXBlci5lbmRTZXNzaW9uKCkgYXQgbWV0aG9kIGV4aXQuCi0gICAgICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZW5kU2Vzc2lvbigpOwotCQotCS8qKgotCSAqIFJlc2V0cyB0aGUgc2Vzc2lvbi4KLQkgKiBBYm9ydHMgYW55IG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4KLQkgKiAKLQkgKiBOb3RlOiBXaGVuIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QsIGNhbGwgc3VwZXIucmVzZXRTZXNzaW9uKCkgYXQgbWV0aG9kIGV4aXQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVzZXRTZXNzaW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50U3VyZmFjZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRTdXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NjY0MDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRTdXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIE1hbmFnZXMgYSBzaW1wbGUgZHJhd2luZyBzdXJmYWNlLgotICovCi1wdWJsaWMgY2xhc3MgUGFpbnRTdXJmYWNlIHsKLQlwcml2YXRlIFBvaW50IGN1cnJlbnRQb3NpdGlvbiA9IG5ldyBQb2ludCgwLCAwKTsKLQlwcml2YXRlIENhbnZhcyBwYWludENhbnZhczsKLQotCXByaXZhdGUgUGFpbnRTZXNzaW9uIHBhaW50U2Vzc2lvbjsKLQlwcml2YXRlIEltYWdlIGltYWdlOwotCXByaXZhdGUgSW1hZ2UgcGFpbnRJbWFnZTsgLy8gYnVmZmVyIGZvciByZWZyZXNoIGJsaXRzCi0JcHJpdmF0ZSBpbnQgICBpbWFnZVdpZHRoLCBpbWFnZUhlaWdodDsKLQlwcml2YXRlIGludCAgIHZpc2libGVXaWR0aCwgdmlzaWJsZUhlaWdodDsKLQotCXByaXZhdGUgRmlndXJlRHJhd0NvbnRleHQgZGlzcGxheUZEQyA9IG5ldyBGaWd1cmVEcmF3Q29udGV4dCgpOwotCXByaXZhdGUgRmlndXJlRHJhd0NvbnRleHQgaW1hZ2VGREMgPSBuZXcgRmlndXJlRHJhd0NvbnRleHQoKTsKLQlwcml2YXRlIEZpZ3VyZURyYXdDb250ZXh0IHBhaW50RkRDID0gbmV3IEZpZ3VyZURyYXdDb250ZXh0KCk7Ci0KLQkvKiBSdWJiZXJiYW5kICovCi0JcHJpdmF0ZSBDb250YWluZXJGaWd1cmUgcnViYmVyYmFuZCA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLQkJLy8gdGhlIGFjdGl2ZSBydWJiZXJiYW5kIHNlbGVjdGlvbgotCXByaXZhdGUgaW50IHJ1YmJlcmJhbmRIaWRkZW5OZXN0aW5nQ291bnQgPSAwOwotCQkvLyBhbHdheXMgPj0gMCwgaWYgPiAwIHJ1YmJlcmJhbmQgaGFzIGJlZW4gaGlkZGVuCi0KLQkvKiBTdGF0dXMgKi8KLQlwcml2YXRlIFRleHQgc3RhdHVzVGV4dDsKLQlwcml2YXRlIFN0cmluZyBzdGF0dXNBY3Rpb25JbmZvLCBzdGF0dXNNZXNzYWdlSW5mbywgc3RhdHVzQ29vcmRJbmZvOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFBhaW50U3VyZmFjZS4KLQkgKiA8cD4KLQkgKiBwYWludENhbnZhcyBtdXN0IGhhdmUgU1dULk5PX1JFRFJBV19SRVNJWkUgYW5kIFNXVC5OT19CQUNLR1JPVU5EIHN0eWxlcywKLQkgKiAgICAgYW5kIG1heSBoYXZlIFNXVC5WX1NDUk9MTCBhbmQvb3IgU1dULkhfU0NST0xMLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gcGFpbnRDYW52YXMgdGhlIENhbnZhcyBvYmplY3QgaW4gd2hpY2ggdG8gcmVuZGVyCi0JICogQHBhcmFtIHBhaW50U3RhdHVzIHRoZSBQYWludFN0YXR1cyBvYmplY3QgdG8gdXNlIGZvciBwcm92aWRpbmcgdXNlciBmZWVkYmFjawotCSAqIEBwYXJhbSBmaWxsQ29sb3IgdGhlIGNvbG9yIHRvIGZpbGwgdGhlIGNhbnZhcyB3aXRoIGluaXRpYWxseQotCSAqLwotCXB1YmxpYyBQYWludFN1cmZhY2UoQ2FudmFzIHBhaW50Q2FudmFzLCBUZXh0IHN0YXR1c1RleHQsIENvbG9yIGZpbGxDb2xvcikgewotCQl0aGlzLnBhaW50Q2FudmFzID0gcGFpbnRDYW52YXM7Ci0JCXRoaXMuc3RhdHVzVGV4dCA9IHN0YXR1c1RleHQ7Ci0JCWNsZWFyU3RhdHVzKCk7Ci0KLQkJLyogU2V0IHVwIHRoZSBkcmF3aW5nIHN1cmZhY2UgKi8KLQkJUmVjdGFuZ2xlIGRpc3BsYXlSZWN0ID0gcGFpbnRDYW52YXMuZ2V0RGlzcGxheSgpLmdldENsaWVudEFyZWEoKTsKLQkJaW1hZ2VXaWR0aCA9IGRpc3BsYXlSZWN0LndpZHRoOwotCQlpbWFnZUhlaWdodCA9IGRpc3BsYXlSZWN0LmhlaWdodDsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UocGFpbnRDYW52YXMuZ2V0RGlzcGxheSgpLCBpbWFnZVdpZHRoLCBpbWFnZUhlaWdodCk7Ci0KLQkJaW1hZ2VGREMuZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCQlpbWFnZUZEQy5nYy5zZXRCYWNrZ3JvdW5kKGZpbGxDb2xvcik7Ci0JCWltYWdlRkRDLmdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQpOwotCQlkaXNwbGF5RkRDLmdjID0gbmV3IEdDKHBhaW50Q2FudmFzKTsKLQotCQkvKiBJbml0aWFsaXplIHRoZSBzZXNzaW9uICovCi0JCXNldFBhaW50U2Vzc2lvbihudWxsKTsKLQotCQkvKiBBZGQgb3VyIGxpc3RlbmVycyAqLwotCQlwYWludENhbnZhcy5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJZGlzcGxheUZEQy5nYy5kaXNwb3NlKCk7Ci0JCQl9CQkJCi0JCX0pOwotCQlwYWludENhbnZhcy5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBldmVudCkgewotCQkJCXByb2Nlc3NNb3VzZUV2ZW50Q29vcmRpbmF0ZXMoZXZlbnQpOwotCQkJCWlmIChwYWludFNlc3Npb24gIT0gbnVsbCkgcGFpbnRTZXNzaW9uLm1vdXNlRG93bihldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQlwcm9jZXNzTW91c2VFdmVudENvb3JkaW5hdGVzKGV2ZW50KTsKLQkJCQlpZiAocGFpbnRTZXNzaW9uICE9IG51bGwpIHBhaW50U2Vzc2lvbi5tb3VzZVVwKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBldmVudCkgewotCQkJCXByb2Nlc3NNb3VzZUV2ZW50Q29vcmRpbmF0ZXMoZXZlbnQpOwotCQkJCWlmIChwYWludFNlc3Npb24gIT0gbnVsbCkgcGFpbnRTZXNzaW9uLm1vdXNlRG91YmxlQ2xpY2soZXZlbnQpOwotCQkJfQkJCQotCQl9KTsKLQkJcGFpbnRDYW52YXMuYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQlwcm9jZXNzTW91c2VFdmVudENvb3JkaW5hdGVzKGV2ZW50KTsKLQkJCQlpZiAocGFpbnRTZXNzaW9uICE9IG51bGwpIHBhaW50U2Vzc2lvbi5tb3VzZU1vdmUoZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJcGFpbnRDYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHJ1YmJlcmJhbmQuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIE5vdGhpbmcgdG8gbWVyZ2UsIHNvIHdlIGp1c3QgcmVmcmVzaAotCQkJCQlldmVudC5nYy5kcmF3SW1hZ2UoaW1hZ2UsCi0JCQkJCQlkaXNwbGF5RkRDLnhPZmZzZXQgKyBldmVudC54LCBkaXNwbGF5RkRDLnlPZmZzZXQgKyBldmVudC55LCBldmVudC53aWR0aCwgZXZlbnQuaGVpZ2h0LAotCQkJCQkJZXZlbnQueCwgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogQXZvaWQgZmxpY2tlciB3aGVuIG1lcmdpbmcgb3ZlcmxheWVkIG9iamVjdHMgYnkgY29uc3RydWN0aW5nIHRoZSBpbWFnZSBvbgotCQkJCQkgKiBhIGJhY2tidWZmZXIgZmlyc3QsIHRoZW4gYmxpdHRpbmcgaXQgdG8gdGhlIHNjcmVlbi4KLQkJCQkJICovCi0JCQkJCS8vIENoZWNrIHRoYXQgdGhlIGJhY2tidWZmZXIgaXMgbGFyZ2UgZW5vdWdoCi0JCQkJCWlmIChwYWludEltYWdlICE9IG51bGwpIHsKLQkJCQkJCVJlY3RhbmdsZSByZWN0ID0gcGFpbnRJbWFnZS5nZXRCb3VuZHMoKTsKLQkJCQkJCWlmICgoZXZlbnQud2lkdGggKyBldmVudC54ID4gcmVjdC53aWR0aCkgfHwKLQkJCQkJCQkoZXZlbnQuaGVpZ2h0ICsgZXZlbnQueSA+IHJlY3QuaGVpZ2h0KSkgewotCQkJCQkJCXBhaW50RkRDLmdjLmRpc3Bvc2UoKTsKLQkJCQkJCQlwYWludEltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQlwYWludEltYWdlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocGFpbnRJbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0JCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGRpc3BsYXkuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCQkJcGFpbnRJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LAotCQkJCQkJCU1hdGgubWF4KHJlY3Qud2lkdGgsIGV2ZW50LndpZHRoICsgZXZlbnQueCksCi0JCQkJCQkJTWF0aC5tYXgocmVjdC5oZWlnaHQsIGV2ZW50LmhlaWdodCArIGV2ZW50LnkpKTsKLQkJCQkJCXBhaW50RkRDLmdjID0gbmV3IEdDKHBhaW50SW1hZ2UpOwotCQkJCQl9Ci0JCQkJCS8vIFNldHVwIGNsaXBwaW5nIGFuZCB0aGUgRkRDCi0JCQkJCVJlZ2lvbiBjbGlwUmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCQkJCQlldmVudC5nYy5nZXRDbGlwcGluZyhjbGlwUmVnaW9uKTsJCQkJCQotCQkJCQlwYWludEZEQy5nYy5zZXRDbGlwcGluZyhjbGlwUmVnaW9uKTsKLQkJCQkJY2xpcFJlZ2lvbi5kaXNwb3NlKCk7Ci0KLQkJCQkJcGFpbnRGREMueE9mZnNldCA9IGRpc3BsYXlGREMueE9mZnNldDsKLQkJCQkJcGFpbnRGREMueU9mZnNldCA9IGRpc3BsYXlGREMueU9mZnNldDsKLQkJCQkJcGFpbnRGREMueFNjYWxlID0gZGlzcGxheUZEQy54U2NhbGU7Ci0JCQkJCXBhaW50RkRDLnlTY2FsZSA9IGRpc3BsYXlGREMueVNjYWxlOwotCQkJCQkKLQkJCQkJLy8gTWVyZ2UgdGhlIG92ZXJsYXllZCBvYmplY3RzIGludG8gdGhlIGltYWdlLCB0aGVuIGJsaXQKLQkJCQkJcGFpbnRGREMuZ2MuZHJhd0ltYWdlKGltYWdlLAotCQkJCQkJZGlzcGxheUZEQy54T2Zmc2V0ICsgZXZlbnQueCwgZGlzcGxheUZEQy55T2Zmc2V0ICsgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCwKLQkJCQkJCWV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQpOwotCQkJCQlydWJiZXJiYW5kLmRyYXcocGFpbnRGREMpOwotCQkJCQlldmVudC5nYy5kcmF3SW1hZ2UocGFpbnRJbWFnZSwKLQkJCQkJCWV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQsCi0JCQkJCQlldmVudC54LCBldmVudC55LCBldmVudC53aWR0aCwgZXZlbnQuaGVpZ2h0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlwYWludENhbnZhcy5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlUmVzaXplKCk7Ci0JCQl9CQkJCi0JCX0pOwotCi0JCS8qIFNldCB1cCB0aGUgcGFpbnQgY2FudmFzIHNjcm9sbCBiYXJzICovCi0JCVNjcm9sbEJhciBob3Jpem9udGFsID0gcGFpbnRDYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlob3Jpem9udGFsLnNldFZpc2libGUodHJ1ZSk7Ci0JCWhvcml6b250YWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNjcm9sbEhvcml6b250YWxseSgoU2Nyb2xsQmFyKWV2ZW50LndpZGdldCk7Ci0JCQl9Ci0JCX0pOwotCQlTY3JvbGxCYXIgdmVydGljYWwgPSBwYWludENhbnZhcy5nZXRWZXJ0aWNhbEJhcigpOwotCQl2ZXJ0aWNhbC5zZXRWaXNpYmxlKHRydWUpOwotCQl2ZXJ0aWNhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2Nyb2xsVmVydGljYWxseSgoU2Nyb2xsQmFyKWV2ZW50LndpZGdldCk7Ci0JCQl9Ci0JCX0pOwotCQloYW5kbGVSZXNpemUoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhlIFBhaW50U3VyZmFjZSdzIHJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbWFnZUZEQy5nYy5kaXNwb3NlKCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJaWYgKHBhaW50SW1hZ2UgIT0gbnVsbCkgewotCQkJcGFpbnRJbWFnZS5kaXNwb3NlKCk7Ci0JCQlwYWludEZEQy5nYy5kaXNwb3NlKCk7Ci0JCX0KLQotCQljdXJyZW50UG9zaXRpb24gPSBudWxsOwotCQlwYWludENhbnZhcyA9IG51bGw7Ci0JCXBhaW50U2Vzc2lvbiA9IG51bGw7Ci0JCWltYWdlID0gbnVsbDsKLQkJcGFpbnRJbWFnZSA9IG51bGw7Ci0JCWRpc3BsYXlGREMgPSBudWxsOwotCQlpbWFnZUZEQyA9IG51bGw7Ci0JCXBhaW50RkRDID0gbnVsbDsKLQkJcnViYmVyYmFuZCA9IG51bGw7Ci0JCXN0YXR1c1RleHQgPSBudWxsOwotCQlzdGF0dXNBY3Rpb25JbmZvID0gbnVsbDsKLQkJc3RhdHVzTWVzc2FnZUluZm8gPSBudWxsOwotCQlzdGF0dXNDb29yZEluZm8gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpICB7Ci0JCXBhaW50Q2FudmFzLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRGlzcGxheSBvbiB3aGljaCB0aGUgUGFpbnRTdXJmYWNlIHJlc2lkZXMuCi0JICogQHJldHVybiB0aGUgRGlzcGxheQotCSAqLwotCXB1YmxpYyBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiBwYWludENhbnZhcy5nZXREaXNwbGF5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU2hlbGwgaW4gd2hpY2ggdGhlIFBhaW50U3VyZmFjZSByZXNpZGVzLgotCSAqIEByZXR1cm4gdGhlIFNoZWxsCi0JICovCi0JcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotCQlyZXR1cm4gcGFpbnRDYW52YXMuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IHBhaW50IHNlc3Npb24uCi0JICogPHA+Ci0JICogSWYgb2xkUGFpbnRTZXNzaW9uICE9IHBhaW50U2Vzc2lvbiBjYWxscyBvbGRQYWludFNlc3Npb24uZW5kKCkKLQkgKiBhbmQgcGFpbnRTZXNzaW9uLmJlZ2luKCkKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhaW50U2Vzc2lvbiB0aGUgcGFpbnQgc2Vzc2lvbiB0byBhY3RpdmF0ZTsgbnVsbCB0byBkaXNhYmxlIGFsbCBzZXNzaW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhaW50U2Vzc2lvbihQYWludFNlc3Npb24gcGFpbnRTZXNzaW9uKSB7Ci0JCWlmICh0aGlzLnBhaW50U2Vzc2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5wYWludFNlc3Npb24gPT0gcGFpbnRTZXNzaW9uKSByZXR1cm47Ci0JCQl0aGlzLnBhaW50U2Vzc2lvbi5lbmRTZXNzaW9uKCk7Ci0JCX0KLQkJdGhpcy5wYWludFNlc3Npb24gPSBwYWludFNlc3Npb247Ci0JCWNsZWFyU3RhdHVzKCk7Ci0JCWlmIChwYWludFNlc3Npb24gIT0gbnVsbCkgewotCQkJc2V0U3RhdHVzQWN0aW9uKHBhaW50U2Vzc2lvbi5nZXREaXNwbGF5TmFtZSgpKTsKLQkJCXBhaW50U2Vzc2lvbi5iZWdpblNlc3Npb24oKTsKLQkJfSBlbHNlIHsKLQkJCXNldFN0YXR1c0FjdGlvbihQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuTnVsbC5sYWJlbCIpKTsKLQkJCXNldFN0YXR1c01lc3NhZ2UoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJzZXNzaW9uLk51bGwubWVzc2FnZSIpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgcGFpbnQgc2Vzc2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHBhaW50IHNlc3Npb24sIG51bGwgaWYgbm9uZSBpcyBhY3RpdmUKLQkgKi8KLQlwdWJsaWMgUGFpbnRTZXNzaW9uIGdldFBhaW50U2Vzc2lvbigpIHsKLQkJcmV0dXJuIHBhaW50U2Vzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBhaW50IHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBwYWludCB0b29sLCBudWxsIGlmIG5vbmUgaXMgYWN0aXZlICh0aG91Z2ggc29tZSBvdGhlciBzZXNzaW9uCi0JICogICAgICAgICBtaWdodCBiZSkKLQkgKi8KLQlwdWJsaWMgUGFpbnRUb29sIGdldFBhaW50VG9vbCgpIHsKLQkJcmV0dXJuIChwYWludFNlc3Npb24gIT0gbnVsbCAmJiBwYWludFNlc3Npb24gaW5zdGFuY2VvZiBQYWludFRvb2wpID8KLQkJCShQYWludFRvb2wpcGFpbnRTZXNzaW9uIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIGFuIGludGVyYWN0aXZlIG9wZXJhdGlvbi4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGxhc3Qga25vd24gcG9zaXRpb24gb2YgdGhlIHBvaW50ZXIKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0Q3VycmVudFBvc2l0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudFBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIERyYXdzIGEgRmlndXJlIG9iamVjdCB0byB0aGUgc2NyZWVuIGFuZCB0byB0aGUgYmFja2luZyBzdG9yZSBwZXJtYW5lbnRseS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gZHJhdyBvbnNjcmVlbgotCSAqLwotCXB1YmxpYyB2b2lkIGRyYXdGaWd1cmUoRmlndXJlIG9iamVjdCkgewotCQlvYmplY3QuZHJhdyhpbWFnZUZEQyk7Ci0JCW9iamVjdC5kcmF3KGRpc3BsYXlGREMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBGaWd1cmUgb2JqZWN0IHRvIHRoZSBhY3RpdmUgcnViYmVyYmFuZCBzZWxlY3Rpb24uCi0JICogPHA+Ci0JICogVGhpcyBvYmplY3Qgd2lsbCBiZSBkcmF3biB0byB0aGUgc2NyZWVuIGFzIGEgcHJldmlldyBhbmQgcmVmcmVzaGVkIGFwcHJvcHJpYXRlbHkKLQkgKiB1bnRpbCB0aGUgc2VsZWN0aW9uIGlzIGVpdGhlciBjbGVhcmVkIG9yIGNvbW1pdHRlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0IHRvIGFkZCB0byB0aGUgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYWRkUnViYmVyYmFuZFNlbGVjdGlvbihGaWd1cmUgb2JqZWN0KSB7Ci0JCXJ1YmJlcmJhbmQuYWRkKG9iamVjdCk7Ci0JCWlmICghIGlzUnViYmVyYmFuZEhpZGRlbigpKSBvYmplY3QuZHJhdyhkaXNwbGF5RkRDKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGFjdGl2ZSBydWJiZXJiYW5kIHNlbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiBFcmFzZXMgYW55IHJ1YmJlcmJhbmQgb2JqZWN0cyBvbiB0aGUgc2NyZWVuIHRoZW4gY2xlYXJzIHRoZSBzZWxlY3Rpb24uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpIHsKLQkJaWYgKCEgaXNSdWJiZXJiYW5kSGlkZGVuKCkpIHsKLQkJCVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKCk7Ci0JCQlydWJiZXJiYW5kLmFkZERhbWFnZWRSZWdpb24oZGlzcGxheUZEQywgcmVnaW9uKTsKLQkJCVJlY3RhbmdsZSByID0gcmVnaW9uLmdldEJvdW5kcygpOwotCQkJcGFpbnRDYW52YXMucmVkcmF3KHIueCwgci55LCByLndpZHRoLCByLmhlaWdodCwgdHJ1ZSk7Ci0JCQlyZWdpb24uZGlzcG9zZSgpOwotCQl9Ci0JCXJ1YmJlcmJhbmQuY2xlYXIoKTsKLQotCX0KLQotCS8qKgotCSAqIENvbW1pdHMgdGhlIGFjdGl2ZSBydWJiZXJiYW5kIHNlbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiBSZWRyYXdzIGFueSBydWJiZXJiYW5kIG9iamVjdHMgb24gdGhlIHNjcmVlbiBhcyBwZXJtYW5lbnQgb2JqZWN0cyB0aGVuIGNsZWFycyB0aGUgc2VsZWN0aW9uLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21taXRSdWJiZXJiYW5kU2VsZWN0aW9uKCkgewotCQlydWJiZXJiYW5kLmRyYXcoaW1hZ2VGREMpOwotCQlpZiAoaXNSdWJiZXJiYW5kSGlkZGVuKCkpIHJ1YmJlcmJhbmQuZHJhdyhkaXNwbGF5RkRDKTsKLQkJcnViYmVyYmFuZC5jbGVhcigpOwotCX0KLQkKLQkvKioKLQkgKiBIaWRlcyB0aGUgcnViYmVyYmFuZCAoYnV0IGRvZXMgbm90IGVsaW1pbmF0ZSBpdCkuCi0JICogPHA+Ci0JICogSW5jcmVtZW50cyBieSBvbmUgdGhlIHJ1YmJlcmJhbmQgImhpZGUiIG5lc3RpbmcgY291bnQuICBUaGUgcnViYmVyYmFuZAotCSAqIGlzIGhpZGRlbiBmcm9tIHZpZXcgKGJ1dCByZW1haW5zIGFjdGl2ZSkgaWYgaXQgd2Fzbid0IGFscmVhZHkgaGlkZGVuLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBoaWRlUnViYmVyYmFuZCgpIHsKLQkJaWYgKHJ1YmJlcmJhbmRIaWRkZW5OZXN0aW5nQ291bnQrKyA8PSAwKSB7Ci0JCQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCQkJcnViYmVyYmFuZC5hZGREYW1hZ2VkUmVnaW9uKGRpc3BsYXlGREMsIHJlZ2lvbik7Ci0JCQlSZWN0YW5nbGUgciA9IHJlZ2lvbi5nZXRCb3VuZHMoKTsKLQkJCXBhaW50Q2FudmFzLnJlZHJhdyhyLngsIHIueSwgci53aWR0aCwgci5oZWlnaHQsIHRydWUpOwotCQkJcmVnaW9uLmRpc3Bvc2UoKTsKLQkJfQotCX0JCQotCi0JLyoqCi0JICogU2hvd3MgKHVuLWhpZGVzKSB0aGUgcnViYmVyYmFuZC4KLQkgKiA8cD4KLQkgKiBEZWNyZW1lbnRzIGJ5IG9uZSB0aGUgcnViYmVyYmFuZCAiaGlkZSIgbmVzdGluZyBjb3VudC4gIFRoZSBydWJiZXJiYW5kCi0JICogaXMgb25seSBtYWRlIHZpc2libGUgd2hlbiBzaG93UnViYmVyYmFuZCgpIGhhcyBiZWVuIGNhbGxlZCBvbmNlIGZvciBlYWNoCi0JICogcHJldmlvdXMgaGlkZVJ1YmJlcmJhbmQoKS4gIEl0IGlzIG5vdCBwZXJtaXR0ZWQgdG8gY2FsbCBzaG93UnViYmVyYmFuZCgpIGlmCi0JICogdGhlIHJ1YmJlciBiYW5kIGlzIG5vdCBwcmVzZW50bHkgaGlkZGVuLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93UnViYmVyYmFuZCgpIHsKLQkJaWYgKHJ1YmJlcmJhbmRIaWRkZW5OZXN0aW5nQ291bnQgPD0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInJ1YmJlcmJhbmRIaWRkZW5OZXN0aW5nQ291bnQgPiAwIik7Ci0JCWlmICgtLXJ1YmJlcmJhbmRIaWRkZW5OZXN0aW5nQ291bnQgPT0gMCkgewotCQkJcnViYmVyYmFuZC5kcmF3KGRpc3BsYXlGREMpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIHJ1YmJlcmJhbmQgaXMgaGlkZGVuLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhlIHJ1YmJlciBpcyBoaWRkZW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1J1YmJlcmJhbmRIaWRkZW4oKSB7Ci0JCXJldHVybiBydWJiZXJiYW5kSGlkZGVuTmVzdGluZ0NvdW50ID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgaG9yaXpvbnRhbCBzY3JvbGwgZXZlbnQKLQkgKiAKLQkgKiBAcGFyYW0gc2Nyb2xsYmFyIHRoZSBob3Jpem9udGFsIHNjcm9sbCBiYXIgdGhhdCBwb3N0ZWQgdGhpcyBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNjcm9sbEhvcml6b250YWxseShTY3JvbGxCYXIgc2Nyb2xsQmFyKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSByZXR1cm47Ci0JCWlmIChpbWFnZVdpZHRoID4gdmlzaWJsZVdpZHRoKSB7Ci0JCQlmaW5hbCBpbnQgb2xkT2Zmc2V0ID0gZGlzcGxheUZEQy54T2Zmc2V0OwotCQkJZmluYWwgaW50IG5ld09mZnNldCA9IE1hdGgubWluKHNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKSwgaW1hZ2VXaWR0aCAtIHZpc2libGVXaWR0aCk7Ci0JCQlpZiAob2xkT2Zmc2V0ICE9IG5ld09mZnNldCkgewotCQkJCXBhaW50Q2FudmFzLnVwZGF0ZSgpOwotCQkJCWRpc3BsYXlGREMueE9mZnNldCA9IG5ld09mZnNldDsKLQkJCQlwYWludENhbnZhcy5zY3JvbGwoTWF0aC5tYXgob2xkT2Zmc2V0IC0gbmV3T2Zmc2V0LCAwKSwgMCwgTWF0aC5tYXgobmV3T2Zmc2V0IC0gb2xkT2Zmc2V0LCAwKSwgMCwKLQkJCQkJdmlzaWJsZVdpZHRoLCB2aXNpYmxlSGVpZ2h0LCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgdmVydGljYWwgc2Nyb2xsIGV2ZW50Ci0JICogCi0JICogQHBhcmFtIHNjcm9sbGJhciB0aGUgdmVydGljYWwgc2Nyb2xsIGJhciB0aGF0IHBvc3RlZCB0aGlzIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2Nyb2xsVmVydGljYWxseShTY3JvbGxCYXIgc2Nyb2xsQmFyKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSByZXR1cm47Ci0JCWlmIChpbWFnZUhlaWdodCA+IHZpc2libGVIZWlnaHQpIHsKLQkJCWZpbmFsIGludCBvbGRPZmZzZXQgPSBkaXNwbGF5RkRDLnlPZmZzZXQ7Ci0JCQlmaW5hbCBpbnQgbmV3T2Zmc2V0ID0gTWF0aC5taW4oc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpLCBpbWFnZUhlaWdodCAtIHZpc2libGVIZWlnaHQpOwotCQkJaWYgKG9sZE9mZnNldCAhPSBuZXdPZmZzZXQpIHsKLQkJCQlwYWludENhbnZhcy51cGRhdGUoKTsKLQkJCQlkaXNwbGF5RkRDLnlPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0JCQkJcGFpbnRDYW52YXMuc2Nyb2xsKDAsIE1hdGgubWF4KG9sZE9mZnNldCAtIG5ld09mZnNldCwgMCksIDAsIE1hdGgubWF4KG5ld09mZnNldCAtIG9sZE9mZnNldCwgMCksCi0JCQkJCXZpc2libGVXaWR0aCwgdmlzaWJsZUhlaWdodCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgcmVzaXplIGV2ZW50cwotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVSZXNpemUoKSB7Ci0JCXBhaW50Q2FudmFzLnVwZGF0ZSgpOwotCi0JCVJlY3RhbmdsZSB2aXNpYmxlUmVjdCA9IHBhaW50Q2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJdmlzaWJsZVdpZHRoID0gdmlzaWJsZVJlY3Qud2lkdGg7Ci0JCXZpc2libGVIZWlnaHQgPSB2aXNpYmxlUmVjdC5oZWlnaHQ7Ci0KLQkJU2Nyb2xsQmFyIGhvcml6b250YWwgPSBwYWludENhbnZhcy5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JCWlmIChob3Jpem9udGFsICE9IG51bGwpIHsKLQkJCWRpc3BsYXlGREMueE9mZnNldCA9IE1hdGgubWluKGhvcml6b250YWwuZ2V0U2VsZWN0aW9uKCksIGltYWdlV2lkdGggLSB2aXNpYmxlV2lkdGgpOwotCQkJaWYgKGltYWdlV2lkdGggPD0gdmlzaWJsZVdpZHRoKSB7Ci0JCQkJaG9yaXpvbnRhbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlob3Jpem9udGFsLnNldFNlbGVjdGlvbigwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaG9yaXpvbnRhbC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWhvcml6b250YWwuc2V0VmFsdWVzKGRpc3BsYXlGREMueE9mZnNldCwgMCwgaW1hZ2VXaWR0aCwgdmlzaWJsZVdpZHRoLAotCQkJCQk4LCB2aXNpYmxlV2lkdGgpOwotCQkJfQotCQl9Ci0KLQkJU2Nyb2xsQmFyIHZlcnRpY2FsID0gcGFpbnRDYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQkJaWYgKHZlcnRpY2FsICE9IG51bGwpIHsKLQkJCWRpc3BsYXlGREMueU9mZnNldCA9IE1hdGgubWluKHZlcnRpY2FsLmdldFNlbGVjdGlvbigpLCBpbWFnZUhlaWdodCAtIHZpc2libGVIZWlnaHQpOwotCQkJaWYgKGltYWdlSGVpZ2h0IDw9IHZpc2libGVIZWlnaHQpIHsKLQkJCQl2ZXJ0aWNhbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl2ZXJ0aWNhbC5zZXRTZWxlY3Rpb24oMCk7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnRpY2FsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJdmVydGljYWwuc2V0VmFsdWVzKGRpc3BsYXlGREMueU9mZnNldCwgMCwgaW1hZ2VIZWlnaHQsIHZpc2libGVIZWlnaHQsCi0JCQkJCTgsIHZpc2libGVIZWlnaHQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVmlydHVhbGl6ZXMgTW91c2VFdmVudCBjb29yZGluYXRlcyBhbmQgc3RvcmVzIHRoZSBjdXJyZW50IHBvc2l0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzTW91c2VFdmVudENvb3JkaW5hdGVzKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJY3VycmVudFBvc2l0aW9uLnggPSBldmVudC54ID0KLQkJCU1hdGgubWluKE1hdGgubWF4KGV2ZW50LngsIDApLCB2aXNpYmxlV2lkdGggLSAxKSArIGRpc3BsYXlGREMueE9mZnNldDsKLQkJY3VycmVudFBvc2l0aW9uLnkgPSBldmVudC55ID0KLQkJCU1hdGgubWluKE1hdGgubWF4KGV2ZW50LnksIDApLCB2aXNpYmxlSGVpZ2h0IC0gMSkgKyBkaXNwbGF5RkRDLnlPZmZzZXQ7Ci0JfQotCQotCS8qKgotCSAqIENsZWFycyB0aGUgc3RhdHVzIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhclN0YXR1cygpIHsKLQkJc3RhdHVzQWN0aW9uSW5mbyA9ICIiOwotCQlzdGF0dXNNZXNzYWdlSW5mbyA9ICIiOwotCQlzdGF0dXNDb29yZEluZm8gPSAiIjsKLQkJdXBkYXRlU3RhdHVzKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdHVzIGJhciBhY3Rpb24gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiBpbiBwcm9ncmVzcywgbnVsbCB0byBjbGVhcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXR1c0FjdGlvbihTdHJpbmcgYWN0aW9uKSB7Ci0JCXN0YXR1c0FjdGlvbkluZm8gPSAoYWN0aW9uICE9IG51bGwpID8gYWN0aW9uIDogIiI7Ci0JCXVwZGF0ZVN0YXR1cygpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0dXMgYmFyIG1lc3NhZ2UgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBkaXNwbGF5LCBudWxsIHRvIGNsZWFyCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlzdGF0dXNNZXNzYWdlSW5mbyA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICIiOwotCQl1cGRhdGVTdGF0dXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb29yZGluYXRlcyBpbiB0aGUgc3RhdHVzIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gY29vcmQgdGhlIGNvb3JkaW5hdGVzIHRvIGRpc3BsYXksIG51bGwgdG8gY2xlYXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXNDb29yZChQb2ludCBjb29yZCkgewotCQlzdGF0dXNDb29yZEluZm8gPSAoY29vcmQgIT0gbnVsbCkgPyBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInN0YXR1cy5Db29yZC5mb3JtYXQiLCBuZXcgT2JqZWN0W10KLQkJCXsgbmV3IEludGVnZXIoY29vcmQueCksIG5ldyBJbnRlZ2VyKGNvb3JkLnkpfSkgOiAiIjsKLQkJdXBkYXRlU3RhdHVzKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29vcmRpbmF0ZSByYW5nZSBpbiB0aGUgc3RhdHVzIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gYSB0aGUgImZyb20iIGNvb3JkaW5hdGUsIG11c3Qgbm90IGJlIG51bGwKLQkgKiBAcGFyYW0gYiB0aGUgInRvIiBjb29yZGluYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzQ29vcmRSYW5nZShQb2ludCBhLCBQb2ludCBiKSB7Ci0JCXN0YXR1c0Nvb3JkSW5mbyA9IFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygic3RhdHVzLkNvb3JkUmFuZ2UuZm9ybWF0IiwgbmV3IE9iamVjdFtdCi0JCQl7IG5ldyBJbnRlZ2VyKGEueCksIG5ldyBJbnRlZ2VyKGEueSksIG5ldyBJbnRlZ2VyKGIueCksIG5ldyBJbnRlZ2VyKGIueSl9KTsKLQkJdXBkYXRlU3RhdHVzKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZGlzcGxheS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzKCkgewotCQlzdGF0dXNUZXh0LnNldFRleHQoCi0JCQlQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInN0YXR1cy5CYXIuZm9ybWF0IiwgbmV3IE9iamVjdFtdCi0JCQl7IHN0YXR1c0FjdGlvbkluZm8sIHN0YXR1c01lc3NhZ2VJbmZvLCBzdGF0dXNDb29yZEluZm8gfSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50VG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNTYxNGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIFBhaW50VG9vbCBleHRlbmRzIFBhaW50U2Vzc2lvbiB7Ci0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGVuY2lsVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGVuY2lsVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjdlNTAzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BlbmNpbFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEEgcGVuY2lsIHRvb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBQZW5jaWxUb29sIGV4dGVuZHMgQ29udGludW91c1BhaW50U2Vzc2lvbiBpbXBsZW1lbnRzIFBhaW50VG9vbCB7Ci0JcHJpdmF0ZSBUb29sU2V0dGluZ3Mgc2V0dGluZ3M7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIHBlbmNpbCB0b29sLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICogQHBhcmFtIGdldFBhaW50U3VyZmFjZSgpIHRoZSBQYWludFN1cmZhY2Ugd2Ugd2lsbCByZW5kZXIgb24uCi0JICovCi0JcHVibGljIFBlbmNpbFRvb2woVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncywgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCQlzZXQodG9vbFNldHRpbmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJc2V0dGluZ3MgPSB0b29sU2V0dGluZ3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuUGVuY2lsLmxhYmVsIik7Ci0JfQotCi0JLyoKLQkgKiBUZW1wbGF0ZSBtZXRob2QgZm9yIGRyYXdpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW5kZXIoZmluYWwgUG9pbnQgcG9pbnQpIHsKLQkJZmluYWwgUGFpbnRTdXJmYWNlIHBzID0gZ2V0UGFpbnRTdXJmYWNlKCk7Ci0JCXBzLmRyYXdGaWd1cmUobmV3IFBvaW50RmlndXJlKHNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciwgcG9pbnQueCwgcG9pbnQueSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BvaW50RmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Qb2ludEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI4MzE3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BvaW50RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBQb2ludCBvYmplY3QKLSAqLwotcHVibGljIGNsYXNzIFBvaW50RmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yIGNvbG9yOwotCXByaXZhdGUgaW50IHgsIHk7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIFBvaW50Ci0JICogCi0JICogQHBhcmFtIGNvbG9yIHRoZSBjb2xvciBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0geCB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGVuZC1wb2ludAotCSAqIEBwYXJhbSB5IHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgZW5kLXBvaW50Ci0JICovCi0JcHVibGljIFBvaW50RmlndXJlKENvbG9yIGNvbG9yLCBpbnQgeCwgaW50IHkpIHsKLQkJdGhpcy5jb2xvciA9IGNvbG9yOyB0aGlzLnggPSB4OyB0aGlzLnkgPSB5OwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlQb2ludCBwID0gZmRjLnRvQ2xpZW50UG9pbnQoeCwgeSk7Ci0JCWZkYy5nYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmRjLmdjLmZpbGxSZWN0YW5nbGUocC54LCBwLnksIDEsIDEpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4LCB5LCB4LCB5KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUG9seUxpbmVUb29sLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Qb2x5TGluZVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ5ODE1NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Qb2x5TGluZVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEEgcG9seWxpbmUgZHJhd2luZyB0b29sLgotICovCi1wdWJsaWMgY2xhc3MgUG9seUxpbmVUb29sIGV4dGVuZHMgU2VnbWVudGVkUGFpbnRTZXNzaW9uIGltcGxlbWVudHMgUGFpbnRUb29sIHsKLQlwcml2YXRlIFRvb2xTZXR0aW5ncyBzZXR0aW5nczsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQb2x5TGluZVRvb2wuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKiBAcGFyYW0gcGFpbnRTdXJmYWNlIHRoZSBQYWludFN1cmZhY2Ugd2Ugd2lsbCByZW5kZXIgb24uCi0JICovCi0JcHVibGljIFBvbHlMaW5lVG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXNldCh0b29sU2V0dGluZ3MpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sJ3Mgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncykgewotCQlzZXR0aW5ncyA9IHRvb2xTZXR0aW5nczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyB0b29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5Qb2x5TGluZS5sYWJlbCIpOwotCX0KLQotCS8qCi0JICogVGVtcGxhdGUgbWV0aG9kcyBmb3IgZHJhd2luZwotCSAqLwotCXByb3RlY3RlZCBGaWd1cmUgY3JlYXRlRmlndXJlKFBvaW50W10gcG9pbnRzLCBpbnQgbnVtUG9pbnRzLCBib29sZWFuIGNsb3NlZCkgewotCQlDb250YWluZXJGaWd1cmUgY29udGFpbmVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotCQlpZiAoY2xvc2VkICYmIHNldHRpbmdzLmNvbW1vbkZpbGxUeXBlICE9IFRvb2xTZXR0aW5ncy5mdE5vbmUgJiYgbnVtUG9pbnRzID49IDMpIHsKLQkJCWNvbnRhaW5lci5hZGQobmV3IFNvbGlkUG9seWdvbkZpZ3VyZShzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIHBvaW50cywgbnVtUG9pbnRzKSk7Ci0JCX0KLQkJaWYgKCEgY2xvc2VkIHx8IHNldHRpbmdzLmNvbW1vbkZpbGxUeXBlICE9IFRvb2xTZXR0aW5ncy5mdFNvbGlkIHx8IG51bVBvaW50cyA8IDMpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtUG9pbnRzIC0gMTsgKytpKSB7Ci0JCQkJZmluYWwgUG9pbnQgYSA9IHBvaW50c1tpXTsKLQkJCQlmaW5hbCBQb2ludCBiID0gcG9pbnRzW2kgKyAxXTsKLQkJCQljb250YWluZXIuYWRkKG5ldyBMaW5lRmlndXJlKHNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25MaW5lU3R5bGUsCi0JCQkJCWEueCwgYS55LCBiLngsIGIueSkpOwotCQkJfQotCQkJaWYgKGNsb3NlZCkgewotCQkJCWZpbmFsIFBvaW50IGEgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdOwotCQkJCWZpbmFsIFBvaW50IGIgPSBwb2ludHNbMF07Ci0JCQkJY29udGFpbmVyLmFkZChuZXcgTGluZUZpZ3VyZShzZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uTGluZVN0eWxlLAotCQkJCQlhLngsIGEueSwgYi54LCBiLnkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1JlY3RhbmdsZUZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUmVjdGFuZ2xlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkODBlNjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUmVjdGFuZ2xlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBSZWN0YW5nbGUgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZWN0YW5nbGVGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCXByaXZhdGUgQ29sb3IgZm9yZWdyb3VuZENvbG9yLCBiYWNrZ3JvdW5kQ29sb3I7Ci0JcHJpdmF0ZSBpbnQgbGluZVN0eWxlLCB4MSwgeTEsIHgyLCB5MjsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUmVjdGFuZ2xlCi0JICogVGhlc2Ugb2JqZWN0cyBhcmUgZGVmaW5lZCBieSBhbnkgdHdvIGRpYW1ldHJpY2FsbHkgb3Bwb3NpbmcgY29ybmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSBsaW5lU3R5bGUgdGhlIGxpbmUgc3R5bGUgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHgxIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHkxIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHgyIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSB5MiB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKi8KLQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlKENvbG9yIGZvcmVncm91bmRDb2xvciwgQ29sb3IgYmFja2dyb3VuZENvbG9yLCBpbnQgbGluZVN0eWxlLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKLQkJdGhpcy5mb3JlZ3JvdW5kQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7Ci0JCXRoaXMuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yOwotCQl0aGlzLmxpbmVTdHlsZSA9IGxpbmVTdHlsZTsKLQkJdGhpcy54MSA9IHgxOyB0aGlzLnkxID0geTE7IHRoaXMueDIgPSB4MjsgdGhpcy55MiA9IHkyOwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlSZWN0YW5nbGUgciA9IGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5Mik7Ci0JCWZkYy5nYy5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0JCWZkYy5nYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0JCWZkYy5nYy5zZXRMaW5lU3R5bGUobGluZVN0eWxlKTsKLQkJZmRjLmdjLmRyYXdSZWN0YW5nbGUoci54LCByLnksIHIud2lkdGggLSAxLCByLmhlaWdodCAtIDEpOwotCQlmZGMuZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9SZWN0YW5nbGVUb29sLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9SZWN0YW5nbGVUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NzNiYmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUmVjdGFuZ2xlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQSBkcmF3aW5nIHRvb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWN0YW5nbGVUb29sIGV4dGVuZHMgRHJhZ1BhaW50U2Vzc2lvbiBpbXBsZW1lbnRzIFBhaW50VG9vbCB7Ci0JcHJpdmF0ZSBUb29sU2V0dGluZ3Mgc2V0dGluZ3M7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUmVjdGFuZ2xlVG9vbC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqIEBwYXJhbSBwYWludFN1cmZhY2UgdGhlIFBhaW50U3VyZmFjZSB3ZSB3aWxsIHJlbmRlciBvbi4KLQkgKi8KLQlwdWJsaWMgUmVjdGFuZ2xlVG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXNldCh0b29sU2V0dGluZ3MpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sJ3Mgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncykgewotCQlzZXR0aW5ncyA9IHRvb2xTZXR0aW5nczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyB0b29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5SZWN0YW5nbGUubGFiZWwiKTsKLQl9Ci0KLQkvKgotCSAqIFRlbXBsYXRlIG1ldGhvZCBmb3IgZHJhd2luZwotCSAqLwotCXByb3RlY3RlZCBGaWd1cmUgY3JlYXRlRmlndXJlKFBvaW50IGEsIFBvaW50IGIpIHsKLQkJc3dpdGNoIChzZXR0aW5ncy5jb21tb25GaWxsVHlwZSkgewotCQkJZGVmYXVsdDoKLQkJCWNhc2UgVG9vbFNldHRpbmdzLmZ0Tm9uZToKLQkJCQlyZXR1cm4gbmV3IFJlY3RhbmdsZUZpZ3VyZShzZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uTGluZVN0eWxlLAotCQkJCQlhLngsIGEueSwgYi54LCBiLnkpOwotCQkJY2FzZSBUb29sU2V0dGluZ3MuZnRTb2xpZDoKLQkJCQlyZXR1cm4gbmV3IFNvbGlkUmVjdGFuZ2xlRmlndXJlKHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwgYS54LCBhLnksIGIueCwgYi55KTsKLQkJCWNhc2UgVG9vbFNldHRpbmdzLmZ0T3V0bGluZTogewotCQkJCUNvbnRhaW5lckZpZ3VyZSBjb250YWluZXIgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0JCQkJY29udGFpbmVyLmFkZChuZXcgU29saWRSZWN0YW5nbGVGaWd1cmUoc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLCBhLngsIGEueSwgYi54LCBiLnkpKTsKLQkJCQljb250YWluZXIuYWRkKG5ldyBSZWN0YW5nbGVGaWd1cmUoc2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkxpbmVTdHlsZSwKLQkJCQkJYS54LCBhLnksIGIueCwgYi55KSk7Ci0JCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1JvdW5kZWRSZWN0YW5nbGVGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1JvdW5kZWRSZWN0YW5nbGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM3MWQ2Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Sb3VuZGVkUmVjdGFuZ2xlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBSZWN0YW5nbGUgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBSb3VuZGVkUmVjdGFuZ2xlRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yIGZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZENvbG9yOwotCXByaXZhdGUgaW50IGxpbmVTdHlsZSwgeDEsIHkxLCB4MiwgeTIsIGRpYW1ldGVyOwotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBSZWN0YW5nbGUKLQkgKiBUaGVzZSBvYmplY3RzIGFyZSBkZWZpbmVkIGJ5IGFueSB0d28gZGlhbWV0cmljYWxseSBvcHBvc2luZyBjb3JuZXJzLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIGxpbmVTdHlsZSB0aGUgbGluZSBzdHlsZSBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0geDEgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb3JuZXIKLQkgKiBAcGFyYW0geTEgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb3JuZXIKLQkgKiBAcGFyYW0geDIgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29ybmVyCi0JICogQHBhcmFtIHkyIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSBkaWFtZXRlciB0aGUgZGlhbWV0ZXIgb2YgY3VydmF0dXJlIG9mIGFsbCBmb3VyIGNvcm5lcnMKLQkgKi8KLQlwdWJsaWMgUm91bmRlZFJlY3RhbmdsZUZpZ3VyZShDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIENvbG9yIGJhY2tncm91bmRDb2xvciwgaW50IGxpbmVTdHlsZSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgZGlhbWV0ZXIpIHsKLQkJdGhpcy5mb3JlZ3JvdW5kQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7Ci0JCXRoaXMuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yOwotCQl0aGlzLmxpbmVTdHlsZSA9IGxpbmVTdHlsZTsKLQkJdGhpcy54MSA9IHgxOyB0aGlzLnkxID0geTE7IHRoaXMueDIgPSB4MjsgdGhpcy55MiA9IHkyOwotCQl0aGlzLmRpYW1ldGVyID0gZGlhbWV0ZXI7Ci0JfQotCXB1YmxpYyB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKSB7Ci0JCVJlY3RhbmdsZSByID0gZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKTsKLQkJZmRjLmdjLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLQkJZmRjLmdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLQkJZmRjLmdjLnNldExpbmVTdHlsZShsaW5lU3R5bGUpOwotCQlmZGMuZ2MuZHJhd1JvdW5kUmVjdGFuZ2xlKHIueCwgci55LCByLndpZHRoIC0gMSwgci5oZWlnaHQgLSAxLCBkaWFtZXRlciwgZGlhbWV0ZXIpOwotCQlmZGMuZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Sb3VuZGVkUmVjdGFuZ2xlVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUm91bmRlZFJlY3RhbmdsZVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1YzA2NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Sb3VuZGVkUmVjdGFuZ2xlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQSBkcmF3aW5nIHRvb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBSb3VuZGVkUmVjdGFuZ2xlVG9vbCBleHRlbmRzIERyYWdQYWludFNlc3Npb24gaW1wbGVtZW50cyBQYWludFRvb2wgewotCXByaXZhdGUgVG9vbFNldHRpbmdzIHNldHRpbmdzOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFJvdW5kZWRSZWN0YW5nbGVUb29sLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgUGFpbnRTdXJmYWNlIHdlIHdpbGwgcmVuZGVyIG9uLgotCSAqLwotCXB1YmxpYyBSb3VuZGVkUmVjdGFuZ2xlVG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXNldCh0b29sU2V0dGluZ3MpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sJ3Mgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncykgewotCQlzZXR0aW5ncyA9IHRvb2xTZXR0aW5nczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyB0b29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5Sb3VuZGVkUmVjdGFuZ2xlLmxhYmVsIik7Ci0JfQotCi0JLyoKLQkgKiBUZW1wbGF0ZSBtZXRob2RzIGZvciBkcmF3aW5nCi0JICovCi0JcHJvdGVjdGVkIEZpZ3VyZSBjcmVhdGVGaWd1cmUoUG9pbnQgYSwgUG9pbnQgYikgewotCQlDb250YWluZXJGaWd1cmUgY29udGFpbmVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotCQlpZiAoc2V0dGluZ3MuY29tbW9uRmlsbFR5cGUgIT0gVG9vbFNldHRpbmdzLmZ0Tm9uZSkKLQkJCWNvbnRhaW5lci5hZGQobmV3IFNvbGlkUm91bmRlZFJlY3RhbmdsZUZpZ3VyZShzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsCi0JCQkJYS54LCBhLnksIGIueCwgYi55LCBzZXR0aW5ncy5yb3VuZGVkUmVjdGFuZ2xlQ29ybmVyRGlhbWV0ZXIpKTsKLQkJaWYgKHNldHRpbmdzLmNvbW1vbkZpbGxUeXBlICE9IFRvb2xTZXR0aW5ncy5mdFNvbGlkKQotCQkJY29udGFpbmVyLmFkZChuZXcgUm91bmRlZFJlY3RhbmdsZUZpZ3VyZShzZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwKLQkJCQlzZXR0aW5ncy5jb21tb25MaW5lU3R5bGUsIGEueCwgYS55LCBiLngsIGIueSwgc2V0dGluZ3Mucm91bmRlZFJlY3RhbmdsZUNvcm5lckRpYW1ldGVyKSk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU2VnbWVudGVkUGFpbnRTZXNzaW9uLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9TZWdtZW50ZWRQYWludFNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0YWRhMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9TZWdtZW50ZWRQYWludFNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBUaGUgc3VwZXJjbGFzcyBmb3IgcGFpbnQgdG9vbHMgdGhhdCBjb250cnVjdCBvYmplY3RzIGZyb20gaW5kaXZpZHVhbGx5Ci0gKiBwaWNrZWQgc2VnbWVudHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWdtZW50ZWRQYWludFNlc3Npb24gZXh0ZW5kcyBCYXNpY1BhaW50U2Vzc2lvbiB7Ci0JLyoqCi0JICogVGhlIHNldCBvZiBjb250cm9sIHBvaW50cyBtYWtpbmcgdXAgdGhlIHNlZ21lbnRlZCBzZWxlY3Rpb24KLQkgKi8KLQlwcml2YXRlIFZlY3RvciAvKiBvZiBQb2ludCAqLyBjb250cm9sUG9pbnRzID0gbmV3IFZlY3RvcigpOwotCi0JLyoqCi0JICogVGhlIHByZXZpb3VzIGZpZ3VyZSAoc28gdGhhdCB3ZSBjYW4gYWJvcnQgd2l0aCByaWdodC1idXR0b24pCi0JICovCi0JcHJpdmF0ZSBGaWd1cmUgcHJldmlvdXNGaWd1cmUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGN1cnJlbnQgZmlndXJlIChzbyB0aGF0IHdlIGNhbiBhYm9ydCB3aXRoIHJpZ2h0LWJ1dHRvbikKLQkgKi8KLQlwcml2YXRlIEZpZ3VyZSBjdXJyZW50RmlndXJlID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQYWludFNlc3Npb24uCi0JICogCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgZHJhd2luZyBzdXJmYWNlIHRvIHVzZQotCSAqLwotCXByb3RlY3RlZCBTZWdtZW50ZWRQYWludFNlc3Npb24oUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCX0KLQotCS8qKgotCSAqIEFjdGl2YXRlcyB0aGUgdG9vbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpblNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLnNldFN0YXR1c01lc3NhZ2UoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKAotCQkJInNlc3Npb24uU2VnbWVudGVkSW50ZXJhY3RpdmVQYWludC5tZXNzYWdlLmFuY2hvck1vZGUiKSk7Ci0JCXByZXZpb3VzRmlndXJlID0gbnVsbDsKLQkJY3VycmVudEZpZ3VyZSA9IG51bGw7Ci0JCWNvbnRyb2xQb2ludHMuY2xlYXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVhY3RpdmF0ZXMgdGhlIHRvb2wuCi0gICAgICovCi0JcHVibGljIHZvaWQgZW5kU2Vzc2lvbigpIHsKLQkJZ2V0UGFpbnRTdXJmYWNlKCkuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JCWlmIChwcmV2aW91c0ZpZ3VyZSAhPSBudWxsKSBnZXRQYWludFN1cmZhY2UoKS5kcmF3RmlndXJlKHByZXZpb3VzRmlndXJlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVzZXRzIHRoZSB0b29sLgotCSAqIEFib3J0cyBhbnkgb3BlcmF0aW9uIGluIHByb2dyZXNzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0U2Vzc2lvbigpIHsKLQkJZ2V0UGFpbnRTdXJmYWNlKCkuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JCWlmIChwcmV2aW91c0ZpZ3VyZSAhPSBudWxsKSBnZXRQYWludFN1cmZhY2UoKS5kcmF3RmlndXJlKHByZXZpb3VzRmlndXJlKTsKLQkJCi0JCWdldFBhaW50U3VyZmFjZSgpLnNldFN0YXR1c01lc3NhZ2UoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKAotCQkJInNlc3Npb24uU2VnbWVudGVkSW50ZXJhY3RpdmVQYWludC5tZXNzYWdlLmFuY2hvck1vZGUiKSk7Ci0JCXByZXZpb3VzRmlndXJlID0gbnVsbDsKLQkJY3VycmVudEZpZ3VyZSA9IG51bGw7Ci0JCWNvbnRyb2xQb2ludHMuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VEb3duIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0KLQkJZ2V0UGFpbnRTdXJmYWNlKCkuc2V0U3RhdHVzTWVzc2FnZShQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoCi0JCQkic2Vzc2lvbi5TZWdtZW50ZWRJbnRlcmFjdGl2ZVBhaW50Lm1lc3NhZ2UuaW50ZXJhY3RpdmVNb2RlIikpOwotCQlwcmV2aW91c0ZpZ3VyZSA9IGN1cnJlbnRGaWd1cmU7Ci0KLQkJaWYgKGNvbnRyb2xQb2ludHMuc2l6ZSgpID4gMCkgewotCQkJZmluYWwgUG9pbnQgbGFzdFBvaW50ID0gKFBvaW50KSBjb250cm9sUG9pbnRzLmVsZW1lbnRBdChjb250cm9sUG9pbnRzLnNpemUoKSAtIDEpOwotCQkJaWYgKGxhc3RQb2ludC54ID09IGV2ZW50LnggfHwgbGFzdFBvaW50LnkgPT0gZXZlbnQueSkgcmV0dXJuOyAvLyBzcHVyaW91cyBldmVudAotCQl9Ci0JCWNvbnRyb2xQb2ludHMuYWRkKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlRG91YmxlQ2xpY2sgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0JCWlmIChjb250cm9sUG9pbnRzLnNpemUoKSA+PSAyKSB7Ci0JCQlnZXRQYWludFN1cmZhY2UoKS5jbGVhclJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQkJCXByZXZpb3VzRmlndXJlID0gY3JlYXRlRmlndXJlKAotCQkJCShQb2ludFtdKSBjb250cm9sUG9pbnRzLnRvQXJyYXkobmV3IFBvaW50W2NvbnRyb2xQb2ludHMuc2l6ZSgpXSksCi0JCQkJY29udHJvbFBvaW50cy5zaXplKCksIHRydWUpOwotCQl9Ci0JCXJlc2V0U2Vzc2lvbigpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZVVwIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5idXR0b24gIT0gMSkgewotCQkJcmVzZXRTZXNzaW9uKCk7IC8vIGFib3J0IGlmIHJpZ2h0IG9yIG1pZGRsZSBtb3VzZSBidXR0b24gcHJlc3NlZAotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZU1vdmUgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBldmVudCkgewotCQlmaW5hbCBQYWludFN1cmZhY2UgcHMgPSBnZXRQYWludFN1cmZhY2UoKTsKLQkJaWYgKGNvbnRyb2xQb2ludHMuc2l6ZSgpID09IDApIHsKLQkJCXBzLnNldFN0YXR1c0Nvb3JkKHBzLmdldEN1cnJlbnRQb3NpdGlvbigpKTsKLQkJCXJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJfSBlbHNlIHsKLQkJCXBzLnNldFN0YXR1c0Nvb3JkUmFuZ2UoKFBvaW50KSBjb250cm9sUG9pbnRzLmVsZW1lbnRBdChjb250cm9sUG9pbnRzLnNpemUoKSAtIDEpLAotCQkJCXBzLmdldEN1cnJlbnRQb3NpdGlvbigpKTsKLQkJfQotCi0JCXBzLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCQlQb2ludFtdIHBvaW50cyA9IChQb2ludFtdKSBjb250cm9sUG9pbnRzLnRvQXJyYXkobmV3IFBvaW50W2NvbnRyb2xQb2ludHMuc2l6ZSgpICsgMV0pOwotCQlwb2ludHNbY29udHJvbFBvaW50cy5zaXplKCldID0gcHMuZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0JCWN1cnJlbnRGaWd1cmUgPSBjcmVhdGVGaWd1cmUocG9pbnRzLCBwb2ludHMubGVuZ3RoLCBmYWxzZSk7Ci0JCXBzLmFkZFJ1YmJlcmJhbmRTZWxlY3Rpb24oY3VycmVudEZpZ3VyZSk7Ci0JfQkKLQotCS8qKgotCSAqIFRlbXBsYXRlIE1ldGhvZDogQ3JlYXRlcyBhIEZpZ3VyZSBmb3IgZHJhd2luZyBydWJiZXJiYW5kIGVudGl0aWVzIGFuZCB0aGUgZmluYWwgcHJvZHVjdAotCSAqIAotCSAqIEBwYXJhbSBwb2ludHMgdGhlIGFycmF5IG9mIGNvbnRyb2wgcG9pbnRzCi0JICogQHBhcmFtIG51bVBvaW50cyB0aGUgbnVtYmVyIG9mIHZhbGlkIHBvaW50cyBpbiB0aGUgYXJyYXkgKG4gPj0gMikKLQkgKiBAcGFyYW0gY2xvc2VkIHRydWUgaWYgdGhlIHVzZXIgZG91YmxlLWNsaWNrZWQgb24gdGhlIGZpbmFsIGNvbnRyb2wgcG9pbnQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRmlndXJlIGNyZWF0ZUZpZ3VyZShQb2ludFtdIHBvaW50cywgaW50IG51bVBvaW50cywgYm9vbGVhbiBjbG9zZWQpOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRFbGxpcHNlRmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZEVsbGlwc2VGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlOWFkYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZEVsbGlwc2VGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIDJEIFNvbGlkIEVsbGlwc2Ugb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBTb2xpZEVsbGlwc2VGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCXByaXZhdGUgQ29sb3IgY29sb3I7Ci0JcHJpdmF0ZSBpbnQgeDEsIHkxLCB4MiwgeTI7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIFNvbGlkRWxsaXBzZQotCSAqIFRoZXNlIG9iamVjdHMgYXJlIGRlZmluZWQgYnkgYW55IHR3byBkaWFtZXRyaWNhbGx5IG9wcG9zaW5nIGNvcm5lcnMgb2YgYSBib3gKLQkgKiBib3VuZGluZyB0aGUgZWxsaXBzZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSB4MSB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB5MSB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB4MiB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKiBAcGFyYW0geTIgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29ybmVyCi0JICovCi0JcHVibGljIFNvbGlkRWxsaXBzZUZpZ3VyZShDb2xvciBjb2xvciwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0JCXRoaXMuY29sb3IgPSBjb2xvcjsgdGhpcy54MSA9IHgxOyB0aGlzLnkxID0geTE7IHRoaXMueDIgPSB4MjsgdGhpcy55MiA9IHkyOwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlSZWN0YW5nbGUgciA9IGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5Mik7Ci0JCWZkYy5nYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmRjLmdjLmZpbGxPdmFsKHIueCwgci55LCByLndpZHRoLCByLmhlaWdodCk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZERhbWFnZWRSZWdpb24oRmlndXJlRHJhd0NvbnRleHQgZmRjLCBSZWdpb24gcmVnaW9uKSB7Ci0JCXJlZ2lvbi5hZGQoZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRQb2x5Z29uRmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZFBvbHlnb25GaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1MTQwMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZFBvbHlnb25GaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIDJEIExpbmUgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBTb2xpZFBvbHlnb25GaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCXByaXZhdGUgQ29sb3IgY29sb3I7Ci0JcHJpdmF0ZSBpbnRbXSBwb2ludHM7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIFNvbGlkUG9seWdvbgotCSAqIFRoZXNlIG9iamVjdHMgYXJlIGRlZmluZWQgYnkgYSBzZXF1ZW5jZSBvZiB2ZXJ0aWNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSB2ZXJ0aWNlcyB0aGUgYXJyYXkgb2YgdmVydGljZXMgbWFraW5nIHVwIHRoZSBwb2x5Z29uCi0JICogQHBhcmFtIG51bVBvaW50IHRoZSBudW1iZXIgb2YgdmFsaWQgcG9pbnRzIGluIHRoZSBhcnJheSAobiA+PSAzKQotCSAqLwotCXB1YmxpYyBTb2xpZFBvbHlnb25GaWd1cmUoQ29sb3IgY29sb3IsIFBvaW50W10gdmVydGljZXMsIGludCBudW1Qb2ludHMpIHsKLQkJdGhpcy5jb2xvciA9IGNvbG9yOwotCQl0aGlzLnBvaW50cyA9IG5ldyBpbnRbbnVtUG9pbnRzICogMl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtUG9pbnRzOyArK2kpIHsKLQkJCXBvaW50c1tpICogMl0gPSB2ZXJ0aWNlc1tpXS54OwotCQkJcG9pbnRzW2kgKiAyICsgMV0gPSB2ZXJ0aWNlc1tpXS55OwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKSB7Ci0JCWludFtdIGRyYXdQb2ludHMgPSBuZXcgaW50W3BvaW50cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKz0gMikgewotCQkJZHJhd1BvaW50c1tpXSA9IHBvaW50c1tpXSAqIGZkYy54U2NhbGUgLSBmZGMueE9mZnNldDsKLQkJCWRyYXdQb2ludHNbaSArIDFdID0gcG9pbnRzW2kgKyAxXSAqIGZkYy55U2NhbGUgLSBmZGMueU9mZnNldDsKLQkJfQotCQlmZGMuZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZkYy5nYy5maWxsUG9seWdvbihkcmF3UG9pbnRzKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IHhtaW4gPSBJbnRlZ2VyLk1BWF9WQUxVRSwgeW1pbiA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQlpbnQgeG1heCA9IEludGVnZXIuTUlOX1ZBTFVFLCB5bWF4ID0gSW50ZWdlci5NSU5fVkFMVUU7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpICs9IDIpIHsKLQkJCWlmIChwb2ludHNbaV0gPCB4bWluKSB4bWluID0gcG9pbnRzW2ldOwotCQkJaWYgKHBvaW50c1tpXSA+IHhtYXgpIHhtYXggPSBwb2ludHNbaV07Ci0JCQlpZiAocG9pbnRzW2krMV0gPCB5bWluKSB5bWluID0gcG9pbnRzW2krMV07Ci0JCQlpZiAocG9pbnRzW2krMV0gPiB5bWF4KSB5bWF4ID0gcG9pbnRzW2krMV07Ci0JCX0JCQotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4bWluLCB5bWluLCB4bWF4LCB5bWF4KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRSZWN0YW5nbGVGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkUmVjdGFuZ2xlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjJmYjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRSZWN0YW5nbGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIDJEIFNvbGlkUmVjdGFuZ2xlIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgU29saWRSZWN0YW5nbGVGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCXByaXZhdGUgQ29sb3IgY29sb3I7Ci0JcHJpdmF0ZSBpbnQgeDEsIHkxLCB4MiwgeTI7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIFNvbGlkUmVjdGFuZ2xlCi0JICogVGhlc2Ugb2JqZWN0cyBhcmUgZGVmaW5lZCBieSBhbnkgdHdvIGRpYW1ldHJpY2FsbHkgb3Bwb3NpbmcgY29ybmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSB4MSB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB5MSB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB4MiB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKiBAcGFyYW0geTIgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29ybmVyCi0JICovCi0JcHVibGljIFNvbGlkUmVjdGFuZ2xlRmlndXJlKENvbG9yIGNvbG9yLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKLQkJdGhpcy5jb2xvciA9IGNvbG9yOyB0aGlzLngxID0geDE7IHRoaXMueTEgPSB5MTsgdGhpcy54MiA9IHgyOyB0aGlzLnkyID0geTI7Ci0JfQotCXB1YmxpYyB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKSB7Ci0JCVJlY3RhbmdsZSByID0gZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKTsKLQkJZmRjLmdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmZGMuZ2MuZmlsbFJlY3RhbmdsZShyLngsIHIueSwgci53aWR0aCwgci5oZWlnaHQpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5MikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkUm91bmRlZFJlY3RhbmdsZUZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRSb3VuZGVkUmVjdGFuZ2xlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMGQyZWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRSb3VuZGVkUmVjdGFuZ2xlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBTb2xpZFJlY3RhbmdsZSBvYmplY3QKLSAqLwotcHVibGljIGNsYXNzIFNvbGlkUm91bmRlZFJlY3RhbmdsZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQlwcml2YXRlIGludCB4MSwgeTEsIHgyLCB5MiwgZGlhbWV0ZXI7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIFNvbGlkUmVjdGFuZ2xlCi0JICogVGhlc2Ugb2JqZWN0cyBhcmUgZGVmaW5lZCBieSBhbnkgdHdvIGRpYW1ldHJpY2FsbHkgb3Bwb3NpbmcgY29ybmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSB4MSB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB5MSB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB4MiB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKiBAcGFyYW0geTIgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29ybmVyCi0JICogQHBhcmFtIGRpYW1ldGVyIHRoZSBkaWFtZXRlciBvZiBjdXJ2YXR1cmUgb2YgYWxsIGZvdXIgY29ybmVycwotCSAqLwotCXB1YmxpYyBTb2xpZFJvdW5kZWRSZWN0YW5nbGVGaWd1cmUoQ29sb3IgY29sb3IsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IGRpYW1ldGVyKSB7Ci0JCXRoaXMuY29sb3IgPSBjb2xvcjsgdGhpcy54MSA9IHgxOyB0aGlzLnkxID0geTE7IHRoaXMueDIgPSB4MjsgdGhpcy55MiA9IHkyOwotCQl0aGlzLmRpYW1ldGVyID0gZGlhbWV0ZXI7Ci0JfQotCXB1YmxpYyB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKSB7Ci0JCVJlY3RhbmdsZSByID0gZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKTsKLQkJZmRjLmdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmZGMuZ2MuZmlsbFJvdW5kUmVjdGFuZ2xlKHIueCwgci55LCByLndpZHRoLCByLmhlaWdodCwgZGlhbWV0ZXIsIGRpYW1ldGVyKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9UZXh0RmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9UZXh0RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYmQwYzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVGV4dEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogMkQgUmVjdGFuZ2xlIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgVGV4dEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciAgY29sb3I7Ci0JcHJpdmF0ZSBGb250ICAgZm9udDsKLQlwcml2YXRlIFN0cmluZyB0ZXh0OwotCXByaXZhdGUgaW50IHgsIHk7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIFRleHRGaWd1cmUKLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSBmb250ICB0aGUgZm9udCBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0gdGV4dCAgdGhlIHRleHQgdG8gZHJhdywgdGFiIGFuZCBuZXctbGluZSBleHBhbnNpb24gaXMgcGVyZm9ybWVkCi0JICogQHBhcmFtIHggICAgIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSB0ZXh0IGJvdW5kaW5nIGJveAotCSAqIEBwYXJhbSB5ICAgICB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgdGV4dCBib3VuZGluZyBib3gKLQkgKi8KLQlwdWJsaWMgVGV4dEZpZ3VyZShDb2xvciBjb2xvciwgRm9udCBmb250LCBTdHJpbmcgdGV4dCwgaW50IHgsIGludCB5KSB7Ci0JCXRoaXMuY29sb3IgPSBjb2xvcjsgdGhpcy5mb250ID0gZm9udDsgdGhpcy50ZXh0ID0gdGV4dDsgdGhpcy54ID0geDsgdGhpcy55ID0geTsKLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJUG9pbnQgcCA9IGZkYy50b0NsaWVudFBvaW50KHgsIHkpOwotCQlmZGMuZ2Muc2V0Rm9udChmb250KTsKLQkJZmRjLmdjLnNldEZvcmVncm91bmQoY29sb3IpOwotCQlmZGMuZ2MuZHJhd1RleHQodGV4dCwgcC54LCBwLnksIHRydWUpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlGb250IG9sZEZvbnQgPSBmZGMuZ2MuZ2V0Rm9udCgpOwotCQlmZGMuZ2Muc2V0Rm9udChmb250KTsKLQkJUG9pbnQgdGV4dEV4dGVudCA9IGZkYy5nYy50ZXh0RXh0ZW50KHRleHQpOwotCQlmZGMuZ2Muc2V0Rm9udChvbGRGb250KTsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeCwgeSwgeCArIHRleHRFeHRlbnQueCwgeSArIHRleHRFeHRlbnQueSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1RleHRUb29sLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9UZXh0VG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjY3ODdlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1RleHRUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi0vKioKLSAqIEEgdGV4dCBkcmF3aW5nIHRvb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0VG9vbCBleHRlbmRzIEJhc2ljUGFpbnRTZXNzaW9uIGltcGxlbWVudHMgUGFpbnRUb29sIHsKLQlwcml2YXRlIFRvb2xTZXR0aW5ncyBzZXR0aW5nczsKLQlwcml2YXRlIFN0cmluZyBkcmF3VGV4dCA9IFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5UZXh0LnNldHRpbmdzLmRlZmF1bHR0ZXh0Iik7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUGFpbnRUb29sLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgUGFpbnRTdXJmYWNlIHdlIHdpbGwgcmVuZGVyIG9uLgotCSAqLwotCXB1YmxpYyBUZXh0VG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXNldCh0b29sU2V0dGluZ3MpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sJ3Mgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncykgewotCQlzZXR0aW5ncyA9IHRvb2xTZXR0aW5nczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyB0b29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5UZXh0LmxhYmVsIik7Ci0JfQotCQotCS8qKgotCSAqIEFjdGl2YXRlcyB0aGUgdG9vbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpblNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLnNldFN0YXR1c01lc3NhZ2UoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKAotCQkJInNlc3Npb24uVGV4dC5tZXNzYWdlIikpOwotCX0KLQkKLQkvKioKLQkgKiBEZWFjdGl2YXRlcyB0aGUgdG9vbC4KLSAgICAgKi8KLQlwdWJsaWMgdm9pZCBlbmRTZXNzaW9uKCkgewotCQlnZXRQYWludFN1cmZhY2UoKS5jbGVhclJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogQWJvcnRzIHRoZSBjdXJyZW50IG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VEb3duIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmJ1dHRvbiA9PSAxKSB7Ci0JCQkvLyBkcmF3IHdpdGggbGVmdCBtb3VzZSBidXR0b24KLQkJCWdldFBhaW50U3VyZmFjZSgpLmNvbW1pdFJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQkJfSBlbHNlIHsKLQkJCS8vIHNldCB0ZXh0IHdpdGggcmlnaHQgbW91c2UgYnV0dG9uCi0JCQlnZXRQYWludFN1cmZhY2UoKS5jbGVhclJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQkJCVNoZWxsIHNoZWxsID0gZ2V0UGFpbnRTdXJmYWNlKCkuZ2V0U2hlbGwoKTsKLQkJCWZpbmFsIFNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbChzaGVsbCwgU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJCWRpYWxvZy5zZXRUZXh0KFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5UZXh0LmRpYWxvZy50aXRsZSIpKTsKLQkJCWRpYWxvZy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkaWFsb2csIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJ0b29sLlRleHQuZGlhbG9nLm1lc3NhZ2UiKSk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQlmaW5hbCBUZXh0IGZpZWxkID0gbmV3IFRleHQoZGlhbG9nLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlmaWVsZC5zZXRUZXh0KGRyYXdUZXh0KTsKLQkJCWZpZWxkLnNlbGVjdEFsbCgpOwotCQkJZmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCQlDb21wb3NpdGUgYnV0dG9ucyA9IG5ldyBDb21wb3NpdGUoZGlhbG9nLCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWJ1dHRvbnMuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlidXR0b25zLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkJQnV0dG9uIG9rID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCQlvay5zZXRUZXh0KFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT0siKSk7Ci0JCQlvay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQlvay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWRyYXdUZXh0ID0gZmllbGQuZ2V0VGV4dCgpOwotCQkJCQlkaWFsb2cuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJQnV0dG9uIGNhbmNlbCA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQkJY2FuY2VsLnNldFRleHQoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDYW5jZWwiKSk7Ci0JCQljYW5jZWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlkaWFsb2cuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJZGlhbG9nLnNldERlZmF1bHRCdXR0b24ob2spOwotCQkJZGlhbG9nLnBhY2soKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBkaWFsb2cuZ2V0RGlzcGxheSgpOwotCQkJd2hpbGUgKCEgc2hlbGwuaXNEaXNwb3NlZCgpICYmICEgZGlhbG9nLmlzRGlzcG9zZWQoKSkgewotCQkJCWlmICghIGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJCX0KLQkJfQkKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VEb3VibGVDbGljayBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZVVwIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZU1vdmUgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBldmVudCkgewotCQlmaW5hbCBQYWludFN1cmZhY2UgcHMgPSBnZXRQYWludFN1cmZhY2UoKTsKLQkJcHMuc2V0U3RhdHVzQ29vcmQocHMuZ2V0Q3VycmVudFBvc2l0aW9uKCkpOwotCQlwcy5jbGVhclJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQkJcHMuYWRkUnViYmVyYmFuZFNlbGVjdGlvbigKLQkJCW5ldyBUZXh0RmlndXJlKHNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uRm9udCwKLQkJCQlkcmF3VGV4dCwgZXZlbnQueCwgZXZlbnQueSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1Rvb2wuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1MWNlMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Ub29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBUb29sIHsKLQlwdWJsaWMgaW50IGlkOwotCXB1YmxpYyBTdHJpbmcgbmFtZTsKLQlwdWJsaWMgU3RyaW5nIGdyb3VwOwotCXB1YmxpYyBpbnQgdHlwZTsKLQlwdWJsaWMgUnVubmFibGUgYWN0aW9uOwotCXB1YmxpYyBJbWFnZSBpbWFnZSA9IG51bGw7Ci0JcHVibGljIE9iamVjdCBkYXRhOwotCQotCXB1YmxpYyBUb29sKGludCBpZCwgU3RyaW5nIG5hbWUsIFN0cmluZyBncm91cCwgaW50IHR5cGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmdyb3VwID0gZ3JvdXA7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIFRvb2woaW50IGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGdyb3VwLCBpbnQgdHlwZSwgT2JqZWN0IGRhdGEpIHsKLQkJdGhpcyhpZCwgbmFtZSwgZ3JvdXAsIHR5cGUpOwotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1Rvb2xTZXR0aW5ncy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVG9vbFNldHRpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OWJlZGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVG9vbFNldHRpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogVG9vbCBTZXR0aW5ncyBvYmplY3RzIGdyb3VwIHRvb2wtcmVsYXRlZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVG9vbFNldHRpbmdzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBmdE5vbmUgPSAwLCBmdE91dGxpbmUgPSAxLCBmdFNvbGlkID0gMjsKLQotCS8qKgotCSAqIGNvbW1vbkZvcmVncm91bmRDb2xvcjogY3VycmVudCB0b29sIGZvcmVncm91bmQgY29sb3VyCi0JICovCi0JcHVibGljIENvbG9yIGNvbW1vbkZvcmVncm91bmRDb2xvcjsKLQotCS8qKgotCSAqIGNvbW1vbkJhY2tncm91bmRDb2xvcjogY3VycmVudCB0b29sIGJhY2tncm91bmQgY29sb3VyCi0JICovCi0JcHVibGljIENvbG9yIGNvbW1vbkJhY2tncm91bmRDb2xvcjsKLQotCS8qKgotCSAqIGNvbW1vbkZvbnQ6IGN1cnJlbnQgZm9udAotCSAqLwotCXB1YmxpYyBGb250IGNvbW1vbkZvbnQ7Ci0KLQkvKioKLQkgKiBjb21tb25GaWxsVHlwZTogY3VycmVudCBmaWxsIHR5cGUKLQkgKiA8cD5PbmUgb2YgZnROb25lLCBmdE91dGxpbmUsIGZ0U29saWQuPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgY29tbW9uRmlsbFR5cGUgPSBmdE5vbmU7Ci0KLQkvKioKLQkgKiBjb21tb25MaW5lU3R5bGU6IGN1cnJlbnQgbGluZSB0eXBlCi0JICovCi0JcHVibGljIGludCBjb21tb25MaW5lU3R5bGUgPSBTV1QuTElORV9TT0xJRDsKLQkKLQkvKioKLQkgKiBhaXJicnVzaFJhZGl1czogY292ZXJhZ2UgcmFkaXVzIGluIHBpeGVscwotCSAqLwotCXB1YmxpYyBpbnQgYWlyYnJ1c2hSYWRpdXMgPSAxMDsKLQkKLQkvKioKLQkgKiBhaXJicnVzaEludGVuc2l0eTogYXZlcmFnZSBzdXJmYWNlIGFyZWEgY292ZXJhZ2UgaW4gcmVnaW9uIGRlZmluZWQgYnkgcmFkaXVzIHBlciAiam90IgotCSAqLwotCXB1YmxpYyBpbnQgYWlyYnJ1c2hJbnRlbnNpdHkgPSAzMDsKLQkKLQkvKioKLQkgKiByb3VuZGVkUmVjdGFuZ2xlQ29ybmVyRGlhbWV0ZXI6IHRoZSBkaWFtZXRlciBvZiBjdXJ2YXR1cmUgb2YgY29ybmVycyBpbiBhIHJvdW5kZWQgcmVjdGFuZ2xlCi0JICovCi0JcHVibGljIGludCByb3VuZGVkUmVjdGFuZ2xlQ29ybmVyRGlhbWV0ZXIgPSAxNjsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2ZpbGxfbm9uZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9maWxsX25vbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjZkZDU4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2ZpbGxfbm9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9maWxsX291dGxpbmUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvZmlsbF9vdXRsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjY2ZlZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9maWxsX291dGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvZmlsbF9zb2xpZC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9maWxsX3NvbGlkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzNGU2NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9maWxsX3NvbGlkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9kYXNoLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9kYXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1N2JiMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfZGFzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfZGFzaGRvdC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfZGFzaGRvdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMjk2OGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX2Rhc2hkb3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX2RvdC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfZG90LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzN2NjYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfZG90LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9zb2xpZC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfc29saWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGE1N2NlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9zb2xpZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9vcHRpb25zX2ZvbnQuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvb3B0aW9uc19mb250LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1ZmUwOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9vcHRpb25zX2ZvbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9haXJicnVzaC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX2FpcmJydXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxMGVkZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX2FpcmJydXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfZWxsaXBzZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX2VsbGlwc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzIxNDJmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfZWxsaXBzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX2xpbmUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9saW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmODE5Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX2xpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9wZW5jaWwuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9wZW5jaWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTZhMjM0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfcGVuY2lsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfcG9seWxpbmUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9wb2x5bGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMzg0ZTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9wb2x5bGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3JlY3RhbmdsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3JlY3RhbmdsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmRkNTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9yZWN0YW5nbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9yb3VuZGVkcmVjdGFuZ2xlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfcm91bmRlZHJlY3RhbmdsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmODQ1ZDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9yb3VuZGVkcmVjdGFuZ2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfdGV4dC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3RleHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDc0NTdmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfdGV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL0ltYWdlcy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTc5MTljZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL0ltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy50ZXh0ZWRpdG9yOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIEltYWdlcyB7Ci0KLQkvLyBCaXRtYXAgSW1hZ2VzCi0JcHVibGljIEltYWdlIEJvbGQ7Ci0JcHVibGljIEltYWdlIEl0YWxpYzsKLQlwdWJsaWMgSW1hZ2UgVW5kZXJsaW5lOwotCXB1YmxpYyBJbWFnZSBTdHJpa2VvdXQ7Ci0JcHVibGljIEltYWdlIFJlZDsKLQlwdWJsaWMgSW1hZ2UgR3JlZW47Ci0JcHVibGljIEltYWdlIEJsdWU7Ci0JcHVibGljIEltYWdlIEVyYXNlOwotCQotCUltYWdlICBbXSBBbGxCaXRtYXBzOwotCi1JbWFnZXMgKCkgewotfQotCi1wdWJsaWMgdm9pZCBmcmVlQWxsICgpIHsKLQlmb3IgKGludCBpPTA7IGk8QWxsQml0bWFwcy5sZW5ndGg7IGkrKykgQWxsQml0bWFwcyBbaV0uZGlzcG9zZSAoKTsKLQlBbGxCaXRtYXBzID0gbnVsbDsKLX0KLQotSW1hZ2UgY3JlYXRlQml0bWFwSW1hZ2UoRGlzcGxheSBkaXNwbGF5LCBTdHJpbmcgZmlsZU5hbWUpIHsKLQlJbnB1dFN0cmVhbSBzb3VyY2VTdHJlYW0gPSBJbWFnZXMuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSAoZmlsZU5hbWUgKyAiLmJtcCIpOwotCUlucHV0U3RyZWFtIG1hc2tTdHJlYW0gPSBJbWFnZXMuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSAoZmlsZU5hbWUgKyAiX21hc2suYm1wIik7Ci0JSW1hZ2VEYXRhIHNvdXJjZSA9IG5ldyBJbWFnZURhdGEgKHNvdXJjZVN0cmVhbSk7Ci0JSW1hZ2VEYXRhIG1hc2sgPSBuZXcgSW1hZ2VEYXRhIChtYXNrU3RyZWFtKTsKLQlJbWFnZSByZXN1bHQgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIHNvdXJjZSwgbWFzayk7Ci0JdHJ5IHsKLQkJc291cmNlU3RyZWFtLmNsb3NlICgpOwotCQltYXNrU3RyZWFtLmNsb3NlICgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UgKCk7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXB1YmxpYyB2b2lkIGxvYWRBbGwgKERpc3BsYXkgZGlzcGxheSkgewotCS8vIEJpdG1hcCBJbWFnZXMKLQlCb2xkID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJib2xkIik7Ci0JSXRhbGljID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJpdGFsaWMiKTsKLQlVbmRlcmxpbmUgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgInVuZGVybGluZSIpOwotCVN0cmlrZW91dCA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAic3RyaWtlb3V0Iik7Ci0JUmVkID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJyZWQiKTsKLQlHcmVlbiA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAiZ3JlZW4iKTsKLQlCbHVlID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJibHVlIik7Ci0JRXJhc2UgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgImVyYXNlIik7Ci0JCi0JQWxsQml0bWFwcyA9IG5ldyBJbWFnZSBbXSB7Ci0JCUJvbGQsCi0JCUl0YWxpYywKLQkJVW5kZXJsaW5lLAotCQlTdHJpa2VvdXQsCi0JCVJlZCwKLQkJR3JlZW4sCi0JCUJsdWUsCi0JCUVyYXNlLAotCX07Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL1RleHRFZGl0b3IuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvVGV4dEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MzNlZGNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvVGV4dEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMudGV4dGVkaXRvcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0RWRpdG9yIHsgIAotCVNoZWxsIHNoZWxsOwotCVRvb2xCYXIgdG9vbEJhcjsKLQlTdHlsZWRUZXh0IHRleHQ7Ci0KLQlJbWFnZXMgaW1hZ2VzID0gbmV3IEltYWdlcygpOwotCVZlY3RvciBjYWNoZWRTdHlsZXMgPSBuZXcgVmVjdG9yKCk7Ci0JQ29sb3IgUkVEID0gbnVsbDsgCi0JQ29sb3IgQkxVRSA9IG51bGw7IAotCUNvbG9yIEdSRUVOID0gbnVsbDsgCi0JRm9udCBmb250ID0gbnVsbDsKLQlUb29sSXRlbSBib2xkQnV0dG9uLCBpdGFsaWNCdXR0b24sIHVuZGVybGluZUJ1dHRvbiwgc3RyaWtlb3V0QnV0dG9uOwotCQotCXN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZXMgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX3RleHRlZGl0b3IiKTsKLQotTWVudSBjcmVhdGVFZGl0TWVudSgpIHsKLQlNZW51IGJhciA9IHNoZWxsLmdldE1lbnVCYXIgKCk7Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUgKGJhcik7Ci0JCi0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiQ3V0X21lbnVpdGVtIikpOwotCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnWCcpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQloYW5kbGVDdXRDb3B5KCk7Ci0JCQl0ZXh0LmN1dCgpOwotCQl9Ci0JfSk7Ci0JaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiQ29weV9tZW51aXRlbSIpKTsKLQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ0MnKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJaGFuZGxlQ3V0Q29weSgpOwotCQkJdGV4dC5jb3B5KCk7Ci0JCX0KLQl9KTsKLQlpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0IChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJQYXN0ZV9tZW51aXRlbSIpKTsKLQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ1YnKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJdGV4dC5wYXN0ZSgpOwotCQl9Ci0JfSk7Ci0JbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuU0VQQVJBVE9SKTsJCi0JaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiRm9udF9tZW51aXRlbSIpKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJc2V0Rm9udCgpOwotCQl9Ci0JfSk7Ci0JcmV0dXJuIG1lbnU7Ci19Ci0KLU1lbnUgY3JlYXRlRmlsZU1lbnUoKSB7Ci0JTWVudSBiYXIgPSBzaGVsbC5nZXRNZW51QmFyICgpOwotCU1lbnUgbWVudSA9IG5ldyBNZW51IChiYXIpOwotCQotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKHJlc291cmNlcy5nZXRTdHJpbmcoIkV4aXRfbWVudWl0ZW0iKSk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCXNoZWxsLmNsb3NlICgpOwotCQl9Ci0JfSk7Ci0KLQlyZXR1cm4gbWVudTsKLX0KLQotLyoKLSAqIFNldCBhIHN0eWxlCi0gKi8KLXZvaWQgc2V0U3R5bGUoV2lkZ2V0IHdpZGdldCkgewotCVBvaW50IHNlbCA9IHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQlpZiAoKHNlbCA9PSBudWxsKSB8fCAoc2VsLnkgPT0gMCkpIHJldHVybjsKLQlTdHlsZVJhbmdlIHN0eWxlOwotCWZvciAoaW50IGkgPSBzZWwueDsgaTxzZWwueCtzZWwueTsgaSsrKSB7Ci0JCVN0eWxlUmFuZ2UgcmFuZ2UgPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChpKTsKLQkJaWYgKHJhbmdlICE9IG51bGwpIHsKLQkJCXN0eWxlID0gKFN0eWxlUmFuZ2UpcmFuZ2UuY2xvbmUoKTsKLQkJCXN0eWxlLnN0YXJ0ID0gaTsKLQkJCXN0eWxlLmxlbmd0aCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlzdHlsZSA9IG5ldyBTdHlsZVJhbmdlKGksIDEsIG51bGwsIG51bGwsIFNXVC5OT1JNQUwpOwotCQl9Ci0JCWlmICh3aWRnZXQgPT0gYm9sZEJ1dHRvbikgewotCQkJc3R5bGUuZm9udFN0eWxlIF49IFNXVC5CT0xEOwotCQl9IGVsc2UgaWYgKHdpZGdldCA9PSBpdGFsaWNCdXR0b24pIHsKLQkJCXN0eWxlLmZvbnRTdHlsZSBePSBTV1QuSVRBTElDOwkJCQkJCQotCQl9IGVsc2UgaWYgKHdpZGdldCA9PSB1bmRlcmxpbmVCdXR0b24pIHsKLQkJCXN0eWxlLnVuZGVybGluZSA9ICFzdHlsZS51bmRlcmxpbmU7Ci0JCX0gZWxzZSBpZiAod2lkZ2V0ID09IHN0cmlrZW91dEJ1dHRvbikgewotCQkJc3R5bGUuc3RyaWtlb3V0ID0gIXN0eWxlLnN0cmlrZW91dDsKLQkJfQotCQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCX0KLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbC54ICsgc2VsLnksIDApOwkJCQotfQotCi0vKgotICogQ2xlYXIgYWxsIHN0eWxlIGRhdGEgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotICovCi12b2lkIGNsZWFyKCkgewotCVBvaW50IHNlbCA9IHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQlpZiAoKHNlbCAhPSBudWxsKSAmJiAoc2VsLnkgIT0gMCkpIHsKLQkJU3R5bGVSYW5nZSBzdHlsZTsKLQkJc3R5bGUgPSBuZXcgU3R5bGVSYW5nZShzZWwueCwgc2VsLnksIG51bGwsIG51bGwsIFNXVC5OT1JNQUwpOwotCQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCX0KLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbC54ICsgc2VsLnksIDApOwotfQotLyoKLSAqIFNldCB0aGUgZm9yZWdyb3VuZCBjb2xvciBmb3IgdGhlIHNlbGVjdGVkIHRleHQuCi0gKi8KLXZvaWQgZmdDb2xvcihDb2xvciBmZykgewotCVBvaW50IHNlbCA9IHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQlpZiAoKHNlbCA9PSBudWxsKSB8fCAoc2VsLnkgPT0gMCkpIHJldHVybjsKLQlTdHlsZVJhbmdlIHN0eWxlLCByYW5nZTsKLQlmb3IgKGludCBpID0gc2VsLng7IGk8c2VsLngrc2VsLnk7IGkrKykgewotCQlyYW5nZSA9IHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGkpOwotCQlpZiAocmFuZ2UgIT0gbnVsbCkgewotCQkJc3R5bGUgPSAoU3R5bGVSYW5nZSlyYW5nZS5jbG9uZSgpOwotCQkJc3R5bGUuc3RhcnQgPSBpOwotCQkJc3R5bGUubGVuZ3RoID0gMTsKLQkJCXN0eWxlLmZvcmVncm91bmQgPSBmZzsKLQkJfSBlbHNlIHsKLQkJCXN0eWxlID0gbmV3IFN0eWxlUmFuZ2UgKGksIDEsIGZnLCBudWxsLCBTV1QuTk9STUFMKTsKLQkJfQotCQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCX0KLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbC54ICsgc2VsLnksIDApOwotfQotdm9pZCBjcmVhdGVNZW51QmFyICgpIHsKLQlNZW51IGJhciA9IG5ldyBNZW51IChzaGVsbCwgU1dULkJBUik7Ci0Jc2hlbGwuc2V0TWVudUJhciAoYmFyKTsKLQotCU1lbnVJdGVtIGZpbGVJdGVtID0gbmV3IE1lbnVJdGVtIChiYXIsIFNXVC5DQVNDQURFKTsKLQlmaWxlSXRlbS5zZXRUZXh0IChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJGaWxlX21lbnVpdGVtIikpOwotCWZpbGVJdGVtLnNldE1lbnUgKGNyZWF0ZUZpbGVNZW51ICgpKTsKLQotCU1lbnVJdGVtIGVkaXRJdGVtID0gbmV3IE1lbnVJdGVtIChiYXIsIFNXVC5DQVNDQURFKTsKLQllZGl0SXRlbS5zZXRUZXh0IChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJFZGl0X21lbnVpdGVtIikpOwotCWVkaXRJdGVtLnNldE1lbnUgKGNyZWF0ZUVkaXRNZW51ICgpKTsKLX0KLQotdm9pZCBjcmVhdGVTaGVsbCAoRGlzcGxheSBkaXNwbGF5KSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQgKHJlc291cmNlcy5nZXRTdHJpbmcoIldpbmRvd190aXRsZSIpKTsJCi0JaW1hZ2VzLmxvYWRBbGwgKGRpc3BsYXkpOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0Jc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0Jc2hlbGwuYWRkRGlzcG9zZUxpc3RlbmVyIChuZXcgRGlzcG9zZUxpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQgKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQlpZiAoZm9udCAhPSBudWxsKSBmb250LmRpc3Bvc2UoKTsKLQkJCWltYWdlcy5mcmVlQWxsICgpOwotCQkJUkVELmRpc3Bvc2UoKTsKLQkJCUdSRUVOLmRpc3Bvc2UoKTsKLQkJCUJMVUUuZGlzcG9zZSgpOwotCQl9Ci0JfSk7Ci19Ci12b2lkIGNyZWF0ZVN0eWxlZFRleHQoKSB7Ci0JaW5pdGlhbGl6ZUNvbG9ycygpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoKTsKLQlzcGVjLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCXNwZWMuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0Jc3BlYy52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0Jc3BlYy5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JdGV4dC5zZXRMYXlvdXREYXRhKHNwZWMpOwotCXRleHQuYWRkRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihuZXcgRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChFeHRlbmRlZE1vZGlmeUV2ZW50IGUpIHsKLQkJCWhhbmRsZUV4dGVuZGVkTW9kaWZ5KGUpOwotCQl9Ci0JfSk7Ci19Ci0KLXZvaWQgY3JlYXRlVG9vbEJhcigpIHsKLQl0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIFNXVC5OT05FKTsKLQlTZWxlY3Rpb25BZGFwdGVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlzZXRTdHlsZSAoZXZlbnQud2lkZ2V0KTsKLQkJfQotCX07Ci0JYm9sZEJ1dHRvbiA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuQ0hFQ0spOwotCWJvbGRCdXR0b24uc2V0SW1hZ2UoaW1hZ2VzLkJvbGQpOwotCWJvbGRCdXR0b24uc2V0VG9vbFRpcFRleHQocmVzb3VyY2VzLmdldFN0cmluZygiQm9sZCIpKTsKLQlib2xkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlpdGFsaWNCdXR0b24gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULkNIRUNLKTsKLQlpdGFsaWNCdXR0b24uc2V0SW1hZ2UoaW1hZ2VzLkl0YWxpYyk7Ci0JaXRhbGljQnV0dG9uLnNldFRvb2xUaXBUZXh0KHJlc291cmNlcy5nZXRTdHJpbmcoIkl0YWxpYyIpKTsKLQlpdGFsaWNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCXVuZGVybGluZUJ1dHRvbiA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuQ0hFQ0spOwotCXVuZGVybGluZUJ1dHRvbi5zZXRJbWFnZShpbWFnZXMuVW5kZXJsaW5lKTsKLQl1bmRlcmxpbmVCdXR0b24uc2V0VG9vbFRpcFRleHQocmVzb3VyY2VzLmdldFN0cmluZygiVW5kZXJsaW5lIikpOwotCXVuZGVybGluZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0Jc3RyaWtlb3V0QnV0dG9uID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0Jc3RyaWtlb3V0QnV0dG9uLnNldEltYWdlKGltYWdlcy5TdHJpa2VvdXQpOwotCXN0cmlrZW91dEJ1dHRvbi5zZXRUb29sVGlwVGV4dChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJTdHJpa2VvdXQiKSk7Ci0Jc3RyaWtlb3V0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCi0JVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuU0VQQVJBVE9SKTsKLQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQlpdGVtLnNldEltYWdlKGltYWdlcy5SZWQpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlmZ0NvbG9yKFJFRCk7Ci0JCX0KLQl9KTsKLQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQlpdGVtLnNldEltYWdlKGltYWdlcy5HcmVlbik7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWZnQ29sb3IoR1JFRU4pOwotCQl9Ci0JfSk7Ci0JaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRJbWFnZShpbWFnZXMuQmx1ZSk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWZnQ29sb3IoQkxVRSk7Ci0JCX0KLQl9KTsJCi0JaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuU0VQQVJBVE9SKTsKLQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQlpdGVtLnNldEltYWdlKGltYWdlcy5FcmFzZSk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWNsZWFyKCk7Ci0JCX0KLQl9KTsKLX0KLS8qCi0gKiBDYWNoZSB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZm9yIHRleHQgdGhhdCBoYXMgYmVlbiBjdXQgb3IgY29waWVkLgotICovCi12b2lkIGhhbmRsZUN1dENvcHkoKSB7Ci0JLy8gU2F2ZSB0aGUgY3V0L2NvcGllZCBzdHlsZSBpbmZvIHNvIHRoYXQgZHVyaW5nIHBhc3RlIHdlIHdpbGwgbWFpbnRhaW4KLQkvLyB0aGUgc3R5bGUgaW5mb3JtYXRpb24uICBDdXQvY29waWVkIHRleHQgaXMgcHV0IGluIHRoZSBjbGlwYm9hcmQgaW4KLQkvLyBSVEYgZm9ybWF0LCBidXQgaXMgbm90IHBhc3RlZCBpbiBSVEYgZm9ybWF0LiAgVGhlIG90aGVyIHdheSB0byAKLQkvLyBoYW5kbGUgdGhlIHBhc3Rpbmcgb2Ygc3R5bGVzIHdvdWxkIGJlIHRvIGFjY2VzcyB0aGUgQ2xpcGJvYXJkIGRpcmVjdGx5IGFuZCAKLQkvLyBwYXJzZSB0aGUgUlRGIHRleHQuCi0JY2FjaGVkU3R5bGVzID0gbmV3IFZlY3RvcigpOwotCVBvaW50IHNlbCA9IHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQlpbnQgc3RhcnRYID0gc2VsLng7Ci0JZm9yIChpbnQgaT1zZWwueDsgaTw9c2VsLngrc2VsLnktMTsgaSsrKSB7Ci0JCVN0eWxlUmFuZ2Ugc3R5bGUgPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCXN0eWxlLnN0YXJ0ID0gc3R5bGUuc3RhcnQgLSBzdGFydFg7Ci0JCQlpZiAoIWNhY2hlZFN0eWxlcy5pc0VtcHR5KCkpIHsKLQkJCQlTdHlsZVJhbmdlIGxhc3RTdHlsZSA9IChTdHlsZVJhbmdlKWNhY2hlZFN0eWxlcy5sYXN0RWxlbWVudCgpOwotCQkJCWlmIChsYXN0U3R5bGUuc2ltaWxhclRvKHN0eWxlKSAmJiBsYXN0U3R5bGUuc3RhcnQgKyBsYXN0U3R5bGUubGVuZ3RoID09IHN0eWxlLnN0YXJ0KSB7Ci0JCQkJCWxhc3RTdHlsZS5sZW5ndGgrKzsKLQkJCQl9IGVsc2UgewotCQkJCQljYWNoZWRTdHlsZXMuYWRkRWxlbWVudChzdHlsZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQljYWNoZWRTdHlsZXMuYWRkRWxlbWVudChzdHlsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci12b2lkIGhhbmRsZUV4dGVuZGVkTW9kaWZ5KEV4dGVuZGVkTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQlpZiAoZXZlbnQubGVuZ3RoID09IDApIHJldHVybjsKLQlTdHlsZVJhbmdlIHN0eWxlOwotCWlmIChldmVudC5sZW5ndGggPT0gMSB8fCB0ZXh0LmdldFRleHRSYW5nZShldmVudC5zdGFydCwgZXZlbnQubGVuZ3RoKS5lcXVhbHModGV4dC5nZXRMaW5lRGVsaW1pdGVyKCkpKSB7Ci0JCS8vIEhhdmUgdGhlIG5ldyB0ZXh0IHRha2Ugb24gdGhlIHN0eWxlIG9mIHRoZSB0ZXh0IHRvIGl0cyByaWdodCAoZHVyaW5nCi0JCS8vIHR5cGluZykgaWYgbm8gc3R5bGUgaW5mb3JtYXRpb24gaXMgYWN0aXZlLgotCQlpbnQgY2FyZXRPZmZzZXQgPSB0ZXh0LmdldENhcmV0T2Zmc2V0KCk7Ci0JCXN0eWxlID0gbnVsbDsKLQkJaWYgKGNhcmV0T2Zmc2V0IDwgdGV4dC5nZXRDaGFyQ291bnQoKSkgc3R5bGUgPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChjYXJldE9mZnNldCk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlzdHlsZSA9IChTdHlsZVJhbmdlKSBzdHlsZS5jbG9uZSAoKTsKLQkJCXN0eWxlLnN0YXJ0ID0gZXZlbnQuc3RhcnQ7Ci0JCQlzdHlsZS5sZW5ndGggPSBldmVudC5sZW5ndGg7Ci0JCX0gZWxzZSB7Ci0JCQlzdHlsZSA9IG5ldyBTdHlsZVJhbmdlKGV2ZW50LnN0YXJ0LCBldmVudC5sZW5ndGgsIG51bGwsIG51bGwsIFNXVC5OT1JNQUwpOwotCQl9CQkKLQkJaWYgKGJvbGRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlLmZvbnRTdHlsZSB8PSBTV1QuQk9MRDsKLQkJaWYgKGl0YWxpY0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUuZm9udFN0eWxlIHw9IFNXVC5JVEFMSUM7Ci0JCXN0eWxlLnVuZGVybGluZSA9IHVuZGVybGluZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJc3R5bGUuc3RyaWtlb3V0ID0gc3RyaWtlb3V0QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXN0eWxlLmlzVW5zdHlsZWQoKSkgdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQl9IGVsc2UgewotCQkvLyBwYXN0ZSBvY2N1cnJpbmcsIGhhdmUgdGV4dCB0YWtlIG9uIHRoZSBzdHlsZXMgaXQgaGFkIHdoZW4gaXQgd2FzCi0JCS8vIGN1dC9jb3BpZWQKLQkJZm9yIChpbnQgaT0wOyBpPGNhY2hlZFN0eWxlcy5zaXplKCk7IGkrKykgewotCQkJc3R5bGUgPSAoU3R5bGVSYW5nZSljYWNoZWRTdHlsZXMuZWxlbWVudEF0KGkpOwotCQkJU3R5bGVSYW5nZSBuZXdTdHlsZSA9IChTdHlsZVJhbmdlKXN0eWxlLmNsb25lKCk7Ci0JCQluZXdTdHlsZS5zdGFydCA9IHN0eWxlLnN0YXJ0ICsgZXZlbnQuc3RhcnQ7Ci0JCQl0ZXh0LnNldFN0eWxlUmFuZ2UobmV3U3R5bGUpOwotCQl9Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlUZXh0RWRpdG9yIGV4YW1wbGUgPSBuZXcgVGV4dEVkaXRvciAoKTsKLQlTaGVsbCBzaGVsbCA9IGV4YW1wbGUub3BlbiAoZGlzcGxheSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKQotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotcHVibGljIFNoZWxsIG9wZW4gKERpc3BsYXkgZGlzcGxheSkgewotCWNyZWF0ZVNoZWxsIChkaXNwbGF5KTsKLQljcmVhdGVNZW51QmFyICgpOwotCWNyZWF0ZVRvb2xCYXIgKCk7Ci0JY3JlYXRlU3R5bGVkVGV4dCAoKTsKLQlzaGVsbC5zZXRTaXplKDUwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXJldHVybiBzaGVsbDsKLX0KLQotdm9pZCBzZXRGb250KCkgewotCUZvbnREaWFsb2cgZm9udERpYWxvZyA9IG5ldyBGb250RGlhbG9nKHNoZWxsKTsKLQlmb250RGlhbG9nLnNldEZvbnRMaXN0KCh0ZXh0LmdldEZvbnQoKSkuZ2V0Rm9udERhdGEoKSk7Ci0JRm9udERhdGEgZm9udERhdGEgPSBmb250RGlhbG9nLm9wZW4oKTsKLQlpZiAoZm9udERhdGEgIT0gbnVsbCkgewotCQlpZiAoZm9udCAhPSBudWxsKSB7Ci0JCQlmb250LmRpc3Bvc2UoKTsKLQkJfQotCQlmb250ID0gbmV3IEZvbnQoc2hlbGwuZ2V0RGlzcGxheSgpLCBmb250RGF0YSk7Ci0JCXRleHQuc2V0Rm9udChmb250KTsKLQl9Ci19Ci0KLXZvaWQgaW5pdGlhbGl6ZUNvbG9ycygpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQlSRUQgPSBuZXcgQ29sb3IgKGRpc3BsYXksIG5ldyBSR0IoMjU1LDAsMCkpOwotCUJMVUUgPSBuZXcgQ29sb3IgKGRpc3BsYXksIG5ldyBSR0IoMCwwLDI1NSkpOwotCUdSRUVOID0gbmV3IENvbG9yIChkaXNwbGF5LCBuZXcgUkdCKDAsMjU1LDApKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYmx1ZS5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JsdWUuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NGM3YWM5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYmx1ZS5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JsdWVfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JsdWVfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjZTkyNjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ibHVlX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ib2xkLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYm9sZC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzMTg0YmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ib2xkLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYm9sZF9tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYm9sZF9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzgyNzUxZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JvbGRfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2VyYXNlLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZXJhc2UuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDJhY2U3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZXJhc2UuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9lcmFzZV9tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZXJhc2VfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2YWIyMWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9lcmFzZV9tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZ3JlZW4uYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ncmVlbi5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjYTAyM2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ncmVlbi5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2dyZWVuX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ncmVlbl9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNlOTI2NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2dyZWVuX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9pdGFsaWMuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9pdGFsaWMuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTM2NzIwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvaXRhbGljLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvaXRhbGljX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9pdGFsaWNfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNDc2MmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9pdGFsaWNfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3JlZC5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3JlZC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4YzYzYmUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9yZWQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9yZWRfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3JlZF9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNlOTI2NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3JlZF9tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3Ivc3RyaWtlb3V0LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3Ivc3RyaWtlb3V0LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkMjk4NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3N0cmlrZW91dC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3N0cmlrZW91dF9tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3Ivc3RyaWtlb3V0X21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzlhYjMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3Ivc3RyaWtlb3V0X21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci91bmRlcmxpbmUuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci91bmRlcmxpbmUuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTNhY2ZkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvdW5kZXJsaW5lLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvdW5kZXJsaW5lX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci91bmRlcmxpbmVfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOWRlOTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci91bmRlcmxpbmVfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+T3BlbkdMVGFiPC9jb2RlPiBpcyB0aGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBldmVyeSBwYWdlCi0gKiBpbiB0aGUgZXhhbXBsZSdzIHRhYiBmb2xkZXIuICBFYWNoIHBhZ2UgaW4gdGhlIHRhYiBmb2xkZXIKLSAqIGRpc3BsYXlzIGEgZGlmZmVyZW50IGV4YW1wbGUuCi0gKgotICogQW4gT3BlbkdMVGFiIGl0c2VsZiBpcyBub3QgYSBjb250cm9sIGJ1dCBpbnN0ZWFkIHByb3ZpZGVzIGEgaGllcmFyY2h5Ci0gKiB3aXRoIHdoaWNoIHRvIHNoYXJlIGNvZGUgdGhhdCBpcyBjb21tb24gdG8gZXZlcnkgcGFnZSBpbiB0aGUgZm9sZGVyLgotICovCi1hYnN0cmFjdCBjbGFzcyBPcGVuR0xUYWIgewotCXByaXZhdGUgR0xDYW52YXMgZ2xDYW52YXM7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgdGFiRm9sZGVyUGFnZTsKLQlwcml2YXRlIGJvb2xlYW4gc3RlbmNpbFN1cHBvcnQ7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfU0xFRVBfTEVOR1RIID0gMTAwOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGlzIHRhYidzIGNvbnRyb2xzLiAgU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlLgotCSAqCi0JICogQHBhcmFtIGNvbXBvc2l0ZSB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCWFic3RyYWN0IHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIHRoZSBwYXJlbnQgdGFiIGZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlCi0JICovCi0JQ29tcG9zaXRlIGNyZWF0ZVRhYkZvbGRlclBhZ2UoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQl0YWJGb2xkZXJQYWdlID0gbmV3IENvbXBvc2l0ZSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJdGFiRm9sZGVyUGFnZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDAwOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlHTERhdGEgZGF0YSA9IG5ldyBHTERhdGEoKTsKLQkJZGF0YS5kb3VibGVCdWZmZXIgPSB0cnVlOwotCQlkYXRhLnN0ZW5jaWxTaXplID0gODsKLQkJZ2xDYW52YXMgPSBuZXcgR0xDYW52YXModGFiRm9sZGVyUGFnZSwgU1dULk5PX0JBQ0tHUk9VTkQsIGRhdGEpOwotCQlnbENhbnZhcy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWdsQ2FudmFzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlnbENhbnZhcy5zZXRTaXplKDQwMCwgNDAwKTsJCS8vIG5lZWRlZCBmb3Igd2luZG93cwotCi0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlDb21wb3NpdGUgY29udHJvbENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyUGFnZSwgU1dULk5PTkUpOwotCQljb250cm9sQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJY29udHJvbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBjcmVhdGUgdGhlIE9wZW5HTCBTY3JlZW4gYW5kIGNvbnRyb2xzCi0JCXNldEN1cnJlbnQoKTsKLQkJc2V0dXBWaWV3aW5nQXJlYSgpOwotCi0JCS8vIGRldGVybWluZSBpZiBuYXRpdmUgc3RlbmNpbCBzdXBwb3J0IGlzIGF2YWlsYWJsZQotCQlpbnRbXSBwYXJhbSA9IG5ldyBpbnRbMV07Ci0JCUdMLmdsR2V0SW50ZWdlcnYoR0wuR0xfU1RFTkNJTF9CSVRTLCBwYXJhbSk7Ci0JCXN0ZW5jaWxTdXBwb3J0ID0gcGFyYW1bMF0gIT0gMDsKLQotCQlpbml0KCk7Ci0KLQkJaWYgKCFpc1N0ZW5jaWxTdXBwb3J0TmVlZGVkKCkgfHwgaGFzU3RlbmNpbFN1cHBvcnQoKSkgewotCQkJY3JlYXRlQ29udHJvbHMoY29udHJvbENvbXBvc2l0ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250cm9sQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KCJUaGlzIHRhYiByZXF1aXJlcyBuYXRpdmUgc3RlbmNpbCBzdXBwb3J0LiIpOwotCQl9Ci0KLQkJcmV0dXJuIHRhYkZvbGRlclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyB0YWIuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdsQ2FudmFzIGZvciB0aGlzIHRhYi4KLQkgKiAKLQkgKiBAcmV0dXJuIENhbnZhcwotCSAqLwotCUdMQ2FudmFzIGdldEdsQ2FudmFzKCkgewotCQlyZXR1cm4gZ2xDYW52YXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRoYXQgdGhlIGV4YW1wbGUKLQkgKiBzaG91bGQgc2xlZXAgYmV0d2VlbiBhbmltYXRpb24gcmVkcmF3cy4gIEFzIHRoaXMgbGVuZ3RoCi0JICogaW5jcmVhc2VzLCB1c2VyIHJlc3BvbnNpdmVuZXNzIGluY3JlYXNlcyBhbmQgdGhlIGZyZXF1ZW5jeSBvZgotCSAqIGFuaW1hdGlvbiByZWRyYXdzIGRlY3JlYXNlcy4gIFN1YmNsYXNzZXMgd2l0aCBtb3ZpbmcgYW5pbWF0aW9ucwotCSAqIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gYQotCSAqIHNtYWxsZXIgdmFsdWUgaWYgdGhlaXIgYW5pbWF0aW9ucyBkbyBub3Qgb2NjdXIgZnJlcXVlbnRseSBlbm91Z2guIAotCSAqCi0JICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJldHdlZW4gcmVkcmF3cwotCSAqLwotCWludCBnZXRTbGVlcExlbmd0aCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0xFRVBfTEVOR1RIOwkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGlzIHRhYi4gIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHRleHQgZm9yIHRoZSB0YWIgaXRlbQotCSAqLwotCWFic3RyYWN0IFN0cmluZyBnZXRUYWJUZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtYWNoaW5lIGhhcyBuYXRpdmUgc3RlbmNpbHMgc3VwcG9ydC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGhhc1N0ZW5jaWxTdXBwb3J0KCkgewotCQlyZXR1cm4gc3RlbmNpbFN1cHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBPcGVuR0wgcmVzb3VyY2VzIGZvciB0aGlzIHRhYi4gIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZS4KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIGluaXQoKTsKLQotCS8qKgotCSAqIExvYWRzIGEgdGV4dHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSB0ZXh0dXJlW10KLQkgKi8KLQlzdGF0aWMgdm9pZCBsb2FkVGV4dHVyZShHTENhbnZhcyBjb250ZXh0LCBTdHJpbmcgZmlsZU5hbWUsIGludCBpbmRleCwgaW50W10gdGV4dHVyZSkgewotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmVbaW5kZXhdKTsKLQkJSW1hZ2VEYXRhIHNvdXJjZSA9Ci0JCQluZXcgSW1hZ2VEYXRhKE9wZW5HTFRhYi5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lKSk7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBzb3VyY2UpOwotCQlJbWFnZSBuZXdJbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgMjU2LCAyNTYpOwotCQlHQyBnYyA9IG5ldyBHQyhuZXdJbWFnZSk7Ci0JCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0LCAwLCAwLCAyNTYsIDI1Nik7Ci0JCXNvdXJjZSA9IG5ld0ltYWdlLmdldEltYWdlRGF0YSgpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCXNvdXJjZSA9IEltYWdlRGF0YVV0aWwuY29udmVydEltYWdlRGF0YShzb3VyY2UpOwotCQluZXdJbWFnZS5kaXNwb3NlKCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJR0wuZ2xUZXhJbWFnZTJEKAotCQkJR0wuR0xfVEVYVFVSRV8yRCwgMCwgMywgCi0JCQlzb3VyY2Uud2lkdGgsIHNvdXJjZS5oZWlnaHQsIDAsCi0JCQlHTC5HTF9SR0IsIEdMLkdMX1VOU0lHTkVEX0JZVEUsIHNvdXJjZS5kYXRhKTsKLQkJR0wuZ2xUZXhQYXJhbWV0ZXJpKEdMLkdMX1RFWFRVUkVfMkQsIEdMLkdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0wuR0xfTElORUFSKTsKLQkJR0wuZ2xUZXhQYXJhbWV0ZXJpKEdMLkdMX1RFWFRVUkVfMkQsIEdMLkdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0wuR0xfTElORUFSKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW5kZXJzIHRoaXMgdGFiLgotCSAqLwotCXZvaWQgcmVuZGVyKCkgewotCQlzZXRDdXJyZW50KCk7Ci0JCWlmICghaXNTdGVuY2lsU3VwcG9ydE5lZWRlZCgpIHx8IGhhc1N0ZW5jaWxTdXBwb3J0KCkpIHsKLQkJCXJlbmRlclNjZW5lKCk7Ci0JCX0gZWxzZSB7Ci0JCQlHTC5nbENsZWFyKEdMLkdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVuZGVycyB0aGUgc2NlbmUgZm9yIHRoaXMgdGFiLiAgU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlLgotCSAqLwotCWFic3RyYWN0IHZvaWQgcmVuZGVyU2NlbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHRhYiByZXF1aXJlcyBzdGVuY2lsIHN1cHBvcnQgaW4gb3JkZXIgdG8gZGlzcGxheQotCSAqIHByb3Blcmx5LiBTdWJjbGFzc2VzIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNTdGVuY2lsU3VwcG9ydE5lZWRlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhpcyByZW5kZXJpbmcgY29udGV4dCB0byBiZSBjdXJyZW50LgotCSAqLwotCXZvaWQgc2V0Q3VycmVudCgpIHsKLQkJZ2xDYW52YXMuc2V0Q3VycmVudCgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSB2aWV3aW5nIGFyZWEgZm9yIHRoZSBPcGVuR0wgc2NyZWVuLiAgVGhlIGRlZmF1bHQKLQkgKiBiZWhhdmlvciBpcyB0byB1c2UgYSBwZXJzcGVjdGl2ZSB2aWV3LCBidXQgdGhlcmUgYWxzbyBleGlzdCBmcnVzdHJ1bQotCSAqIGFuZCBvcnRobyB2aWV3cy4gIFN1YmNsYXNzZXMgbWF5IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0Jdm9pZCBzZXR1cFZpZXdpbmdBcmVhKCkgewotCQlSZWN0YW5nbGUgcmVjdCA9IGdsQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJaW50IHdpZHRoID0gcmVjdC53aWR0aDsKLQkJaW50IGhlaWdodCA9IHJlY3QuaGVpZ2h0OwotCQloZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIDEpOwotCQlHTC5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCQlHTC5nbE1hdHJpeE1vZGUoR0wuR0xfUFJPSkVDVElPTik7CS8vIHNlbGVjdCB0aGUgcHJvamVjdGlvbiBtYXRyaXgKLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsJCQkJLy8gcmVzZXQgdGhlIHByb2plY3Rpb24gbWF0cml4Ci0JCWZsb2F0IGZBc3BlY3QgPSAoZmxvYXQpIHdpZHRoIC8gKGZsb2F0KSBoZWlnaHQ7Ci0JCUdMVS5nbHVQZXJzcGVjdGl2ZSg0NS4wZiwgZkFzcGVjdCwgMC41ZiwgNDAwLjBmKTsKLQkJR0wuZ2xNYXRyaXhNb2RlKEdMLkdMX01PREVMVklFVyk7CS8vIHNlbGVjdCB0aGUgbW9kZWx2aWV3IG1hdHJpeAotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCX0KLQotCS8qKgotCSAqIFN3YXBzIHRoZSBidWZmZXJzLgotCSAqLwotCXZvaWQgc3dhcCgpIHsKLQkJZ2xDYW52YXMuc3dhcEJ1ZmZlcnMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1JlZmxlY3Rpb25UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvUmVmbGVjdGlvblRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjY1NGIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvUmVmbGVjdGlvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgUmVmbGVjdGlvblRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JcHJpdmF0ZSBmbG9hdCBiYWxsWSA9IDAuMGY7Ci0JcHJpdmF0ZSBmbG9hdCBiYWxsWiA9IDEuNjY2NjY2NmY7Ci0JcHJpdmF0ZSBmbG9hdCBiYWxsWCA9IDAuMGY7Ci0JcHJpdmF0ZSBmbG9hdCBiYWxsUm90ID0gMC4wZjsKLQlwcml2YXRlIGZsb2F0IGN1YmVYID0gMi41ZjsKLQlwcml2YXRlIGZsb2F0IGN1YmVZID0gLTIuMGY7Ci0JcHJpdmF0ZSBmbG9hdCBjdWJlWiA9IDIuMGY7Ci0JcHJpdmF0ZSBmbG9hdCB4UG9zID0gMC4wZjsKLQlwcml2YXRlIGZsb2F0IHlQb3MgPSAwLjBmOwotCXByaXZhdGUgZmxvYXQgelBvcyA9IDIyLjBmOwotCXByaXZhdGUgZmxvYXQgYmFsbFJvdFNwZWVkID0gMC4wZjsKLQlwcml2YXRlIGludCBxdWFkcmF0aWM7Ci0JcHJpdmF0ZSBpbnRbXSB0ZXh0dXJlcyA9IG5ldyBpbnRbM107Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50Ci0JCUxJU1RfSU5ERVhfQkFMTCA9IDEsTElTVF9JTkRFWF9CT1ggPSAyLAotCQlMSVNUX0lOREVYX01JUlJPUiA9IDMsIExJU1RfSU5ERVhfUk9PTSA9IDQ7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50Ci0JCVRFWFRVUkVfSU5ERVhfQkFMTCA9IDAsIFRFWFRVUkVfSU5ERVhfRkxPT1IgPSAxLAotCQlURVhUVVJFX0lOREVYX0JPWCA9IDI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gSU1BR0VTID0gewotCQkiaW1hZ2VzL0JhbGwuanBnIiwgImltYWdlcy9GbG9vci5qcGciLCAiaW1hZ2VzL0JveC5ibXAiIH07Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNMRUVQX0xFTkdUSCA9IDUwOwotCi0JLyoqCi0JICogRHJhd3MgdGhlIGJhbGwKLQkgKi8KLQl2b2lkIGNyZWF0ZUJhbGwoKSB7Ci0JCUdMLmdsTmV3TGlzdChMSVNUX0lOREVYX0JBTEwsIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQmluZFRleHR1cmUoR0wuR0xfVEVYVFVSRV8yRCwgdGV4dHVyZXNbVEVYVFVSRV9JTkRFWF9CQUxMXSk7Ci0JCUdMVS5nbHVTcGhlcmUocXVhZHJhdGljLCAwLjM1ZiwgMzIsIDE2KTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0JMRU5EKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogRHJhd3MgdGhlIGJveAotCSAqLwotCXZvaWQgY3JlYXRlQm94KCkgewotCQlmbG9hdCBzaXplID0gMS4wZjsKLQkJR0wuZ2xOZXdMaXN0KExJU1RfSU5ERVhfQk9YLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xDb2xvcjRmKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmVzW1RFWFRVUkVfSU5ERVhfQk9YXSk7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQkvLyBmcm9udAkKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCAtc2l6ZSwgc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCAtc2l6ZSwgc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCBzaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCBzaXplLCBzaXplKTsKLQkJLy8gYmFjawkKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAwLjBmLCAtMS4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgLXNpemUsIC1zaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCBzaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQkvLyBsZWZ0CQotCQlHTC5nbE5vcm1hbDNmKC0xLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCAtc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCBzaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCBzaXplLCAtc2l6ZSk7Ci0JCS8vIHJpZ2h0CQotCQlHTC5nbE5vcm1hbDNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgLXNpemUsIC1zaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIHNpemUsIHNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQkvLyB0b3AJCi0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCBzaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIHNpemUsIHNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgc2l6ZSwgc2l6ZSk7Ci0JCS8vIGJvdHRvbQkKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAtMS4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCAtc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgLXNpemUsIHNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgLXNpemUsIHNpemUpOwotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGJhbGxUcmFuc2xhdGlvbiA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYmFsbFRyYW5zbGF0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQliYWxsVHJhbnNsYXRpb24uc2V0VGV4dCgiQmFsbCBUcmFuc2xhdGlvbiIpOwotCi0JCW5ldyBMYWJlbChiYWxsVHJhbnNsYXRpb24sIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgYmFsbFhQb3NTbGlkZXIgPSBuZXcgU2xpZGVyKGJhbGxUcmFuc2xhdGlvbiwgU1dULk5PTkUpOwotCQliYWxsWFBvc1NsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCWJhbGxYUG9zU2xpZGVyLnNldE1heGltdW0oMzgpOwotCQliYWxsWFBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQliYWxsWFBvc1NsaWRlci5zZXRUaHVtYigyKTsKLQkJYmFsbFhQb3NTbGlkZXIuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJYmFsbFhQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDE4KTsKLQkJYmFsbFhQb3NTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWJhbGxYID0gKGZsb2F0KSAoYmFsbFhQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgLSAxOCkgLyA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoYmFsbFRyYW5zbGF0aW9uLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIGJhbGxZUG9zU2xpZGVyID0gbmV3IFNsaWRlcihiYWxsVHJhbnNsYXRpb24sIFNXVC5OT05FKTsKLQkJYmFsbFlQb3NTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQliYWxsWVBvc1NsaWRlci5zZXRNYXhpbXVtKDM4KTsKLQkJYmFsbFlQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJYmFsbFlQb3NTbGlkZXIuc2V0VGh1bWIoMik7Ci0JCWJhbGxZUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWJhbGxZUG9zU2xpZGVyLnNldFNlbGVjdGlvbigxOCk7Ci0JCWJhbGxZUG9zU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQliYWxsWSA9IChmbG9hdCkgKGJhbGxZUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpIC0gMTgpIC8gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGJhbGxUcmFuc2xhdGlvbiwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciBiYWxsWlBvc1NsaWRlciA9IG5ldyBTbGlkZXIoYmFsbFRyYW5zbGF0aW9uLCBTV1QuTk9ORSk7Ci0JCWJhbGxaUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJYmFsbFpQb3NTbGlkZXIuc2V0TWF4aW11bSgyNCk7Ci0JCWJhbGxaUG9zU2xpZGVyLnNldE1pbmltdW0oMCk7Ci0JCWJhbGxaUG9zU2xpZGVyLnNldFRodW1iKDEpOwotCQliYWxsWlBvc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQliYWxsWlBvc1NsaWRlci5zZXRTZWxlY3Rpb24oNCk7Ci0JCWJhbGxaUG9zU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQliYWxsWiA9IChmbG9hdCkgKGJhbGxaUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpICsgMSkgLyAzOwotCQkJfQotCQl9KTsKLQotCQlHcm91cCBjdWJlVHJhbnNsYXRpb24gPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWN1YmVUcmFuc2xhdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJY3ViZVRyYW5zbGF0aW9uLnNldFRleHQoIkN1YmUgVHJhbnNsYXRpb24iKTsKLQotCQluZXcgTGFiZWwoY3ViZVRyYW5zbGF0aW9uLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIGN1YmVYUG9zU2xpZGVyID0gbmV3IFNsaWRlcihjdWJlVHJhbnNsYXRpb24sIFNXVC5OT05FKTsKLQkJY3ViZVhQb3NTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQljdWJlWFBvc1NsaWRlci5zZXRNYXhpbXVtKDE0KTsKLQkJY3ViZVhQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJY3ViZVhQb3NTbGlkZXIuc2V0VGh1bWIoMik7Ci0JCWN1YmVYUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWN1YmVYUG9zU2xpZGVyLnNldFNlbGVjdGlvbigxMSk7Ci0JCWN1YmVYUG9zU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQljdWJlWCA9IChmbG9hdCkgKGN1YmVYUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpIC0gNikgLyAyOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY3ViZVRyYW5zbGF0aW9uLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIGN1YmVZUG9zU2xpZGVyID0gbmV3IFNsaWRlcihjdWJlVHJhbnNsYXRpb24sIFNXVC5OT05FKTsKLQkJY3ViZVlQb3NTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQljdWJlWVBvc1NsaWRlci5zZXRNYXhpbXVtKDE0KTsKLQkJY3ViZVlQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJY3ViZVlQb3NTbGlkZXIuc2V0VGh1bWIoMik7Ci0JCWN1YmVZUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWN1YmVZUG9zU2xpZGVyLnNldFNlbGVjdGlvbigyKTsKLQkJY3ViZVlQb3NTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWN1YmVZID0gKGZsb2F0KSAoY3ViZVlQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgLSA2KSAvIDI7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChjdWJlVHJhbnNsYXRpb24sIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgY3ViZVpQb3NTbGlkZXIgPSBuZXcgU2xpZGVyKGN1YmVUcmFuc2xhdGlvbiwgU1dULk5PTkUpOwotCQljdWJlWlBvc1NsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCWN1YmVaUG9zU2xpZGVyLnNldE1heGltdW0oMTApOwotCQljdWJlWlBvc1NsaWRlci5zZXRNaW5pbXVtKDEpOwotCQljdWJlWlBvc1NsaWRlci5zZXRUaHVtYigxKTsKLQkJY3ViZVpQb3NTbGlkZXIuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJY3ViZVpQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDIpOwotCQljdWJlWlBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJY3ViZVogPSAoZmxvYXQpIChjdWJlWlBvc1NsaWRlci5nZXRTZWxlY3Rpb24oKSArIDIpIC8gMjsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgbW92ZW1lbnRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRUZXh0KCJSb29tIFJvdGF0aW9uIik7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgc2NyZWVuWFBvc1NsaWRlciA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQlzY3JlZW5YUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5zZXRNYXhpbXVtKDQyKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQlzY3JlZW5YUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQlzY3JlZW5YUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXNjcmVlblhQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDIwKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHNjcmVlblhQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgLSAyMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgc2NyZWVuWVBvc1NsaWRlciA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQlzY3JlZW5ZUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5zZXRNYXhpbXVtKDQyKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQlzY3JlZW5ZUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQlzY3JlZW5ZUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXNjcmVlbllQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDIwKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHNjcmVlbllQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgLSAyMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgc2NyZWVuWlBvc1NsaWRlciA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQlzY3JlZW5aUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5zZXRNYXhpbXVtKDQyKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQlzY3JlZW5aUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQlzY3JlZW5aUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXNjcmVlblpQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDIwKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelBvcyA9IHNjcmVlblpQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgKyAyOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiQmFsbCBSb3RhdGlvbiBTcGVlZDoiKTsKLQkJZmluYWwgU2xpZGVyIGJhbGxSb3RTbGlkZXIgPSBuZXcgU2xpZGVyKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQliYWxsUm90U2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJYmFsbFJvdFNsaWRlci5zZXRNYXhpbXVtKDIyKTsKLQkJYmFsbFJvdFNsaWRlci5zZXRNaW5pbXVtKDApOwotCQliYWxsUm90U2xpZGVyLnNldFRodW1iKDIpOwotCQliYWxsUm90U2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWJhbGxSb3RTbGlkZXIuc2V0U2VsZWN0aW9uKDApOwotCQliYWxsUm90U2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQliYWxsUm90U3BlZWQgPSBiYWxsUm90U2xpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogRHJhd3MgdGhlIG1pcnJvcgotCSAqLwotCXZvaWQgY3JlYXRlTWlycm9yKCkgewotCQlHTC5nbE5ld0xpc3QoTElTVF9JTkRFWF9NSVJST1IsIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCUdMLmdsQ29sb3I0ZigxLjBmLCAxLjBmLCAxLjBmLCAwLjRmKTsKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsRW5kKCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX1RFWFRVUkVfMkQpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0JCi0JLyoqCi0JICogRHJhd3MgdGhlIHJvb20KLQkgKi8KLQl2b2lkIGNyZWF0ZVJvb20oKSB7Ci0JCUdMLmdsTmV3TGlzdChMSVNUX0lOREVYX1JPT00sIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQkvLyBsZWZ0IHdhbGwKLQkJR0wuZ2xOb3JtYWwzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtNC4wZiwgNC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIDQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKC00LjBmLCAtNC4wZiwgNi4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIC00LjBmLCAwLjBmKTsKLQkJLy8gcmlnaHQgd2FsbAotCQlHTC5nbE5vcm1hbDNmKC0xLjBmLCAwLjBmLCAwMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgNC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgNC4wZiwgNi4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgLTQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIC00LjBmLCAwLjBmKTsKLQkJLy8gY2VpbGluZwkKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAtMS4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjlmLCAwLjlmLCAwLjlmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtNC4wZiwgNC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIDQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIDQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIDQuMGYsIDAuMGYpOwotCQlHTC5nbEVuZCgpOwotCQkvLyBiYWNrIHdhbGwgd2l0aCB0cmlhbmdsZSBzdHJpcCB0byBpbGxpbWluYXRlIHQtaW50ZXJzZWN0aW9ucyAKLQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRV9TVFJJUCk7Ci0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2QoLTQuMCwgLTQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtMi4yLCAtNC4wLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC0yLjIsIC0yLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoMi4yLCAtNC4wLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKDIuMiwgLTIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCg0LjAsIC00LjAsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoMi4yLCAtMi4yLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKDQuMCwgLTIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCg0LjAsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCg0LjAsIDQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIDQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtMi4yLCAyLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTIuMiwgNC4wLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC00LjAsIDQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtMi4yLCAyLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTQuMCwgMi4yLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC0yLjIsIC0yLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTQuMCwgLTIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtNC4wLCAtNC4wLCAwLjApOwotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9URVhUVVJFXzJEKTsKLQkJLy8gZHJhdyBmbG9vcgotCQlHTC5nbENvbG9yNGYoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQmluZFRleHR1cmUoR0wuR0xfVEVYVFVSRV8yRCwgdGV4dHVyZXNbVEVYVFVSRV9JTkRFWF9GTE9PUl0pOwotCQlHTC5nbE5vcm1hbDNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJLy8gZmxvb3IKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC00LjBmLCAtNC4wZiwgNi4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtNC4wZiwgLTQuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgLTQuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgLTQuMGYsIDYuMGYpOwotCQlHTC5nbEVuZCgpOwotCQkvLyBkcmF3IG1pcnJvciBmcmFtZQotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmVzW1RFWFRVUkVfSU5ERVhfQk9YXSk7Ci0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQkvLyB0b3AKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjJmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMmYsIDIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4yZiwgMi4yZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4yZiwgMi4yZiwgMC4wZik7Ci0JCS8vIHJpZ2h0Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMGYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMmYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMmYsIDIuMGYsIDAuMGYpOwotCQkvLyBib3R0b20KLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjJmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjJmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjJmLCAtMi4yZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4yZiwgLTIuMmYsIDAuMGYpOwotCQkvLyBsZWZ0Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMmYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjJmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xFbmQoKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMVS5nbHVEZWxldGVRdWFkcmljKHF1YWRyYXRpYyk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoTElTVF9JTkRFWF9CQUxMLCAxKTsKLQkJR0wuZ2xEZWxldGVMaXN0cyhMSVNUX0lOREVYX0JPWCwgMSk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoTElTVF9JTkRFWF9NSVJST1IsIDEpOwotCQlHTC5nbERlbGV0ZUxpc3RzKExJU1RfSU5ERVhfUk9PTSwgMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0U2xlZXBMZW5ndGgoKQotCSAqLwotCWludCBnZXRTbGVlcExlbmd0aCgpIHsKLQkJcmV0dXJuIFNMRUVQX0xFTkdUSDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0VGFiVGV4dCgpCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiUmVmbGVjdGlvbiI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQlpZiAoIWhhc1N0ZW5jaWxTdXBwb3J0KCkpIHJldHVybjsKLQotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQ2xlYXJEZXB0aCgxLjBmKTsKLQkJR0wuZ2xDbGVhclN0ZW5jaWwoMCk7Ci0JCUdMLmdsR2VuVGV4dHVyZXMoSU1BR0VTLmxlbmd0aCwgdGV4dHVyZXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IElNQUdFUy5sZW5ndGg7IGkrKykgewotCQkJbG9hZFRleHR1cmUoZ2V0R2xDYW52YXMoKSwgSU1BR0VTW2ldLCBpLCB0ZXh0dXJlcyk7Ci0JCX0KLQotCQlHTC5nbFNoYWRlTW9kZWwoR0wuR0xfU01PT1RIKTsKLQkJcXVhZHJhdGljID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkJR0xVLmdsdVF1YWRyaWNOb3JtYWxzKHF1YWRyYXRpYywgR0wuR0xfU01PT1RIKTsKLQkJR0xVLmdsdVF1YWRyaWNUZXh0dXJlKHF1YWRyYXRpYywgdHJ1ZSk7Ci0JCUdMLmdsRGVwdGhGdW5jKEdMLkdMX0xFUVVBTCk7Ci0JCUdMLmdsQmxlbmRGdW5jKEdMLkdMX1NSQ19BTFBIQSwgR0wuR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0JCUdMLmdsSGludChHTC5HTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsIEdMLkdMX05JQ0VTVCk7Ci0KLQkJLy8gc2V0IHVwIHRoZSBsaWdodHMKLQkJZmxvYXRbXSBMaWdodEFtYiA9IHsgMC43ZiwgMC43ZiwgMC43ZiwgMS4wZiB9OwotCQlmbG9hdFtdIExpZ2h0RGlmID0geyAxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0JCWZsb2F0W10gbGlnaHRzQW1iaWVudCA9IHsgMC41ZiwgMC41ZiwgMC41ZiwgMS4wZiB9OwotCQlHTC5nbExpZ2h0TW9kZWxmdihHTC5HTF9MSUdIVF9NT0RFTF9BTUJJRU5ULCBsaWdodHNBbWJpZW50KTsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfQU1CSUVOVCwgTGlnaHRBbWIpOwotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9ESUZGVVNFLCBMaWdodERpZik7Ci0KLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFQwKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSU5FX1NNT09USCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9URVhUVVJFXzJEKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQkxFTkQpOwotCi0JCWNyZWF0ZVJvb20oKTsKLQkJY3JlYXRlQmFsbCgpOwotCQljcmVhdGVCb3goKTsKLQkJY3JlYXRlTWlycm9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaXNTdGVuY2lsU3VwcG9ydE5lZWRlZAotCSAqLwotCWJvb2xlYW4gaXNTdGVuY2lsU3VwcG9ydE5lZWRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoCi0JCQlHTC5HTF9DT0xPUl9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9TVEVOQ0lMX0JVRkZFUl9CSVQpOwotCi0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMVS5nbHVMb29rQXQoeFBvcywgeVBvcywgelBvcywgMCwgMCwgMCwgMCwgMSwgMCk7Ci0JCS8vIGNsaXAgcGxhbmUgZXF1YXRpb24KLQkJZG91YmxlIGNsaXBFcXVhdGlvbltdID0geyAwLjBmLCAwLjBmLCAtMS4wZiwgMC4wZiB9OwotCQlmbG9hdFtdIExpZ2h0UG9zID0geyAwLjBmLCAyLjBmLCA3LjBmLCAxLjBmIH07Ci0JCUdMLmdsQ29sb3JNYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJLy8gZW5hYmxlIHN0ZW5jaWwgYnVmZmVyIGZvciAibWFya2luZyIgdGhlIG1pcnJvcgkJCi0JCUdMLmdsRW5hYmxlKEdMLkdMX1NURU5DSUxfVEVTVCk7Ci0JCS8vIHNldCB0aGUgc3RlbmNpbCBidWZmZXIgdG8gMSB3aGVyZSBhIHBvbHlnb24gaXMgZHJhd24KLQkJR0wuZ2xTdGVuY2lsRnVuYyhHTC5HTF9BTFdBWVMsIDEsIDEpOwotCQlHTC5nbFN0ZW5jaWxPcChHTC5HTF9LRUVQLCBHTC5HTF9LRUVQLCBHTC5HTF9SRVBMQUNFKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfTUlSUk9SKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCUdMLmdsQ29sb3JNYXNrKHRydWUsIHRydWUsIHRydWUsIHRydWUpOwotCQlHTC5nbFN0ZW5jaWxGdW5jKEdMLkdMX0VRVUFMLCAxLCAxKTsKLQkJLy8gZHJhdyB3aGVyZSB0aGUgc3RlbmNpbCBpcyAxCQkJCQkJCi0JCUdMLmdsU3RlbmNpbE9wKEdMLkdMX0tFRVAsIEdMLkdMX0tFRVAsIEdMLkdMX0tFRVApOwotCQlHTC5nbEVuYWJsZShHTC5HTF9DTElQX1BMQU5FMCk7Ci0JCUdMLmdsQ2xpcFBsYW5lKEdMLkdMX0NMSVBfUExBTkUwLCBjbGlwRXF1YXRpb24pOwotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xTY2FsZWYoMS4wZiwgMS4wZiwgLTEuMGYpOwotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9QT1NJVElPTiwgTGlnaHRQb3MpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfUk9PTSk7CQkJLy8gcmVmbGVjdGlvbgotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKGN1YmVYLCBjdWJlWSwgY3ViZVopOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfQk9YKTsJCQkvLyByZWZsZWN0aW9uCi0JCUdMLmdsUG9wTWF0cml4KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZihiYWxsWCwgYmFsbFksIGJhbGxaKTsKLQkJR0wuZ2xSb3RhdGVmKGJhbGxSb3QsIDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfQkFMTCk7CQkJLy8gcmVmbGVjdGlvbgotCQlHTC5nbFBvcE1hdHJpeCgpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfQ0xJUF9QTEFORTApOwotCQlHTC5nbERpc2FibGUoR0wuR0xfU1RFTkNJTF9URVNUKTsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfUE9TSVRJT04sIExpZ2h0UG9zKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQkxFTkQpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbEJsZW5kRnVuYyhHTC5HTF9TUkNfQUxQSEEsIEdMLkdMX09ORV9NSU5VU19TUkNfQUxQSEEpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfTUlSUk9SKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfQkxFTkQpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfUk9PTSk7Ci0JCUdMLmdsUHVzaE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoY3ViZVgsIGN1YmVZLCBjdWJlWik7Ci0JCUdMLmdsQ2FsbExpc3QoTElTVF9JTkRFWF9CT1gpOwotCQlHTC5nbFBvcE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoYmFsbFgsIGJhbGxZLCBiYWxsWik7Ci0JCUdMLmdsUm90YXRlZihiYWxsUm90LCAxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xDYWxsTGlzdChMSVNUX0lOREVYX0JBTEwpOwotCQliYWxsUm90ICs9IGJhbGxSb3RTcGVlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1N0ZW5jaWxUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvU3RlbmNpbFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjMzN2U2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvU3RlbmNpbFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgU3RlbmNpbFRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBTaGFwZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCS8qKgotCQkgKiBDb25zdHJ1Y3RvcgotCQkgKiAKLQkJICogQHBhcmFtIG5hbWUgdGhlIHNoYXBlJ3MgbmFtZQotCQkgKi8KLQkJU2hhcGUoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCS8qKgotCQkgKiBEcmF3cyB0aGlzIHNoYXBlLgotCQkgKi8KLQkJYWJzdHJhY3Qgdm9pZCBkcmF3KCk7Ci0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBuYW1lLgotCQkgKiAKLQkJICogQHJldHVybiBTdHJpbmcKLQkJICovCi0JCVN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNoYXBlW10gc2hhcGVzID0gbmV3IFNoYXBlWzVdOwotCXByaXZhdGUgU2hhcGUgY3VycmVudFNoYXBlOwotCXByaXZhdGUgZmxvYXQgeFBvcyA9IDAsIHlQb3MgPSAwOwotCXByaXZhdGUgZmxvYXQgc2l6ZSA9IDAuNDVmOwotCXByaXZhdGUgaW50IHRleHR1cmU7Ci0JcHJpdmF0ZSBpbnQgcXVhZHJhdGljOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJTUFHRSA9ICJpbWFnZXMvc3BsYXNoLmJtcCI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNMRUVQX0xFTkdUSCA9IDUwOwotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlDb21wb3NpdGUgY29udHJvbHMgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbnRyb2xzLnNldExheW91dChsYXlvdXQpOwotCQluZXcgTGFiZWwoY29udHJvbHMsIFNXVC5OT05FKS5zZXRUZXh0KCJPYmplY3Q6Iik7Ci0JCWZpbmFsIENvbWJvIHNoYXBlQ29tYm8gPSBuZXcgQ29tYm8oY29udHJvbHMsIFNXVC5SRUFEX09OTFkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNoYXBlcy5sZW5ndGg7IGkrKykgewotCQkJc2hhcGVDb21iby5hZGQoc2hhcGVzW2ldLmdldE5hbWUoKSk7Ci0JCX0KLQkJc2hhcGVDb21iby5zZWxlY3QoMCk7Ci0JCXNoYXBlQ29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWN1cnJlbnRTaGFwZSA9IHNoYXBlc1tzaGFwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiU2l6ZToiKTsKLQkJZmluYWwgU2xpZGVyIHNpemVTbGlkZXIgPSBuZXcgU2xpZGVyKGNvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwpOwotCQlzaXplU2xpZGVyLnNldFZhbHVlcygwLCAxNSwgNzUsIDUsIDUsIDEwKTsKLQkJc2l6ZVNsaWRlci5zZXRTZWxlY3Rpb24oNDUpOwotCQlzaXplU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlzaXplID0gKChmbG9hdCkgc2l6ZVNsaWRlci5nZXRTZWxlY3Rpb24oKSkgLyAxMDA7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2Rpc3Bvc2UoKQotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlHTFUuZ2x1RGVsZXRlUXVhZHJpYyhxdWFkcmF0aWMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFNsZWVwTGVuZ3RoKCkKLQkgKi8KLQlpbnQgZ2V0U2xlZXBMZW5ndGgoKSB7Ci0JCXJldHVybiBTTEVFUF9MRU5HVEg7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIlN0ZW5jaWwiOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJaWYgKCFoYXNTdGVuY2lsU3VwcG9ydCgpKSByZXR1cm47Ci0JCQotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQ2xlYXJEZXB0aCgxLjBmKTsKLQkJaW50W10gdGV4dHVyZU91dCA9IG5ldyBpbnRbMV07Ci0JCUdMLmdsR2VuVGV4dHVyZXMoMSwgdGV4dHVyZU91dCk7Ci0JCWxvYWRUZXh0dXJlKGdldEdsQ2FudmFzKCksIElNQUdFLCAwLCB0ZXh0dXJlT3V0KTsKLQkJdGhpcy50ZXh0dXJlID0gdGV4dHVyZU91dFswXTsKLQkJcXVhZHJhdGljID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkJR0xVLmdsdVF1YWRyaWNOb3JtYWxzKHF1YWRyYXRpYywgR0xVLkdMVV9TTU9PVEgpOwotCQlHTC5nbERlcHRoRnVuYyhHTC5HTF9MRVFVQUwpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9TVEVOQ0lMX1RFU1QpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9URVhUVVJFXzJEKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCS8vIGNyZWF0ZSBzaGFwZXMKLQkJc2hhcGVzWzBdID0gbmV3IFNoYXBlKCJUcmlhbmdsZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYXcoKSB7Ci0JCQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRVMpOwotCQkJCUdMLmdsVmVydGV4M2YoMC4wZiwgc2l6ZSwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgLXNpemUsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2Yoc2l6ZSwgLXNpemUsIDAuMGYpOwotCQkJCUdMLmdsRW5kKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJc2hhcGVzWzFdID0gbmV3IFNoYXBlKCJEaXNrIikgewotCQkJcHVibGljIHZvaWQgZHJhdygpIHsKLQkJCQlHTFUuZ2x1RGlzayhxdWFkcmF0aWMsIDAuMGYsIHNpemUsIDMyLCAzMik7Ci0JCQl9Ci0JCX07Ci0KLQkJc2hhcGVzWzJdID0gbmV3IFNoYXBlKCJTcXVhcmUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcmF3KCkgewotCQkJCUdMLmdsUmVjdGYoLXNpemUsIC1zaXplLCBzaXplLCBzaXplKTsKLQkJCX0KLQkJfTsKLQotCQlzaGFwZXNbM10gPSBuZXcgU2hhcGUoIkhvdXIgR2xhc3MiKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcmF3KCkgewotCQkJCUdMLmdsQmVnaW4oR0wuR0xfVFJJQU5HTEVTKTsKLQkJCQlHTC5nbFZlcnRleDNmKDAuMGYsIHNpemUsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKDAuMGYsIC1zaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKHNpemUsIHNpemUsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2YoLXNpemUsIHNpemUsIDAuMGYpOwotCQkJCUdMLmdsRW5kKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJc2hhcGVzWzRdID0gbmV3IFNoYXBlKCJTdGFyIikgewotCQkJcHVibGljIHZvaWQgZHJhdygpIHsKLQkJCQlHTC5nbEJlZ2luKEdMLkdMX1RSSUFOR0xFUyk7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigtMC4zZiwgMCwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigyICogc2l6ZSAtIDAuM2YsIDAsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2Yoc2l6ZSAtIDAuM2YsIDIgKiBzaXplICogMC44NWYsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2YoMiAqIHNpemUgLSAwLjNmLCBzaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKDAgLSAwLjNmLCBzaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKHNpemUgLSAwLjNmLCAtc2l6ZSAqIDAuODVmLCAwLjBmKTsKLQkJCQlHTC5nbEVuZCgpOwotCQkJfQotCQl9OwotCi0JCWN1cnJlbnRTaGFwZSA9IHNoYXBlc1swXTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpc1N0ZW5jaWxTdXBwb3J0TmVlZGVkCi0JICovCi0JYm9vbGVhbiBpc1N0ZW5jaWxTdXBwb3J0TmVlZGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcigKLQkJCUdMLkdMX0NPTE9SX0JVRkZFUl9CSVQKLQkJCQl8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQKLQkJCQl8IEdMLkdMX1NURU5DSUxfQlVGRkVSX0JJVCk7Ci0KLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKAotCQkJKGZsb2F0KSAoMS41ICogTWF0aC5jb3MoeFBvcykpLAotCQkJKGZsb2F0KSAoMS4wICogTWF0aC5zaW4oeVBvcykpLAotCQkJLTMuMGYpOwotCQl4UG9zICs9IDAuMTVmOwotCQl5UG9zICs9IDAuM2Y7Ci0KLQkJR0wuZ2xDb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQlHTC5nbFN0ZW5jaWxGdW5jKEdMLkdMX0FMV0FZUywgMSwgMSk7Ci0JCUdMLmdsU3RlbmNpbE9wKEdMLkdMX0tFRVAsIEdMLkdMX0tFRVAsIEdMLkdMX1JFUExBQ0UpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCUdMLmdsQ29sb3I0ZigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQotCQljdXJyZW50U2hhcGUuZHJhdygpOwotCi0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbENvbG9yTWFzayh0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJR0wuZ2xTdGVuY2lsRnVuYyhHTC5HTF9FUVVBTCwgMSwgMSk7Ci0JCUdMLmdsU3RlbmNpbE9wKEdMLkdMX0tFRVAsIEdMLkdMX0tFRVAsIEdMLkdMX0tFRVApOwotCi0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCS8vIGxvYWQgdGhlIHRleHR1cmUgYmVoaW5kIHRoZSBzdGVuY2lsIG9iamVjdAotCQlHTC5nbFRyYW5zbGF0ZWYoMC4wZiwgMC4wZiwgLTMuMWYpOwotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjg1ZiwgLTAuODVmLCAxLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuODVmLCAtMC44NWYsIDEuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC44NWYsIDAuODVmLCAxLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjg1ZiwgMC44NWYsIDEuMGYpOwotCQlHTC5nbEVuZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvVGV4dHVyZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9UZXh0dXJlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYWUxMWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9UZXh0dXJlVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBUZXh0dXJlVGFiIGV4dGVuZHMgT3BlbkdMVGFiIHsKLQlwcml2YXRlIGZsb2F0IHlyb3QgPSAwLCB6cm90ID0gMDsKLQlwcml2YXRlIGZsb2F0IHhQb3MgPSAwLjBmLCB5UG9zID0gMC4wZiwgelBvcyA9IC0yMDsKLQlwcml2YXRlIGludCB0ZXh0dXJlID0gMDsKLQlwcml2YXRlIGZsb2F0W11bXVtdIHBvaW50cyA9IG5ldyBmbG9hdFs0NV1bNDVdWzNdOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJTUFHRSA9ICJpbWFnZXMvc3BsYXNoLmJtcCI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNMRUVQX0xFTkdUSCA9IDUwOwotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBtb3ZlbWVudEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQltb3ZlbWVudEdyb3VwLnNldFRleHQoIlRyYW5zbGF0aW9uIik7Ci0JCW1vdmVtZW50R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgeE1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeE1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl4TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJeE1vdmUuc2V0TWluaW11bSgwKTsKLQkJeE1vdmUuc2V0VGh1bWIoMik7Ci0JCXhNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXhNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJeE1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXhQb3MgPSB4TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDU7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIHlNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeU1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXlNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXlNb3ZlLnNldFRodW1iKDIpOwotCQl5TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl5TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXlNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5UG9zID0geU1vdmUuZ2V0U2VsZWN0aW9uKCkgLSA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciB6TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl6TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXpNb3ZlLnNldE1heGltdW0oMjQpOwotCQl6TW92ZS5zZXRNaW5pbXVtKDApOwotCQl6TW92ZS5zZXRUaHVtYig0KTsKLQkJek1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJek1vdmUuc2V0U2VsZWN0aW9uKDEwKTsKLQkJek1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSB6TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDMwOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRTbGVlcExlbmd0aCgpCi0JICovCi0JaW50IGdldFNsZWVwTGVuZ3RoKCkgewotCQlyZXR1cm4gU0xFRVBfTEVOR1RIOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJUZXh0dXJlIjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCS8vR0wuZ2xDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuM2YsIDEuMGYpOyAKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbENsZWFyRGVwdGgoMS4wZik7Ci0JCWludFtdIHRleHR1cmVPdXQgPSBuZXcgaW50WzFdOwotCQlHTC5nbEdlblRleHR1cmVzKDEsIHRleHR1cmVPdXQpOwotCQlsb2FkVGV4dHVyZShnZXRHbENhbnZhcygpLCBJTUFHRSwgMCwgdGV4dHVyZU91dCk7Ci0JCXRleHR1cmUgPSB0ZXh0dXJlT3V0WzBdOwotCQlHTC5nbERlcHRoRnVuYyhHTC5HTF9MRVFVQUwpOwotCQlHTC5nbFBvbHlnb25Nb2RlKEdMLkdMX0JBQ0ssIEdMLkdMX0ZJTEwpOwotCQlHTC5nbFBvbHlnb25Nb2RlKEdMLkdMX0ZST05ULCBHTC5HTF9MSU5FKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElTVF9NT0RFKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQkvLyBpbml0aWFsaXplIHBvaW50cwkKLQkJZm9yIChpbnQgeCA9IDA7IHggPCA0NTsgeCsrKSB7Ci0JCQlmb3IgKGludCB5ID0gMDsgeSA8IDQ1OyB5KyspIHsKLQkJCQlwb2ludHNbeF1beV1bMF0gPSB4IC8gNS4wZiAtIDQuNWY7Ci0JCQkJcG9pbnRzW3hdW3ldWzFdID0geSAvIDUuMGYgLSA0LjVmOwotCQkJCXBvaW50c1t4XVt5XVsyXSA9Ci0JCQkJCShmbG9hdCkgTWF0aC5zaW4oCi0JCQkJCQkoKCh4IC8gNS4wZikgKiA0MC4wZikgLyAzNjAuMGYpICogTWF0aC5QSSAqIDIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoCi0JCQlHTC5HTF9DT0xPUl9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9TVEVOQ0lMX0JVRkZFUl9CSVQpOwotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoeFBvcywgeVBvcywgelBvcyk7Ci0JCUdMLmdsUm90YXRlZih5cm90LCAwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xSb3RhdGVmKHpyb3QsIDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOwotCi0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IDQ0OyB4KyspIHsKLQkJCWZvciAoaW50IHkgPSAwOyB5IDwgNDQ7IHkrKykgewotCQkJCWZsb2F0IGZ4ID0geCAvIDQ0LjBmOwotCQkJCWZsb2F0IGZ5ID0geSAvIDQ0LjBmOwotCQkJCWZsb2F0IGZ4YiA9ICh4ICsgMSkgLyA0NC4wZjsKLQkJCQlmbG9hdCBmeWIgPSAoeSArIDEpIC8gNDQuMGY7Ci0JCQkJR0wuZ2xUZXhDb29yZDJmKGZ4LCBmeSk7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigKLQkJCQkJcG9pbnRzW3hdW3ldWzBdLAotCQkJCQlwb2ludHNbeF1beV1bMV0sCi0JCQkJCXBvaW50c1t4XVt5XVsyXSk7Ci0JCQkJR0wuZ2xUZXhDb29yZDJmKGZ4LCBmeWIpOwotCQkJCUdMLmdsVmVydGV4M2YoCi0JCQkJCXBvaW50c1t4XVt5ICsgMV1bMF0sCi0JCQkJCXBvaW50c1t4XVt5ICsgMV1bMV0sCi0JCQkJCXBvaW50c1t4XVt5ICsgMV1bMl0pOwotCQkJCUdMLmdsVGV4Q29vcmQyZihmeGIsIGZ5Yik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigKLQkJCQkJcG9pbnRzW3ggKyAxXVt5ICsgMV1bMF0sCi0JCQkJCXBvaW50c1t4ICsgMV1beSArIDFdWzFdLAotCQkJCQlwb2ludHNbeCArIDFdW3kgKyAxXVsyXSk7Ci0JCQkJR0wuZ2xUZXhDb29yZDJmKGZ4YiwgZnkpOwotCQkJCUdMLmdsVmVydGV4M2YoCi0JCQkJCXBvaW50c1t4ICsgMV1beV1bMF0sCi0JCQkJCXBvaW50c1t4ICsgMV1beV1bMV0sCi0JCQkJCXBvaW50c1t4ICsgMV1beV1bMl0pOwotCQkJfQotCQl9Ci0JCUdMLmdsRW5kKCk7Ci0JCS8vIHBlcmZvcm0gd2F2ZSBtb3Rpb24KLQkJZm9yIChpbnQgeSA9IDA7IHkgPCA0NTsgeSsrKSB7Ci0JCQlmbG9hdCBob2xkID0gcG9pbnRzWzBdW3ldWzJdOwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCA0NDsgeCsrKSB7Ci0JCQkJcG9pbnRzW3hdW3ldWzJdID0gcG9pbnRzW3ggKyAxXVt5XVsyXTsKLQkJCX0KLQkJCXBvaW50c1s0NF1beV1bMl0gPSBob2xkOwotCQl9Ci0JCXlyb3QgKz0gMC45ZjsKLQkJenJvdCArPSAwLjZmOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvVHJhbnNwYXJlbmN5VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1RyYW5zcGFyZW5jeVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDlkYjUzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvVHJhbnNwYXJlbmN5VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBUcmFuc3BhcmVuY3lUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgZmxvYXRbXSBhbHBoYXMgPSB7IDAuM2YsIDAuNWYsIDEuMGYgfTsKLQlwcml2YXRlIGludCBxdWFkcmF0aWM7Ci0JcHJpdmF0ZSBpbnQgY3VycmVudFNlbGVjdGlvbiA9IDE7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50Ci0JCUlOREVYX1RSSUFOR0xFID0gMSwgSU5ERVhfU1BIRVJFID0gMiwgSU5ERVhfRElTSyA9IDM7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gT0JKRUNUUyA9IHsiVHJpYW5nbGUiLCAiU3BoZXJlIiwgIkRpc2siIH07Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUNvbXBvc2l0ZSBvYmplY3RHcm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJb2JqZWN0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCW9iamVjdEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCW5ldyBMYWJlbChvYmplY3RHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIk9iamVjdDoiKTsKLQkJZmluYWwgQ29tYm8gb2JqZWN0Q29tYm8gPSBuZXcgQ29tYm8ob2JqZWN0R3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCW9iamVjdENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW9iamVjdENvbWJvLnNldEl0ZW1zKE9CSkVDVFMpOwotCQlvYmplY3RDb21iby5zZWxlY3QoMCk7Ci0JCQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiVHJhbnNwYXJlbmN5OiIpOwotCQlmaW5hbCBTbGlkZXIgdHJhbnNwYXJlbmN5U2xpZGVyID0gbmV3IFNsaWRlcihjb21wb3NpdGUsIFNXVC5IT1JJWk9OVEFMKTsKLQkJdHJhbnNwYXJlbmN5U2xpZGVyLnNldFZhbHVlcygwLCAwLCAxMSwgMSwgMSwgMik7Ci0JCXRyYW5zcGFyZW5jeVNsaWRlci5zZXRTZWxlY3Rpb24oNyk7Ci0JCXRyYW5zcGFyZW5jeVNsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZmxvYXQgYWxwaGEgPSB0cmFuc3BhcmVuY3lTbGlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJYWxwaGEgPSAxLjBmIC0gYWxwaGEgLyAxMDsKLQkJCQlhbHBoYXNbY3VycmVudFNlbGVjdGlvbiAtIDFdID0gYWxwaGE7Ci0JCQl9Ci0JCX0pOwotCQlvYmplY3RDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJY3VycmVudFNlbGVjdGlvbiA9IG9iamVjdENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgKyAxOwotCQkJCXRyYW5zcGFyZW5jeVNsaWRlci5zZXRTZWxlY3Rpb24oCi0JCQkJCShpbnQpICgoMS4wZiAtIGFscGhhc1tjdXJyZW50U2VsZWN0aW9uIC0gMV0pICogMTApKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMVS5nbHVEZWxldGVRdWFkcmljKHF1YWRyYXRpYyk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoSU5ERVhfRElTSywgMSk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoSU5ERVhfU1BIRVJFLCAxKTsKLQkJR0wuZ2xEZWxldGVMaXN0cyhJTkRFWF9UUklBTkdMRSwgMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0VGFiVGV4dCgpCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiVHJhbnNwYXJlbmN5IjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wuZ2xCbGVuZEZ1bmMoR0wuR0xfU1JDX0FMUEhBLCBHTC5HTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLQkJcXVhZHJhdGljID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkJR0xVLmdsdVF1YWRyaWNOb3JtYWxzKHF1YWRyYXRpYywgR0xVLkdMVV9TTU9PVEgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9DVUxMX0ZBQ0UpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQkxFTkQpOwotCQkvLyBjcmVhdGUgZGlzcGxheSBsaXN0cwkJCi0JCUdMLmdsTmV3TGlzdChJTkRFWF9TUEhFUkUsIEdMLkdMX0NPTVBJTEUpOwotCQlHTFUuZ2x1UXVhZHJpY0RyYXdTdHlsZShxdWFkcmF0aWMsIEdMVS5HTFVfRklMTCk7Ci0JCUdMVS5nbHVTcGhlcmUocXVhZHJhdGljLCAxLjUsIDMyLCAzMik7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlHTC5nbE5ld0xpc3QoSU5ERVhfRElTSywgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVRdWFkcmljRHJhd1N0eWxlKHF1YWRyYXRpYywgR0xVLkdMVV9GSUxMKTsKLQkJR0xVLmdsdURpc2socXVhZHJhdGljLCAxLjAsIDMsIDMyLCAzMik7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlHTC5nbE5ld0xpc3QoSU5ERVhfVFJJQU5HTEUsIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1RSSUFOR0xFUyk7Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMGYsIC0yLjBmLCAyLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAtMi4wZiwgMi4wZik7Ci0JCUdMLmdsRW5kKCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgU2VsZWN0aW9uVGFiLnByb2Nlc3NQaWNrIChpbnRbXSwgaW50KQotCSAqLwotCXZvaWQgcHJvY2Vzc1BpY2soaW50W10gcFNlbGVjdEJ1ZmYsIGludCBoaXRzKSB7Ci0JCWludCB6RGVwdGg7Ci0JCWludCB0ZW1wU2VsZWN0aW9uID0gcFNlbGVjdEJ1ZmZbM107Ci0JCXpEZXB0aCA9IHBTZWxlY3RCdWZmWzJdOwotCQkvLyBwaWNrIG9iamVjdCB3aXRoIGxhcmdlc3QgeiB2YWx1ZQotCQlmb3IgKGludCBpID0gNDsgaSA8PSA0ICogKGhpdHMgLSAxKTsgaSA9IGkgKyA0KSB7Ci0JCQlpZiAoekRlcHRoID4gcFNlbGVjdEJ1ZmZbaSArIDJdKSB7Ci0JCQkJekRlcHRoID0gcFNlbGVjdEJ1ZmZbaSArIDJdOwotCQkJCXRlbXBTZWxlY3Rpb24gPSBwU2VsZWN0QnVmZltpICsgM107Ci0JCQl9Ci0JCX0KLQkJaWYgKHRlbXBTZWxlY3Rpb24gPiAwKSBjdXJyZW50U2VsZWN0aW9uID0gdGVtcFNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJLy8gZHJhdyBpdGVtcyB3aXRoIHRyYW5zcGFyZW50IHF1YWxpdGllcyBpbiByZXZlcnNlIFogb3JkZXIKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCAtMTQuMGYpOwotCQlHTC5nbFB1c2hOYW1lKDApOwotCi0JCS8vIGRyYXcgZGlzawotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKC0xLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xDb2xvcjRmKDAuMGYsIDEuMGYsIDAuMGYsIGFscGhhc1syXSk7Ci0JCUdMLmdsTG9hZE5hbWUoSU5ERVhfRElTSyk7Ci0JCUdMLmdsQ2FsbExpc3QoSU5ERVhfRElTSyk7Ci0JCWlmIChjdXJyZW50U2VsZWN0aW9uID09IElOREVYX0RJU0spIHsKLQkJCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJCUdMVS5nbHVRdWFkcmljRHJhd1N0eWxlKHF1YWRyYXRpYywgR0xVLkdMVV9MSU5FKTsKLQkJCUdMVS5nbHVEaXNrKHF1YWRyYXRpYywgMC45OCwgMy4wMiwgMzIsIDMyKTsKLQkJfQotCQlHTC5nbFBvcE1hdHJpeCgpOwotCi0JCS8vIGRyYXcgdHJpYW5nbGUKLQkJR0wuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsICszLjBmKTsKLQkJR0wuZ2xMb2FkTmFtZShJTkRFWF9UUklBTkdMRSk7Ci0JCUdMLmdsQ29sb3I0ZigxLjBmLCAwLjBmLCAwLjBmLCBhbHBoYXNbMF0pOwotCQlHTC5nbENhbGxMaXN0KElOREVYX1RSSUFOR0xFKTsKLQkJR0wuZ2xQb2ludFNpemUoNS4wZik7Ci0JCWlmIChjdXJyZW50U2VsZWN0aW9uID09IElOREVYX1RSSUFOR0xFKSB7Ci0JCQlHTC5nbEJlZ2luKEdMLkdMX1BPSU5UUyk7Ci0JCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCQlHTC5nbFZlcnRleDNmKDAuMGYsIDIuMGYsIDAuMGYpOwotCQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgLTIuMGYsIDIuMGYpOwotCQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAtMi4wZiwgMi4wZik7Ci0JCQlHTC5nbEVuZCgpOwotCQl9Ci0KLQkJLy8gZHJhdyBzcGhlcmUKLQkJR0wuZ2xQdXNoTWF0cml4KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZigxLjBmLCAwLjBmLCArMy4wZik7Ci0JCUdMLmdsQ29sb3I0ZigwLjBmLCAwLjBmLCAxLjBmLCBhbHBoYXNbMV0pOwotCQlHTC5nbExvYWROYW1lKElOREVYX1NQSEVSRSk7Ci0JCUdMLmdsQ2FsbExpc3QoSU5ERVhfU1BIRVJFKTsKLQkJaWYgKGN1cnJlbnRTZWxlY3Rpb24gPT0gSU5ERVhfU1BIRVJFKSB7Ci0JCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCQlHTFUuZ2x1UXVhZHJpY0RyYXdTdHlsZShxdWFkcmF0aWMsIEdMVS5HTFVfTElORSk7Ci0JCQlHTFUuZ2x1U3BoZXJlKHF1YWRyYXRpYywgMS41MSwgOCwgOCk7Ci0JCX0KLQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9CYWxsLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0JhbGwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODkwZDI2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0JhbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvQm94LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0JveC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZWY2NjMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvQm94LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0Zsb29yLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0Zsb29yLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzNGM5Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9GbG9vci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9zcGxhc2guYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvc3BsYXNoLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjNzVkYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9zcGxhc2guYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvdW50aXRsZWQuanBnIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvdW50aXRsZWQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWQ2YWExLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL3VudGl0bGVkLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjliM2ExLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5zd3Q8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYWFhOTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2Uuc3d0c25pcHBldHMuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWUwMjEyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBTV1QgU25pcHBldHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTkwMzM5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3Quc25pcHBldHMiCi0gICBuYW1lPSIlcGx1Z2luTmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiIGV4cG9ydD0idHJ1ZSIvPgotICAgPC9yZXF1aXJlcz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhMGIxYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBleGFtcGxlIHNuaXBwZXQ6IEhlbGxvIFdvcmxkCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOGM5MGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIERyYXdpbmcgd2l0aCB0cmFuc2Zvcm1hdGlvbnMsIHBhdGhzIGFuZCBhbHBoYSBibGVuZGluZwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTAgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoIkFkdmFuY2VkIEdyYXBoaWNzIik7Ci0JCUZvbnREYXRhIGZkID0gc2hlbGwuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JCWZpbmFsIEZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZkLmdldE5hbWUoKSwgNjAsIFNXVC5CT0xEIHwgU1dULklUQUxJQyk7Ci0JCWZpbmFsIEltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDY0MCwgNDgwKTsKLQkJZmluYWwgUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCQlnYy5maWxsT3ZhbChyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwkJCQkKLQkJCQlUcmFuc2Zvcm0gdHIgPSBuZXcgVHJhbnNmb3JtKGRpc3BsYXkpOwotCQkJCXRyLnRyYW5zbGF0ZSg1MCwgMTIwKTsKLQkJCQl0ci5yb3RhdGUoLTMwKTsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCAwLCAwLCByZWN0LndpZHRoIC8gMiwgcmVjdC5oZWlnaHQgLyAyKTsKLQkJCQlnYy5zZXRBbHBoYSgxMDApOwotCQkJCWdjLnNldFRyYW5zZm9ybSh0cik7Ci0JCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGlzcGxheSk7Ci0JCQkJcGF0aC5hZGRTdHJpbmcoIlNXVCIsIDAsIDAsIGZvbnQpOwotCQkJCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLQkJCQlnYy5maWxsUGF0aChwYXRoKTsKLQkJCQlnYy5kcmF3UGF0aChwYXRoKTsKLQkJCQl0ci5kaXNwb3NlKCk7Ci0JCQkJcGF0aC5kaXNwb3NlKCk7Ci0JCQl9CQkJCi0JCX0pOwotCQlzaGVsbC5zZXRTaXplKHNoZWxsLmNvbXB1dGVTaXplKHJlY3Qud2lkdGggLyAyLCByZWN0LmhlaWdodCAvIDIpKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZmY4MGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEZvbnQgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBsYXJnZSBmb250IGZvciB1c2UgYnkgYSB0ZXh0IHdpZGdldAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwMCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcygxMCwgMTAsIDIwMCwgMjAwKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULk1VTFRJKTsKLQl0ZXh0LnNldEJvdW5kcygxMCwgMTAsIDE1MCwgMTUwKTsKLQlGb250IGluaXRpYWxGb250ID0gdGV4dC5nZXRGb250KCk7Ci0JRm9udERhdGFbXSBmb250RGF0YSA9IGluaXRpYWxGb250LmdldEZvbnREYXRhKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmb250RGF0YS5sZW5ndGg7IGkrKykgewotCQlmb250RGF0YVtpXS5zZXRIZWlnaHQoMjQpOwotCX0KLQlGb250IG5ld0ZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBmb250RGF0YSk7Ci0JdGV4dC5zZXRGb250KG5ld0ZvbnQpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCW5ld0ZvbnQuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzBlOTc2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGluc2VydCBhIHRhYmxlIGl0ZW0gKGF0IGFuIGluZGV4KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSwgMSk7Ci0JaXRlbS5zZXRUZXh0ICgiKioqIE5ldyBJdGVtICIgKyB0YWJsZS5pbmRleE9mIChpdGVtKSArICIgKioqIik7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzA1NmI2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogaW5zZXJ0IGEgdHJlZSBpdGVtIChhdCBhbiBpbmRleCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVHJlZSB0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0cmVlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSwgMSk7Ci0JVHJlZUl0ZW0gW10gaXRlbXMgPSB0cmVlLmdldEl0ZW1zICgpOwotCWludCBpbmRleCA9IDA7Ci0Jd2hpbGUgKGluZGV4IDwgaXRlbXMubGVuZ3RoICYmIGl0ZW1zIFtpbmRleF0gIT0gaXRlbSkgaW5kZXgrKzsKLQlpdGVtLnNldFRleHQgKCIqKiogTmV3IEl0ZW0gIiArIGluZGV4ICsgIiAqKioiKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTI4YzRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IHVwZGF0ZSB0YWJsZSBpdGVtIHRleHQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDMgewotCi1zdGF0aWMgY2hhciBjb250ZW50ID0gJ2EnOwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyNDApOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JdGFibGUuc2V0Qm91bmRzKDEwLCAxMCwgMTYwLCAxNjApOwotCi0JZmluYWwgVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtWzRdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpLnNldFdpZHRoKDQwKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCXBvcHVsYXRlSXRlbShpdGVtc1tpXSk7Ci0JfQotCi0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0Qm91bmRzKDEwLCAxODAsIDUwLCAzMCk7Ci0JYnV0dG9uLnNldFRleHQoIkNoYW5nZSIpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJCXBvcHVsYXRlSXRlbShpdGVtc1tpXSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBvcHVsYXRlSXRlbShUYWJsZUl0ZW0gaXRlbSkgewotCVN0cmluZyBzdHJpbmdDb250ZW50ID0gU3RyaW5nLnZhbHVlT2YoY29udGVudCk7Ci0JaXRlbS5zZXRUZXh0KAotCQluZXcgU3RyaW5nW10gewotCQkJc3RyaW5nQ29udGVudCwKLQkJCXN0cmluZ0NvbnRlbnQsCi0JCQlzdHJpbmdDb250ZW50LAotCQkJc3RyaW5nQ29udGVudCB9KTsKLQljb250ZW50Kys7Ci0JaWYgKGNvbnRlbnQgPiAneicpIGNvbnRlbnQgPSAnYSc7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRlYWQ4Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgc3BsYXNoIHNjcmVlbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBpbnQgW10gY291bnQgPSBuZXcgaW50IFtdIHs0fTsKLQlmaW5hbCBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAzMDAsIDMwMCk7Ci0JZmluYWwgU2hlbGwgc3BsYXNoID0gbmV3IFNoZWxsKFNXVC5PTl9UT1ApOwotCWZpbmFsIFByb2dyZXNzQmFyIGJhciA9IG5ldyBQcm9ncmVzc0JhcihzcGxhc2gsIFNXVC5OT05FKTsKLQliYXIuc2V0TWF4aW11bShjb3VudFswXSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoc3BsYXNoLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0SW1hZ2UoaW1hZ2UpOwotCUZvcm1MYXlvdXQgbGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKLQlzcGxhc2guc2V0TGF5b3V0KGxheW91dCk7Ci0JRm9ybURhdGEgbGFiZWxEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCWxhYmVsRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlsYWJlbERhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50ICgxMDAsIDApOwotCWxhYmVsLnNldExheW91dERhdGEobGFiZWxEYXRhKTsKLQlGb3JtRGF0YSBwcm9ncmVzc0RhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JcHJvZ3Jlc3NEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDUpOwotCXByb2dyZXNzRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAtNSk7Ci0JcHJvZ3Jlc3NEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAtNSk7Ci0JYmFyLnNldExheW91dERhdGEocHJvZ3Jlc3NEYXRhKTsKLQlzcGxhc2gucGFjaygpOwotCVJlY3RhbmdsZSBzcGxhc2hSZWN0ID0gc3BsYXNoLmdldEJvdW5kcygpOwotCVJlY3RhbmdsZSBkaXNwbGF5UmVjdCA9IGRpc3BsYXkuZ2V0Qm91bmRzKCk7Ci0JaW50IHggPSAoZGlzcGxheVJlY3Qud2lkdGggLSBzcGxhc2hSZWN0LndpZHRoKSAvIDI7Ci0JaW50IHkgPSAoZGlzcGxheVJlY3QuaGVpZ2h0IC0gc3BsYXNoUmVjdC5oZWlnaHQpIC8gMjsKLQlzcGxhc2guc2V0TG9jYXRpb24oeCwgeSk7Ci0Jc3BsYXNoLm9wZW4oKTsKLQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVNoZWxsIFtdIHNoZWxscyA9IG5ldyBTaGVsbFtjb3VudFswXV07Ci0JCQlmb3IgKGludCBpPTA7IGk8Y291bnRbMF07IGkrKykgewotCQkJCXNoZWxscyBbaV0gPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCQkJc2hlbGxzIFtpXS5zZXRTaXplICgzMDAsIDMwMCk7Ci0JCQkJc2hlbGxzIFtpXS5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQkJCS0tY291bnRbMF07Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQliYXIuc2V0U2VsZWN0aW9uKGkrMSk7Ci0JCQkJdHJ5IHtUaHJlYWQuc2xlZXAoMTAwMCk7fSBjYXRjaCAoVGhyb3dhYmxlIGUpIHt9Ci0JCQl9Ci0JCQlzcGxhc2guY2xvc2UoKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjb3VudFswXTsgaSsrKSB7Ci0JCQkJc2hlbGxzIFtpXS5vcGVuKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQl3aGlsZSAoY291bnQgWzBdICE9IDApIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzZDMyNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUHJvZ3JhbSBleGFtcGxlIHNuaXBwZXQ6IGludm9rZSBhbiBleHRlcm5hbCBiYXRjaCBmaWxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JUHJvZ3JhbS5sYXVuY2goImM6XFxjeWd3aW5cXGN5Z3dpbi5iYXQiKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhjM2FjYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBpbnNlcnQgYSB0YWJsZSBjb2x1bW4gKGF0IGFuIGluZGV4KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0IChTV1QuVkVSVElDQUwpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUgKHRydWUpOwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCAoIkNvbHVtbiAiICsgaSk7Ci0JfQotCWZpbmFsIFRhYmxlQ29sdW1uIFtdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zICgpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJZm9yIChpbnQgaj0wOyBqPGNvbHVtbnMubGVuZ3RoOyBqKyspIHsKLQkJCWl0ZW0uc2V0VGV4dCAoaiwgIkl0ZW0gIiArIGkpOwotCQl9Ci0JfQotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5zLmxlbmd0aDsgaSsrKSBjb2x1bW5zIFtpXS5wYWNrICgpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWZpbmFsIGludCBpbmRleCA9IDE7Ci0JYnV0dG9uLnNldFRleHQgKCJJbnNlcnQgQ29sdW1uICIgKyBpbmRleCArICJhIik7Ci0JYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUsIGluZGV4KTsKLQkJCWNvbHVtbi5zZXRUZXh0ICgiQ29sdW1uICIgKyBpbmRleCArICJhIik7Ci0JCQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcyAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCWl0ZW1zIFtpXS5zZXRUZXh0IChpbmRleCwgIkl0ZW0gIiArIGkgKyAiYSIpOwotCQkJfQotCQkJY29sdW1uLnBhY2sgKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjEzNjk4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0vKgotICogU2FzaCBleGFtcGxlIHNuaXBwZXQ6IGltcGxlbWVudCBhIHNpbXBsZSBzcGxpdHRlciAod2l0aCBhIDIwIHBpeGVsIGxpbWl0KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjEuc2V0VGV4dCAoIkJ1dHRvbiAxIik7Ci0JZmluYWwgU2FzaCBzYXNoID0gbmV3IFNhc2ggKHNoZWxsLCBTV1QuVkVSVElDQUwpOwotCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24yLnNldFRleHQgKCJCdXR0b24gMiIpOwotCQotCWZpbmFsIEZvcm1MYXlvdXQgZm9ybSA9IG5ldyBGb3JtTGF5b3V0ICgpOwotCXNoZWxsLnNldExheW91dCAoZm9ybSk7Ci0JCi0JRm9ybURhdGEgYnV0dG9uMURhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JYnV0dG9uMURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMCwgMCk7Ci0JYnV0dG9uMURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKHNhc2gsIDApOwotCWJ1dHRvbjFEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMCwgMCk7Ci0JYnV0dG9uMURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50ICgxMDAsIDApOwotCWJ1dHRvbjEuc2V0TGF5b3V0RGF0YSAoYnV0dG9uMURhdGEpOwotCi0JZmluYWwgaW50IGxpbWl0ID0gMjAsIHBlcmNlbnQgPSA1MDsKLQlmaW5hbCBGb3JtRGF0YSBzYXNoRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlzYXNoRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50IChwZXJjZW50LCAwKTsKLQlzYXNoRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCXNhc2hEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlzYXNoLnNldExheW91dERhdGEgKHNhc2hEYXRhKTsKLQlzYXNoLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJUmVjdGFuZ2xlIHNhc2hSZWN0ID0gc2FzaC5nZXRCb3VuZHMgKCk7Ci0JCQlSZWN0YW5nbGUgc2hlbGxSZWN0ID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCWludCByaWdodCA9IHNoZWxsUmVjdC53aWR0aCAtIHNhc2hSZWN0LndpZHRoIC0gbGltaXQ7Ci0JCQllLnggPSBNYXRoLm1heCAoTWF0aC5taW4gKGUueCwgcmlnaHQpLCBsaW1pdCk7Ci0JCQlpZiAoZS54ICE9IHNhc2hSZWN0LngpICB7Ci0JCQkJc2FzaERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMCwgZS54KTsKLQkJCQlzaGVsbC5sYXlvdXQgKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlGb3JtRGF0YSBidXR0b24yRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlidXR0b24yRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50IChzYXNoLCAwKTsKLQlidXR0b24yRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlidXR0b24yRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCWJ1dHRvbjJEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlidXR0b24yLnNldExheW91dERhdGEgKGJ1dHRvbjJEYXRhKTsKLQkKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMmJjMzIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJ1dHRvbiBleGFtcGxlIHNuaXBwZXQ6IHNldCB0aGUgZGVmYXVsdCBidXR0b24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQgKCJFbnRlciB5b3VyIG5hbWU6Iik7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldExheW91dERhdGEgKG5ldyBSb3dEYXRhICgxMDAsIFNXVC5ERUZBVUxUKSk7Ci0JQnV0dG9uIG9rID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlvay5zZXRUZXh0ICgiT2siKTsKLQlCdXR0b24gY2FuY2VsID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQljYW5jZWwuc2V0VGV4dCAoIkNhbmNlbCIpOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24gKGNhbmNlbCk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiMjViYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNhc2hGb3JtIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgc2FzaCBmb3JtIHdpdGggdGhyZWUgY2hpbGRyZW4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwOSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLQlTYXNoRm9ybSBmb3JtID0gbmV3IFNhc2hGb3JtKHNoZWxsLFNXVC5IT1JJWk9OVEFMKTsKLQlmb3JtLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkKLQlDb21wb3NpdGUgY2hpbGQxID0gbmV3IENvbXBvc2l0ZShmb3JtLFNXVC5OT05FKTsKLQljaGlsZDEuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCW5ldyBMYWJlbChjaGlsZDEsU1dULk5PTkUpLnNldFRleHQoIkxhYmVsIGluIHBhbmUgMSIpOwotCQotCUNvbXBvc2l0ZSBjaGlsZDIgPSBuZXcgQ29tcG9zaXRlKGZvcm0sU1dULk5PTkUpOwotCWNoaWxkMi5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JbmV3IEJ1dHRvbihjaGlsZDIsU1dULlBVU0gpLnNldFRleHQoIkJ1dHRvbiBpbiBwYW5lMiIpOwotCi0JQ29tcG9zaXRlIGNoaWxkMyA9IG5ldyBDb21wb3NpdGUoZm9ybSxTV1QuTk9ORSk7Ci0JY2hpbGQzLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQluZXcgTGFiZWwoY2hpbGQzLFNXVC5QVVNIKS5zZXRUZXh0KCJMYWJlbCBpbiBwYW5lMyIpOwotCQotCWZvcm0uc2V0V2VpZ2h0cyhuZXcgaW50W10gezMwLDQwLDMwfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ2YzAwMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHNldCB0aGUgc2VsZWN0aW9uIChpLWJlYW0pCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQl0ZXh0LnNldEJvdW5kcyAoMTAsIDEwLCAxMDAsIDEwMCk7Ci0JZm9yIChpbnQgaT0wOyBpPDE2OyBpKyspIHsKLQkJdGV4dC5hcHBlbmQgKCJMaW5lICIgKyBpICsgIlxuIik7Ci0JfQotCXNoZWxsLm9wZW4gKCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24gKDMwKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKHRleHQuZ2V0Q2FyZXRMb2NhdGlvbiAoKSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkYTBjMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBmaW5kIGEgdGFibGUgY2VsbCBmcm9tIG1vdXNlIGRvd24gKHdvcmtzIGZvciBhbnkgdGFibGUgc3R5bGUpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTEwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSAodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlICh0cnVlKTsKLQlmaW5hbCBpbnQgcm93Q291bnQgPSA2NCwgY29sdW1uQ291bnQgPSA0OwotCWZvciAoaW50IGk9MDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCAoIkNvbHVtbiAiICsgaSk7Ci0JfQotCWZvciAoaW50IGk9MDsgaSA8IHJvd0NvdW50OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlmb3IgKGludCBqPTA7IGogPCBjb2x1bW5Db3VudDsgaisrKSB7Ci0JCQlpdGVtLnNldFRleHQgKGosICJJdGVtICIgKyBpICsgIi0iICsgaik7Ci0JCX0KLQl9Ci0JZm9yIChpbnQgaT0wOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQl0YWJsZS5nZXRDb2x1bW4gKGkpLnBhY2sgKCk7Ci0JfQotCVBvaW50IHNpemUgPSB0YWJsZS5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIDIwMCk7Ci0JdGFibGUuc2V0U2l6ZSAoc2l6ZSk7Ci0Jc2hlbGwucGFjayAoKTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHRhYmxlLmdldENsaWVudEFyZWEgKCk7Ci0JCQlQb2ludCBwdCA9IG5ldyBQb2ludCAoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQlpbnQgaW5kZXggPSB0YWJsZS5nZXRUb3BJbmRleCAoKTsKLQkJCXdoaWxlIChpbmRleCA8IHRhYmxlLmdldEl0ZW1Db3VudCAoKSkgewotCQkJCWJvb2xlYW4gdmlzaWJsZSA9IGZhbHNlOwotCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoaW5kZXgpOwotCQkJCWZvciAoaW50IGk9MDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyAoaSk7Ci0JCQkJCWlmIChyZWN0LmNvbnRhaW5zIChwdCkpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkl0ZW0gIiArIGluZGV4ICsgIi0iICsgaSk7Ci0JCQkJCX0KLQkJCQkJaWYgKCF2aXNpYmxlICYmIHJlY3QuaW50ZXJzZWN0cyAoY2xpZW50QXJlYSkpIHsKLQkJCQkJCXZpc2libGUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghdmlzaWJsZSkgcmV0dXJuOwotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y3ZTU5Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyZWVFZGl0b3IgZXhhbXBsZSBzbmlwcGV0OiBlZGl0IHRoZSB0ZXh0IG9mIGEgdHJlZSBpdGVtIChpbiBwbGFjZSwgZmFuY3kpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBDb2xvciBibGFjayA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTEFDSyk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaT0wOyBpPDE2OyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbUkgPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbUkuc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCQlmb3IgKGludCBqPTA7IGo8MTY7IGorKykgewotCQkJVHJlZUl0ZW0gaXRlbUogPSBuZXcgVHJlZUl0ZW0gKGl0ZW1JLCBTV1QuTk9ORSk7Ci0JCQlpdGVtSi5zZXRUZXh0ICgiSXRlbSAiICsgaik7Ci0JCX0KLQl9Ci0JZmluYWwgVHJlZUl0ZW0gW10gbGFzdEl0ZW0gPSBuZXcgVHJlZUl0ZW0gWzFdOwotCWZpbmFsIFRyZWVFZGl0b3IgZWRpdG9yID0gbmV3IFRyZWVFZGl0b3IgKHRyZWUpOwotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJZmluYWwgVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCWlmIChpdGVtICE9IG51bGwgJiYgaXRlbSA9PSBsYXN0SXRlbSBbMF0pIHsKLQkJCQlib29sZWFuIGlzQ2FyYm9uID0gU1dULmdldFBsYXRmb3JtICgpLmVxdWFscyAoImNhcmJvbiIpOwotCQkJCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlICh0cmVlLCBTV1QuTk9ORSk7Ci0JCQkJaWYgKCFpc0NhcmJvbikgY29tcG9zaXRlLnNldEJhY2tncm91bmQgKGJsYWNrKTsKLQkJCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJZmluYWwgaW50IGluc2V0ID0gaXNDYXJib24gPyAwIDogMTsKLQkJCQljb21wb3NpdGUuYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhICgpOwotCQkJCQkJdGV4dC5zZXRCb3VuZHMgKHJlY3QueCArIGluc2V0LCByZWN0LnkgKyBpbnNldCwgcmVjdC53aWR0aCAtIGluc2V0ICogMiwgcmVjdC5oZWlnaHQgLSBpbnNldCAqIDIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJTGlzdGVuZXIgdGV4dExpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKGZpbmFsIEV2ZW50IGUpIHsKLQkJCQkJCXN3aXRjaCAoZS50eXBlKSB7Ci0JCQkJCQkJY2FzZSBTV1QuRm9jdXNPdXQ6Ci0JCQkJCQkJCWl0ZW0uc2V0VGV4dCAodGV4dC5nZXRUZXh0ICgpKTsKLQkJCQkJCQkJY29tcG9zaXRlLmRpc3Bvc2UgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgU1dULlZlcmlmeToKLQkJCQkJCQkJU3RyaW5nIG5ld1RleHQgPSB0ZXh0LmdldFRleHQgKCk7Ci0JCQkJCQkJCVN0cmluZyBsZWZ0VGV4dCA9IG5ld1RleHQuc3Vic3RyaW5nICgwLCBlLnN0YXJ0KTsKLQkJCQkJCQkJU3RyaW5nIHJpZ2h0VGV4dCA9IG5ld1RleHQuc3Vic3RyaW5nIChlLmVuZCwgbmV3VGV4dC5sZW5ndGggKCkpOwotCQkJCQkJCQlHQyBnYyA9IG5ldyBHQyAodGV4dCk7Ci0JCQkJCQkJCVBvaW50IHNpemUgPSBnYy50ZXh0RXh0ZW50IChsZWZ0VGV4dCArIGUudGV4dCArIHJpZ2h0VGV4dCk7Ci0JCQkJCQkJCWdjLmRpc3Bvc2UgKCk7Ci0JCQkJCQkJCXNpemUgPSB0ZXh0LmNvbXB1dGVTaXplIChzaXplLngsIFNXVC5ERUZBVUxUKTsKLQkJCQkJCQkJZWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJCQkJCQkJUmVjdGFuZ2xlIGl0ZW1SZWN0ID0gaXRlbS5nZXRCb3VuZHMgKCksIHJlY3QgPSB0cmVlLmdldENsaWVudEFyZWEgKCk7Ci0JCQkJCQkJCWVkaXRvci5taW5pbXVtV2lkdGggPSBNYXRoLm1heCAoc2l6ZS54LCBpdGVtUmVjdC53aWR0aCkgKyBpbnNldCAqIDI7Ci0JCQkJCQkJCWludCBsZWZ0ID0gaXRlbVJlY3QueCwgcmlnaHQgPSByZWN0LnggKyByZWN0LndpZHRoOwotCQkJCQkJCQllZGl0b3IubWluaW11bVdpZHRoID0gTWF0aC5taW4gKGVkaXRvci5taW5pbXVtV2lkdGgsIHJpZ2h0IC0gbGVmdCk7Ci0JCQkJCQkJCWVkaXRvci5taW5pbXVtSGVpZ2h0ID0gc2l6ZS55ICsgaW5zZXQgKiAyOwotCQkJCQkJCQllZGl0b3IubGF5b3V0ICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFNXVC5UcmF2ZXJzZToKLQkJCQkJCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOgotCQkJCQkJCQkJCWl0ZW0uc2V0VGV4dCAodGV4dC5nZXRUZXh0ICgpKTsKLQkJCQkJCQkJCQkvL0ZBTEwgVEhST1VHSAotCQkJCQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfRVNDQVBFOgotCQkJCQkJCQkJCWNvbXBvc2l0ZS5kaXNwb3NlICgpOwotCQkJCQkJCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQkJCQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuRm9jdXNPdXQsIHRleHRMaXN0ZW5lcik7Ci0JCQkJdGV4dC5hZGRMaXN0ZW5lciAoU1dULlRyYXZlcnNlLCB0ZXh0TGlzdGVuZXIpOwotCQkJCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5WZXJpZnksIHRleHRMaXN0ZW5lcik7Ci0JCQkJZWRpdG9yLnNldEVkaXRvciAoY29tcG9zaXRlLCBpdGVtKTsKLQkJCQl0ZXh0LnNldFRleHQgKGl0ZW0uZ2V0VGV4dCAoKSk7Ci0JCQkJdGV4dC5zZWxlY3RBbGwgKCk7Ci0JCQkJdGV4dC5zZXRGb2N1cyAoKTsKLQkJCX0KLQkJCWxhc3RJdGVtIFswXSA9IGl0ZW07Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzZlMzk4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBJbWFnZSBleGFtcGxlIHNuaXBwZXQ6IGRpc3BsYXkgYW4gaW1hZ2UgaW4gYSBncm91cAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTEyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDIwLCAyMCk7Ci0JQ29sb3IgY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGNvbG9yKTsKLQlnYy5maWxsUmVjdGFuZ2xlIChpbWFnZS5nZXRCb3VuZHMgKCkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JY29sb3IuZGlzcG9zZSAoKTsKLQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlHcm91cCBncm91cCA9IG5ldyBHcm91cCAoc2hlbGwsIFNXVC5OT05FKTsKLQlncm91cC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlncm91cC5zZXRUZXh0ICgiYSBzcXVhcmUiKTsKLQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyAoZ3JvdXAsIFNXVC5OT05FKTsKLQljYW52YXMuYWRkUGFpbnRMaXN0ZW5lciAobmV3IFBhaW50TGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2wgKFBhaW50RXZlbnQgZSkgewotCQkJZS5nYy5kcmF3SW1hZ2UgKGltYWdlLCAwLCAwKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKQotCQkJZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YmEzNGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBhIHNlbGVjdGlvbiBvciBjaGVjayBldmVudCBpbiBhIHRhYmxlIChTV1QuQ0hFQ0spCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTEzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkNIRUNLIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdGFibGUuc2V0U2l6ZSAoMTAwLCAxMDApOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBldmVudC5kZXRhaWwgPT0gU1dULkNIRUNLID8gIkNoZWNrZWQiIDogIlNlbGVjdGVkIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoZXZlbnQuaXRlbSArICIgIiArIHN0cmluZyk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzZmYzYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogZGV0ZWN0IGEgc2VsZWN0aW9uIG9yIGNoZWNrIGV2ZW50IGluIGEgdHJlZSAoU1dULkNIRUNLKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExNCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5DSEVDSyB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXRyZWUuc2V0U2l6ZSAoMTAwLCAxMDApOwotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJU3RyaW5nIHN0cmluZyA9IGV2ZW50LmRldGFpbCA9PSBTV1QuQ0hFQ0sgPyAiQ2hlY2tlZCIgOiAiU2VsZWN0ZWQiOwotCQkJU3lzdGVtLm91dC5wcmludGxuIChldmVudC5pdGVtICsgIiAiICsgc3RyaW5nKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkMjI0NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29tcG9zaXRlIGV4YW1wbGUgc25pcHBldDogZm9yY2UgcmFkaW8gYmVoYXZpb3Igb24gdHdvIGRpZmZlcmVudCBjb21wb3NpdGVzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExNSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKFNXVC5WRVJUSUNBTCkpOwotCUNvbXBvc2l0ZSBjMSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk5PX1JBRElPX0dST1VQKTsKLQljMS5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUNvbXBvc2l0ZSBjMiA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk5PX1JBRElPX0dST1VQKTsKLQljMi5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCWZpbmFsIENvbXBvc2l0ZSBbXSBjb21wb3NpdGVzID0gbmV3IENvbXBvc2l0ZSBbXSB7YzEsIGMyfTsKLQlMaXN0ZW5lciByYWRpb0dyb3VwID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y29tcG9zaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjb21wb3NpdGVzIFtpXTsKLQkJCQlDb250cm9sIFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuICgpOwotCQkJCWZvciAoaW50IGo9MDsgajxjaGlsZHJlbi5sZW5ndGg7IGorKykgewotCQkJCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW4gW2pdOwotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBCdXR0b24pIHsKLQkJCQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBjaGlsZDsKLQkJCQkJCWlmICgoYnV0dG9uLmdldFN0eWxlICgpICYgU1dULlJBRElPKSAhPSAwKSBidXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJYnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCX0KLQl9OwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUkFESU8pOwotCQlidXR0b24uc2V0VGV4dCAoIkJ1dHRvbiAiICsgaSk7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgcmFkaW9Hcm91cCk7Ci0JfQotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGMyLCBTV1QuUkFESU8pOwotCQlidXR0b24uc2V0VGV4dCAoIkJ1dHRvbiAiICsgKGkgKyA0KSk7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgcmFkaW9Hcm91cCk7Ci0JfQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOTVlZjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBzdG9wIENSIGZyb20gZ29pbmcgdG8gdGhlIGRlZmF1bHQgYnV0dG9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTYgIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JdGV4dC5zZXRUZXh0KCJIZXJlIGlzIHNvbWUgdGV4dCIpOwotCXRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRleHQgZGVmYXVsdCBzZWxlY3RlZCAob3ZlcnJpZGVzIGRlZmF1bHQgYnV0dG9uKSIpOwotCQl9Ci0JfSk7Ci0JdGV4dC5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCWUuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJPayIpOwotCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJCdXR0b24gc2VsZWN0ZWQiKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MzhmYzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBhZGQgYSBzZWxlY3QgYWxsIG1lbnUgaXRlbSB0byB0aGUgY29udHJvbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTcgIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUZXh0IHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0gICAgCi0JTWVudSBiYXIgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIgKGJhcik7Ci0JTWVudUl0ZW0gZWRpdEl0ZW0gPSBuZXcgTWVudUl0ZW0gKGJhciwgU1dULkNBU0NBREUpOwotCWVkaXRJdGVtLnNldFRleHQgKCJFZGl0Iik7Ci0JTWVudSBzdWJtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQllZGl0SXRlbS5zZXRNZW51IChzdWJtZW51KTsKLQotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKHN1Ym1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJdC5zZWxlY3RBbGwoKTsKLQkJfQotCX0pOwotCWl0ZW0uc2V0VGV4dCAoIlNlbGVjdCAmQWxsXHRDdHJsK0EiKTsKLQlpdGVtLnNldEFjY2VsZXJhdG9yIChTV1QuQ1RSTCArICdBJyk7Ci0JCi0JLy8gTm90ZSB0aGF0IGFzIGxvbmcgYXMgeW91ciBhcHBsaWNhdGlvbiBoYXMgbm90IG92ZXJyaWRkZW4gCi0JLy8gdGhlIGdsb2JhbCBhY2NlbGVyYXRvcnMgZm9yIGNvcHksIHBhc3RlLCBhbmQgY3V0IAotCS8vKENUUkwrQyBvciBDVFJMK0lOU0VSVCwgQ1RSTCtWIG9yIFNISUZUK0lOU0VSVCwgYW5kIENUUkwrWCBvciBTSElGVCtERUxFVEUpCi0JLy8gdGhlc2UgYmVoYXZpb3VycyBhcmUgYWxyZWFkeSBhdmFpbGFibGUgYnkgZGVmYXVsdC4KLQkvLyBJZiB5b3VyIGFwcGxpY2F0aW9uIG92ZXJyaWRlcyB0aGVzZSBhY2NlbGVyYXRvcnMsCi0JLy8geW91IHdpbGwgbmVlZCB0byBjYWxsIFRleHQuY29weSgpLCBUZXh0LnBhc3RlKCkgYW5kIFRleHQuY3V0KCkKLQkvLyBmcm9tIHRoZSBTZWxlY3Rpb24gY2FsbGJhY2sgZm9yIHRoZSBhY2NlbGVyYXRvciB3aGVuIHRoZSAKLQkvLyB0ZXh0IHdpZGdldCBoYXMgZm9jdXMuCi0KLQlzaGVsbC5zZXRTaXplKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU2NTBjOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIEN1cnNvciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGNvbG9yIGN1cnNvciBmcm9tIGFuIGltYWdlIGZpbGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExOCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0U2l6ZSgxNTAsIDE1MCk7Ci0JZmluYWwgQ3Vyc29yW10gY3Vyc29yID0gbmV3IEN1cnNvclsxXTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJDaGFuZ2UgY3Vyc29yIik7Ci0JUG9pbnQgc2l6ZSA9IGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCWJ1dHRvbi5zZXRTaXplKHNpemUpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwpOwotCQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsiKi5pY28iLCAiKi5naWYiLCAiKi4qIn0pOwotCQkJU3RyaW5nIG5hbWUgPSBkaWFsb2cub3BlbigpOwotCQkJaWYgKG5hbWUgPT0gbnVsbCkgcmV0dXJuOwotCQkJSW1hZ2VEYXRhIGltYWdlID0gbmV3IEltYWdlRGF0YShuYW1lKTsKLQkJCUN1cnNvciBvbGRDdXJzb3IgPSBjdXJzb3JbMF07Ci0JCQljdXJzb3JbMF0gPSBuZXcgQ3Vyc29yKGRpc3BsYXksIGltYWdlLCAwLCAwKTsKLQkJCXNoZWxsLnNldEN1cnNvcihjdXJzb3JbMF0pOwotCQkJaWYgKG9sZEN1cnNvciAhPSBudWxsKSBvbGRDdXJzb3IuZGlzcG9zZSgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JaWYgKGN1cnNvclswXSAhPSBudWxsKSBjdXJzb3JbMF0uZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2Y3OTM5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIEN1cnNvciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGNvbG9yIGN1cnNvciBmcm9tIGEgc291cmNlIGFuZCBhIG1hc2sKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTkgewotCi1zdGF0aWMgYnl0ZVtdIHNyY0RhdGEgPSB7Ci0JKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwKLQkoYnl0ZSkweDExLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAxLCAoYnl0ZSkweDExLCAKLQkoYnl0ZSkweDExLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDIyLCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDMzLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDExLAotCShieXRlKTB4MTAsIChieXRlKTB4MDIsIChieXRlKTB4MjIsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MzMsIChieXRlKTB4MzAsIChieXRlKTB4MDEsCi0JKGJ5dGUpMHgxMCwgKGJ5dGUpMHgyMiwgKGJ5dGUpMHgyMiwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgzMywgKGJ5dGUpMHgzMywgKGJ5dGUpMHgwMSwKLQkoYnl0ZSkweDEwLCAoYnl0ZSkweDIyLCAoYnl0ZSkweDIyLCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDMzLCAoYnl0ZSkweDMzLCAoYnl0ZSkweDAxLAotCShieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsCi0JKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMCwKLQkoYnl0ZSkweDAxLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDEwLAotCShieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsCi0JKGJ5dGUpMHgxMCwgKGJ5dGUpMHg0NCwgKGJ5dGUpMHg0NCwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHg1NSwgKGJ5dGUpMHg1NSwgKGJ5dGUpMHgwMSwKLQkoYnl0ZSkweDEwLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDU1LCAoYnl0ZSkweDU1LCAoYnl0ZSkweDAxLAotCShieXRlKTB4MTAsIChieXRlKTB4MDQsIChieXRlKTB4NDQsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4NTUsIChieXRlKTB4NTAsIChieXRlKTB4MDEsCi0JKGJ5dGUpMHgxMSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg0NCwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHg1NSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgxMSwKLQkoYnl0ZSkweDExLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAxLCAoYnl0ZSkweDExLAotCShieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MTEsCi19OwotCi1zdGF0aWMgYnl0ZVtdIG1za0RhdGEgPSB7Ci0JKGJ5dGUpMHgwMywgKGJ5dGUpMHhjMCwgCi0JKGJ5dGUpMHgxZiwgKGJ5dGUpMHhmOCwKLQkoYnl0ZSkweDNmLCAoYnl0ZSkweGZjLAotCShieXRlKTB4N2YsIChieXRlKTB4ZmUsCi0JKGJ5dGUpMHg3ZiwgKGJ5dGUpMHhmZSwKLQkoYnl0ZSkweDdmLCAoYnl0ZSkweGZlLAotCShieXRlKTB4ZmYsIChieXRlKTB4ZmYsCi0JKGJ5dGUpMHhmZSwgKGJ5dGUpMHg3ZiwKLQkoYnl0ZSkweGZlLCAoYnl0ZSkweDdmLAotCShieXRlKTB4ZmYsIChieXRlKTB4ZmYsCi0JKGJ5dGUpMHg3ZiwgKGJ5dGUpMHhmZSwKLQkoYnl0ZSkweDdmLCAoYnl0ZSkweGZlLAotCShieXRlKTB4N2YsIChieXRlKTB4ZmUsCi0JKGJ5dGUpMHgzZiwgKGJ5dGUpMHhmYywKLQkoYnl0ZSkweDFmLCAoYnl0ZSkweGY4LAotCShieXRlKTB4MDMsIChieXRlKTB4YzAKLX07Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGJsYWNrID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMQUNLKTsKLQlDb2xvciB5ZWxsb3cgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfWUVMTE9XKTsKLQlDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQlDb2xvciBncmVlbiA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9HUkVFTik7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTFVFKTsKLQkKLQkvL0NyZWF0ZSBhIHNvdXJjZSBJbWFnZURhdGEgb2YgZGVwdGggNAotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKG5ldyBSR0JbXSB7Ci0JCWJsYWNrLmdldFJHQigpLCB3aGl0ZS5nZXRSR0IoKSwgeWVsbG93LmdldFJHQigpLCAKLQkJcmVkLmdldFJHQigpLCBibHVlLmdldFJHQigpLCBncmVlbi5nZXRSR0IoKX0pOwotCUltYWdlRGF0YSBzb3VyY2VEYXRhID0gbmV3IEltYWdlRGF0YSAoMTYsIDE2LCA0LCBwYWxldHRlLCAxLCBzcmNEYXRhKTsKLQkKLQkvL0NyZWF0ZSBhIG1hc2sgSW1hZ2VEYXRhIG9mIGRlcHRoIDEgKG1vbm9jaHJvbWUpCi0JcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YSAobmV3IFJHQiBbXSB7YmxhY2suZ2V0UkdCKCksIHdoaXRlLmdldFJHQigpLH0pOwotCUltYWdlRGF0YSBtYXNrRGF0YSA9IG5ldyBJbWFnZURhdGEgKDE2LCAxNiwgMSwgcGFsZXR0ZSwgMSwgbXNrRGF0YSk7Ci0KLQkvL1NldCBtYXNrCi0Jc291cmNlRGF0YS5tYXNrRGF0YSA9IG1hc2tEYXRhLmRhdGE7Ci0Jc291cmNlRGF0YS5tYXNrUGFkID0gbWFza0RhdGEuc2NhbmxpbmVQYWQ7Ci0KLQkvL0NyZWF0ZSBjdXJzb3IKLQlDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBzb3VyY2VEYXRhLCAxMCwgMTApOwotCi0JLy9SZW1vdmUgbWFzayB0byBkcmF3IHRoZW0gc2VwYXJhdGVseSBqdXN0IHRvIHNob3cgd2hhdCB0aGV5IGxvb2sgbGlrZQotCXNvdXJjZURhdGEubWFza0RhdGEgPSBudWxsOwotCXNvdXJjZURhdGEubWFza1BhZCA9IC0xOwotCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgSW1hZ2Ugc291cmNlID0gbmV3IEltYWdlIChkaXNwbGF5LHNvdXJjZURhdGEpOwotCWZpbmFsIEltYWdlIG1hc2sgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIG1hc2tEYXRhKTsKLQlzaGVsbC5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQlHQyBnYyA9IGUuZ2M7Ci0JCQlpbnQgeCA9IDEwLCB5ID0gMTA7Ci0JCQlTdHJpbmcgc3RyaW5nU291cmNlID0gInNvdXJjZTogIjsKLQkJCVN0cmluZyBzdHJpbmdNYXNrID0gIm1hc2s6ICI7Ci0JCQlnYy5kcmF3U3RyaW5nKHN0cmluZ1NvdXJjZSwgeCwgeSk7Ci0JCQlnYy5kcmF3U3RyaW5nKHN0cmluZ01hc2ssIHgsIHkgKyAzMCk7Ci0JCQl4ICs9IE1hdGgubWF4KGdjLnN0cmluZ0V4dGVudChzdHJpbmdTb3VyY2UpLngsIGdjLnN0cmluZ0V4dGVudChzdHJpbmdNYXNrKS54KTsKLQkJCWdjLmRyYXdJbWFnZShzb3VyY2UsIHgsIHkpOwotCQkJZ2MuZHJhd0ltYWdlKG1hc2ssIHgsIHkgKyAzMCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDE1MCwgMTUwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jc2hlbGwuc2V0Q3Vyc29yKGN1cnNvcik7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQljdXJzb3IuZGlzcG9zZSgpOwotCXNvdXJjZS5kaXNwb3NlKCk7Ci0JbWFzay5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjQxZmEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUZXh0IGV4YW1wbGUgc25pcHBldDogc2V0IHRoZSBzZWxlY3Rpb24gKHN0YXJ0LCBlbmQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQl0ZXh0LnNldEJvdW5kcyAoMTAsIDEwLCAxMDAsIDEwMCk7Ci0JZm9yIChpbnQgaT0wOyBpPDE2OyBpKyspIHsKLQkJdGV4dC5hcHBlbmQgKCJMaW5lICIgKyBpICsgIlxuIik7Ci0JfQotCXNoZWxsLm9wZW4gKCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24gKDMwLCAzOCk7Ci0JU3lzdGVtLm91dC5wcmludGxuICh0ZXh0LmdldENhcmV0TG9jYXRpb24gKCkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19IAotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjA3MGNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogTW9uaXRvciBleGFtcGxlIHNuaXBwZXQ6IGNlbnRlciBhIHNoZWxsIG9uIHRoZSBwcmltYXJ5IG1vbml0b3IKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyMCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0JTW9uaXRvciBwcmltYXJ5ID0gZGlzcGxheS5nZXRQcmltYXJ5TW9uaXRvciAoKTsKLQlSZWN0YW5nbGUgYm91bmRzID0gcHJpbWFyeS5nZXRCb3VuZHMgKCk7Ci0JUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRCb3VuZHMgKCk7Ci0JaW50IHggPSBib3VuZHMueCArIChib3VuZHMud2lkdGggLSByZWN0LndpZHRoKSAvIDI7Ci0JaW50IHkgPSBib3VuZHMueSArIChib3VuZHMuaGVpZ2h0IC0gcmVjdC5oZWlnaHQpIC8gMjsKLQlzaGVsbC5zZXRMb2NhdGlvbiAoeCwgeSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTAxNmEwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHByb21wdCBmb3IgYSBwYXNzd29yZCAoc2V0IHRoZSBlY2hvIGNoYXJhY3RlcikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTIxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCXRleHQuc2V0RWNob0NoYXIgKCcqJyk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWZiZDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENsaXBib2FyZCBleGFtcGxlIHNuaXBwZXQ6IGVuYWJsZS9kaXNhYmxlIG1lbnUgZGVwZW5kaW5nIG9uIGNsaXBib2FyZCBjb250ZW50IGF2YWlsYWJpbGl0eQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTIyIHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIENsaXBib2FyZCBjYiA9IG5ldyBDbGlwYm9hcmQoZGlzcGxheSk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULldSQVApOwotCU1lbnUgbWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuUE9QX1VQKTsKLQlmaW5hbCBNZW51SXRlbSBjb3B5SXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7Ci0JY29weUl0ZW0uc2V0VGV4dCgiQ29weSIpOwotCWNvcHlJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBzZWxlY3Rpb24gPSB0ZXh0LmdldFNlbGVjdGlvblRleHQoKTsKLQkJCWlmIChzZWxlY3Rpb24ubGVuZ3RoKCkgPT0gMCkgcmV0dXJuOwotCQkJT2JqZWN0W10gZGF0YSA9IG5ldyBPYmplY3RbXXtzZWxlY3Rpb259OwotCQkJVHJhbnNmZXJbXSB0eXBlcyA9IG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX07Ci0JCQljYi5zZXRDb250ZW50cyhkYXRhLCB0eXBlcyk7Ci0JCX0KLQl9KTsKLQlmaW5hbCBNZW51SXRlbSBwYXN0ZUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCXBhc3RlSXRlbS5zZXRUZXh0ICgiUGFzdGUiKTsKLQlwYXN0ZUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKXsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpKGNiLmdldENvbnRlbnRzKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKSk7Ci0JCQlpZiAoc3RyaW5nICE9IG51bGwpIHRleHQuaW5zZXJ0KHN0cmluZyk7Ci0JCX0KLQl9KTsKLQltZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotCQkJLy8gaXMgY29weSB2YWxpZD8KLQkJCVN0cmluZyBzZWxlY3Rpb24gPSB0ZXh0LmdldFNlbGVjdGlvblRleHQoKTsKLQkJCWNvcHlJdGVtLnNldEVuYWJsZWQoc2VsZWN0aW9uLmxlbmd0aCgpID4gMCk7Ci0JCQkvLyBpcyBwYXN0ZSB2YWxpZD8KLQkJCVRyYW5zZmVyRGF0YVtdIGF2YWlsYWJsZSA9IGNiLmdldEF2YWlsYWJsZVR5cGVzKCk7Ci0JCQlib29sZWFuIGVuYWJsZWQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXZhaWxhYmxlLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShhdmFpbGFibGVbaV0pKSB7Ci0JCQkJCWVuYWJsZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlwYXN0ZUl0ZW0uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotCX0pOwotCXRleHQuc2V0TWVudSAobWVudSk7Ci0KLQlzaGVsbC5zZXRTaXplKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQljYi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NjZkZjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogT0xFIGFuZCBBY3RpdmVYIGV4YW1wbGUgc25pcHBldDogZ2V0IGV2ZW50cyBmcm9tIElFIGNvbnRyb2wKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JT2xlQ29udHJvbFNpdGUgY29udHJvbFNpdGU7Ci0JdHJ5IHsKLQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29udHJvbFNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiU2hlbGwuRXhwbG9yZXIiKTsKLQkJY29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJcmV0dXJuOwotCX0KLQlzaGVsbC5vcGVuKCk7Ci0JCi0JLy8gSVdlYkJyb3dzZXIKLQlmaW5hbCBPbGVBdXRvbWF0aW9uIHdlYkJyb3dzZXIgPSBuZXcgT2xlQXV0b21hdGlvbihjb250cm9sU2l0ZSk7Ci0KLQkvLyBXaGVuIGEgbmV3IGRvY3VtZW50IGlzIGxvYWRlZCwgYWNjZXNzIHRoZSBkb2N1bWVudCBvYmplY3QgZm9yIHRoZSBuZXcgcGFnZS4KLQlpbnQgRG93bmxvYWRDb21wbGV0ZSA9IDEwNDsKLQljb250cm9sU2l0ZS5hZGRFdmVudExpc3RlbmVyKERvd25sb2FkQ29tcGxldGUsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCWludFtdIGh0bWxEb2N1bWVudElEID0gd2ViQnJvd3Nlci5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiRG9jdW1lbnQifSk7IAotCQkJaWYgKGh0bWxEb2N1bWVudElEID09IG51bGwpIHJldHVybjsKLQkJCVZhcmlhbnQgcFZhclJlc3VsdCA9IHdlYkJyb3dzZXIuZ2V0UHJvcGVydHkoaHRtbERvY3VtZW50SURbMF0pOwotCQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSA9PSAwKSByZXR1cm47Ci0JCQkvL0lIVE1MRG9jdW1lbnQyCi0JCQlPbGVBdXRvbWF0aW9uIGh0bWxEb2N1bWVudCA9IHBWYXJSZXN1bHQuZ2V0QXV0b21hdGlvbigpOwotCi0JCQkvLyBSZXF1ZXN0IHRvIGJlIG5vdGlmaWVkIG9mIGNsaWNrLCBkb3VibGUgY2xpY2sgYW5kIGtleSBkb3duIGV2ZW50cwotCQkJRXZlbnREaXNwYXRjaCBteURpc3BhdGNoID0gbmV3IEV2ZW50RGlzcGF0Y2goRXZlbnREaXNwYXRjaC5vbmNsaWNrKTsKLQkJCUlEaXNwYXRjaCBpZGlzcGF0Y2ggPSBuZXcgSURpc3BhdGNoKG15RGlzcGF0Y2guZ2V0QWRkcmVzcygpKTsKLQkJCVZhcmlhbnQgZGlzcGF0Y2ggPSBuZXcgVmFyaWFudChpZGlzcGF0Y2gpOwotCQkJaHRtbERvY3VtZW50LnNldFByb3BlcnR5KEV2ZW50RGlzcGF0Y2gub25jbGljaywgZGlzcGF0Y2gpOwotCi0JCQlteURpc3BhdGNoID0gbmV3IEV2ZW50RGlzcGF0Y2goRXZlbnREaXNwYXRjaC5vbmRibGNsaWNrKTsKLQkJCWlkaXNwYXRjaCA9IG5ldyBJRGlzcGF0Y2gobXlEaXNwYXRjaC5nZXRBZGRyZXNzKCkpOwotCQkJZGlzcGF0Y2ggPSBuZXcgVmFyaWFudChpZGlzcGF0Y2gpOwotCQkJaHRtbERvY3VtZW50LnNldFByb3BlcnR5KEV2ZW50RGlzcGF0Y2gub25kYmxjbGljaywgZGlzcGF0Y2gpOwotCi0JCQlteURpc3BhdGNoID0gbmV3IEV2ZW50RGlzcGF0Y2goRXZlbnREaXNwYXRjaC5vbmtleWRvd24pOwotCQkJaWRpc3BhdGNoID0gbmV3IElEaXNwYXRjaChteURpc3BhdGNoLmdldEFkZHJlc3MoKSk7Ci0JCQlkaXNwYXRjaCA9IG5ldyBWYXJpYW50KGlkaXNwYXRjaCk7Ci0JCQlodG1sRG9jdW1lbnQuc2V0UHJvcGVydHkoRXZlbnREaXNwYXRjaC5vbmtleWRvd24sIGRpc3BhdGNoKTsKLQkJCQotCQkJLy9SZW1lbWJlciB0byByZWxlYXNlIE9sZUF1dG9tYXRpb24gT2JqZWN0Ci0JCQlodG1sRG9jdW1lbnQuZGlzcG9zZSgpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gTmF2aWdhdGUgdG8gYSB3ZWIgc2l0ZQotCWludFtdIGlkcyA9IHdlYkJyb3dzZXIuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117Ik5hdmlnYXRlIiwgIlVSTCJ9KTsgCi0JVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50W10ge25ldyBWYXJpYW50KCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iKX07Ci0JaW50W10gcmdkaXNwaWROYW1lZEFyZ3MgPSBuZXcgaW50W117aWRzWzFdfTsKLQl3ZWJCcm93c2VyLmludm9rZShpZHNbMF0sIHJndmFyZywgcmdkaXNwaWROYW1lZEFyZ3MpOwotCQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCS8vUmVtZW1iZXIgdG8gcmVsZWFzZSBPbGVBdXRvbWF0aW9uIE9iamVjdAotCXdlYkJyb3dzZXIuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotCQotfQotfQotLy8gRXZlbnREaXNwYXRjaCBpbXBsZW1lbnRzIGEgc2ltcGxlIElEaXNwYXRjaCBpbnRlcmZhY2Ugd2hpY2ggd2lsbCBiZSBjYWxsZWQgCi0vLyB3aGVuIHRoZSBldmVudCBpcyBmaXJlZC4KLWNsYXNzIEV2ZW50RGlzcGF0Y2ggewotCXByaXZhdGUgQ09NT2JqZWN0IGlEaXNwYXRjaDsKLQlwcml2YXRlIGludCByZWZDb3VudCA9IDA7Ci0JcHJpdmF0ZSBpbnQgZXZlbnRJRDsKLQkKLQlmaW5hbCBzdGF0aWMgaW50IG9uaGVscCA9IDB4ODAwMTE3N2Q7Ci0JZmluYWwgc3RhdGljIGludCBvbmNsaWNrID0gMHg4MDAxMTc3ODsKLQlmaW5hbCBzdGF0aWMgaW50IG9uZGJsY2xpY2sgPSAweDgwMDExNzc5OwotCWZpbmFsIHN0YXRpYyBpbnQgb25rZXl1cCA9IDB4ODAwMTE3NzY7Ci0JZmluYWwgc3RhdGljIGludCBvbmtleWRvd24gPSAweDgwMDExNzc1OwotCWZpbmFsIHN0YXRpYyBpbnQgb25rZXlwcmVzcyA9IDB4ODAwMTE3Nzc7Ci0JZmluYWwgc3RhdGljIGludCBvbm1vdXNldXAgPSAweDgwMDExNzczOwotCWZpbmFsIHN0YXRpYyBpbnQgb25tb3VzZWRvd24gPSAweDgwMDExNzcyOwotCWZpbmFsIHN0YXRpYyBpbnQgb25tb3VzZW1vdmUgPSAweDgwMDExNzc0OwotCWZpbmFsIHN0YXRpYyBpbnQgb25tb3VzZW91dCA9IDB4ODAwMTE3NzE7Ci0JZmluYWwgc3RhdGljIGludCBvbm1vdXNlb3ZlciA9IDB4ODAwMTE3NzA7Ci0JZmluYWwgc3RhdGljIGludCBvbnJlYWR5c3RhdGVjaGFuZ2UgPSAweDgwMDExNzg5OwotCWZpbmFsIHN0YXRpYyBpbnQgb25hZnRlcnVwZGF0ZSA9IDB4ODAwMTE3ODY7Ci0JZmluYWwgc3RhdGljIGludCBvbnJvd2V4aXQ9IDB4ODAwMTE3ODI7Ci0JZmluYWwgc3RhdGljIGludCBvbnJvd2VudGVyID0gMHg4MDAxMTc4MzsKLQlmaW5hbCBzdGF0aWMgaW50IG9uZHJhZ3N0YXJ0ID0gMHg4MDAxMTc5MzsKLQlmaW5hbCBzdGF0aWMgaW50IG9uc2VsZWN0c3RhcnQgPSAweDgwMDExNzk1OwotCi0JRXZlbnREaXNwYXRjaChpbnQgZXZlbnRJRCkgewotCQl0aGlzLmV2ZW50SUQgPSBldmVudElEOwotCQljcmVhdGVDT01JbnRlcmZhY2VzKCk7Ci0JfQotCWludCBnZXRBZGRyZXNzKCkgewotCQlyZXR1cm4gaURpc3BhdGNoLmdldEFkZHJlc3MoKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNPTUludGVyZmFjZXMoKSB7Ci0JCWlEaXNwYXRjaCA9IG5ldyBDT01PYmplY3QobmV3IGludFtdezIsIDAsIDAsIDEsIDMsIDQsIDh9KXsKLQkJCXB1YmxpYyBpbnQgbWV0aG9kMChpbnRbXSBhcmdzKSB7cmV0dXJuIFF1ZXJ5SW50ZXJmYWNlKGFyZ3NbMF0sIGFyZ3NbMV0pO30KLQkJCXB1YmxpYyBpbnQgbWV0aG9kMShpbnRbXSBhcmdzKSB7cmV0dXJuIEFkZFJlZigpO30KLQkJCXB1YmxpYyBpbnQgbWV0aG9kMihpbnRbXSBhcmdzKSB7cmV0dXJuIFJlbGVhc2UoKTt9Ci0JCQkvLyBtZXRob2QzIEdldFR5cGVJbmZvQ291bnQgLSBub3QgaW1wbGVtZW50ZWQKLQkJCS8vIG1ldGhvZDQgR2V0VHlwZUluZm8gLSBub3QgaW1wbGVtZW50ZWQKLQkJCS8vIG1ldGhvZDUgR2V0SURzT2ZOYW1lcyAtIG5vdCBpbXBsZW1lbnRlZAotCQkJcHVibGljIGludCBtZXRob2Q2KGludFtdIGFyZ3MpIHtyZXR1cm4gSW52b2tlKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0sIGFyZ3NbNl0sIGFyZ3NbN10pO30KLQkJfTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VDT01JbnRlcmZhY2VzKCkgewotCQlpZiAoaURpc3BhdGNoICE9IG51bGwpCi0JCQlpRGlzcGF0Y2guZGlzcG9zZSgpOwotCQlpRGlzcGF0Y2ggPSBudWxsOwotCQkKLQl9Ci0JcHJpdmF0ZSBpbnQgQWRkUmVmKCkgewotCQlyZWZDb3VudCsrOwotCQlyZXR1cm4gcmVmQ291bnQ7Ci0JfQotCXByaXZhdGUgaW50IEludm9rZShpbnQgZGlzcElkTWVtYmVyLCBpbnQgcmlpZCwgaW50IGxjaWQsIGludCBkd0ZsYWdzLCBpbnQgcERpc3BQYXJhbXMsIGludCBwVmFyUmVzdWx0LCBpbnQgcEV4Y2VwSW5mbywgaW50IHBBcmdFcnIpCXsKLQkJc3dpdGNoIChldmVudElEKSB7Ci0JCQljYXNlIG9uaGVscDogU3lzdGVtLm91dC5wcmludGxuKCJvbmhlbHAiKTsgYnJlYWs7Ci0JCQljYXNlIG9uY2xpY2s6IFN5c3RlbS5vdXQucHJpbnRsbigib25jbGljayIpOyBicmVhazsKLQkJCWNhc2Ugb25kYmxjbGljazogU3lzdGVtLm91dC5wcmludGxuKCJvbmRibGNsaWNrIik7IGJyZWFrOwotCQkJY2FzZSBvbmtleXVwOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ua2V5dXAiKTsgYnJlYWs7Ci0JCQljYXNlIG9ua2V5ZG93bjogU3lzdGVtLm91dC5wcmludGxuKCJvbmtleWRvd24iKTsgYnJlYWs7Ci0JCQljYXNlIG9ua2V5cHJlc3M6IFN5c3RlbS5vdXQucHJpbnRsbigib25rZXlwcmVzcyIpOyBicmVhazsKLQkJCWNhc2Ugb25tb3VzZXVwOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2V1cCIpOyBicmVhazsKLQkJCWNhc2Ugb25tb3VzZWRvd246IFN5c3RlbS5vdXQucHJpbnRsbigib25tb3VzZWRvd24iKTsgYnJlYWs7Ci0JCQljYXNlIG9ubW91c2Vtb3ZlOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2Vtb3ZlIik7IGJyZWFrOwotCQkJY2FzZSBvbm1vdXNlb3V0OiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2VvdXQiKTsgYnJlYWs7Ci0JCQljYXNlIG9ubW91c2VvdmVyOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2VvdmVyIik7IGJyZWFrOwotCQkJY2FzZSBvbnJlYWR5c3RhdGVjaGFuZ2U6IFN5c3RlbS5vdXQucHJpbnRsbigib25yZWFkeXN0YXRlY2hhbmdlIik7IGJyZWFrOwotCQkJY2FzZSBvbmFmdGVydXBkYXRlOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9uYWZ0ZXJ1cGRhdGUiKTsgYnJlYWs7Ci0JCQljYXNlIG9ucm93ZXhpdDogU3lzdGVtLm91dC5wcmludGxuKCJvbnJvd2V4aXQiKTsgYnJlYWs7Ci0JCQljYXNlIG9ucm93ZW50ZXI6IFN5c3RlbS5vdXQucHJpbnRsbigib25yb3dlbnRlciIpOyBicmVhazsKLQkJCWNhc2Ugb25kcmFnc3RhcnQ6IFN5c3RlbS5vdXQucHJpbnRsbigib25kcmFnc3RhcnQiKTsgYnJlYWs7Ci0JCQljYXNlIG9uc2VsZWN0c3RhcnQ6IFN5c3RlbS5vdXQucHJpbnRsbigib25zZWxlY3RzdGFydCIpOyBicmVhazsKLQkJfQotCQlyZXR1cm4gQ09NLlNfT0s7Ci0JfQotCXByaXZhdGUgaW50IFF1ZXJ5SW50ZXJmYWNlKGludCByaWlkLCBpbnQgcHB2T2JqZWN0KSB7Ci0JCWlmIChyaWlkID09IDAgfHwgcHB2T2JqZWN0ID09IDApIHJldHVybiBDT00uRV9JTlZBTElEQVJHOwotCQlHVUlEIGd1aWQgPSBuZXcgR1VJRCgpOwotCQlDT00uTW92ZU1lbW9yeShndWlkLCByaWlkLCBHVUlELnNpemVvZik7Ci0JCi0JCWlmICggQ09NLklzRXF1YWxHVUlEKGd1aWQsIENPTS5JSURJVW5rbm93bikgfHwgQ09NLklzRXF1YWxHVUlEKGd1aWQsIENPTS5JSURJRGlzcGF0Y2gpKSB7Ci0JCQlDT00uTW92ZU1lbW9yeShwcHZPYmplY3QsIG5ldyBpbnRbXSB7aURpc3BhdGNoLmdldEFkZHJlc3MoKX0sIDQpOwotCQkJQWRkUmVmKCk7Ci0JCQlyZXR1cm4gQ09NLlNfT0s7Ci0JCX0KLQkJQ09NLk1vdmVNZW1vcnkocHB2T2JqZWN0LCBuZXcgaW50W10gezB9LCA0KTsKLQkJcmV0dXJuIENPTS5FX05PSU5URVJGQUNFOwotCX0KLQlpbnQgUmVsZWFzZSgpIHsKLQkJcmVmQ291bnQtLTsKLQkJaWYgKHJlZkNvdW50ID09IDApIHsKLQkJCWRpc3Bvc2VDT01JbnRlcmZhY2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHJlZkNvdW50OwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjAxZmJkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRhYmxlRWRpdG9yIGV4YW1wbGUgc25pcHBldDogZWRpdCBhIGNlbGwgaW4gYSB0YWJsZSAoaW4gcGxhY2UsIGZhbmN5KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTI0IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUgKHRydWUpOwotCWZvciAoaW50IGk9MDsgaTwzOyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0V2lkdGgoMTAwKTsKLQl9Ci0JZm9yIChpbnQgaT0wOyBpPDM7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nIFtdIHsiIiArIGksICIiICsgaSAsICIiICsgaX0pOwotCX0KLQlmaW5hbCBUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQllZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSB0YWJsZS5nZXRDbGllbnRBcmVhICgpOwotCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQgKGV2ZW50LngsIGV2ZW50LnkpOwotCQkJaW50IGluZGV4ID0gdGFibGUuZ2V0VG9wSW5kZXggKCk7Ci0JCQl3aGlsZSAoaW5kZXggPCB0YWJsZS5nZXRJdGVtQ291bnQgKCkpIHsKLQkJCQlib29sZWFuIHZpc2libGUgPSBmYWxzZTsKLQkJCQlmaW5hbCBUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGluZGV4KTsKLQkJCQlmb3IgKGludCBpPTA7IGk8dGFibGUuZ2V0Q29sdW1uQ291bnQgKCk7IGkrKykgewotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGl0ZW0uZ2V0Qm91bmRzIChpKTsKLQkJCQkJaWYgKHJlY3QuY29udGFpbnMgKHB0KSkgewotCQkJCQkJZmluYWwgaW50IGNvbHVtbiA9IGk7Ci0JCQkJCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5OT05FKTsKLQkJCQkJCUxpc3RlbmVyIHRleHRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKGZpbmFsIEV2ZW50IGUpIHsKLQkJCQkJCQkJc3dpdGNoIChlLnR5cGUpIHsKLQkJCQkJCQkJCWNhc2UgU1dULkZvY3VzT3V0OgotCQkJCQkJCQkJCWl0ZW0uc2V0VGV4dCAoY29sdW1uLCB0ZXh0LmdldFRleHQgKCkpOwotCQkJCQkJCQkJCXRleHQuZGlzcG9zZSAoKTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgU1dULlRyYXZlcnNlOgotCQkJCQkJCQkJCXN3aXRjaCAoZS5kZXRhaWwpIHsKLQkJCQkJCQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOgotCQkJCQkJCQkJCQkJaXRlbS5zZXRUZXh0IChjb2x1bW4sIHRleHQuZ2V0VGV4dCAoKSk7Ci0JCQkJCQkJCQkJCQkvL0ZBTEwgVEhST1VHSAotCQkJCQkJCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCQkJCQkJCQl0ZXh0LmRpc3Bvc2UgKCk7Ci0JCQkJCQkJCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQkJdGV4dC5hZGRMaXN0ZW5lciAoU1dULkZvY3VzT3V0LCB0ZXh0TGlzdGVuZXIpOwotCQkJCQkJdGV4dC5hZGRMaXN0ZW5lciAoU1dULlRyYXZlcnNlLCB0ZXh0TGlzdGVuZXIpOwotCQkJCQkJZWRpdG9yLnNldEVkaXRvciAodGV4dCwgaXRlbSwgaSk7Ci0JCQkJCQl0ZXh0LnNldFRleHQgKGl0ZW0uZ2V0VGV4dCAoaSkpOwotCQkJCQkJdGV4dC5zZWxlY3RBbGwgKCk7Ci0JCQkJCQl0ZXh0LnNldEZvY3VzICgpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWlmICghdmlzaWJsZSAmJiByZWN0LmludGVyc2VjdHMgKGNsaWVudEFyZWEpKSB7Ci0JCQkJCQl2aXNpYmxlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXZpc2libGUpIHJldHVybjsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNmY4N2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sIFRpcHMgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgZmFrZSB0b29sIHRpcHMgZm9yIGl0ZW1zIGluIGEgdGFibGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTI1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJpdGVtICIgKyBpKTsKLQl9Ci0JLy8gRGlzYWJsZSBuYXRpdmUgdG9vbHRpcAotCXRhYmxlLnNldFRvb2xUaXBUZXh0ICgiIik7Ci0JCi0JLy8gSW1wbGVtZW50IGEgImZha2UiIHRvb2x0aXAKLQlmaW5hbCBMaXN0ZW5lciBsYWJlbExpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlMYWJlbCBsYWJlbCA9IChMYWJlbClldmVudC53aWRnZXQ7Ci0JCQlTaGVsbCBzaGVsbCA9IGxhYmVsLmdldFNoZWxsICgpOwotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJCQlFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotCQkJCQllLml0ZW0gPSAoVGFibGVJdGVtKSBsYWJlbC5nZXREYXRhICgiX1RBQkxFSVRFTSIpOwotCQkJCQkvLyBBc3N1bWluZyB0YWJsZSBpcyBzaW5nbGUgc2VsZWN0LCBzZXQgdGhlIHNlbGVjdGlvbiBhcyBpZgotCQkJCQkvLyB0aGUgbW91c2UgZG93biBldmVudCB3ZW50IHRocm91Z2ggdG8gdGhlIHRhYmxlCi0JCQkJCXRhYmxlLnNldFNlbGVjdGlvbiAobmV3IFRhYmxlSXRlbSBbXSB7KFRhYmxlSXRlbSkgZS5pdGVtfSk7Ci0JCQkJCXRhYmxlLm5vdGlmeUxpc3RlbmVycyAoU1dULlNlbGVjdGlvbiwgZSk7Ci0JCQkJCS8vIGZhbGwgdGhyb3VnaAotCQkJCWNhc2UgU1dULk1vdXNlRXhpdDoKLQkJCQkJc2hlbGwuZGlzcG9zZSAoKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCQotCUxpc3RlbmVyIHRhYmxlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlTaGVsbCB0aXAgPSBudWxsOwotCQlMYWJlbCBsYWJlbCA9IG51bGw7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuRGlzcG9zZToKLQkJCQljYXNlIFNXVC5LZXlEb3duOgotCQkJCWNhc2UgU1dULk1vdXNlTW92ZTogewotCQkJCQlpZiAodGlwID09IG51bGwpIGJyZWFrOwotCQkJCQl0aXAuZGlzcG9zZSAoKTsKLQkJCQkJdGlwID0gbnVsbDsKLQkJCQkJbGFiZWwgPSBudWxsOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBTV1QuTW91c2VIb3ZlcjogewotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKG5ldyBQb2ludCAoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAodGlwICE9IG51bGwgICYmICF0aXAuaXNEaXNwb3NlZCAoKSkgdGlwLmRpc3Bvc2UgKCk7Ci0JCQkJCQl0aXAgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuT05fVE9QIHwgU1dULlRPT0wpOwotCQkJCQkJdGlwLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCQkJCQkJbGFiZWwgPSBuZXcgTGFiZWwgKHRpcCwgU1dULk5PTkUpOwotCQkJCQkJbGFiZWwuc2V0Rm9yZWdyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0lORk9fRk9SRUdST1VORCkpOwotCQkJCQkJbGFiZWwuc2V0QmFja2dyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotCQkJCQkJbGFiZWwuc2V0RGF0YSAoIl9UQUJMRUlURU0iLCBpdGVtKTsKLQkJCQkJCWxhYmVsLnNldFRleHQgKCJ0b29sdGlwICIraXRlbS5nZXRUZXh0ICgpKTsKLQkJCQkJCWxhYmVsLmFkZExpc3RlbmVyIChTV1QuTW91c2VFeGl0LCBsYWJlbExpc3RlbmVyKTsKLQkJCQkJCWxhYmVsLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBsYWJlbExpc3RlbmVyKTsKLQkJCQkJCVBvaW50IHNpemUgPSB0aXAuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGl0ZW0uZ2V0Qm91bmRzICgwKTsKLQkJCQkJCVBvaW50IHB0ID0gdGFibGUudG9EaXNwbGF5IChyZWN0LngsIHJlY3QueSk7Ci0JCQkJCQl0aXAuc2V0Qm91bmRzIChwdC54LCBwdC55LCBzaXplLngsIHNpemUueSk7Ci0JCQkJCQl0aXAuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuRGlzcG9zZSwgdGFibGVMaXN0ZW5lcik7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5LZXlEb3duLCB0YWJsZUxpc3RlbmVyKTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULk1vdXNlTW92ZSwgdGFibGVMaXN0ZW5lcik7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZUhvdmVyLCB0YWJsZUxpc3RlbmVyKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiNjRmNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogcGxhY2UgYXJiaXRyYXJ5IGNvbnRyb2xzIGluIGEgdGFibGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyNiB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlICh0cnVlKTsKLQlmb3IgKGludCBpPTA7IGk8MzsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0V2lkdGggKDEwMCk7Ci0JfQotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCW5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JfQotCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zICgpOwotCWZvciAoaW50IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewotCQlUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJQ0NvbWJvIGNvbWJvID0gbmV3IENDb21ibyAodGFibGUsIFNXVC5OT05FKTsKLQkJZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJZWRpdG9yLnNldEVkaXRvcihjb21ibywgaXRlbXNbaV0sIDApOwotCQllZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCWVkaXRvci5zZXRFZGl0b3IodGV4dCwgaXRlbXNbaV0sIDEpOwotCQllZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHRhYmxlLCBTV1QuQ0hFQ0spOwotCQlidXR0b24ucGFjayAoKTsKLQkJZWRpdG9yLm1pbmltdW1XaWR0aCA9IGJ1dHRvbi5nZXRTaXplICgpLng7Ci0JCWVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCWVkaXRvci5zZXRFZGl0b3IgKGJ1dHRvbiwgaXRlbXNbaV0sIDIpOwotCX0KLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E1NWQ4MS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29udHJvbCBleGFtcGxlIHNuaXBwZXQ6IHByZXZlbnQgVGFiIGZyb20gdHJhdmVyc2luZyBvdXQgb2YgYSBjb250cm9sCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyNyB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uMS5zZXRCb3VuZHMoMTAsMTAsMTgwLDMwKTsKLQlidXR0b24xLnNldFRleHQoIm5vIHRyYXZlcnNlIik7Ci0JYnV0dG9uMS5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1RBQl9ORVhUOgotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUzogewotCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uMi5zZXRCb3VuZHMoMjAwLDEwLDE4MCwzMCk7Ci0JYnV0dG9uMi5zZXRUZXh0KCJjYW4gdHJhdmVyc2UiKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGI2MDViLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IGJyaW5nIHVwIGEgYnJvd3NlcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTI4IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJc2hlbGwuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlUb29sQmFyIHRvb2xiYXIgPSBuZXcgVG9vbEJhcihzaGVsbCwgU1dULk5PTkUpOwotCQlUb29sSXRlbSBpdGVtQmFjayA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW1CYWNrLnNldFRleHQoIkJhY2siKTsKLQkJVG9vbEl0ZW0gaXRlbUZvcndhcmQgPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQlpdGVtRm9yd2FyZC5zZXRUZXh0KCJGb3J3YXJkIik7Ci0JCVRvb2xJdGVtIGl0ZW1TdG9wID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJaXRlbVN0b3Auc2V0VGV4dCgiU3RvcCIpOwotCQlUb29sSXRlbSBpdGVtUmVmcmVzaCA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW1SZWZyZXNoLnNldFRleHQoIlJlZnJlc2giKTsKLQkJVG9vbEl0ZW0gaXRlbUdvID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJaXRlbUdvLnNldFRleHQoIkdvIik7Ci0JCQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl0b29sYmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJTGFiZWwgbGFiZWxBZGRyZXNzID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWxhYmVsQWRkcmVzcy5zZXRUZXh0KCJBZGRyZXNzIik7Ci0JCQotCQlmaW5hbCBUZXh0IGxvY2F0aW9uID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlsb2NhdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJYnJvd3Nlci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZpbmFsIExhYmVsIHN0YXR1cyA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzdGF0dXMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlmaW5hbCBQcm9ncmVzc0JhciBwcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0JhcihzaGVsbCwgU1dULk5PTkUpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkVORDsKLQkJcHJvZ3Jlc3NCYXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvKiBldmVudCBoYW5kbGluZyAqLwotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJVG9vbEl0ZW0gaXRlbSA9IChUb29sSXRlbSlldmVudC53aWRnZXQ7Ci0JCQkJU3RyaW5nIHN0cmluZyA9IGl0ZW0uZ2V0VGV4dCgpOwotCQkJCWlmIChzdHJpbmcuZXF1YWxzKCJCYWNrIikpIGJyb3dzZXIuYmFjaygpOyAKLQkJCQllbHNlIGlmIChzdHJpbmcuZXF1YWxzKCJGb3J3YXJkIikpIGJyb3dzZXIuZm9yd2FyZCgpOwotCQkJCWVsc2UgaWYgKHN0cmluZy5lcXVhbHMoIlN0b3AiKSkgYnJvd3Nlci5zdG9wKCk7Ci0JCQkJZWxzZSBpZiAoc3RyaW5nLmVxdWFscygiUmVmcmVzaCIpKSBicm93c2VyLnJlZnJlc2goKTsKLQkJCQllbHNlIGlmIChzdHJpbmcuZXF1YWxzKCJHbyIpKSBicm93c2VyLnNldFVybChsb2NhdGlvbi5nZXRUZXh0KCkpOwotCQkgICB9Ci0JCX07Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCQlpZiAoZXZlbnQudG90YWwgPT0gMCkgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJaW50IHJhdGlvID0gZXZlbnQuY3VycmVudCAqIDEwMCAvIGV2ZW50LnRvdGFsOwotCQkJCQlwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24ocmF0aW8pOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQlwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24oMCk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFN0YXR1c1RleHRMaXN0ZW5lcihuZXcgU3RhdHVzVGV4dExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJCQlzdGF0dXMuc2V0VGV4dChldmVudC50ZXh0KTsJCi0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQudG9wKSBsb2NhdGlvbi5zZXRUZXh0KGV2ZW50LmxvY2F0aW9uKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW1CYWNrLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJaXRlbUZvcndhcmQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlpdGVtU3RvcC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCWl0ZW1SZWZyZXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJaXRlbUdvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJbG9jYXRpb24uYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlicm93c2VyLnNldFVybChsb2NhdGlvbi5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly9lY2xpcHNlLm9yZyIpOwotCQkKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmQxYmEwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBjb2xvciBjZWxscyBhbmQgcm93cyBpbiB0YWJsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyOSB7Ci0gCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCUNvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKTsKLQlDb2xvciBncmF5ID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JBWSk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0YWJsZS5zZXRCYWNrZ3JvdW5kKGdyYXkpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMyA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJlbnRpcmUiLCJyb3ciLCJyZWQgZm9yZWdyb3VuZCJ9KTsKLQlpdGVtLnNldEZvcmVncm91bmQocmVkKTsKLQlpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJlbnRpcmUiLCJyb3ciLCJyZWQgYmFja2dyb3VuZCJ9KTsKLQlpdGVtLnNldEJhY2tncm91bmQocmVkKTsKLQlpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJlbnRpcmUiLCJyb3ciLCJ3aGl0ZSBmb3JlL3JlZCBiYWNrIn0pOwotCWl0ZW0uc2V0Rm9yZWdyb3VuZCh3aGl0ZSk7Ci0JaXRlbS5zZXRCYWNrZ3JvdW5kKHJlZCk7Ci0JaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsibm9ybWFsIiwiYmx1ZSBmb3JlZ3JvdW5kIiwicmVkIGZvcmVncm91bmQifSk7Ci0JaXRlbS5zZXRGb3JlZ3JvdW5kKDEsIGJsdWUpOwotCWl0ZW0uc2V0Rm9yZWdyb3VuZCgyLCByZWQpOwotCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7Im5vcm1hbCIsImJsdWUgYmFja2dyb3VuZCIsInJlZCBiYWNrZ3JvdW5kIn0pOwotCWl0ZW0uc2V0QmFja2dyb3VuZCgxLCBibHVlKTsKLQlpdGVtLnNldEJhY2tncm91bmQoMiwgcmVkKTsKLQlpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJ3aGl0ZSBmb3JlL2JsdWUgYmFjayIsIm5vcm1hbCIsIndoaXRlIGZvcmUvcmVkIGJhY2sifSk7Ci0JaXRlbS5zZXRGb3JlZ3JvdW5kKDAsIHdoaXRlKTsKLQlpdGVtLnNldEJhY2tncm91bmQoMCwgYmx1ZSk7Ci0JaXRlbS5zZXRGb3JlZ3JvdW5kKDIsIHdoaXRlKTsKLQlpdGVtLnNldEJhY2tncm91bmQoMiwgcmVkKTsKLQkKLQljb2x1bW4xLnBhY2soKTsKLQljb2x1bW4yLnBhY2soKTsKLQljb2x1bW4zLnBhY2soKTsKLQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWE4ZDA5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBHQyBleGFtcGxlIHNuaXBwZXQ6IGRyYXcgYSB0aGljayBsaW5lCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlHQyBnYyA9IG5ldyBHQyAoc2hlbGwpOwotCWdjLnNldExpbmVXaWR0aCAoNCk7Ci0JZ2MuZHJhd1JlY3RhbmdsZSAoMjAsIDIwLCAxMDAsIDEwMCk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM4MGNiOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnVzeUluZGljYXRvciBleGFtcGxlIHNuaXBwZXQ6IGRpc3BsYXkgYnVzeSBjdXJzb3IgZHVyaW5nIGxvbmcgcnVubmluZyB0YXNrCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTMwIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlmaW5hbCBpbnRbXSBuZXh0SWQgPSBuZXcgaW50WzFdOwotCQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYi5zZXRUZXh0KCJpbnZva2UgbG9uZyBydW5uaW5nIGpvYiIpOwotCQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVJ1bm5hYmxlIGxvbmdKb2IgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQkJCQlpbnQgaWQ7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCWlkID0gbmV4dElkWzBdKys7Ci0JCQkJCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCWlmICh0ZXh0LmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQkJCQkJCXRleHQuYXBwZW5kKCJcblN0YXJ0IGxvbmcgcnVubmluZyB0YXNrICIraWQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDA7IGkrKykgewotCQkJCQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImRvIHRhc2sgdGhhdCB0YWtlcyBhIGxvbmcgdGltZSBpbiBhIHNlcGFyYXRlIHRocmVhZCAiK2lkKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJaWYgKHRleHQuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCQkJCQkJdGV4dC5hcHBlbmQoIlxuQ29tcGxldGVkIGxvbmcgcnVubmluZyB0YXNrICIraWQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCQkJCWRpc3BsYXkud2FrZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCQkJCQl3aGlsZSAoIWRvbmUgJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQkJCQkJZGlzcGxheS5zbGVlcCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShkaXNwbGF5LCBsb25nSm9iKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnNldFNpemUoMjUwLCAxNTApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBkMGMwNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE1lbnUgZXhhbXBsZSBzbmlwcGV0OiBzaG93IGEgcG9wdXAgbWVudSAod2FpdCBmb3IgaXQgdG8gY2xvc2UpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzEgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTWVudURldGVjdCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCQkJaXRlbS5zZXRUZXh0ICgiTWVudSBJdGVtIik7Ci0JCQlpdGVtLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkl0ZW0gU2VsZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCW1lbnUuc2V0TG9jYXRpb24gKGV2ZW50LngsIGV2ZW50LnkpOwotCQkJbWVudS5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCXdoaWxlICghbWVudS5pc0Rpc3Bvc2VkICgpICYmIG1lbnUuaXNWaXNpYmxlICgpKSB7Ci0JCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJCX0KLQkJCW1lbnUuZGlzcG9zZSAoKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGE4MWEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gIAotLyoKLSAqIFByaW50aW5nIGV4YW1wbGUgc25pcHBldDogcHJpbnQgIkhlbGxvIFdvcmxkISIgaW4gYmxhY2ssIG91dGxpbmVkIGluIHJlZCwgdG8gZGVmYXVsdCBwcmludGVyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTMyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCVByaW50ZXJEYXRhIGRhdGEgPSBQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpOwotCWlmIChkYXRhID09IG51bGwpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiBObyBkZWZhdWx0IHByaW50ZXIuIik7Ci0JCXJldHVybjsKLQl9Ci0JUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoZGF0YSk7Ci0JaWYgKHByaW50ZXIuc3RhcnRKb2IoIlNXVCBQcmludGluZyBTbmlwcGV0IikpIHsKLQkJQ29sb3IgYmxhY2sgPSBwcmludGVyLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSyk7Ci0JCUNvbG9yIHdoaXRlID0gcHJpbnRlci5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpOwotCQlDb2xvciByZWQgPSBwcmludGVyLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCQlSZWN0YW5nbGUgdHJpbSA9IHByaW50ZXIuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0JCVBvaW50IGRwaSA9IHByaW50ZXIuZ2V0RFBJKCk7Ci0JCWludCBsZWZ0TWFyZ2luID0gZHBpLnggKyB0cmltLng7IC8vIG9uZSBpbmNoIGZyb20gbGVmdCBzaWRlIG9mIHBhcGVyCi0JCWludCB0b3BNYXJnaW4gPSBkcGkueSAvIDIgKyB0cmltLnk7IC8vIG9uZS1oYWxmIGluY2ggZnJvbSB0b3AgZWRnZSBvZiBwYXBlcgotCQlHQyBnYyA9IG5ldyBHQyhwcmludGVyKTsKLQkJRm9udCBmb250ID0gZ2MuZ2V0Rm9udCgpOyAvLyBleGFtcGxlIGp1c3QgdXNlcyBwcmludGVyJ3MgZGVmYXVsdCBmb250Ci0JCWlmIChwcmludGVyLnN0YXJ0UGFnZSgpKSB7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKHdoaXRlKTsKLQkJCWdjLnNldEZvcmVncm91bmQoYmxhY2spOwotCQkJU3RyaW5nIHRlc3RTdHJpbmcgPSAiSGVsbG8gV29ybGQhIjsKLQkJCVBvaW50IGV4dGVudCA9IGdjLnN0cmluZ0V4dGVudCh0ZXN0U3RyaW5nKTsKLQkJCWdjLmRyYXdTdHJpbmcodGVzdFN0cmluZywgbGVmdE1hcmdpbiwgdG9wTWFyZ2luICsgZm9udC5nZXRGb250RGF0YSgpWzBdLmdldEhlaWdodCgpKTsKLQkJCWdjLnNldEZvcmVncm91bmQocmVkKTsKLQkJCWdjLmRyYXdSZWN0YW5nbGUobGVmdE1hcmdpbiwgdG9wTWFyZ2luLCBleHRlbnQueCwgZXh0ZW50LnkpOwotCQkJcHJpbnRlci5lbmRQYWdlKCk7Ci0JCX0KLQkJZ2MuZGlzcG9zZSgpOwotCQlwcmludGVyLmVuZEpvYigpOwotCQl9Ci0JcHJpbnRlci5kaXNwb3NlKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkxODBmNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogUHJpbnRpbmcgZXhhbXBsZSBzbmlwcGV0OiBwcmludCB0ZXh0IHRvIHByaW50ZXIsIHdpdGggd29yZCB3cmFwIGFuZCBwYWdpbmF0aW9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTMzIHsKLQlEaXNwbGF5IGRpc3BsYXk7Ci0JU2hlbGwgc2hlbGw7Ci0JVGV4dCB0ZXh0OwotCUZvbnQgZm9udDsKLQlDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmRDb2xvcjsKLQkKLQlQcmludGVyIHByaW50ZXI7Ci0JR0MgZ2M7Ci0JRm9udCBwcmludGVyRm9udDsKLQlDb2xvciBwcmludGVyRm9yZWdyb3VuZENvbG9yLCBwcmludGVyQmFja2dyb3VuZENvbG9yOwotCi0JaW50IGxpbmVIZWlnaHQgPSAwOwotCWludCB0YWJXaWR0aCA9IDA7Ci0JaW50IGxlZnRNYXJnaW4sIHJpZ2h0TWFyZ2luLCB0b3BNYXJnaW4sIGJvdHRvbU1hcmdpbjsKLQlpbnQgeCwgeTsKLQlpbnQgaW5kZXgsIGVuZDsKLQlTdHJpbmcgdGV4dFRvUHJpbnQ7Ci0JU3RyaW5nIHRhYnM7Ci0JU3RyaW5nQnVmZmVyIHdvcmRCdWZmZXI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCW5ldyBTbmlwcGV0MTMzKCkub3BlbigpOwotCX0KLQkKLQl2b2lkIG9wZW4oKSB7Ci0JCWRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgIkNvdXJpZXIiLCAxMCwgU1dULk5PUk1BTCk7Ci0JCWZvcmVncm91bmRDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKTsKLQkJYmFja2dyb3VuZENvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpOwotCQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlzaGVsbC5zZXRUZXh0KCJQcmludCBUZXh0Iik7Ci0JCXNoZWxsLnNldE1heGltaXplZCh0cnVlKTsKLQkJdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJdGV4dC5zZXRGb250KGZvbnQpOwotCQl0ZXh0LnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLQkJdGV4dC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0JCQotCQlNZW51IG1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlpdGVtLnNldFRleHQoIiZGaWxlIik7Ci0JCU1lbnUgZmlsZU1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0TWVudShmaWxlTWVudSk7Ci0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCImT3Blbi4uLiIpOwotCQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5DVFJMICsgJ08nKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudU9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCJGb250Li4uIik7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVGb250KCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiRm9yZWdyb3VuZCBDb2xvci4uLiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51Rm9yZWdyb3VuZENvbG9yKCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiQmFja2dyb3VuZCBDb2xvci4uLiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51QmFja2dyb3VuZENvbG9yKCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiJlByaW50Li4uIik7Ci0JCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULkNUUkwgKyAnUCcpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51UHJpbnQoKTsKLQkJCX0KLQkJfSk7Ci0JCW5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCJFJnhpdCIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWlmIChmb250ICE9IG51bGwpIGZvbnQuZGlzcG9zZSgpOwotCQlpZiAoZm9yZWdyb3VuZENvbG9yICE9IG51bGwpIGZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCWlmIChiYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgYmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQl9Ci0JCQotCXZvaWQgbWVudU9wZW4oKSB7Ci0JCWZpbmFsIFN0cmluZyB0ZXh0U3RyaW5nOwotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IiouamF2YSIsICIqLioifSk7Ci0JCVN0cmluZyBuYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKChuYW1lID09IG51bGwpIHx8IChuYW1lLmxlbmd0aCgpID09IDApKSByZXR1cm47Ci0JCi0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShuYW1lKTsKLQkJCUZpbGVJbnB1dFN0cmVhbSBzdHJlYW09IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZS5nZXRQYXRoKCkpOwotCQkJdHJ5IHsKLQkJCQlSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSkpOwotCQkJCWNoYXJbXSByZWFkQnVmZmVyPSBuZXcgY2hhclsyMDQ4XTsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKChpbnQpIGZpbGUubGVuZ3RoKCkpOwotCQkJCWludCBuOwotCQkJCXdoaWxlICgobiA9IGluLnJlYWQocmVhZEJ1ZmZlcikpID4gMCkgewotCQkJCQlidWZmZXIuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCX0KLQkJCQl0ZXh0U3RyaW5nID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCQkJCWJveC5zZXRNZXNzYWdlKCJFcnJvciByZWFkaW5nIGZpbGU6XG4iICsgbmFtZSk7Ci0JCQkJYm94Lm9wZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9FUlJPUik7Ci0JCQlib3guc2V0TWVzc2FnZSgiRmlsZSBub3QgZm91bmQ6XG4iICsgbmFtZSk7Ci0JCQlib3gub3BlbigpOwotCQkJcmV0dXJuOwotCQl9CQotCQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JfQotCi0Jdm9pZCBtZW51Rm9udCgpIHsKLQkJRm9udERpYWxvZyBmb250RGlhbG9nID0gbmV3IEZvbnREaWFsb2coc2hlbGwpOwotCQlmb250RGlhbG9nLnNldEZvbnRMaXN0KGZvbnQuZ2V0Rm9udERhdGEoKSk7Ci0JCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuKCk7Ci0JCWlmIChmb250RGF0YSAhPSBudWxsKSB7Ci0JCQlpZiAoZm9udCAhPSBudWxsKSBmb250LmRpc3Bvc2UoKTsKLQkJCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBmb250RGF0YSk7Ci0JCQl0ZXh0LnNldEZvbnQoZm9udCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIG1lbnVGb3JlZ3JvdW5kQ29sb3IoKSB7Ci0JCUNvbG9yRGlhbG9nIGNvbG9yRGlhbG9nID0gbmV3IENvbG9yRGlhbG9nKHNoZWxsKTsKLQkJY29sb3JEaWFsb2cuc2V0UkdCKGZvcmVncm91bmRDb2xvci5nZXRSR0IoKSk7Ci0JCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyZ2IgIT0gbnVsbCkgewotCQkJaWYgKGZvcmVncm91bmRDb2xvciAhPSBudWxsKSBmb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJZm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIHJnYik7Ci0JCQl0ZXh0LnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLQkJfQotCX0KLQotCXZvaWQgbWVudUJhY2tncm91bmRDb2xvcigpIHsKLQkJQ29sb3JEaWFsb2cgY29sb3JEaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2coc2hlbGwpOwotCQljb2xvckRpYWxvZy5zZXRSR0IoYmFja2dyb3VuZENvbG9yLmdldFJHQigpKTsKLQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJaWYgKHJnYiAhPSBudWxsKSB7Ci0JCQlpZiAoYmFja2dyb3VuZENvbG9yICE9IG51bGwpIGJhY2tncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQliYWNrZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgcmdiKTsKLQkJCXRleHQuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotCQl9Ci0JfQotCi0Jdm9pZCBtZW51UHJpbnQoKSB7Ci0JCVByaW50RGlhbG9nIGRpYWxvZyA9IG5ldyBQcmludERpYWxvZyhzaGVsbCwgU1dULk5PTkUpOwotCQlQcmludGVyRGF0YSBkYXRhID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuOwotCQlpZiAoZGF0YS5wcmludFRvRmlsZSkgewotCQkJZGF0YS5maWxlTmFtZSA9ICJwcmludC5vdXQiOyAvLyB5b3UgcHJvYmFibHkgd2FudCB0byBhc2sgdGhlIHVzZXIgZm9yIGEgZmlsZW5hbWUKLQkJfQotCQkKLQkJLyogR2V0IHRoZSB0ZXh0IHRvIHByaW50IGZyb20gdGhlIFRleHQgd2lkZ2V0ICh5b3UgY291bGQgZ2V0IGl0IGZyb20gYW55d2hlcmUsIGkuZS4geW91ciBqYXZhIG1vZGVsKSAqLwotCQl0ZXh0VG9QcmludCA9IHRleHQuZ2V0VGV4dCgpOwotCi0JCS8qIERvIHRoZSBwcmludGluZyBpbiBhIGJhY2tncm91bmQgdGhyZWFkIHNvIHRoYXQgc3Bvb2xpbmcgZG9lcyBub3QgZnJlZXplIHRoZSBVSS4gKi8KLQkJcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotCQlUaHJlYWQgcHJpbnRpbmdUaHJlYWQgPSBuZXcgVGhyZWFkKCJQcmludGluZyIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwcmludChwcmludGVyKTsKLQkJCQlwcmludGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfTsKLQkJcHJpbnRpbmdUaHJlYWQuc3RhcnQoKTsKLQl9Ci0JCi0Jdm9pZCBwcmludChQcmludGVyIHByaW50ZXIpIHsKLQkJaWYgKHByaW50ZXIuc3RhcnRKb2IoIlRleHQiKSkgeyAgIC8vIHRoZSBzdHJpbmcgaXMgdGhlIGpvYiBuYW1lIC0gc2hvd3MgdXAgaW4gdGhlIHByaW50ZXIncyBqb2IgbGlzdAotCQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBwcmludGVyLmdldENsaWVudEFyZWEoKTsKLQkJCVJlY3RhbmdsZSB0cmltID0gcHJpbnRlci5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLQkJCVBvaW50IGRwaSA9IHByaW50ZXIuZ2V0RFBJKCk7Ci0JCQlsZWZ0TWFyZ2luID0gZHBpLnggKyB0cmltLng7IC8vIG9uZSBpbmNoIGZyb20gbGVmdCBzaWRlIG9mIHBhcGVyCi0JCQlyaWdodE1hcmdpbiA9IGNsaWVudEFyZWEud2lkdGggLSBkcGkueCArIHRyaW0ueCArIHRyaW0ud2lkdGg7IC8vIG9uZSBpbmNoIGZyb20gcmlnaHQgc2lkZSBvZiBwYXBlcgotCQkJdG9wTWFyZ2luID0gZHBpLnkgKyB0cmltLnk7IC8vIG9uZSBpbmNoIGZyb20gdG9wIGVkZ2Ugb2YgcGFwZXIKLQkJCWJvdHRvbU1hcmdpbiA9IGNsaWVudEFyZWEuaGVpZ2h0IC0gZHBpLnkgKyB0cmltLnkgKyB0cmltLmhlaWdodDsgLy8gb25lIGluY2ggZnJvbSBib3R0b20gZWRnZSBvZiBwYXBlcgotCQkJCi0JCQkvKiBDcmVhdGUgYSBidWZmZXIgZm9yIGNvbXB1dGluZyB0YWIgd2lkdGguICovCi0JCQlpbnQgdGFiU2l6ZSA9IDQ7IC8vIGlzIHRhYiB3aWR0aCBhIHVzZXIgc2V0dGluZyBpbiB5b3VyIFVJPwotCQkJU3RyaW5nQnVmZmVyIHRhYkJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGFiU2l6ZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYlNpemU7IGkrKykgdGFiQnVmZmVyLmFwcGVuZCgnICcpOwotCQkJdGFicyA9IHRhYkJ1ZmZlci50b1N0cmluZygpOwotCi0JCQkvKiBDcmVhdGUgcHJpbnRlciBHQywgYW5kIGNyZWF0ZSBhbmQgc2V0IHRoZSBwcmludGVyIGZvbnQgJiBmb3JlZ3JvdW5kIGNvbG9yLiAqLwotCQkJZ2MgPSBuZXcgR0MocHJpbnRlcik7Ci0JCQkKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gZm9udC5nZXRGb250RGF0YSgpWzBdOwotCQkJcHJpbnRlckZvbnQgPSBuZXcgRm9udChwcmludGVyLCBmb250RGF0YS5nZXROYW1lKCksIGZvbnREYXRhLmdldEhlaWdodCgpLCBmb250RGF0YS5nZXRTdHlsZSgpKTsKLQkJCWdjLnNldEZvbnQocHJpbnRlckZvbnQpOwotCQkJdGFiV2lkdGggPSBnYy5zdHJpbmdFeHRlbnQodGFicykueDsKLQkJCWxpbmVIZWlnaHQgPSBnYy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpOwotCQkJCi0JCQlSR0IgcmdiID0gZm9yZWdyb3VuZENvbG9yLmdldFJHQigpOwotCQkJcHJpbnRlckZvcmVncm91bmRDb2xvciA9IG5ldyBDb2xvcihwcmludGVyLCByZ2IpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChwcmludGVyRm9yZWdyb3VuZENvbG9yKTsKLQkJCi0JCQlyZ2IgPSBiYWNrZ3JvdW5kQ29sb3IuZ2V0UkdCKCk7Ci0JCQlwcmludGVyQmFja2dyb3VuZENvbG9yID0gbmV3IENvbG9yKHByaW50ZXIsIHJnYik7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKHByaW50ZXJCYWNrZ3JvdW5kQ29sb3IpOwotCQkKLQkJCS8qIFByaW50IHRleHQgdG8gY3VycmVudCBnYyB1c2luZyB3b3JkIHdyYXAgKi8KLQkJCXByaW50VGV4dCgpOwotCQkJcHJpbnRlci5lbmRKb2IoKTsKLQotCQkJLyogQ2xlYW51cCBncmFwaGljcyByZXNvdXJjZXMgdXNlZCBpbiBwcmludGluZyAqLwotCQkJcHJpbnRlckZvbnQuZGlzcG9zZSgpOwotCQkJcHJpbnRlckZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQlwcmludGVyQmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQl2b2lkIHByaW50VGV4dCgpIHsKLQkJcHJpbnRlci5zdGFydFBhZ2UoKTsKLQkJd29yZEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJeCA9IGxlZnRNYXJnaW47Ci0JCXkgPSB0b3BNYXJnaW47Ci0JCWluZGV4ID0gMDsKLQkJZW5kID0gdGV4dFRvUHJpbnQubGVuZ3RoKCk7Ci0JCXdoaWxlIChpbmRleCA8IGVuZCkgewotCQkJY2hhciBjID0gdGV4dFRvUHJpbnQuY2hhckF0KGluZGV4KTsKLQkJCWluZGV4Kys7Ci0JCQlpZiAoYyAhPSAwKSB7Ci0JCQkJaWYgKGMgPT0gMHgwYSB8fCBjID09IDB4MGQpIHsKLQkJCQkJaWYgKGMgPT0gMHgwZCAmJiBpbmRleCA8IGVuZCAmJiB0ZXh0VG9QcmludC5jaGFyQXQoaW5kZXgpID09IDB4MGEpIHsKLQkJCQkJCWluZGV4Kys7IC8vIGlmIHRoaXMgaXMgY3ItbGYsIHNraXAgdGhlIGxmCi0JCQkJCX0KLQkJCQkJcHJpbnRXb3JkQnVmZmVyKCk7Ci0JCQkJCW5ld2xpbmUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoYyAhPSAnXHQnKSB7Ci0JCQkJCQl3b3JkQnVmZmVyLmFwcGVuZChjKTsKLQkJCQkJfQotCQkJCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCQkJcHJpbnRXb3JkQnVmZmVyKCk7Ci0JCQkJCQlpZiAoYyA9PSAnXHQnKSB7Ci0JCQkJCQkJeCArPSB0YWJXaWR0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoeSArIGxpbmVIZWlnaHQgPD0gYm90dG9tTWFyZ2luKSB7Ci0JCQlwcmludGVyLmVuZFBhZ2UoKTsKLQkJfQotCX0KLQotCXZvaWQgcHJpbnRXb3JkQnVmZmVyKCkgewotCQlpZiAod29yZEJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLQkJCVN0cmluZyB3b3JkID0gd29yZEJ1ZmZlci50b1N0cmluZygpOwotCQkJaW50IHdvcmRXaWR0aCA9IGdjLnN0cmluZ0V4dGVudCh3b3JkKS54OwotCQkJaWYgKHggKyB3b3JkV2lkdGggPiByaWdodE1hcmdpbikgewotCQkJCS8qIHdvcmQgZG9lc24ndCBmaXQgb24gY3VycmVudCBsaW5lLCBzbyB3cmFwICovCi0JCQkJbmV3bGluZSgpOwotCQkJfQotCQkJZ2MuZHJhd1N0cmluZyh3b3JkLCB4LCB5LCBmYWxzZSk7Ci0JCQl4ICs9IHdvcmRXaWR0aDsKLQkJCXdvcmRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIG5ld2xpbmUoKSB7Ci0JCXggPSBsZWZ0TWFyZ2luOwotCQl5ICs9IGxpbmVIZWlnaHQ7Ci0JCWlmICh5ICsgbGluZUhlaWdodCA+IGJvdHRvbU1hcmdpbikgewotCQkJcHJpbnRlci5lbmRQYWdlKCk7Ci0JCQlpZiAoaW5kZXggKyAxIDwgZW5kKSB7Ci0JCQkJeSA9IHRvcE1hcmdpbjsKLQkJCQlwcmludGVyLnN0YXJ0UGFnZSgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGQ4MTlhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBub24tcmVjdGFuZ3VsYXIgd2luZG93Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzQgewotCi1zdGF0aWMgaW50W10gY2lyY2xlKGludCByLCBpbnQgb2Zmc2V0WCwgaW50IG9mZnNldFkpIHsKLQlpbnRbXSBwb2x5Z29uID0gbmV3IGludFs4ICogciArIDRdOwotCS8veF4yICsgeV4yID0gcl4yCi0JZm9yIChpbnQgaSA9IDA7IGkgPCAyICogciArIDE7IGkrKykgewotCQlpbnQgeCA9IGkgLSByOwotCQlpbnQgeSA9IChpbnQpTWF0aC5zcXJ0KHIqciAtIHgqeCk7Ci0JCXBvbHlnb25bMippXSA9IG9mZnNldFggKyB4OwotCQlwb2x5Z29uWzIqaSsxXSA9IG9mZnNldFkgKyB5OwotCQlwb2x5Z29uWzgqciAtIDIqaSAtIDJdID0gb2Zmc2V0WCArIHg7Ci0JCXBvbHlnb25bOCpyIC0gMippIC0gMV0gPSBvZmZzZXRZIC0geTsKLQl9Ci0JcmV0dXJuIHBvbHlnb247Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCS8vU2hlbGwgbXVzdCBiZSBjcmVhdGVkIHdpdGggc3R5bGUgU1dULk5PX1RSSU0KLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSB8IFNXVC5PTl9UT1ApOwotCXNoZWxsLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JLy9kZWZpbmUgYSByZWdpb24gdGhhdCBsb29rcyBsaWtlIGEga2V5IGhvbGUKLQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCXJlZ2lvbi5hZGQoY2lyY2xlKDY3LCA2NywgNjcpKTsKLQlyZWdpb24uc3VidHJhY3QoY2lyY2xlKDIwLCA2NywgNTApKTsKLQlyZWdpb24uc3VidHJhY3QobmV3IGludFtdezY3LCA1MCwgNTUsIDEwNSwgNzksIDEwNX0pOwotCS8vZGVmaW5lIHRoZSBzaGFwZSBvZiB0aGUgc2hlbGwgdXNpbmcgc2V0UmVnaW9uCi0Jc2hlbGwuc2V0UmVnaW9uKHJlZ2lvbik7Ci0JUmVjdGFuZ2xlIHNpemUgPSByZWdpb24uZ2V0Qm91bmRzKCk7Ci0Jc2hlbGwuc2V0U2l6ZShzaXplLndpZHRoLCBzaXplLmhlaWdodCk7Ci0JLy9hZGQgYWJpbGl0eSB0byBtb3ZlIHNoZWxsIGFyb3VuZAotCUxpc3RlbmVyIGwgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCVBvaW50IG9yaWdpbjsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJc3dpdGNoIChlLnR5cGUpIHsKLQkJCQljYXNlIFNXVC5Nb3VzZURvd246Ci0JCQkJCW9yaWdpbiA9IG5ldyBQb2ludChlLngsIGUueSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlVXA6Ci0JCQkJCW9yaWdpbiA9IG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlTW92ZToKLQkJCQkJaWYgKG9yaWdpbiAhPSBudWxsKSB7Ci0JCQkJCQlQb2ludCBwID0gZGlzcGxheS5tYXAoc2hlbGwsIG51bGwsIGUueCwgZS55KTsKLQkJCQkJCXNoZWxsLnNldExvY2F0aW9uKHAueCAtIG9yaWdpbi54LCBwLnkgLSBvcmlnaW4ueSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIGwpOwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5Nb3VzZVVwLCBsKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VNb3ZlLCBsKTsKLQkvL2FkZCBhYmlsaXR5IHRvIGNsb3NlIHNoZWxsCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRCYWNrZ3JvdW5kKHNoZWxsLmdldEJhY2tncm91bmQoKSk7Ci0JYi5zZXRUZXh0KCJjbG9zZSIpOwotCWIucGFjaygpOwotCWIuc2V0TG9jYXRpb24oMTAsIDY4KTsKLQliLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJc2hlbGwuY2xvc2UoKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCXJlZ2lvbi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOGY3MTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogZXhhbXBsZSBzbmlwcGV0OiBlbWJlZCBTd2luZy9BV1QgaW4gU1dUCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmF3dC5TV1RfQVdUOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzNSB7Ci0KLQlzdGF0aWMgY2xhc3MgRmlsZVRhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgewkJCi0JCUZpbGVbXSBmaWxlczsgICAgICAgIAotCQlTdHJpbmdbXSBjb2x1bW5zTmFtZSA9IHsiTmFtZSIsICJTaXplIiwgIkRhdGUgTW9kaWZpZWQifTsKLQkJCi0JCXB1YmxpYyBGaWxlVGFibGVNb2RlbCAoRmlsZVtdIGZpbGVzKSB7Ci0JCQl0aGlzLmZpbGVzID0gZmlsZXM7Ci0JCX0KLQkJcHVibGljIGludCBnZXRDb2x1bW5Db3VudCAoKSB7Ci0JCQlyZXR1cm4gY29sdW1uc05hbWUubGVuZ3RoOwotCQl9Ci0JCXB1YmxpYyBDbGFzcyBnZXRDb2x1bW5DbGFzcyAoaW50IGNvbCkgewotCQkJaWYgKGNvbCA9PSAxKSByZXR1cm4gTG9uZy5jbGFzczsKLQkJCWlmIChjb2wgPT0gMikgcmV0dXJuIERhdGUuY2xhc3M7Ci0JCQlyZXR1cm4gU3RyaW5nLmNsYXNzOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0Um93Q291bnQgKCkgewotCQkJcmV0dXJuIGZpbGVzID09IG51bGwgPyAwIDogZmlsZXMubGVuZ3RoOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdCAoaW50IHJvdywgaW50IGNvbCkgewotCQkJaWYgKGNvbCA9PSAwKSByZXR1cm4gZmlsZXNbcm93XS5nZXROYW1lKCk7Ci0JCQlpZiAoY29sID09IDEpIHJldHVybiBuZXcgTG9uZyhmaWxlc1tyb3ddLmxlbmd0aCgpKTsKLQkJCWlmIChjb2wgPT0gMikgcmV0dXJuIG5ldyBEYXRlKGZpbGVzW3Jvd10ubGFzdE1vZGlmaWVkKCkpOwotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZSAoaW50IGNvbCkgewotCQkJcmV0dXJuIGNvbHVtbnNOYW1lW2NvbF07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJTV1QgYW5kIFN3aW5nL0FXVCBFeGFtcGxlIik7Ci0KLQkJTGlzdGVuZXIgZXhpdExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5PSyB8IFNXVC5DQU5DRUwgfCBTV1QuSUNPTl9RVUVTVElPTik7Ci0JCQkJZGlhbG9nLnNldFRleHQoIlF1ZXN0aW9uIik7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoIkV4aXQ/Iik7Ci0JCQkJaWYgKGUudHlwZSA9PSBTV1QuQ2xvc2UpIGUuZG9pdCA9IGZhbHNlOwotCQkJCWlmIChkaWFsb2cub3BlbigpICE9IFNXVC5PSykgcmV0dXJuOwotCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfTsJCi0JCUxpc3RlbmVyIGFib3V0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZmluYWwgU2hlbGwgcyA9IG5ldyBTaGVsbChzaGVsbCwgU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJCQlzLnNldFRleHQoIkFib3V0Iik7Ci0JCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDIwOwotCQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSBsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJCQlzLnNldExheW91dChsYXlvdXQpOwotCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHMsIFNXVC5OT05FKTsKLQkJCQlsYWJlbC5zZXRUZXh0KCJTV1QgYW5kIEFXVCBFeGFtcGxlLiIpOwotCQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHMsIFNXVC5QVVNIKTsKLQkJCQlidXR0b24uc2V0VGV4dCgiT0siKTsKLQkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotCQkJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlzLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXMucGFjaygpOwotCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBzaGVsbC5nZXRCb3VuZHMoKTsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gcy5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgeCA9IHBhcmVudEJvdW5kcy54ICsgKHBhcmVudEJvdW5kcy53aWR0aCAtIGJvdW5kcy53aWR0aCkgLyAyOwotCQkJCWludCB5ID0gcGFyZW50Qm91bmRzLnkgKyAocGFyZW50Qm91bmRzLmhlaWdodCAtIGJvdW5kcy5oZWlnaHQpIC8gMjsKLQkJCQlzLnNldExvY2F0aW9uKHgsIHkpOwotCQkJCXMub3BlbigpOwotCQkJCXdoaWxlICghcy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIGV4aXRMaXN0ZW5lcik7Ci0JCU1lbnUgbWIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCU1lbnVJdGVtIGZpbGVJdGVtID0gbmV3IE1lbnVJdGVtKG1iLCBTV1QuQ0FTQ0FERSk7Ci0JCWZpbGVJdGVtLnNldFRleHQoIiZGaWxlIik7Ci0JCU1lbnUgZmlsZU1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JCWZpbGVJdGVtLnNldE1lbnUoZmlsZU1lbnUpOwotCQlNZW51SXRlbSBleGl0SXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlleGl0SXRlbS5zZXRUZXh0KCImRXhpdFx0Q3RybCtYIik7Ci0JCWV4aXRJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5DT05UUk9MICsgJ1gnKTsKLQkJZXhpdEl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgZXhpdExpc3RlbmVyKTsKLQkJTWVudUl0ZW0gYWJvdXRJdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWFib3V0SXRlbS5zZXRUZXh0KCImQWJvdXRcdEN0cmwrQSIpOwotCQlhYm91dEl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULkNPTlRST0wgKyAnQScpOwotCQlhYm91dEl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgYWJvdXRMaXN0ZW5lcik7Ci0JCXNoZWxsLnNldE1lbnVCYXIobWIpOwotCi0JCVJHQiBjb2xvciA9IHNoZWxsLmdldEJhY2tncm91bmQoKS5nZXRSR0IoKTsKLQkJTGFiZWwgc2VwYXJhdG9yMSA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJTGFiZWwgbG9jYXRpb25MYiA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlsb2NhdGlvbkxiLnNldFRleHQoIkxvY2F0aW9uOiIpOwotCQlDb21wb3NpdGUgbG9jYXRpb25Db21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULkVNQkVEREVEKTsKLQkJVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIFNXVC5GTEFUKTsKLQkJVG9vbEl0ZW0gZXhpdFRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJZXhpdFRvb2xJdGVtLnNldFRleHQoIiZFeGl0Iik7Ci0JCWV4aXRUb29sSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBleGl0TGlzdGVuZXIpOwotCQlUb29sSXRlbSBhYm91dFRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJYWJvdXRUb29sSXRlbS5zZXRUZXh0KCImQWJvdXQiKTsKLQkJYWJvdXRUb29sSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBhYm91dExpc3RlbmVyKTsKLQkJTGFiZWwgc2VwYXJhdG9yMiA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJZmluYWwgQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWZpbmFsIFRyZWUgZmlsZVRyZWUgPSBuZXcgVHJlZShjb21wLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCVNhc2ggc2FzaCA9IG5ldyBTYXNoKGNvbXAsIFNXVC5WRVJUSUNBTCk7Ci0JCUNvbXBvc2l0ZSB0YWJsZUNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXAsIFNXVC5FTUJFRERFRCk7Ci0JCUxhYmVsIHNlcGFyYXRvcjMgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUNvbXBvc2l0ZSBzdGF0dXNDb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULkVNQkVEREVEKTsKLQotCQlqYXZhLmF3dC5GcmFtZSBsb2NhdGlvbkZyYW1lID0gU1dUX0FXVC5uZXdfRnJhbWUobG9jYXRpb25Db21wKTsKLQkJZmluYWwgamF2YS5hd3QuVGV4dEZpZWxkIGxvY2F0aW9uVGV4dCA9IG5ldyBqYXZhLmF3dC5UZXh0RmllbGQoKTsKLQkJbG9jYXRpb25GcmFtZS5hZGQobG9jYXRpb25UZXh0KTsKLQotCQlqYXZhLmF3dC5GcmFtZSBmaWxlVGFibGVGcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKHRhYmxlQ29tcCk7Ci0JCWphdmEuYXd0LlBhbmVsIHBhbmVsID0gbmV3IGphdmEuYXd0LlBhbmVsKG5ldyBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQoKSk7Ci0JCWZpbGVUYWJsZUZyYW1lLmFkZChwYW5lbCk7Ci0JCWZpbmFsIEpUYWJsZSBmaWxlVGFibGUgPSBuZXcgSlRhYmxlKG5ldyBGaWxlVGFibGVNb2RlbChudWxsKSk7Ci0JCWZpbGVUYWJsZS5zZXREb3VibGVCdWZmZXJlZCh0cnVlKTsKLQkJZmlsZVRhYmxlLnNldFNob3dHcmlkKGZhbHNlKTsKLQkJZmlsZVRhYmxlLmNyZWF0ZURlZmF1bHRDb2x1bW5zRnJvbU1vZGVsKCk7Ci0JCUpTY3JvbGxQYW5lIHNjcm9sbFBhbmUgPSBuZXcgSlNjcm9sbFBhbmUoZmlsZVRhYmxlKTsKLQkJcGFuZWwuYWRkKHNjcm9sbFBhbmUpOwotCi0JCWphdmEuYXd0LkZyYW1lIHN0YXR1c0ZyYW1lID0gU1dUX0FXVC5uZXdfRnJhbWUoc3RhdHVzQ29tcCk7Ci0JCXN0YXR1c0ZyYW1lLnNldEJhY2tncm91bmQobmV3IGphdmEuYXd0LkNvbG9yKGNvbG9yLnJlZCwgY29sb3IuZ3JlZW4sIGNvbG9yLmJsdWUpKTsKLQkJZmluYWwgamF2YS5hd3QuTGFiZWwgc3RhdHVzTGFiZWwgPSBuZXcgamF2YS5hd3QuTGFiZWwoKTsKLQkJc3RhdHVzRnJhbWUuYWRkKHN0YXR1c0xhYmVsKTsKLQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiU2VsZWN0IGEgZmlsZSIpOwotCi0JCXNhc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuRFJBRykgcmV0dXJuOwotCQkJCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpZmlsZVRyZWUuZ2V0TGF5b3V0RGF0YSgpOwotCQkJCVJlY3RhbmdsZSB0cmltID0gZmlsZVRyZWUuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0JCQkJZGF0YS53aWR0aEhpbnQgPSBlLnggLSB0cmltLndpZHRoOwotCQkJCWNvbXAubGF5b3V0KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUZpbGVbXSByb290cyA9IEZpbGUubGlzdFJvb3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgZmlsZSA9IHJvb3RzW2ldOwotCQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSBuZXcgVHJlZUl0ZW0oZmlsZVRyZWUsIFNXVC5OT05FKTsKLQkJCXRyZWVJdGVtLnNldFRleHQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl0cmVlSXRlbS5zZXREYXRhKGZpbGUpOwotCQkJbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTk9ORSk7Ci0JCX0KLQkJZmlsZVRyZWUuYWRkTGlzdGVuZXIoU1dULkV4cGFuZCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZS5pdGVtOwotCQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCQlpZiAoaXRlbS5nZXRJdGVtQ291bnQoKSA9PSAxKSB7Ci0JCQkJCVRyZWVJdGVtIGZpcnN0SXRlbSA9IGl0ZW0uZ2V0SXRlbXMoKVswXTsKLQkJCQkJaWYgKGZpcnN0SXRlbS5nZXREYXRhKCkgIT0gbnVsbCkgcmV0dXJuOwotCQkJCQlmaXJzdEl0ZW0uZGlzcG9zZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJRmlsZSByb290ID0gKEZpbGUpaXRlbS5nZXREYXRhKCk7Ci0JCQkJRmlsZVtdIGZpbGVzID0gcm9vdC5saXN0RmlsZXMoKTsKLQkJCQlpZiAoZmlsZXMgPT0gbnVsbCkgcmV0dXJuOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJRmlsZSBmaWxlID0gZmlsZXNbaV07Ci0JCQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJCXRyZWVJdGVtLnNldFRleHQoZmlsZS5nZXROYW1lKCkpOwotCQkJCQkJdHJlZUl0ZW0uc2V0RGF0YShmaWxlKTsKLQkJCQkJCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJZmlsZVRyZWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZS5pdGVtOwotCQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCQlmaW5hbCBGaWxlIHJvb3QgPSAoRmlsZSlpdGVtLmdldERhdGEoKTsKLQkJCQlFdmVudFF1ZXVlLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc3RhdHVzTGFiZWwuc2V0VGV4dChyb290LmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCWxvY2F0aW9uVGV4dC5zZXRUZXh0KHJvb3QuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQkJZmlsZVRhYmxlLnNldE1vZGVsKG5ldyBGaWxlVGFibGVNb2RlbChyb290Lmxpc3RGaWxlcygpKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxOwotCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YTsJCQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQlzZXBhcmF0b3IxLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlsb2NhdGlvbkxiLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGxvY2F0aW9uVGV4dC5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQlsb2NhdGlvbkNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJdG9vbEJhci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQlzZXBhcmF0b3IyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJc2VwYXJhdG9yMy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQlkYXRhLmhlaWdodEhpbnQgPSBzdGF0dXNMYWJlbC5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQlzdGF0dXNDb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsJCQkKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0JCWZpbGVUcmVlLnNldExheW91dERhdGEoZGF0YSk7CQkKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJc2FzaC5zZXRMYXlvdXREYXRhKGRhdGEpOwkJCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJdGFibGVDb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNmZjZWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiByZW5kZXIgSFRNTCBmcm9tIG1lbW9yeQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTM2IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlTdHJpbmcgaHRtbCA9ICI8SFRNTD48SEVBRD48VElUTEU+SFRNTCBUZXN0PC9USVRMRT48L0hFQUQ+PEJPRFk+IjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgaHRtbCArPSAiPFA+VGhpcyBpcyBsaW5lICIraSsiPC9QPiI7Ci0JCWh0bWwgKz0gIjwvQk9EWT48L0hUTUw+IjsKLQotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlicm93c2VyLnNldFRleHQoaHRtbCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM1OTlkOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IHJlbmRlciBIVE1MIHRoYXQgaW5jbHVkZXMgcmVsYXRpdmUgbGlua3MgZnJvbSBtZW1vcnkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JLyogUmVsYXRpdmUgbGlua3M6IHVzZSB0aGUgSFRNTCBiYXNlIHRhZyAqLwotCVN0cmluZyBodG1sID0gIjxodG1sPjxoZWFkPiIrCi0JCSI8YmFzZSBocmVmPVwiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QvXCIgPiIrCi0JCSI8dGl0bGU+SFRNTCBUZXN0PC90aXRsZT48L2hlYWQ+IisKLQkJIjxib2R5PjxhIGhyZWY9XCJmYXEucGhwXCI+bG9jYWwgbGluazwvYT48L2JvZHk+PC9odG1sPiI7Ci0KLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuc2V0VGV4dChodG1sKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0ZWNjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogc2V0IGljb25zIHdpdGggZGlmZmVyZW50IHJlc29sdXRpb25zCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzggewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJCi0JCUltYWdlIHNtYWxsID0gbmV3IEltYWdlKGRpc3BsYXksIDE2LCAxNik7Ci0JCUdDIGdjID0gbmV3IEdDKHNtYWxsKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJZ2MuZmlsbEFyYygwLCAwLCAxNiwgMTYsIDQ1LCAyNzApOwotCQlnYy5kaXNwb3NlKCk7Ci0JCQotCQlJbWFnZSBsYXJnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAzMiwgMzIpOwotCQlnYyA9IG5ldyBHQyhsYXJnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCWdjLmZpbGxBcmMoMCwgMCwgMzIsIDMyLCA0NSwgMjcwKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQkKLQkJLyogUHJvdmlkZSBkaWZmZXJlbnQgcmVzb2x1dGlvbnMgZm9yIGljb25zIHRvIGdldAotCQkgKiBoaWdoIHF1YWxpdHkgcmVuZGVyaW5nIHdoZXJldmVyIHRoZSBPUyBuZWVkcyAKLQkJICogbGFyZ2UgaWNvbnMuIEZvciBleGFtcGxlLCB0aGUgQUxUK1RBQiB3aW5kb3cgCi0JCSAqIG9uIGNlcnRhaW4gc3lzdGVtcyB1c2VzIGEgbGFyZ2VyIGljb24uCi0JCSAqLwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiU21hbGwgYW5kIExhcmdlIGljb25zIik7Ci0JCXNoZWxsLnNldEltYWdlcyhuZXcgSW1hZ2VbXSB7c21hbGwsIGxhcmdlfSk7Ci0KLQkJLyogTm8gbGFyZ2UgaWNvbjogdGhlIE9TIHdpbGwgc2NhbGUgdXAgdGhlCi0JCSAqIHNtYWxsIGljb24gd2hlbiBpdCBuZWVkcyBhIGxhcmdlIG9uZS4KLQkJICovCi0JCVNoZWxsIHNoZWxsMiA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwyLnNldFRleHQoIlNtYWxsIGljb24iKTsKLQkJc2hlbGwyLnNldEltYWdlKHNtYWxsKTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJc2hlbGwyLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzUxZjc1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRoaXMgc25pcHBldCB3YXMgYWRhcHRlZCBmcm9tIG9yZy5lY2xpcHNlLmRyYXcyZC5JbWFnZVV0aWxpdGllcyBpbiAKLSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuZHJhdzJkLz9jdnNyb290PVRvb2xzX1Byb2plY3QKLSAqIGJ5IFByYXRpayBTaGFoLgotICoKLSAqIGV4YW1wbGUgc25pcHBldDogcm90YXRlIGFuZCBmbGlwIGFuIGltYWdlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzOSB7CQotCi1zdGF0aWMgSW1hZ2VEYXRhIHJvdGF0ZShJbWFnZURhdGEgc3JjRGF0YSwgaW50IGRpcmVjdGlvbikgewotCWludCBieXRlc1BlclBpeGVsID0gc3JjRGF0YS5ieXRlc1BlckxpbmUgLyBzcmNEYXRhLndpZHRoOwotCWludCBkZXN0Qnl0ZXNQZXJMaW5lID0gKGRpcmVjdGlvbiA9PSBTV1QuRE9XTik/IHNyY0RhdGEud2lkdGggKiBieXRlc1BlclBpeGVsIDogc3JjRGF0YS5oZWlnaHQgKiBieXRlc1BlclBpeGVsOwotCWJ5dGVbXSBuZXdEYXRhID0gbmV3IGJ5dGVbKGRpcmVjdGlvbiA9PSBTV1QuRE9XTik/IHNyY0RhdGEuaGVpZ2h0ICogZGVzdEJ5dGVzUGVyTGluZSA6IHNyY0RhdGEud2lkdGggKiBkZXN0Qnl0ZXNQZXJMaW5lXTsKLQlpbnQgd2lkdGggPSAwLCBoZWlnaHQgPSAwOwotCWZvciAoaW50IHNyY1kgPSAwOyBzcmNZIDwgc3JjRGF0YS5oZWlnaHQ7IHNyY1krKykgewotCQlmb3IgKGludCBzcmNYID0gMDsgc3JjWCA8IHNyY0RhdGEud2lkdGg7IHNyY1grKykgewotCQkJaW50IGRlc3RYID0gMCwgZGVzdFkgPSAwLCBkZXN0SW5kZXggPSAwLCBzcmNJbmRleCA9IDA7Ci0JCQlzd2l0Y2ggKGRpcmVjdGlvbil7Ci0JCQkJY2FzZSBTV1QuTEVGVDogLy8gbGVmdCA5MCBkZWdyZWVzCi0JCQkJCWRlc3RYID0gc3JjWTsKLQkJCQkJZGVzdFkgPSBzcmNEYXRhLndpZHRoIC0gc3JjWCAtIDE7Ci0JCQkJCXdpZHRoID0gc3JjRGF0YS5oZWlnaHQ7Ci0JCQkJCWhlaWdodCA9IHNyY0RhdGEud2lkdGg7IAotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5SSUdIVDogLy8gcmlnaHQgOTAgZGVncmVlcwotCQkJCQlkZXN0WCA9IHNyY0RhdGEuaGVpZ2h0IC0gc3JjWSAtIDE7Ci0JCQkJCWRlc3RZID0gc3JjWDsKLQkJCQkJd2lkdGggPSBzcmNEYXRhLmhlaWdodDsKLQkJCQkJaGVpZ2h0ID0gc3JjRGF0YS53aWR0aDsgCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULkRPV046IC8vIDE4MCBkZWdyZWVzCi0JCQkJCWRlc3RYID0gc3JjRGF0YS53aWR0aCAtIHNyY1ggLSAxOwotCQkJCQlkZXN0WSA9IHNyY0RhdGEuaGVpZ2h0IC0gc3JjWSAtIDE7Ci0JCQkJCXdpZHRoID0gc3JjRGF0YS53aWR0aDsKLQkJCQkJaGVpZ2h0ID0gc3JjRGF0YS5oZWlnaHQ7IAotCQkJCQlicmVhazsKLQkJCX0KLQkJCWRlc3RJbmRleCA9IChkZXN0WSAqIGRlc3RCeXRlc1BlckxpbmUpICsgKGRlc3RYICogYnl0ZXNQZXJQaXhlbCk7Ci0JCQlzcmNJbmRleCA9IChzcmNZICogc3JjRGF0YS5ieXRlc1BlckxpbmUpICsgKHNyY1ggKiBieXRlc1BlclBpeGVsKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3JjRGF0YS5kYXRhLCBzcmNJbmRleCwgbmV3RGF0YSwgZGVzdEluZGV4LCBieXRlc1BlclBpeGVsKTsKLQkJfQotCX0KLQkvLyBkZXN0Qnl0ZXNQZXJMaW5lIGlzIHVzZWQgYXMgc2NhbmxpbmVQYWQgdG8gZW5zdXJlIHRoYXQgbm8gcGFkZGluZyBpcyByZXF1aXJlZAotCXJldHVybiBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQsIHNyY0RhdGEuZGVwdGgsIHNyY0RhdGEucGFsZXR0ZSwgZGVzdEJ5dGVzUGVyTGluZSwgbmV3RGF0YSk7Ci19Ci1zdGF0aWMgSW1hZ2VEYXRhIGZsaXAoSW1hZ2VEYXRhIHNyY0RhdGEsIGJvb2xlYW4gdmVydGljYWwpIHsKLQlpbnQgYnl0ZXNQZXJQaXhlbCA9IHNyY0RhdGEuYnl0ZXNQZXJMaW5lIC8gc3JjRGF0YS53aWR0aDsKLQlpbnQgZGVzdEJ5dGVzUGVyTGluZSA9IHNyY0RhdGEud2lkdGggKiBieXRlc1BlclBpeGVsOwotCWJ5dGVbXSBuZXdEYXRhID0gbmV3IGJ5dGVbc3JjRGF0YS5kYXRhLmxlbmd0aF07Ci0JZm9yIChpbnQgc3JjWSA9IDA7IHNyY1kgPCBzcmNEYXRhLmhlaWdodDsgc3JjWSsrKSB7Ci0JCWZvciAoaW50IHNyY1ggPSAwOyBzcmNYIDwgc3JjRGF0YS53aWR0aDsgc3JjWCsrKSB7Ci0JCQlpbnQgZGVzdFggPSAwLCBkZXN0WSA9IDAsIGRlc3RJbmRleCA9IDAsIHNyY0luZGV4ID0gMDsKLQkJCWlmICh2ZXJ0aWNhbCl7Ci0JCQkJZGVzdFggPSBzcmNYOwotCQkJCWRlc3RZID0gc3JjRGF0YS5oZWlnaHQgLSBzcmNZIC0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVzdFggPSBzcmNEYXRhLndpZHRoIC0gc3JjWCAtIDE7Ci0JCQkJZGVzdFkgPSBzcmNZOyAKLQkJCX0KLQkJCWRlc3RJbmRleCA9IChkZXN0WSAqIGRlc3RCeXRlc1BlckxpbmUpICsgKGRlc3RYICogYnl0ZXNQZXJQaXhlbCk7Ci0JCQlzcmNJbmRleCA9IChzcmNZICogc3JjRGF0YS5ieXRlc1BlckxpbmUpICsgKHNyY1ggKiBieXRlc1BlclBpeGVsKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3JjRGF0YS5kYXRhLCBzcmNJbmRleCwgbmV3RGF0YSwgZGVzdEluZGV4LCBieXRlc1BlclBpeGVsKTsKLQkJfQotCX0KLQkvLyBkZXN0Qnl0ZXNQZXJMaW5lIGlzIHVzZWQgYXMgc2NhbmxpbmVQYWQgdG8gZW5zdXJlIHRoYXQgbm8gcGFkZGluZyBpcyByZXF1aXJlZAotCXJldHVybiBuZXcgSW1hZ2VEYXRhKHNyY0RhdGEud2lkdGgsIHNyY0RhdGEuaGVpZ2h0LCBzcmNEYXRhLmRlcHRoLCBzcmNEYXRhLnBhbGV0dGUsIGRlc3RCeXRlc1BlckxpbmUsIG5ld0RhdGEpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkKLQkvLyBjcmVhdGUgYW4gaW1hZ2Ugd2l0aCB0aGUgd29yZCAiaGVsbG8iIG9uIGl0Ci0JZmluYWwgSW1hZ2UgaW1hZ2UwID0gbmV3IEltYWdlKGRpc3BsYXksIDUwLCAzMCk7Ci0JR0MgZ2MgPSBuZXcgR0MoaW1hZ2UwKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCWdjLmZpbGxSZWN0YW5nbGUoaW1hZ2UwLmdldEJvdW5kcygpKTsKLQlnYy5kcmF3U3RyaW5nKCJoZWxsbyIsCTUsIDUsIHRydWUpOwotCWdjLmRpc3Bvc2UoKTsKLQkKLQlJbWFnZURhdGEgZGF0YSA9IGltYWdlMC5nZXRJbWFnZURhdGEoKTsKLQkvLyByb3RhdGUgYW5kIGZsaXAgdGhpcyBpbWFnZQotCWZpbmFsIEltYWdlIGltYWdlMSA9IG5ldyBJbWFnZShkaXNwbGF5LCByb3RhdGUoZGF0YSwgU1dULkxFRlQpKTsKLQlmaW5hbCBJbWFnZSBpbWFnZTIgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcm90YXRlKGRhdGEsIFNXVC5SSUdIVCkpOwotCWZpbmFsIEltYWdlIGltYWdlMyA9IG5ldyBJbWFnZShkaXNwbGF5LCByb3RhdGUoZGF0YSwgU1dULkRPV04pKTsKLQlmaW5hbCBJbWFnZSBpbWFnZTQgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZmxpcChkYXRhLCB0cnVlKSk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2U1ID0gbmV3IEltYWdlKGRpc3BsYXksIGZsaXAoZGF0YSwgZmFsc2UpKTsKLQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCS8vIGRyYXcgdGhlIHJlc3VsdHMgb24gdGhlIHNoZWxsCi0Jc2hlbGwuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQllLmdjLmRyYXdUZXh0KCJPcmlnaW5hbCBJbWFnZToiLCAxMCwgMTAsIHRydWUpOwotCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UwLCAxMCwgNDApOwotCQkJZS5nYy5kcmF3VGV4dCgiTGVmdCwgUmlnaHQsIDE4MDoiLCAxMCwgODAsIHRydWUpOwotCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UxLCAxMCwgMTEwKTsKLQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlMiwgNTAsIDExMCk7Ci0JCQllLmdjLmRyYXdJbWFnZShpbWFnZTMsIDkwLCAxMTApOwotCQkJZS5nYy5kcmF3VGV4dCgiRmxpcHBlZCBWZXJ0aWNhbCwgSG9yaXpvbnRhbDoiLCAxMCwgMTcwLCB0cnVlKTsKLQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlNCwgMTAsIDIwMCk7Ci0JCQllLmdjLmRyYXdJbWFnZShpbWFnZTUsIDcwLCAyMDApOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JaW1hZ2UwLmRpc3Bvc2UoKTsKLQlpbWFnZTEuZGlzcG9zZSgpOwotCWltYWdlMi5kaXNwb3NlKCk7Ci0JaW1hZ2UzLmRpc3Bvc2UoKTsKLQlpbWFnZTQuZGlzcG9zZSgpOwotCWltYWdlNS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjZjNmJhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDb250cm9sIGV4YW1wbGUgc25pcHBldDogZGV0ZWN0IG1vdXNlIGVudGVyLCBleGl0IGFuZCBob3ZlciBldmVudHMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRTaXplICgxMDAsIDEwMCk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZUVudGVyLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRU5URVIiKTsKLQkJfQotCX0pOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VFeGl0LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRVhJVCIpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZUhvdmVyLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiSE9WRVIiKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzZThjYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogQ29vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGRyb3AtZG93biBhIGNoZXZyb24gbWVudSBjb250YWluaW5nIGhpZGRlbiB0b29sIGl0ZW1zCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDAgewotCXN0YXRpYyBEaXNwbGF5IGRpc3BsYXk7Ci0Jc3RhdGljIFNoZWxsIHNoZWxsOwotCXN0YXRpYyBDb29sQmFyIGNvb2xCYXI7Ci0Jc3RhdGljIE1lbnUgY2hldnJvbk1lbnUgPSBudWxsOwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCXNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCBTV1QuRkxBVCB8IFNXVC5CT1JERVIpOwotCWNvb2xCYXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIoY29vbEJhciwgU1dULkZMQVQgfCBTV1QuV1JBUCk7Ci0JaW50IG1pbldpZHRoID0gMDsKLQlmb3IgKGludCBqID0gMDsgaiA8IDU7IGorKykgewotCQlpbnQgd2lkdGggPSAwOwotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCJCIiArIGopOwotCQl3aWR0aCA9IGl0ZW0uZ2V0V2lkdGgoKTsKLQkJLyogZmluZCB0aGUgd2lkdGggb2YgdGhlIHdpZGVzdCB0b29sICovCi0JCWlmICh3aWR0aCA+IG1pbldpZHRoKSBtaW5XaWR0aCA9IHdpZHRoOwotCX0KLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQljb29sSXRlbS5zZXRDb250cm9sKHRvb2xCYXIpOwotCVBvaW50IHNpemUgPSB0b29sQmFyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JUG9pbnQgY29vbFNpemUgPSBjb29sSXRlbS5jb21wdXRlU2l6ZSAoc2l6ZS54LCBzaXplLnkpOwotCWNvb2xJdGVtLnNldE1pbmltdW1TaXplKG1pbldpZHRoLCBjb29sU2l6ZS55KTsKLQljb29sSXRlbS5zZXRQcmVmZXJyZWRTaXplKGNvb2xTaXplKTsKLQljb29sSXRlbS5zZXRTaXplKGNvb2xTaXplKTsKLQljb29sSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gU1dULkFSUk9XKSB7Ci0JCQkJQ29vbEl0ZW0gaXRlbSA9IChDb29sSXRlbSkgZXZlbnQud2lkZ2V0OwotCQkJCVJlY3RhbmdsZSBpdGVtQm91bmRzID0gaXRlbS5nZXRCb3VuZHMgKCk7Ci0JCQkJUG9pbnQgcHQgPSBjb29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQoaXRlbUJvdW5kcy54LCBpdGVtQm91bmRzLnkpKTsKLQkJCQlpdGVtQm91bmRzLnggPSBwdC54OwotCQkJCWl0ZW1Cb3VuZHMueSA9IHB0Lnk7Ci0JCQkJVG9vbEJhciBiYXIgPSAoVG9vbEJhcikgaXRlbS5nZXRDb250cm9sICgpOwotCQkJCVRvb2xJdGVtW10gdG9vbHMgPSBiYXIuZ2V0SXRlbXMgKCk7Ci0JCQkJCi0JCQkJaW50IGkgPSAwOwotCQkJCXdoaWxlIChpIDwgdG9vbHMubGVuZ3RoKSB7Ci0JCQkJCVJlY3RhbmdsZSB0b29sQm91bmRzID0gdG9vbHNbaV0uZ2V0Qm91bmRzICgpOwotCQkJCQlwdCA9IGJhci50b0Rpc3BsYXkobmV3IFBvaW50KHRvb2xCb3VuZHMueCwgdG9vbEJvdW5kcy55KSk7Ci0JCQkJCXRvb2xCb3VuZHMueCA9IHB0Lng7Ci0JCQkJCXRvb2xCb3VuZHMueSA9IHB0Lnk7Ci0JCQkJCQotCQkJCQkvKiBGaWd1cmUgb3V0IHRoZSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlIHRvb2wgYnkgbG9va2luZyBhdCB0aGUKLQkJCQkJICogaW50ZXJzZWN0aW9uIG9mIHRoZSB0b29sIGJvdW5kcyB3aXRoIHRoZSBjb29sIGl0ZW0gYm91bmRzLiAqLwotCQkJICAJCVJlY3RhbmdsZSBpbnRlcnNlY3Rpb24gPSBpdGVtQm91bmRzLmludGVyc2VjdGlvbiAodG9vbEJvdW5kcyk7Ci0JCQkgIAkJCi0JCQkJCS8qIElmIHRoZSB0b29sIGlzIG5vdCBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgY29vbCBpdGVtIGJvdW5kcywgdGhlbiBpdAotCQkJCQkgKiBpcyBwYXJ0aWFsbHkgaGlkZGVuLCBhbmQgYWxsIHJlbWFpbmluZyB0b29scyBhcmUgY29tcGxldGVseSBoaWRkZW4uICovCi0JCQkgIAkJaWYgKCFpbnRlcnNlY3Rpb24uZXF1YWxzICh0b29sQm91bmRzKSkgYnJlYWs7Ci0JCQkgIAkJaSsrOwotCQkJCX0KLQkJCQkKLQkJCQkvKiBDcmVhdGUgYSBtZW51IHdpdGggaXRlbXMgZm9yIGVhY2ggb2YgdGhlIGNvbXBsZXRlbHkgaGlkZGVuIGJ1dHRvbnMuICovCi0JCQkJaWYgKGNoZXZyb25NZW51ICE9IG51bGwpIGNoZXZyb25NZW51LmRpc3Bvc2UoKTsKLQkJCQljaGV2cm9uTWVudSA9IG5ldyBNZW51IChjb29sQmFyKTsKLQkJCQlmb3IgKGludCBqID0gaTsgaiA8IHRvb2xzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCU1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IE1lbnVJdGVtIChjaGV2cm9uTWVudSwgU1dULlBVU0gpOwotCQkJCQltZW51SXRlbS5zZXRUZXh0ICh0b29sc1tqXS5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCQkKLQkJCQkvKiBEcm9wIGRvd24gdGhlIG1lbnUgYmVsb3cgdGhlIGNoZXZyb24sIHdpdGggdGhlIGxlZnQgZWRnZXMgYWxpZ25lZC4gKi8KLQkJCQlwdCA9IGNvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JCQkJY2hldnJvbk1lbnUuc2V0TG9jYXRpb24gKHB0LngsIHB0LnkpOwotCQkJCWNoZXZyb25NZW51LnNldFZpc2libGUgKHRydWUpOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWExZTZkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogSW1hZ2UgZXhhbXBsZSBzbmlwcGV0OiBkaXNwbGF5IGFuIGFuaW1hdGVkIEdJRgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0MSB7Ci0Jc3RhdGljIERpc3BsYXkgZGlzcGxheTsKLQlzdGF0aWMgU2hlbGwgc2hlbGw7Ci0Jc3RhdGljIEdDIHNoZWxsR0M7Ci0Jc3RhdGljIENvbG9yIHNoZWxsQmFja2dyb3VuZDsKLQlzdGF0aWMgSW1hZ2VMb2FkZXIgbG9hZGVyOwotCXN0YXRpYyBJbWFnZURhdGFbXSBpbWFnZURhdGFBcnJheTsKLQlzdGF0aWMgVGhyZWFkIGFuaW1hdGVUaHJlYWQ7Ci0Jc3RhdGljIEltYWdlIGltYWdlOwotCXN0YXRpYyBmaW5hbCBib29sZWFuIHVzZUdJRkJhY2tncm91bmQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0U2l6ZSgzMDAsIDMwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJc2hlbGxHQyA9IG5ldyBHQyhzaGVsbCk7Ci0JCXNoZWxsQmFja2dyb3VuZCA9IHNoZWxsLmdldEJhY2tncm91bmQoKTsKLQotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsKTsKLQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsiKi5naWYifSk7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQlsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJCXRyeSB7Ci0JCQkJaW1hZ2VEYXRhQXJyYXkgPSBsb2FkZXIubG9hZChmaWxlTmFtZSk7Ci0JCQkJaWYgKGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEpIHsKLQkJCQkJYW5pbWF0ZVRocmVhZCA9IG5ldyBUaHJlYWQoIkFuaW1hdGlvbiIpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkvKiBDcmVhdGUgYW4gb2ZmLXNjcmVlbiBpbWFnZSB0byBkcmF3IG9uLCBhbmQgZmlsbCBpdCB3aXRoIHRoZSBzaGVsbCBiYWNrZ3JvdW5kLiAqLwotCQkJCQkJCUltYWdlIG9mZlNjcmVlbkltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGgsIGxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0KTsKLQkJCQkJCQlHQyBvZmZTY3JlZW5JbWFnZUdDID0gbmV3IEdDKG9mZlNjcmVlbkltYWdlKTsKLQkJCQkJCQlvZmZTY3JlZW5JbWFnZUdDLnNldEJhY2tncm91bmQoc2hlbGxCYWNrZ3JvdW5kKTsKLQkJCQkJCQlvZmZTY3JlZW5JbWFnZUdDLmZpbGxSZWN0YW5nbGUoMCwgMCwgbG9hZGVyLmxvZ2ljYWxTY3JlZW5XaWR0aCwgbG9hZGVyLmxvZ2ljYWxTY3JlZW5IZWlnaHQpOwotCQkJCQkJCQkKLQkJCQkJCQl0cnkgewotCQkJCQkJCQkvKiBDcmVhdGUgdGhlIGZpcnN0IGltYWdlIGFuZCBkcmF3IGl0IG9uIHRoZSBvZmYtc2NyZWVuIGltYWdlLiAqLwotCQkJCQkJCQlpbnQgaW1hZ2VEYXRhSW5kZXggPSAwOwkKLQkJCQkJCQkJSW1hZ2VEYXRhIGltYWdlRGF0YSA9IGltYWdlRGF0YUFycmF5W2ltYWdlRGF0YUluZGV4XTsKLQkJCQkJCQkJaWYgKGltYWdlICE9IG51bGwgJiYgIWltYWdlLmlzRGlzcG9zZWQoKSkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJCQkJCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQkJCQkJCQlvZmZTY3JlZW5JbWFnZUdDLmRyYXdJbWFnZSgKLQkJCQkJCQkJCWltYWdlLAotCQkJCQkJCQkJMCwKLQkJCQkJCQkJCTAsCi0JCQkJCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJCQkJCQkJaW1hZ2VEYXRhLngsCi0JCQkJCQkJCQlpbWFnZURhdGEueSwKLQkJCQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCi0JCQkJCQkJCS8qIE5vdyBsb29wIHRocm91Z2ggdGhlIGltYWdlcywgY3JlYXRpbmcgYW5kIGRyYXdpbmcgZWFjaCBvbmUKLQkJCQkJCQkJICogb24gdGhlIG9mZi1zY3JlZW4gaW1hZ2UgYmVmb3JlIGRyYXdpbmcgaXQgb24gdGhlIHNoZWxsLiAqLwotCQkJCQkJCQlpbnQgcmVwZWF0Q291bnQgPSBsb2FkZXIucmVwZWF0Q291bnQ7Ci0JCQkJCQkJCXdoaWxlIChsb2FkZXIucmVwZWF0Q291bnQgPT0gMCB8fCByZXBlYXRDb3VudCA+IDApIHsKLQkJCQkJCQkJCXN3aXRjaCAoaW1hZ2VEYXRhLmRpc3Bvc2FsTWV0aG9kKSB7Ci0JCQkJCQkJCQljYXNlIFNXVC5ETV9GSUxMX0JBQ0tHUk9VTkQ6Ci0JCQkJCQkJCQkJLyogRmlsbCB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGJlZm9yZSBkcmF3aW5nLiAqLwotCQkJCQkJCQkJCUNvbG9yIGJnQ29sb3IgPSBudWxsOwotCQkJCQkJCQkJCWlmICh1c2VHSUZCYWNrZ3JvdW5kICYmIGxvYWRlci5iYWNrZ3JvdW5kUGl4ZWwgIT0gLTEpIHsKLQkJCQkJCQkJCQkJYmdDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCBpbWFnZURhdGEucGFsZXR0ZS5nZXRSR0IobG9hZGVyLmJhY2tncm91bmRQaXhlbCkpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlvZmZTY3JlZW5JbWFnZUdDLnNldEJhY2tncm91bmQoYmdDb2xvciAhPSBudWxsID8gYmdDb2xvciA6IHNoZWxsQmFja2dyb3VuZCk7Ci0JCQkJCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5maWxsUmVjdGFuZ2xlKGltYWdlRGF0YS54LCBpbWFnZURhdGEueSwgaW1hZ2VEYXRhLndpZHRoLCBpbWFnZURhdGEuaGVpZ2h0KTsKLQkJCQkJCQkJCQlpZiAoYmdDb2xvciAhPSBudWxsKSBiZ0NvbG9yLmRpc3Bvc2UoKTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgU1dULkRNX0ZJTExfUFJFVklPVVM6Ci0JCQkJCQkJCQkJLyogUmVzdG9yZSB0aGUgcHJldmlvdXMgaW1hZ2UgYmVmb3JlIGRyYXdpbmcuICovCi0JCQkJCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5kcmF3SW1hZ2UoCi0JCQkJCQkJCQkJCWltYWdlLAotCQkJCQkJCQkJCQkwLAotCQkJCQkJCQkJCQkwLAotCQkJCQkJCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJCQkJCQkJCWltYWdlRGF0YS54LAotCQkJCQkJCQkJCQlpbWFnZURhdGEueSwKLQkJCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0KTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCQkJCi0JCQkJCQkJCQlpbWFnZURhdGFJbmRleCA9IChpbWFnZURhdGFJbmRleCArIDEpICUgaW1hZ2VEYXRhQXJyYXkubGVuZ3RoOwotCQkJCQkJCQkJaW1hZ2VEYXRhID0gaW1hZ2VEYXRhQXJyYXlbaW1hZ2VEYXRhSW5kZXhdOwotCQkJCQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCQkJCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJCQkJCQkJCW9mZlNjcmVlbkltYWdlR0MuZHJhd0ltYWdlKAotCQkJCQkJCQkJCWltYWdlLAotCQkJCQkJCQkJCTAsCi0JCQkJCQkJCQkJMCwKLQkJCQkJCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJCQkJCQlpbWFnZURhdGEueCwKLQkJCQkJCQkJCQlpbWFnZURhdGEueSwKLQkJCQkJCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCS8qIERyYXcgdGhlIG9mZi1zY3JlZW4gaW1hZ2UgdG8gdGhlIHNoZWxsLiAqLwotCQkJCQkJCQkJc2hlbGxHQy5kcmF3SW1hZ2Uob2ZmU2NyZWVuSW1hZ2UsIDAsIDApOwotCQkJCQkJCQkJCi0JCQkJCQkJCQkvKiBTbGVlcCBmb3IgdGhlIHNwZWNpZmllZCBkZWxheSB0aW1lIChhZGRpbmcgY29tbW9ubHktdXNlZCBzbG93LWRvd24gZnVkZ2UgZmFjdG9ycykuICovCi0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCWludCBtcyA9IGltYWdlRGF0YS5kZWxheVRpbWUgKiAxMDsKLQkJCQkJCQkJCQlpZiAobXMgPCAyMCkgbXMgKz0gMzA7Ci0JCQkJCQkJCQkJaWYgKG1zIDwgMzApIG1zICs9IDEwOwotCQkJCQkJCQkJCVRocmVhZC5zbGVlcChtcyk7Ci0JCQkJCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCS8qIElmIHdlIGhhdmUganVzdCBkcmF3biB0aGUgbGFzdCBpbWFnZSwgZGVjcmVtZW50IHRoZSByZXBlYXQgY291bnQgYW5kIHN0YXJ0IGFnYWluLiAqLwotCQkJCQkJCQkJaWYgKGltYWdlRGF0YUluZGV4ID09IGltYWdlRGF0YUFycmF5Lmxlbmd0aCAtIDEpIHJlcGVhdENvdW50LS07Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaGVyZSB3YXMgYW4gZXJyb3IgYW5pbWF0aW5nIHRoZSBHSUYiKTsKLQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQlpZiAob2ZmU2NyZWVuSW1hZ2UgIT0gbnVsbCAmJiAhb2ZmU2NyZWVuSW1hZ2UuaXNEaXNwb3NlZCgpKSBvZmZTY3JlZW5JbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCQkJCWlmIChvZmZTY3JlZW5JbWFnZUdDICE9IG51bGwgJiYgIW9mZlNjcmVlbkltYWdlR0MuaXNEaXNwb3NlZCgpKSBvZmZTY3JlZW5JbWFnZUdDLmRpc3Bvc2UoKTsKLQkJCQkJCQkJaWYgKGltYWdlICE9IG51bGwgJiYgIWltYWdlLmlzRGlzcG9zZWQoKSkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQkJYW5pbWF0ZVRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCQkJCWFuaW1hdGVUaHJlYWQuc3RhcnQoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRoZXJlIHdhcyBhbiBlcnJvciBsb2FkaW5nIHRoZSBHSUYiKTsKLQkJCX0KLQkJfQotCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYWYxNGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogVUkgQXV0b21hdGlvbiAoZm9yIHRlc3RpbmcgdG9vbHMpIHNuaXBwZXQ6IHBvc3QgbW91c2UgZXZlbnRzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlmaW5hbCBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCxTV1QuTk9ORSk7Ci0JYnV0dG9uLnNldFNpemUoMTAwLDEwMCk7Ci0JYnV0dG9uLnNldFRleHQoIkNsaWNrIik7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQlidXR0b24uYWRkTGlzdGVuZXIoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTW91c2UgRG93biAoYnV0dG9uOiAiICsgZS5idXR0b24gKyAiIHg6ICIgKyBlLnggKyAiIHk6ICIgKyBlLnkgKyAiKSIpOwotCQl9Ci0JfSk7Ci0JZmluYWwgUG9pbnQgcHQgPSBkaXNwbGF5Lm1hcChzaGVsbCwgbnVsbCwgNTAsIDUwKTsKLQluZXcgVGhyZWFkKCl7Ci0JCUV2ZW50IGV2ZW50OwotCQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDMwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotCQkJZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJCWV2ZW50LnR5cGUgPSBTV1QuTW91c2VNb3ZlOwotCQkJZXZlbnQueCA9IHB0Lng7Ci0JCQlldmVudC55ID0gcHQueTsKLQkJCWRpc3BsYXkucG9zdChldmVudCk7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgzMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KLQkJCWV2ZW50LnR5cGUgPSBTV1QuTW91c2VEb3duOwotCQkJZXZlbnQuYnV0dG9uID0gMTsKLQkJCWRpc3BsYXkucG9zdChldmVudCk7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgzMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KLQkJCWV2ZW50LnR5cGUgPSBTV1QuTW91c2VVcDsKLQkJCWRpc3BsYXkucG9zdChldmVudCk7Ci0JCX0JCi0JfS5zdGFydCgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0YTkyNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotICAKLS8qCi0gKiBUcmF5IGV4YW1wbGUgc25pcHBldDogcGxhY2UgYW4gaWNvbiB3aXRoIGEgcG9wdXAgbWVudSBvbiB0aGUgc3lzdGVtIHRyYXkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDE2LCAxNik7Ci0JZmluYWwgVHJheSB0cmF5ID0gZGlzcGxheS5nZXRTeXN0ZW1UcmF5ICgpOwotCWlmICh0cmF5ID09IG51bGwpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuICgiVGhlIHN5c3RlbSB0cmF5IGlzIG5vdCBhdmFpbGFibGUiKTsKLQl9IGVsc2UgewotCQlmaW5hbCBUcmF5SXRlbSBpdGVtID0gbmV3IFRyYXlJdGVtICh0cmF5LCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVCBUcmF5SXRlbSIpOwotCQlpdGVtLmFkZExpc3RlbmVyIChTV1QuU2hvdywgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2hvdyIpOwotCQkJfQotCQl9KTsKLQkJaXRlbS5hZGRMaXN0ZW5lciAoU1dULkhpZGUsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImhpZGUiKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNlbGVjdGlvbiIpOwotCQkJfQotCQl9KTsKLQkJaXRlbS5hZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImRlZmF1bHQgc2VsZWN0aW9uIik7Ci0JCQl9Ci0JCX0pOwotCQlmaW5hbCBNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgewotCQkJTWVudUl0ZW0gbWkgPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQkJCW1pLnNldFRleHQgKCJJdGVtIiArIGkpOwotCQkJbWkuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2VsZWN0aW9uICIgKyBldmVudC53aWRnZXQpOwotCQkJCX0KLQkJCX0pOwotCQkJaWYgKGkgPT0gMCkgbWVudS5zZXREZWZhdWx0SXRlbShtaSk7Ci0JCX0KLQkJaXRlbS5hZGRMaXN0ZW5lciAoU1dULk1lbnVEZXRlY3QsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51LnNldFZpc2libGUgKHRydWUpOwotCQkJfQotCQl9KTsKLQkJaXRlbS5zZXRJbWFnZSAoaW1hZ2UpOwotCX0KLQlzaGVsbC5zZXRCb3VuZHMoNTAsIDUwLCAzMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Njk2MjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFZpcnR1YWwgVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0YWJsZSB3aXRoIDEsMDAwLDAwMCBpdGVtcyAobGF6eSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDQgewotCi1zdGF0aWMgZmluYWwgaW50IENPVU5UID0gMTAwMDAwMDsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKFNXVC5WRVJUSUNBTCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULlZJUlRVQUwgfCBTV1QuQk9SREVSKTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULlNldERhdGEsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSBldmVudC5pdGVtOwotCQkJaW50IGluZGV4ID0gdGFibGUuaW5kZXhPZiAoaXRlbSk7Ci0JCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpbmRleCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKGl0ZW0uZ2V0VGV4dCAoKSk7Ci0JCX0KLQl9KTsKLQl0YWJsZS5zZXRMYXlvdXREYXRhIChuZXcgUm93RGF0YSAoMjAwLCAyMDApKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCAoIkFkZCBJdGVtcyIpOwotCWZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWxvbmcgdDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMgKCk7Ci0JCQl0YWJsZS5zZXRJdGVtQ291bnQgKENPVU5UKTsKLQkJCWxvbmcgdDIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMgKCk7Ci0JCQlsYWJlbC5zZXRUZXh0ICgiSXRlbXM6ICIgKyBDT1VOVCArICIsIFRpbWU6ICIgKyAodDIgLSB0MSkgKyAiIChtcykiKTsKLQkJCXNoZWxsLmxheW91dCAoKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2M2NTBmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0TGF5b3V0IGV4YW1wbGUgc25pcHBldDogZHJhdyBpbnRlcm5hdGlvbmFsaXplZCBzdHlsZWQgdGV4dCBvbiBhIHNoZWxsCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDUgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JCQotCQlGb250IGZvbnQxID0gbmV3IEZvbnQoZGlzcGxheSwgIlRhaG9tYSIsIDE0LCBTV1QuQk9MRCk7Ci0JCUZvbnQgZm9udDIgPSBuZXcgRm9udChkaXNwbGF5LCAiTVMgTWluY2hvIiwgMjAsIFNXVC5JVEFMSUMpOwotCQlGb250IGZvbnQzID0gbmV3IEZvbnQoZGlzcGxheSwgIkFyYWJpYyBUcmFuc3BhcmVudCIsIDE4LCBTV1QuTk9STUFMKTsKLQkJCi0JCUNvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQkJQ29sb3IgZ3JlZW4gPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTik7Ci0JCUNvbG9yIHllbGxvdyA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVyk7Ci0JCUNvbG9yIGdyYXkgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKTsKLQkJCi0JCWZpbmFsIFRleHRMYXlvdXQgbGF5b3V0ID0gbmV3IFRleHRMYXlvdXQoZGlzcGxheSk7Ci0JCVRleHRTdHlsZSBzdHlsZTEgPSBuZXcgVGV4dFN0eWxlKGZvbnQxLCB5ZWxsb3csIGJsdWUpOwotCQlUZXh0U3R5bGUgc3R5bGUyID0gbmV3IFRleHRTdHlsZShmb250MiwgZ3JlZW4sIG51bGwpOwotCQlUZXh0U3R5bGUgc3R5bGUzID0gbmV3IFRleHRTdHlsZShmb250MywgYmx1ZSwgZ3JheSk7Ci0JCQotCQlsYXlvdXQuc2V0VGV4dCgiRW5nbGlzaCBcdTY1RTVcdTY3MkNcdThBOUUgIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0QVx1MDY1MVx1MDYyOSIpOwotCQlsYXlvdXQuc2V0U3R5bGUoc3R5bGUxLCAwLCA2KTsKLQkJbGF5b3V0LnNldFN0eWxlKHN0eWxlMiwgOCwgMTApOwotCQlsYXlvdXQuc2V0U3R5bGUoc3R5bGUzLCAxMywgMjEpOwotCQkJCQkKLQkJc2hlbGwuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCWxheW91dC5kcmF3KGV2ZW50LmdjLCAxMCwgMTApOwotCQkJfQotCQl9KTsKLQkJc2hlbGwub3BlbigpOwkKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWZvbnQxLmRpc3Bvc2UoKTsKLQkJZm9udDIuZGlzcG9zZSgpOwotCQlmb250My5kaXNwb3NlKCk7Ci0JCWxheW91dC5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIyMjlhZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotICAKLS8qCi0gKiBVSSBBdXRvbWF0aW9uIChmb3IgdGVzdGluZyB0b29scykgc25pcHBldDogcG9zdCBrZXkgZXZlbnRzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUik7Ci0JdGV4dC5zZXRTaXplKHRleHQuY29tcHV0ZVNpemUoMTUwLCBTV1QuREVGQVVMVCkpOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0JbmV3IFRocmVhZCgpewotCQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJCVN0cmluZyBzdHJpbmcgPSAiTG92ZSB0aGUgbWV0aG9kLiI7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJY2hhciBjaCA9IHN0cmluZy5jaGFyQXQoaSk7Ci0JCQkJYm9vbGVhbiBzaGlmdCA9IENoYXJhY3Rlci5pc1VwcGVyQ2FzZShjaCk7Ci0JCQkJY2ggPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2gpOwotCQkJCWlmIChzaGlmdCkgewotCQkJCQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCQkJCQlldmVudC50eXBlID0gU1dULktleURvd247Ci0JCQkJCWV2ZW50LmtleUNvZGUgPSBTV1QuU0hJRlQ7Ci0JCQkJCWRpc3BsYXkucG9zdChldmVudCk7CQotCQkJCX0KLQkJCQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCQkJCWV2ZW50LnR5cGUgPSBTV1QuS2V5RG93bjsKLQkJCQlldmVudC5jaGFyYWN0ZXIgPSBjaDsKLQkJCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KLQkJCQlldmVudC50eXBlID0gU1dULktleVVwOwotCQkJCWRpc3BsYXkucG9zdChldmVudCk7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDEwMCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KLQkJCQlpZiAoc2hpZnQpIHsKLQkJCQkJZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJCQkJZXZlbnQudHlwZSA9IFNXVC5LZXlVcDsKLQkJCQkJZXZlbnQua2V5Q29kZSA9IFNXVC5TSElGVDsKLQkJCQkJZGlzcGxheS5wb3N0KGV2ZW50KTsJCi0JCQkJfQotCQkJfQotCQl9CQotCX0uc3RhcnQoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMjlkNWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBzdG9wIENSIGZyb20gZ29pbmcgdG8gdGhlIGRlZmF1bHQgYnV0dG9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDcgIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhzaGVsbCwgU1dULk5PTkUpOwotCWNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCWNvbWJvLnNldFRleHQoIkhlcmUgaXMgc29tZSB0ZXh0Iik7Ci0JY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvbWJvIGRlZmF1bHQgc2VsZWN0ZWQgKG92ZXJyaWRlcyBkZWZhdWx0IGJ1dHRvbikiKTsKLQkJfQotCX0pOwotCWNvbWJvLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfUkVUVVJOKSB7Ci0JCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJZS5kZXRhaWwgPSBTV1QuVFJBVkVSU0VfTk9ORTsKLQkJCX0KLQkJfQotCX0pOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIk9rIik7Ci0JYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJ1dHRvbiBzZWxlY3RlZCIpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0RGVmYXVsdEJ1dHRvbihidXR0b24pOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5NWMyOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBjaGVjayBpZiB0aGUgYnJvd3NlciBpcyBhdmFpbGFibGUgb3Igbm90Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDggewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlCcm93c2VyIGJyb3dzZXIgPSBudWxsOwotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCS8qIFRoZSBCcm93c2VyIHdpZGdldCB0aHJvd3MgYW4gU1dURXJyb3IgaWYgaXQgZmFpbHMgdG8KLQkJCSAqIGluc3RhbnRpYXRlIHByb3Blcmx5LiBBcHBsaWNhdGlvbiBjb2RlIHNob3VsZCBjYXRjaAotCQkJICogdGhpcyBTV1RFcnJvciBhbmQgZGlzYWJsZSBhbnkgZmVhdHVyZSByZXF1aXJpbmcgdGhlCi0JCQkgKiBCcm93c2VyIHdpZGdldC4KLQkJCSAqIFBsYXRmb3JtIHJlcXVpcmVtZW50cyBmb3IgdGhlIFNXVCBCcm93c2VyIHdpZGdldCBhcmUgYXZhaWxhYmxlCi0JCQkgKiBmcm9tIHRoZSBTV1QgRkFRIHdlYnNpdGUuIAotCQkJICovCi0JCX0KLQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJLyogVGhlIEJyb3dzZXIgd2lkZ2V0IGNhbiBiZSB1c2VkICovCi0JCQlicm93c2VyLnNldFVybCgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIpOwotCQl9Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkODU1MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGVFZGl0b3IgZXhhbXBsZSBzbmlwcGV0OiBwbGFjZSBhIHByb2dyZXNzIGJhciBpbiBhIHRhYmxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDkgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQlmb3IgKGludCBpPTA7IGk8MjsgaSsrKSB7Ci0JCQluZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCX0KLQkJdGFibGUuZ2V0Q29sdW1uICgwKS5zZXRUZXh0ICgiVGFzayIpOwotCQl0YWJsZS5nZXRDb2x1bW4gKDEpLnNldFRleHQgKCJQcm9ncmVzcyIpOwotCQlmb3IgKGludCBpPTA7IGk8NDA7IGkrKykgewotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0ICgiVGFzayAiICsgaSk7Ci0JCQlpZiAoIGkgJSA1ID09IDApIHsKLQkJCQlQcm9ncmVzc0JhciBiYXIgPSBuZXcgUHJvZ3Jlc3NCYXIgKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJYmFyLnNldFNlbGVjdGlvbiAoaSk7Ci0JCQkJVGFibGVFZGl0b3IgZWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCQkJZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gZWRpdG9yLmdyYWJWZXJ0aWNhbCA9IHRydWU7Ci0JCQkJZWRpdG9yLnNldEVkaXRvciAoYmFyLCBpdGVtLCAxKTsKLQkJCX0KLQkJfQotCQl0YWJsZS5nZXRDb2x1bW4gKDApLnBhY2sgKCk7Ci0JCXRhYmxlLmdldENvbHVtbiAoMSkuc2V0V2lkdGggKDEyOCk7Ci0JCXNoZWxsLnBhY2sgKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgewotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMDhmZDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0cmVlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0cmVlLnNldFNpemUgKDEwMCwgMTAwKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0JZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQlUcmVlSXRlbSBpSXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgMCk7Ci0JCWlJdGVtLnNldFRleHQgKCJUcmVlSXRlbSAoMCkgLSIgKyBpKTsKLQkJZm9yIChpbnQgaj0wOyBqPDQ7IGorKykgewotCQkJVHJlZUl0ZW0gakl0ZW0gPSBuZXcgVHJlZUl0ZW0gKGlJdGVtLCAwKTsKLQkJCWpJdGVtLnNldFRleHQgKCJUcmVlSXRlbSAoMSkgLSIgKyBqKTsKLQkJCWZvciAoaW50IGs9MDsgazw0OyBrKyspIHsKLQkJCQlUcmVlSXRlbSBrSXRlbSA9IG5ldyBUcmVlSXRlbSAoakl0ZW0sIDApOwotCQkJCWtJdGVtLnNldFRleHQgKCJUcmVlSXRlbSAoMikgLSIgKyBrKTsKLQkJCQlmb3IgKGludCBsPTA7IGw8NDsgbCsrKSB7Ci0JCQkJCVRyZWVJdGVtIGxJdGVtID0gbmV3IFRyZWVJdGVtIChrSXRlbSwgMCk7Ci0JCQkJCWxJdGVtLnNldFRleHQgKCJUcmVlSXRlbSAoMykgLSIgKyBsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2YxMmYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb29sQmFyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY29vbGJhciAocmVsYXlvdXQgd2hlbiByZXNpemVkKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1MCB7Ci0KLXN0YXRpYyBpbnQgaXRlbUNvdW50Owotc3RhdGljIENvb2xJdGVtIGNyZWF0ZUl0ZW0oQ29vbEJhciBjb29sQmFyLCBpbnQgY291bnQpIHsKLSAgICBUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhcihjb29sQmFyLCBTV1QuRkxBVCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIFRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotICAgICAgICBpdGVtLnNldFRleHQoaXRlbUNvdW50KysgKyIiKTsKLSAgICB9Ci0gICAgdG9vbEJhci5wYWNrKCk7Ci0gICAgUG9pbnQgc2l6ZSA9IHRvb2xCYXIuZ2V0U2l6ZSgpOwotICAgIENvb2xJdGVtIGl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgU1dULk5PTkUpOwotICAgIGl0ZW0uc2V0Q29udHJvbCh0b29sQmFyKTsKLSAgICBQb2ludCBwcmVmZXJyZWQgPSBpdGVtLmNvbXB1dGVTaXplKHNpemUueCwgc2l6ZS55KTsKLSAgICBpdGVtLnNldFByZWZlcnJlZFNpemUocHJlZmVycmVkKTsKLSAgICByZXR1cm4gaXRlbTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0gICAgZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0gICAgQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIFNXVC5OT05FKTsKLSAgICBjcmVhdGVJdGVtKGNvb2xCYXIsIDMpOwotICAgIGNyZWF0ZUl0ZW0oY29vbEJhciwgMik7Ci0gICAgY3JlYXRlSXRlbShjb29sQmFyLCAzKTsKLSAgICBjcmVhdGVJdGVtKGNvb2xCYXIsIDQpOwotICAgIGludCBzdHlsZSA9IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEw7Ci0gICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIHN0eWxlKTsKLSAgICBGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0gICAgc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgRm9ybURhdGEgY29vbERhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBjb29sRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotICAgIGNvb2xEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0gICAgY29vbERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotICAgIGNvb2xCYXIuc2V0TGF5b3V0RGF0YShjb29sRGF0YSk7Ci0gICAgY29vbEJhci5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBzaGVsbC5sYXlvdXQoKTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIEZvcm1EYXRhIHRleHREYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgdGV4dERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLSAgICB0ZXh0RGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotICAgIHRleHREYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjb29sQmFyKTsKLSAgICB0ZXh0RGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLSAgICB0ZXh0LnNldExheW91dERhdGEodGV4dERhdGEpOwotICAgIHNoZWxsLm9wZW4oKTsKLSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLSAgICB9Ci0gICAgZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YWIyZGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSBhIHZpcnR1YWwgdGFibGUgYW5kIGFkZCAxMDAwIGVudHJpZXMgdG8gaXQgZXZlcnkgNTAwIG1zLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1MSB7Ci0KLXN0YXRpYyBpbnRbXSBkYXRhID0gbmV3IGludFswXTsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WSVJUVUFMKTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuU2V0RGF0YSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZS5pdGVtOwotCQkJaW50IGluZGV4ID0gdGFibGUuaW5kZXhPZihpdGVtKTsKLQkJCWl0ZW0uc2V0VGV4dCgiSXRlbSAiK2RhdGFbaW5kZXhdKTsKLQkJfQotCX0pOwotCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpbnQgY291bnQgPSAwOwotCQkJUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKLQkJCXdoaWxlIChjb3VudCsrIDwgNTAwKSB7Ci0JCQkJaWYgKHRhYmxlLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCS8vIGFkZCAxMCByYW5kb20gbnVtYmVycyB0byBhcnJheSBhbmQgc29ydAotCQkJCWludCBncm93ID0gMTA7Ci0JCQkJaW50W10gbmV3RGF0YSA9IG5ldyBpbnRbZGF0YS5sZW5ndGggKyBncm93XTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIG5ld0RhdGEsIDAsIGRhdGEubGVuZ3RoKTsKLQkJCQlpbnQgaW5kZXggPSBkYXRhLmxlbmd0aDsKLQkJCQlkYXRhID0gbmV3RGF0YTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGdyb3c7IGorKykgewotCQkJCQlkYXRhW2luZGV4KytdID0gcmFuZG9tLm5leHRJbnQoKTsKLQkJCQl9Ci0JCQkJQXJyYXlzLnNvcnQoZGF0YSk7Ci0JCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmICh0YWJsZS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJCXRhYmxlLnNldEl0ZW1Db3VudChkYXRhLmxlbmd0aCk7Ci0JCQkJCQl0YWJsZS5jbGVhckFsbCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJdHJ5IHtUaHJlYWQuc2xlZXAoNTAwKTt9IGNhdGNoIChUaHJvd2FibGUgdCkge30KLQkJCX0KLQkJfQotCX07Ci0JdGhyZWFkLnN0YXJ0KCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSB8fCB0aHJlYWQuaXNBbGl2ZSgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZhMmQ1Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29udHJvbCBleGFtcGxlIHNuaXBwZXQ6IHVwZGF0ZSBhIHN0YXR1cyBsaW5lIHdoZW4gYW4gaXRlbSBpcyBhcm1lZAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTUyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0gICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0gICAgRm9ybUxheW91dCBsYXlvdXQgPSBuZXcgRm9ybUxheW91dCgpOwotICAgIHNoZWxsLnNldExheW91dChsYXlvdXQpOwotICAgIGZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQk9SREVSKTsKLSAgICBMaXN0ZW5lciBhcm1MaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIE1lbnVJdGVtIGl0ZW0gPSAoTWVudUl0ZW0pIGV2ZW50LndpZGdldDsKLSAgICAgICAgICAgIGxhYmVsLnNldFRleHQoaXRlbS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgbGFiZWwudXBkYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIExpc3RlbmVyIHNob3dMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIE1lbnUgbWVudSA9IChNZW51KSBldmVudC53aWRnZXQ7Ci0gICAgICAgICAgICBNZW51SXRlbSBpdGVtID0gbWVudS5nZXRQYXJlbnRJdGVtKCk7Ci0gICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbGFiZWwuc2V0VGV4dChpdGVtLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgbGFiZWwudXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotICAgIExpc3RlbmVyIGhpZGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGxhYmVsLnNldFRleHQoIiIpOwotICAgICAgICAgICAgbGFiZWwudXBkYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIEZvcm1EYXRhIGxhYmVsRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGxhYmVsRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotICAgIGxhYmVsRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotICAgIGxhYmVsRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGxhYmVsRGF0YSk7Ci0gICAgTWVudSBtZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotICAgIHNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0gICAgTWVudUl0ZW0gZmlsZUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotICAgIGZpbGVJdGVtLnNldFRleHQoIkZpbGUiKTsKLSAgICBmaWxlSXRlbS5hZGRMaXN0ZW5lcihTV1QuQXJtLCBhcm1MaXN0ZW5lcik7Ci0gICAgTWVudUl0ZW0gZWRpdEl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotICAgIGVkaXRJdGVtLnNldFRleHQoIkVkaXQiKTsKLSAgICBlZGl0SXRlbS5hZGRMaXN0ZW5lcihTV1QuQXJtLCBhcm1MaXN0ZW5lcik7Ci0gICAgTWVudSBmaWxlTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLSAgICBmaWxlTWVudS5hZGRMaXN0ZW5lcihTV1QuSGlkZSwgaGlkZUxpc3RlbmVyKTsKLSAgICBmaWxlTWVudS5hZGRMaXN0ZW5lcihTV1QuU2hvdywgc2hvd0xpc3RlbmVyKTsKLSAgICBmaWxlSXRlbS5zZXRNZW51KGZpbGVNZW51KTsKLSAgICBTdHJpbmdbXSBmaWxlU3RyaW5ncyA9IHsgIk5ldyIsICJDbG9zZSIsICJFeGl0IiB9OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZVN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotICAgICAgICBpdGVtLnNldFRleHQoZmlsZVN0cmluZ3NbaV0pOwotICAgICAgICBpdGVtLmFkZExpc3RlbmVyKFNXVC5Bcm0sIGFybUxpc3RlbmVyKTsKLSAgICB9Ci0gICAgTWVudSBlZGl0TWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLSAgICBlZGl0TWVudS5hZGRMaXN0ZW5lcihTV1QuSGlkZSwgaGlkZUxpc3RlbmVyKTsKLSAgICBlZGl0TWVudS5hZGRMaXN0ZW5lcihTV1QuU2hvdywgc2hvd0xpc3RlbmVyKTsKLSAgICBTdHJpbmdbXSBlZGl0U3RyaW5ncyA9IHsgIkN1dCIsICJDb3B5IiwgIlBhc3RlIiB9OwotICAgIGVkaXRJdGVtLnNldE1lbnUoZWRpdE1lbnUpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWRpdFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShlZGl0TWVudSwgU1dULlBVU0gpOwotICAgICAgICBpdGVtLnNldFRleHQoZWRpdFN0cmluZ3NbaV0pOwotICAgICAgICBpdGVtLmFkZExpc3RlbmVyKFNXVC5Bcm0sIGFybUxpc3RlbmVyKTsKLSAgICB9Ci0gICAgc2hlbGwub3BlbigpOwotICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotICAgIH0KLSAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjY4NjJmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sQmFyIGV4YW1wbGUgc25pcHBldDogdXBkYXRlIGEgc3RhdHVzIGxpbmUgd2hlbiB0aGUgcG9pbnRlciBlbnRlcnMgYSBUb29sSXRlbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTMgewotCQotc3RhdGljIFN0cmluZyBzdGF0dXNUZXh0ID0gIiI7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLSAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLSAgICBzaGVsbC5zZXRCb3VuZHMoMTAsIDEwLCAyMDAsIDIwMCk7Ci0gICAgZmluYWwgVG9vbEJhciBiYXIgPSBuZXcgVG9vbEJhcihzaGVsbCwgU1dULkJPUkRFUik7Ci0gICAgYmFyLnNldEJvdW5kcygxMCwgMTAsIDE1MCwgNTApOwotICAgIGZpbmFsIExhYmVsIHN0YXR1c0xpbmUgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIpOwotICAgIHN0YXR1c0xpbmUuc2V0Qm91bmRzKDEwLCA5MCwgMTUwLCAzMCk7Ci0gICAgbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpLnNldFRleHQoIml0ZW0gMSIpOwotICAgIG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKS5zZXRUZXh0KCJpdGVtIDIiKTsKLSAgICBuZXcgVG9vbEl0ZW0oYmFyLCBTV1QuTk9ORSkuc2V0VGV4dCgiaXRlbSAzIik7Ci0gICAgYmFyLmFkZE1vdXNlTW92ZUxpc3RlbmVyKG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAgICAgVG9vbEl0ZW0gaXRlbSA9IGJhci5nZXRJdGVtKG5ldyBQb2ludChlLngsIGUueSkpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAiIjsKLSAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gaXRlbS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXN0YXR1c1RleHQuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGluZS5zZXRUZXh0KG5hbWUpOwotICAgICAgICAgICAgICAgIHN0YXR1c1RleHQgPSBuYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgc2hlbGwub3BlbigpOwotICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotICAgIH0KLSAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTk3Y2EwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogZXhhbXBsZSBzbmlwcGV0OiBlbWJlZCBhIEpUYWJsZSBpbiBTV1QgKG5vIGZsaWNrZXIpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkZyYW1lOwotaW1wb3J0IGphdmEuYXd0LlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hd3QuU1dUX0FXVDsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTQgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9fQkFDS0dST1VORCB8IFNXVC5FTUJFRERFRCk7Ci0JCQotCQkvKgotCQkqIFNldCBhIFdpbmRvd3Mgc3BlY2lmaWMgQVdUIHByb3BlcnR5IHRoYXQgcHJldmVudHMgaGVhdnl3ZWlnaHQKLQkJKiBjb21wb25lbnRzIGZyb20gZXJhc2luZyB0aGVpciBiYWNrZ3JvdW5kLiBOb3RlIHRoYXQgdGhpcwotCQkqIGlzIGEgZ2xvYmFsIHByb3BlcnR5IGFuZCBjYW5ub3QgYmUgc2NvcGVkLiBJdCBtaWdodCBub3QgYmUKLQkJKiBzdWl0YWJsZSBmb3IgeW91ciBhcHBsaWNhdGlvbi4KLQkJKi8KLQkJdHJ5IHsKLQkJCVN5c3RlbS5zZXRQcm9wZXJ0eSgic3VuLmF3dC5ub2VyYXNlYmFja2dyb3VuZCIsInRydWUiKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXJyb3IgZXJyb3IpIHt9Ci0KLQkJLyogQ3JlYXRlIGFuZCBzZXR0aW5nIHVwIGZyYW1lICovCi0JCUZyYW1lIGZyYW1lID0gU1dUX0FXVC5uZXdfRnJhbWUoY29tcG9zaXRlKTsKLQkJUGFuZWwgcGFuZWwgPSBuZXcgUGFuZWwobmV3IEJvcmRlckxheW91dCgpKSB7Ci0JCQlwdWJsaWMgdm9pZCB1cGRhdGUoamF2YS5hd3QuR3JhcGhpY3MgZykgewotCQkJCS8qIERvIG5vdCBlcmFzZSB0aGUgYmFja2dyb3VuZCAqLyAKLQkJCQlwYWludChnKTsKLQkJCX0KLQkJfTsKLQkJZnJhbWUuYWRkKHBhbmVsKTsKLQkJSlJvb3RQYW5lIHJvb3QgPSBuZXcgSlJvb3RQYW5lKCk7Ci0JCXBhbmVsLmFkZChyb290KTsKLQkJamF2YS5hd3QuQ29udGFpbmVyIGNvbnRlbnRQYW5lID0gcm9vdC5nZXRDb250ZW50UGFuZSgpOwotCi0JCS8qIENyZWF0aW5nIGNvbXBvbmVudHMgKi8KLQkJaW50IG5yb3dzID0gMTAwMCwgbmNvbHVtbnMgPSAxMDsKLQkJVmVjdG9yIHJvd3MgPSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnJvd3M7IGkrKykgewotCQkJVmVjdG9yIHJvdyA9IG5ldyBWZWN0b3IoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbmNvbHVtbnM7IGorKykgewotCQkJCXJvdy5hZGRFbGVtZW50KCJJdGVtICIgKyBpICsgIi0iICsgaik7Ci0JCQl9Ci0JCQlyb3dzLmFkZEVsZW1lbnQocm93KTsKLQkJfQotCQlWZWN0b3IgY29sdW1ucyA9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuY29sdW1uczsgaSsrKSB7Ci0JCQljb2x1bW5zLmFkZEVsZW1lbnQoIkNvbHVtbiAiICsgaSk7Ci0JCX0KLQkJSlRhYmxlIHRhYmxlID0gbmV3IEpUYWJsZShyb3dzLCBjb2x1bW5zKTsKLQkJdGFibGUuc2V0QXV0b1Jlc2l6ZU1vZGUoSlRhYmxlLkFVVE9fUkVTSVpFX09GRik7Ci0JCXRhYmxlLmNyZWF0ZURlZmF1bHRDb2x1bW5zRnJvbU1vZGVsKCk7Ci0JCUpTY3JvbGxQYW5lIHNjcm9sbFBhbmUgPSBuZXcgSlNjcm9sbFBhbmUodGFibGUpOwotCQljb250ZW50UGFuZS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLQkJY29udGVudFBhbmUuYWRkKHNjcm9sbFBhbmUpOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiM2Q4ZWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogZHJhdyBhbiBYIHVzaW5nIEFXVCBHcmFwaGljcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IGphdmEuYXd0LkZyYW1lOwotaW1wb3J0IGphdmEuYXd0LkNhbnZhczsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKLWltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYXd0LlNXVF9BV1Q7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTU1IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5FTUJFRERFRCk7Ci0JCQotCQkvKiBEcmF3IGFuIFggdXNpbmcgQVdUICovCi0JCUZyYW1lIGZyYW1lID0gU1dUX0FXVC5uZXdfRnJhbWUoY29tcG9zaXRlKTsKLQkJQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludCAoR3JhcGhpY3MgZykgewotCQkJCURpbWVuc2lvbiBkID0gZ2V0U2l6ZSgpOwotCQkJCWcuZHJhd0xpbmUoMCwgMCwgZC53aWR0aCwgZC5oZWlnaHQpOwotCQkJCWcuZHJhd0xpbmUoZC53aWR0aCwgMCwgMCwgZC5oZWlnaHQpOwotCQkJfQotCQl9OwotCQlmcmFtZS5hZGQoY2FudmFzKTsKLQotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY1ZTM5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogY29udmVydCBiZXR3ZWVuIFNXVCBJbWFnZSBhbmQgQVdUIEJ1ZmZlcmVkSW1hZ2UKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgamF2YS5hd3QuRnJhbWU7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7Ci1pbXBvcnQgamF2YS5hd3QuSW5zZXRzOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQ29sb3JNb2RlbDsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5EaXJlY3RDb2xvck1vZGVsOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLkluZGV4Q29sb3JNb2RlbDsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5Xcml0YWJsZVJhc3RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTU2IHsKLQkKLXN0YXRpYyBCdWZmZXJlZEltYWdlIGNvbnZlcnRUb0FXVChJbWFnZURhdGEgZGF0YSkgewotCUNvbG9yTW9kZWwgY29sb3JNb2RlbCA9IG51bGw7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IGRhdGEucGFsZXR0ZTsKLQlpZiAocGFsZXR0ZS5pc0RpcmVjdCkgewotCQljb2xvck1vZGVsID0gbmV3IERpcmVjdENvbG9yTW9kZWwoZGF0YS5kZXB0aCwgcGFsZXR0ZS5yZWRNYXNrLCBwYWxldHRlLmdyZWVuTWFzaywgcGFsZXR0ZS5ibHVlTWFzayk7Ci0JCUJ1ZmZlcmVkSW1hZ2UgYnVmZmVyZWRJbWFnZSA9IG5ldyBCdWZmZXJlZEltYWdlKGNvbG9yTW9kZWwsIGNvbG9yTW9kZWwuY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0KSwgZmFsc2UsIG51bGwpOwotCQlXcml0YWJsZVJhc3RlciByYXN0ZXIgPSBidWZmZXJlZEltYWdlLmdldFJhc3RlcigpOwotCQlpbnRbXSBwaXhlbEFycmF5ID0gbmV3IGludFszXTsKLQkJZm9yIChpbnQgeSA9IDA7IHkgPCBkYXRhLmhlaWdodDsgeSsrKSB7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IGRhdGEud2lkdGg7IHgrKykgewotCQkJCWludCBwaXhlbCA9IGRhdGEuZ2V0UGl4ZWwoeCwgeSk7Ci0JCQkJUkdCIHJnYiA9IHBhbGV0dGUuZ2V0UkdCKHBpeGVsKTsKLQkJCQlwaXhlbEFycmF5WzBdID0gcmdiLnJlZDsKLQkJCQlwaXhlbEFycmF5WzFdID0gcmdiLmdyZWVuOwotCQkJCXBpeGVsQXJyYXlbMl0gPSByZ2IuYmx1ZTsKLQkJCQlyYXN0ZXIuc2V0UGl4ZWxzKHgsIHksIDEsIDEsIHBpeGVsQXJyYXkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWZmZXJlZEltYWdlOwotCX0gZWxzZSB7Ci0JCVJHQltdIHJnYnMgPSBwYWxldHRlLmdldFJHQnMoKTsKLQkJYnl0ZVtdIHJlZCA9IG5ldyBieXRlW3JnYnMubGVuZ3RoXTsKLQkJYnl0ZVtdIGdyZWVuID0gbmV3IGJ5dGVbcmdicy5sZW5ndGhdOwotCQlieXRlW10gYmx1ZSA9IG5ldyBieXRlW3JnYnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZ2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlSR0IgcmdiID0gcmdic1tpXTsKLQkJCXJlZFtpXSA9IChieXRlKXJnYi5yZWQ7Ci0JCQlncmVlbltpXSA9IChieXRlKXJnYi5ncmVlbjsKLQkJCWJsdWVbaV0gPSAoYnl0ZSlyZ2IuYmx1ZTsKLQkJfQotCQlpZiAoZGF0YS50cmFuc3BhcmVudFBpeGVsICE9IC0xKSB7Ci0JCQljb2xvck1vZGVsID0gbmV3IEluZGV4Q29sb3JNb2RlbChkYXRhLmRlcHRoLCByZ2JzLmxlbmd0aCwgcmVkLCBncmVlbiwgYmx1ZSwgZGF0YS50cmFuc3BhcmVudFBpeGVsKTsKLQkJfSBlbHNlIHsKLQkJCWNvbG9yTW9kZWwgPSBuZXcgSW5kZXhDb2xvck1vZGVsKGRhdGEuZGVwdGgsIHJnYnMubGVuZ3RoLCByZWQsIGdyZWVuLCBibHVlKTsKLQkJfQkJCi0JCUJ1ZmZlcmVkSW1hZ2UgYnVmZmVyZWRJbWFnZSA9IG5ldyBCdWZmZXJlZEltYWdlKGNvbG9yTW9kZWwsIGNvbG9yTW9kZWwuY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0KSwgZmFsc2UsIG51bGwpOwotCQlXcml0YWJsZVJhc3RlciByYXN0ZXIgPSBidWZmZXJlZEltYWdlLmdldFJhc3RlcigpOwotCQlpbnRbXSBwaXhlbEFycmF5ID0gbmV3IGludFsxXTsKLQkJZm9yIChpbnQgeSA9IDA7IHkgPCBkYXRhLmhlaWdodDsgeSsrKSB7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IGRhdGEud2lkdGg7IHgrKykgewotCQkJCWludCBwaXhlbCA9IGRhdGEuZ2V0UGl4ZWwoeCwgeSk7Ci0JCQkJcGl4ZWxBcnJheVswXSA9IHBpeGVsOwotCQkJCXJhc3Rlci5zZXRQaXhlbCh4LCB5LCBwaXhlbEFycmF5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmZmVyZWRJbWFnZTsKLQl9Ci19Ci0KLXN0YXRpYyBJbWFnZURhdGEgY29udmVydFRvU1dUKEJ1ZmZlcmVkSW1hZ2UgYnVmZmVyZWRJbWFnZSkgewotCWlmIChidWZmZXJlZEltYWdlLmdldENvbG9yTW9kZWwoKSBpbnN0YW5jZW9mIERpcmVjdENvbG9yTW9kZWwpIHsKLQkJRGlyZWN0Q29sb3JNb2RlbCBjb2xvck1vZGVsID0gKERpcmVjdENvbG9yTW9kZWwpYnVmZmVyZWRJbWFnZS5nZXRDb2xvck1vZGVsKCk7Ci0JCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEoY29sb3JNb2RlbC5nZXRSZWRNYXNrKCksIGNvbG9yTW9kZWwuZ2V0R3JlZW5NYXNrKCksIGNvbG9yTW9kZWwuZ2V0Qmx1ZU1hc2soKSk7Ci0JCUltYWdlRGF0YSBkYXRhID0gbmV3IEltYWdlRGF0YShidWZmZXJlZEltYWdlLmdldFdpZHRoKCksIGJ1ZmZlcmVkSW1hZ2UuZ2V0SGVpZ2h0KCksIGNvbG9yTW9kZWwuZ2V0UGl4ZWxTaXplKCksIHBhbGV0dGUpOwotCQlXcml0YWJsZVJhc3RlciByYXN0ZXIgPSBidWZmZXJlZEltYWdlLmdldFJhc3RlcigpOwotCQlpbnRbXSBwaXhlbEFycmF5ID0gbmV3IGludFszXTsKLQkJZm9yIChpbnQgeSA9IDA7IHkgPCBkYXRhLmhlaWdodDsgeSsrKSB7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IGRhdGEud2lkdGg7IHgrKykgewotCQkJCXJhc3Rlci5nZXRQaXhlbCh4LCB5LCBwaXhlbEFycmF5KTsKLQkJCQlpbnQgcGl4ZWwgPSBwYWxldHRlLmdldFBpeGVsKG5ldyBSR0IocGl4ZWxBcnJheVswXSwgcGl4ZWxBcnJheVsxXSwgcGl4ZWxBcnJheVsyXSkpOwotCQkJCWRhdGEuc2V0UGl4ZWwoeCwgeSwgcGl4ZWwpOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIGRhdGE7CQkKLQl9IGVsc2UgaWYgKGJ1ZmZlcmVkSW1hZ2UuZ2V0Q29sb3JNb2RlbCgpIGluc3RhbmNlb2YgSW5kZXhDb2xvck1vZGVsKSB7Ci0JCUluZGV4Q29sb3JNb2RlbCBjb2xvck1vZGVsID0gKEluZGV4Q29sb3JNb2RlbClidWZmZXJlZEltYWdlLmdldENvbG9yTW9kZWwoKTsKLQkJaW50IHNpemUgPSBjb2xvck1vZGVsLmdldE1hcFNpemUoKTsKLQkJYnl0ZVtdIHJlZHMgPSBuZXcgYnl0ZVtzaXplXTsKLQkJYnl0ZVtdIGdyZWVucyA9IG5ldyBieXRlW3NpemVdOwotCQlieXRlW10gYmx1ZXMgPSBuZXcgYnl0ZVtzaXplXTsKLQkJY29sb3JNb2RlbC5nZXRSZWRzKHJlZHMpOwotCQljb2xvck1vZGVsLmdldEdyZWVucyhncmVlbnMpOwotCQljb2xvck1vZGVsLmdldEJsdWVzKGJsdWVzKTsKLQkJUkdCW10gcmdicyA9IG5ldyBSR0Jbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmdicy5sZW5ndGg7IGkrKykgewotCQkJcmdic1tpXSA9IG5ldyBSR0IocmVkc1tpXSAmIDB4RkYsIGdyZWVuc1tpXSAmIDB4RkYsIGJsdWVzW2ldICYgMHhGRik7Ci0JCX0KLQkJUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YShyZ2JzKTsKLQkJSW1hZ2VEYXRhIGRhdGEgPSBuZXcgSW1hZ2VEYXRhKGJ1ZmZlcmVkSW1hZ2UuZ2V0V2lkdGgoKSwgYnVmZmVyZWRJbWFnZS5nZXRIZWlnaHQoKSwgY29sb3JNb2RlbC5nZXRQaXhlbFNpemUoKSwgcGFsZXR0ZSk7Ci0JCWRhdGEudHJhbnNwYXJlbnRQaXhlbCA9IGNvbG9yTW9kZWwuZ2V0VHJhbnNwYXJlbnRQaXhlbCgpOwotCQlXcml0YWJsZVJhc3RlciByYXN0ZXIgPSBidWZmZXJlZEltYWdlLmdldFJhc3RlcigpOwotCQlpbnRbXSBwaXhlbEFycmF5ID0gbmV3IGludFsxXTsKLQkJZm9yIChpbnQgeSA9IDA7IHkgPCBkYXRhLmhlaWdodDsgeSsrKSB7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IGRhdGEud2lkdGg7IHgrKykgewotCQkJCXJhc3Rlci5nZXRQaXhlbCh4LCB5LCBwaXhlbEFycmF5KTsKLQkJCQlkYXRhLnNldFBpeGVsKHgsIHksIHBpeGVsQXJyYXlbMF0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBkYXRhOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLQotc3RhdGljIEltYWdlRGF0YSBjcmVhdGVTYW1wbGVJbWFnZShEaXNwbGF5IGRpc3BsYXkpIHsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMDAsIDEwMCk7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLQlnYy5maWxsUmVjdGFuZ2xlKGJvdW5kcyk7Ci0JZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOwotCWdjLmZpbGxPdmFsKDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQlnYy5kcmF3TGluZSgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCWdjLmRyYXdMaW5lKGJvdW5kcy53aWR0aCwgMCwgMCwgYm91bmRzLmhlaWdodCk7Ci0JZ2MuZGlzcG9zZSgpOwotCUltYWdlRGF0YSBkYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCXJldHVybiBkYXRhOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJTV1QgSW1hZ2UiKTsKLQlJbWFnZURhdGEgZGF0YTsKLQlpZiAoYXJncy5sZW5ndGggPiAwKSB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGFyZ3NbMF07Ci0JCWRhdGEgPSBuZXcgSW1hZ2VEYXRhKGZpbGVOYW1lKTsKLQl9IGVsc2UgewotCQlkYXRhID0gY3JlYXRlU2FtcGxlSW1hZ2UoZGlzcGxheSk7Ci0JfQotCWZpbmFsIEltYWdlIHN3dEltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotCWZpbmFsIEJ1ZmZlcmVkSW1hZ2UgYXd0SW1hZ2UgPSBjb252ZXJ0VG9BV1QoZGF0YSk7Ci0JZmluYWwgSW1hZ2Ugc3d0SW1hZ2UyID0gbmV3IEltYWdlKGRpc3BsYXksIGNvbnZlcnRUb1NXVChhd3RJbWFnZSkpOwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpbnQgeSA9IDEwOwotCQkJaWYgKHN3dEltYWdlICE9IG51bGwpIHsKLQkJCQllLmdjLmRyYXdJbWFnZShzd3RJbWFnZSwgMTAsIHkpOwotCQkJCXkgKz0gc3d0SW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0ICsgMTA7Ci0JCQl9Ci0JCQlpZiAoc3d0SW1hZ2UyICE9IG51bGwpIHsKLQkJCQllLmdjLmRyYXdJbWFnZShzd3RJbWFnZTIsIDEwLCB5KTsKLQkJCX0KLQkJfQotCX0pOwotCUZyYW1lIGZyYW1lID0gbmV3IEZyYW1lKCkgewotCQlwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBnKSB7Ci0JCQlJbnNldHMgaW5zZXRzID0gZ2V0SW5zZXRzKCk7Ci0JCQlpZiAoYXd0SW1hZ2UgIT0gbnVsbCkgewotCQkJCWcuZHJhd0ltYWdlKGF3dEltYWdlLCAxMCArIGluc2V0cy5sZWZ0LCAxMCArIGluc2V0cy50b3AsIG51bGwpOwotCQkJfQotCQl9Ci0JfTsKLQlmcmFtZS5zZXRUaXRsZSgiQVdUIEltYWdlIik7Ci0Jc2hlbGwuc2V0TG9jYXRpb24oNTAsIDUwKTsKLQlSZWN0YW5nbGUgYm91bmRzID0gc3d0SW1hZ2UuZ2V0Qm91bmRzKCk7Ci0Jc2hlbGwuc2V0U2l6ZShib3VuZHMud2lkdGggKyA1MCwgYm91bmRzLmhlaWdodCAqIDIgKyAxMDApOwotCVBvaW50IHNpemUgPSBzaGVsbC5nZXRTaXplKCk7Ci0JUG9pbnQgbG9jYXRpb24gPSBzaGVsbC5nZXRMb2NhdGlvbigpOwotCUluc2V0cyBpbnNldHMgPSBmcmFtZS5nZXRJbnNldHMoKTsKLQlmcmFtZS5zZXRMb2NhdGlvbihsb2NhdGlvbi54ICsgc2l6ZS54ICsgMTAsIGxvY2F0aW9uLnkpOwotCWZyYW1lLnNldFNpemUoc2l6ZS54IC0gKGluc2V0cy5sZWZ0ICsgaW5zZXRzLnJpZ2h0KSwgc2l6ZS55IC0gKGluc2V0cy50b3AgKyBpbnNldHMuYm90dG9tKSk7Ci0JZnJhbWUuc2V0VmlzaWJsZSh0cnVlKTsJCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlpZiAoc3d0SW1hZ2UgIT0gbnVsbCkgc3d0SW1hZ2UuZGlzcG9zZSgpOwotCWlmIChzd3RJbWFnZTIgIT0gbnVsbCkgc3d0SW1hZ2UuZGlzcG9zZSgpOwotCWZyYW1lLmRpc3Bvc2UoKTsKLQlTeXN0ZW0uZXhpdCgwKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1ZGE2OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogZXhhbXBsZSBzbmlwcGV0OiBFbWJlZCBXb3JkIGluIGFuIGFwcGxldAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotCQotaW1wb3J0IGphdmEuYXBwbGV0Lio7Ci0JIAotcHVibGljIGNsYXNzIFNuaXBwZXQxNTcgZXh0ZW5kcyBBcHBsZXQgewotCQotCW9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkgZGlzcGxheTsKLQlvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCBzd3RQYXJlbnQ7Ci0JamF2YS5hd3QuQ2FudmFzIGF3dFBhcmVudDsKLQotcHVibGljIHZvaWQgaW5pdCAoKSB7Ci0JVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQgKG5ldyBSdW5uYWJsZSAoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQlzZXRMYXlvdXQobmV3IGphdmEuYXd0LkdyaWRMYXlvdXQgKDEsIDEpKTsKLQkJCWF3dFBhcmVudCA9IG5ldyBqYXZhLmF3dC5DYW52YXMgKCk7Ci0JCQlhZGQgKGF3dFBhcmVudCk7Ci0JCQlkaXNwbGF5ID0gbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkgKCk7Ci0JCQlzd3RQYXJlbnQgPSBvcmcuZWNsaXBzZS5zd3QuYXd0LlNXVF9BV1QubmV3X1NoZWxsIChkaXNwbGF5LCBhd3RQYXJlbnQpOwotCQkJc3d0UGFyZW50LnNldExheW91dCAobmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dCAoKSk7Ci0JCQlvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUZyYW1lIGZyYW1lID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRnJhbWUgKHN3dFBhcmVudCwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT05FKTsKLQkJCW9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ2xpZW50U2l0ZSBzaXRlOwotCQkJdHJ5IHsKLQkJCQlzaXRlID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ2xpZW50U2l0ZSAoZnJhbWUsIG9yZy5lY2xpcHNlLnN3dC5TV1QuTk9ORSwgIldvcmQuRG9jdW1lbnQiKTsKLQkJCX0gY2F0Y2ggKG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBzdHIgPSAiQ3JlYXRlIE9sZUNsaWVudFNpdGUgRXJyb3IiICsgZS50b1N0cmluZyAoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKHN0cik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJc2V0U2l6ZSAoNTAwLCA1MDApOwotCQkJdmFsaWRhdGUgKCk7Ci0JCQlzaXRlLmRvVmVyYiAob3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PTEUuT0xFSVZFUkJfU0hPVyk7Ci0JCQkKLQkJCXdoaWxlIChzd3RQYXJlbnQgIT0gbnVsbCAmJiAhc3d0UGFyZW50LmlzRGlzcG9zZWQgKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwkJCi0JCQl9CQotCQl9Ci0JfSk7Ci0JdGhyZWFkLnN0YXJ0ICgpOwotfQotIHB1YmxpYyB2b2lkIHN0b3AgKCl7Ci0gCWlmIChkaXNwbGF5ICE9IG51bGwgJiYgIWRpc3BsYXkuaXNEaXNwb3NlZCAoKSl7Ci0gCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSAoKSB7Ci0gCQkJcHVibGljIHZvaWQgcnVuICgpIHsKLSAJCQkJaWYgKHN3dFBhcmVudCAhPSBudWxsICYmICFzd3RQYXJlbnQuaXNEaXNwb3NlZCAoKSkgc3d0UGFyZW50LmRpc3Bvc2UgKCk7Ci0gCQkJCXN3dFBhcmVudCA9IG51bGw7Ci0gCQkJCWRpc3BsYXkuZGlzcG9zZSAoKTsKLSAJCQkJZGlzcGxheSA9IG51bGw7Ci0gCQkJfQotIAkJfSk7Ci0gCQlyZW1vdmUgKGF3dFBhcmVudCk7Ci0gCQlhd3RQYXJlbnQgPSBudWxsOwotIAl9Ci0gfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg0ZTgzZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZGV0ZXJtaW5lIG5hdGl2ZSBkYXRhIHR5cGVzIGF2YWlsYWJsZSAobW90aWYgb25seSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5tb3RpZi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1OCBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyIHsKLQotcHJpdmF0ZSBzdGF0aWMgU25pcHBldDE1OCBfaW5zdGFuY2UgPSBuZXcgU25pcHBldDE1OCgpOwotcHJpdmF0ZSBpbnRbXSBpZHM7Ci1wcml2YXRlIFN0cmluZ1tdIG5hbWVzOwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRhYmxlIGNvbnRyb2wgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5OT05FKTsKLQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29udHJvbCwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dCgiRHJhZyBkYXRhIG92ZXIgdGhpcyBzaXRlIHRvIHNlZSB0aGUgbmF0aXZlIHRyYW5zZmVyIHR5cGUuIik7Ci0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldChjb250cm9sLCBETkQuRFJPUF9ERUZBVUxUIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTksgfCBETkQuRFJPUF9NT1ZFKTsKLQl0YXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1NuaXBwZXQxNTguZ2V0SW5zdGFuY2UoKX0pOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7CQkJCi0JCQlTdHJpbmcgb3BzID0gIiI7Ci0JCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9DT1BZKSAhPSAwKSBvcHMgKz0gIkNvcHk7IjsKLQkJCWlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX01PVkUpICE9IDApIG9wcyArPSAiTW92ZTsiOwotCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfTElOSykgIT0gMCkgb3BzICs9ICJMaW5rOyI7Ci0JCQljb250cm9sLnJlbW92ZUFsbCgpOwotCQkJVGFibGVJdGVtIGl0ZW0xID0gbmV3IFRhYmxlSXRlbShjb250cm9sLFNXVC5OT05FKTsKLQkJCWl0ZW0xLnNldFRleHQoIkFsbG93ZWQgT3BlcmF0aW9ucyBhcmUgIitvcHMpOwotCQkJCi0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9DT1BZKSAhPSAwKSB7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkJfSBlbHNlIGlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0xJTkspICE9IDApIHsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTElOSzsKLQkJCQl9IGVsc2UgaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfTU9WRSkgIT0gMCkgewotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9NT1ZFOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJVHJhbnNmZXJEYXRhW10gZGF0YSA9IGV2ZW50LmRhdGFUeXBlczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJCWludCBpZCA9IGRhdGFbaV0udHlwZTsKLQkJCQlTdHJpbmcgbmFtZSA9IGdldE5hbWVGcm9tSWQoaWQpOwotCQkJCVRhYmxlSXRlbSBpdGVtMiA9IG5ldyBUYWJsZUl0ZW0oY29udHJvbCxTV1QuTk9ORSk7Ci0JCQkJaXRlbTIuc2V0VGV4dCgiRGF0YSB0eXBlIGlzICIraWQrIiAiK25hbWUpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0Jc2hlbGwuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgU25pcHBldDE1OCBnZXRJbnN0YW5jZSAoKSB7Ci0JcmV0dXJuIF9pbnN0YW5jZTsKLX0KLVNuaXBwZXQxNTgoKSB7Ci19Ci1wdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUgKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLX0KLXB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpewotCXJldHVybiAiSGVsbG8gV29ybGQiOwotfQotcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpewotCXJldHVybiBuYW1lczsKLX0KLXN0YXRpYyBpbnQgc2hlbGxIYW5kbGU7Ci1wcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpewotCWlmIChpZHMgPT0gbnVsbCkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaW50IHdpZGdldENsYXNzID0gT1MudG9wTGV2ZWxTaGVsbFdpZGdldENsYXNzICgpOwotCQlzaGVsbEhhbmRsZSA9IE9TLlh0QXBwQ3JlYXRlU2hlbGwgKG51bGwsIG51bGwsIHdpZGdldENsYXNzLCBkaXNwbGF5LnhEaXNwbGF5LCBudWxsLCAwKTsKLQkJT1MuWHRTZXRNYXBwZWRXaGVuTWFuYWdlZCAoc2hlbGxIYW5kbGUsIGZhbHNlKTsKLQkJT1MuWHRSZWFsaXplV2lkZ2V0IChzaGVsbEhhbmRsZSk7Ci0JCQotCQlpZHMgPSBuZXcgaW50Wzg0MF07Ci0JCW5hbWVzID0gbmV3IFN0cmluZ1s4NDBdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJaWRzW2ldID0gaStpOwotCQkJbmFtZXNbaV0gPSBnZXROYW1lRnJvbUlkKGkrMSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGlkczsKLX0KLXN0YXRpYyBTdHJpbmcgZ2V0TmFtZUZyb21JZChpbnQgaWQpIHsKLQlpbnQgeERpc3BsYXkgPSBPUy5YdERpc3BsYXkgKHNoZWxsSGFuZGxlKTsKLQlpbnQgcHRyID0gMDsKLQl0cnkgewotCQlwdHIgPSBPUy5YbUdldEF0b21OYW1lKHhEaXNwbGF5LCBpZCk7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQl9Ci0JaWYgKHB0ciA9PSAwKSByZXR1cm4gImludmFsaWQgIitpZDsKLQlpbnQgbGVuZ3RoID0gT1Muc3RybGVuKHB0cik7Ci0JYnl0ZVtdIG5hbWVCdWYgPSBuZXcgYnl0ZVtsZW5ndGhdOwotCU9TLm1lbW1vdmUobmFtZUJ1ZiwgcHRyLCBsZW5ndGgpOwotCU9TLlhGcmVlKHB0cik7Ci0JcmV0dXJuIG5ldyBTdHJpbmcoQ29udmVydGVyLm1iY3NUb1djcyhudWxsLCBuYW1lQnVmKSkudG9Mb3dlckNhc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE0NmQwZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IG1vZGlmeSBIVE1MIHRpdGxlIHRhZwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTU5IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBTdHJpbmcgbmV3VGl0bGUgPSAiTmV3IFZhbHVlIGZvciBUaXRsZSI7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIuYWRkVGl0bGVMaXN0ZW5lcihuZXcgVGl0bGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoVGl0bGVFdmVudCBldmVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGl0bGVFdmVudDogIitldmVudC50aXRsZSk7Ci0JCQkJc2hlbGwuc2V0VGV4dChldmVudC50aXRsZSk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJLyogU2V0IEhUTUwgdGl0bGUgdGFnIHVzaW5nIEphdmFTY3JpcHQgYW5kIERPTSB3aGVuIHBhZ2UgaGFzIGJlZW4gbG9hZGVkICovCi0JCQkJYm9vbGVhbiByZXN1bHQgPSBicm93c2VyLmV4ZWN1dGUoImRvY3VtZW50LnRpdGxlPSciK25ld1RpdGxlKyInIik7Ci0JCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQkJLyogU2NyaXB0IG1heSBmYWlsIG9yIG1heSBub3QgYmUgc3VwcG9ydGVkIG9uIGNlcnRhaW4gcGxhdGZvcm1zLiAqLwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNjcmlwdCB3YXMgbm90IGV4ZWN1dGVkLiIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCS8qIExvYWQgYW4gSFRNTCBkb2N1bWVudCAqLwotCQlicm93c2VyLnNldFVybCgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzZjYTMzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBEaXNwbGF5IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIG9uZSByZXBlYXRpbmcgdGltZXIgKGV2ZXJ5IDUwMCBtcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBpbnQgdGltZSA9IDUwMDsKLQlSdW5uYWJsZSB0aW1lciA9IG5ldyBSdW5uYWJsZSAoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQlQb2ludCBwb2ludCA9IGRpc3BsYXkuZ2V0Q3Vyc29yTG9jYXRpb24gKCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldEJvdW5kcyAoKTsKLQkJCWlmIChyZWN0LmNvbnRhaW5zIChwb2ludCkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJJbiIpOwotCQkJfSBlbHNlIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJPdXQiKTsKLQkJCX0KLQkJCWRpc3BsYXkudGltZXJFeGVjICh0aW1lLCB0aGlzKTsKLQkJfQotCX07Ci0JZGlzcGxheS50aW1lckV4ZWMgKHRpbWUsIHRpbWVyKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7CQotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlZTdmYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IHF1ZXJ5IERPTSBub2RlIHZhbHVlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjAgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWZpbmFsIFN0cmluZyBodG1sID0gIjxodG1sPjx0aXRsZT5TbmlwcGV0PC90aXRsZT48Ym9keT48cCBpZD0nbXlpZCc+QmVzdCBGcmllbmRzPC9wPjxwIGlkPSdteWlkMic+Q2F0IGFuZCBEb2c8L3A+PC9ib2R5PjwvaHRtbD4iOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZFN0YXR1c1RleHRMaXN0ZW5lcihuZXcgU3RhdHVzVGV4dExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJCQlicm93c2VyLnNldERhdGEoInF1ZXJ5IiwgZXZlbnQudGV4dCk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJLyogCi0JCQkJICogVXNlIEphdmFTY3JpcHQgdG8gcXVlcnkgdGhlIGRlc2lyZWQgbm9kZSBjb250ZW50IHRocm91Z2ggdGhlIERvY3VtZW50IE9iamVjdCBNb2RlbAotCQkJCSAqIAotCQkJCSAqIEFzc2lnbiByZXN1bHQgdG8gdGhlIHdpbmRvdyBwcm9wZXJ0eSBzdGF0dXMgdG8gcGFzcyB0aGUgcmVzdWx0IHRvIHRoZSBTdGF0dXNUZXh0TGlzdGVuZXIKLQkJCQkgKiBUaGlzIHRyaWNrIGlzIHJlcXVpcmVkIHNpbmNlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IGRvZXMgbm90IHJldHVybiB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPgotCQkJCSAqIGRpcmVjdGx5LgotCQkJCSAqLwotCQkJCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5leGVjdXRlKCJ3aW5kb3cuc3RhdHVzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteWlkJykuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU7Iik7Ci0JCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQkJLyogU2NyaXB0IG1heSBmYWlsIG9yIG1heSBub3QgYmUgc3VwcG9ydGVkIG9uIGNlcnRhaW4gcGxhdGZvcm1zLiAqLwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNjcmlwdCB3YXMgbm90IGV4ZWN1dGVkLiIpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpYnJvd3Nlci5nZXREYXRhKCJxdWVyeSIpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm9kZSB2YWx1ZTogIit2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkvKiBMb2FkIGFuIEhUTUwgZG9jdW1lbnQgKi8KLQkJYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZjVlOWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiBtb2RpZnkgRE9NIChleGVjdXRpbmcgamF2YXNjcmlwdCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2MSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgU3RyaW5nIGh0bWwgPSAiPGh0bWw+PHRpdGxlPlNuaXBwZXQ8L3RpdGxlPjxib2R5PjxwIGlkPSdteWlkJz5CZXN0IEZyaWVuZHM8L3A+PHAgaWQ9J215aWQyJz5DYXQgYW5kIERvZzwvcD48L2JvZHk+PC9odG1sPiI7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChjb21wLCBTV1QuTVVMVEkpOwotCQl0ZXh0LnNldFRleHQoInZhciBuZXdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnUCcpOyBcclxuIisKLQkJCQkidmFyIHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnQXQgbGVhc3Qgd2hlbiBJIGFtIGFyb3VuZCcpO1xyXG4iKwotCQkJCSJuZXdOb2RlLmFwcGVuZENoaWxkKHRleHQpO1xyXG4iKwotCQkJCSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXlpZCcpLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4iKwotCQkJCSJcclxuIisKLQkJCQkiZG9jdW1lbnQuYmdDb2xvcj0neWVsbG93JzsiKTsKLQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCgiRXhlY3V0ZSBTY3JpcHQiKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJYm9vbGVhbiByZXN1bHQgPSBicm93c2VyLmV4ZWN1dGUodGV4dC5nZXRUZXh0KCkpOwotCQkJCWlmICghcmVzdWx0KSB7Ci0JCQkJCS8qIFNjcmlwdCBtYXkgZmFpbCBvciBtYXkgbm90IGJlIHN1cHBvcnRlZCBvbiBjZXJ0YWluIHBsYXRmb3Jtcy4gKi8KLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTY3JpcHQgd2FzIG5vdCBleGVjdXRlZC4iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLnNldFRleHQoaHRtbCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkMjg2YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEFkZGluZyBhbiBhY2Nlc3NpYmxlIGxpc3RlbmVyIHRvIHByb3ZpZGUgc3RhdGUgaW5mb3JtYXRpb24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjIgewotCi1maW5hbCBzdGF0aWMgU3RyaW5nIFNUQVRFID0gIkNoZWNrZWRJbmRpY2VzIjsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JSW1hZ2UgY2hlY2tlZEltYWdlID0gZ2V0Q2hlY2tlZEltYWdlIChkaXNwbGF5KTsKLQlJbWFnZSB1bmNoZWNrZWRJbWFnZSA9IGdldFVuY2hlY2tlZEltYWdlIChkaXNwbGF5KTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMyA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUl0ZW0gaXRlbTEgPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0xLnNldFRleHQgKG5ldyBTdHJpbmcgW10geyJmaXJzdCBpdGVtIiwgImEiLCAiYiJ9KTsKLQlpdGVtMS5zZXRJbWFnZSAoMSwgdW5jaGVja2VkSW1hZ2UpOwotCWl0ZW0xLnNldEltYWdlICgyLCB1bmNoZWNrZWRJbWFnZSk7Ci0JaXRlbTEuc2V0RGF0YSAoU1RBVEUsIG51bGwpOwotCVRhYmxlSXRlbSBpdGVtMiA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbTIuc2V0VGV4dCAobmV3IFN0cmluZyBbXSB7InNlY29uZCBpdGVtIiwgImMiLCAiZCJ9KTsKLQlpdGVtMi5zZXRJbWFnZSAoMSwgdW5jaGVja2VkSW1hZ2UpOwotCWl0ZW0yLnNldEltYWdlICgyLCBjaGVja2VkSW1hZ2UpOwotCWl0ZW0yLnNldERhdGEgKFNUQVRFLCBuZXcgaW50IFtdIHsyfSk7Ci0JVGFibGVJdGVtIGl0ZW0zID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQlpdGVtMy5zZXRUZXh0IChuZXcgU3RyaW5nIFtdIHsidGhpcmQiLCAiZSIsICJmIn0pOwotCWl0ZW0zLnNldEltYWdlICgxLCBjaGVja2VkSW1hZ2UpOwotCWl0ZW0zLnNldEltYWdlICgyLCBjaGVja2VkSW1hZ2UpOwotCWl0ZW0zLnNldERhdGEgKFNUQVRFLCBuZXcgaW50IFtdIHsxLCAyfSk7Ci0JY29sdW1uMS5wYWNrICgpOwotCWNvbHVtbjIucGFjayAoKTsKLQljb2x1bW4zLnBhY2sgKCk7Ci0JQWNjZXNzaWJsZSBhY2Nlc3NpYmxlID0gdGFibGUuZ2V0QWNjZXNzaWJsZSAoKTsKLQlhY2Nlc3NpYmxlLmFkZEFjY2Vzc2libGVMaXN0ZW5lciAobmV3IEFjY2Vzc2libGVBZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgZ2V0TmFtZSAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCXN1cGVyLmdldE5hbWUgKGUpOwotCQkJaWYgKGUuY2hpbGRJRCA+PSAwICYmIGUuY2hpbGRJRCA8IHRhYmxlLmdldEl0ZW1Db3VudCAoKSkgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoZS5jaGlsZElEKTsKLQkJCQlQb2ludCBwdCA9IGRpc3BsYXkuZ2V0Q3Vyc29yTG9jYXRpb24gKCk7Ci0JCQkJcHQgPSBkaXNwbGF5Lm1hcCAobnVsbCwgdGFibGUsIHB0KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlLmdldENvbHVtbkNvdW50ICgpOyBpKyspIHsKLQkJCQkJaWYgKGl0ZW0uZ2V0Qm91bmRzIChpKS5jb250YWlucyAocHQpKSB7Ci0JCQkJCQlpbnQgW10gZGF0YSA9IChpbnQgW10pIGl0ZW0uZ2V0RGF0YSAoU1RBVEUpOwotCQkJCQkJYm9vbGVhbiBjaGVja2VkID0gZmFsc2U7Ci0JCQkJCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkYXRhLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJCWlmIChkYXRhIFtqXSA9PSBpKSB7Ci0JCQkJCQkJCQljaGVja2VkID0gdHJ1ZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZS5yZXN1bHQgPSBpdGVtLmdldFRleHQgKGkpICsgIiAiICsgKGNoZWNrZWQgPyAiY2hlY2tlZCIgOiAidW5jaGVja2VkIik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCWFjY2Vzc2libGUuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciAobmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldFN0YXRlIChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCXN1cGVyLmdldFN0YXRlIChlKTsKLQkJCWlmIChlLmNoaWxkSUQgPj0gMCAmJiBlLmNoaWxkSUQgPCB0YWJsZS5nZXRJdGVtQ291bnQgKCkpIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGUuY2hpbGRJRCk7Ci0JCQkJaW50IFtdIGRhdGEgPSAoaW50IFtdKSBpdGVtLmdldERhdGEgKFNUQVRFKTsKLQkJCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJCVBvaW50IHB0ID0gZGlzcGxheS5nZXRDdXJzb3JMb2NhdGlvbiAoKTsKLQkJCQkJcHQgPSBkaXNwbGF5Lm1hcCAobnVsbCwgdGFibGUsIHB0KTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoaXRlbS5nZXRCb3VuZHMgKGRhdGEgW2ldKS5jb250YWlucyAocHQpKSB7Ci0JCQkJCQkJZS5kZXRhaWwgfD0gQUNDLlNUQVRFX0NIRUNLRUQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQljaGVja2VkSW1hZ2UuZGlzcG9zZSAoKTsKLQl1bmNoZWNrZWRJbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotc3RhdGljIEltYWdlIGdldENoZWNrZWRJbWFnZSAoRGlzcGxheSBkaXNwbGF5KSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDE2LCAxNik7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfWUVMTE9XKSk7Ci0JZ2MuZmlsbE92YWwgKDAsIDAsIDE2LCAxNik7Ci0JZ2Muc2V0Rm9yZWdyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0RBUktfR1JFRU4pKTsKLQlnYy5kcmF3TGluZSAoMCwgMCwgMTYsIDE2KTsKLQlnYy5kcmF3TGluZSAoMTYsIDAsIDAsIDE2KTsKLQlnYy5kaXNwb3NlICgpOwotCXJldHVybiBpbWFnZTsKLX0KLQotc3RhdGljIEltYWdlIGdldFVuY2hlY2tlZEltYWdlIChEaXNwbGF5IGRpc3BsYXkpIHsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMTYsIDE2KTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9ZRUxMT1cpKTsKLQlnYy5maWxsT3ZhbCAoMCwgMCwgMTYsIDE2KTsKLQlnYy5kaXNwb3NlICgpOwotCXJldHVybiBpbWFnZTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5N2ZkNGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNldHRpbmcgdGhlIGZvbnQgc3R5bGUsIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzIG9mIFN0eWxlZFRleHQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlTdHlsZWRUZXh0IHRleHQgPSBuZXcgU3R5bGVkVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSBBQkNERUZHSElKS0xNIE5PUFFSU1RVVldYWVoiKTsKLQkvLyBtYWtlIDAxMjM0NTY3ODkgYXBwZWFyIGJvbGQKLQlTdHlsZVJhbmdlIHN0eWxlMSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUxLnN0YXJ0ID0gMDsKLQlzdHlsZTEubGVuZ3RoID0gMTA7Ci0Jc3R5bGUxLmZvbnRTdHlsZSA9IFNXVC5CT0xEOwotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZTEpOwotCS8vIG1ha2UgQUJDREVGR0hJSktMTSBoYXZlIGEgcmVkIGZvbnQKLQlTdHlsZVJhbmdlIHN0eWxlMiA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUyLnN0YXJ0ID0gMTE7Ci0Jc3R5bGUyLmxlbmd0aCA9IDEzOwotCXN0eWxlMi5mb3JlZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUyKTsKLQkvLyBtYWtlIE5PUFFSU1RVVldYWVogaGF2ZSBhIGJsdWUgYmFja2dyb3VuZAotCVN0eWxlUmFuZ2Ugc3R5bGUzID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTMuc3RhcnQgPSAyNTsKLQlzdHlsZTMubGVuZ3RoID0gMTM7Ci0Jc3R5bGUzLmJhY2tncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUzKTsKLQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjk0NWY0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBPdmVycmlkZSB0aGUgdGV4dCB0aGF0IGlzIHNwb2tlbiBmb3IgYSBuYXRpdmUgQnV0dG9uLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTY0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCi0JQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjEuc2V0VGV4dCgiJlR5cGljYWwgYnV0dG9uIik7Ci0JYnV0dG9uMS5zZXRCb3VuZHMoMTAsMTAsMTgwLDMwKTsKLQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uMi5zZXRUZXh0KCImT3ZlcmlkZGVuIGJ1dHRvbiIpOwotCWJ1dHRvbjIuc2V0Qm91bmRzKDEwLDUwLDE4MCwzMCk7Ci0JYnV0dG9uMi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJZS5yZXN1bHQgPSAiU3BlYWsgdGhpcyBpbnN0ZWFkIG9mIHRoZSBidXR0b24gdGV4dCI7Ci0JCX0KLQl9KTsKLQkKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWNiMThiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSBDVGFiRm9sZGVyIHdpdGggbWluIGFuZCBtYXggYnV0dG9ucywgYXMgd2VsbCBhcyBjbG9zZSBidXR0b24gYW5kIAotICogaW1hZ2Ugb25seSBvbiBzZWxlY3RlZCB0YWIuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDE2LCAxNik7Ci0JR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgMTYsIDE2KTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVykpOwotCWdjLmZpbGxSZWN0YW5nbGUoMywgMywgMTAsIDEwKTsKLQlnYy5kaXNwb3NlKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlmaW5hbCBDVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCWZvbGRlci5zZXRTaW1wbGUoZmFsc2UpOwotCWZvbGRlci5zZXRVbnNlbGVjdGVkSW1hZ2VWaXNpYmxlKGZhbHNlKTsKLQlmb2xkZXIuc2V0VW5zZWxlY3RlZENsb3NlVmlzaWJsZShmYWxzZSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJQ1RhYkl0ZW0gaXRlbSA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5DTE9TRSk7Ci0JCWl0ZW0uc2V0VGV4dCgiSXRlbSAiK2kpOwotCQlpdGVtLnNldEltYWdlKGltYWdlKTsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoZm9sZGVyLCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQl0ZXh0LnNldFRleHQoIlRleHQgZm9yIGl0ZW0gIitpKyJcblxub25lLCB0d28sIHRocmVlXG5cbmFiY2RlZmdoaWprbG1ub3AiKTsKLQkJaXRlbS5zZXRDb250cm9sKHRleHQpOwotCX0KLQlmb2xkZXIuc2V0TWluaW1pemVWaXNpYmxlKHRydWUpOwotCWZvbGRlci5zZXRNYXhpbWl6ZVZpc2libGUodHJ1ZSk7Ci0JZm9sZGVyLmFkZENUYWJGb2xkZXIyTGlzdGVuZXIobmV3IENUYWJGb2xkZXIyQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgbWluaW1pemUoQ1RhYkZvbGRlckV2ZW50IGV2ZW50KSB7Ci0JCQlmb2xkZXIuc2V0TWluaW1pemVkKHRydWUpOwotCQkJc2hlbGwubGF5b3V0KHRydWUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG1heGltaXplKENUYWJGb2xkZXJFdmVudCBldmVudCkgewotCQkJZm9sZGVyLnNldE1heGltaXplZCh0cnVlKTsKLQkJCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJCXNoZWxsLmxheW91dCh0cnVlKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZXN0b3JlKENUYWJGb2xkZXJFdmVudCBldmVudCkgewotCQkJZm9sZGVyLnNldE1pbmltaXplZChmYWxzZSk7Ci0JCQlmb2xkZXIuc2V0TWF4aW1pemVkKGZhbHNlKTsKLQkJCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0JCQlzaGVsbC5sYXlvdXQodHJ1ZSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDcyN2YwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSBTY3JvbGxlZENvbXBvc2l0ZSB3aXRoIHdyYXBwaW5nIGNvbnRlbnQuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlJbWFnZSBpbWFnZTEgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dPUktJTkcpOwotCUltYWdlIGltYWdlMiA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fUVVFU1RJT04pOwotCUltYWdlIGltYWdlMyA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fRVJST1IpOwotCQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkKLQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzY3JvbGxDb21wb3NpdGUgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCi0JZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoc2Nyb2xsQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JZm9yKGludCBpID0gMDsgaSA8PSA1MDsgaSsrKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlpZiAoaSAlIDMgPT0gMCkgbGFiZWwuc2V0SW1hZ2UoaW1hZ2UxKTsKLQkJaWYgKGkgJSAzID09IDEpIGxhYmVsLnNldEltYWdlKGltYWdlMik7Ci0JCWlmIChpICUgMyA9PSAyKSBsYWJlbC5zZXRJbWFnZShpbWFnZTMpOwotCX0KLQlSb3dMYXlvdXQgbGF5b3V0ID0gbmV3IFJvd0xheW91dChTV1QuSE9SSVpPTlRBTCk7Ci0JbGF5b3V0LndyYXAgPSB0cnVlOwotCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQlzY3JvbGxDb21wb3NpdGUuc2V0Q29udGVudChwYXJlbnQpOwotCXNjcm9sbENvbXBvc2l0ZS5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQlzY3JvbGxDb21wb3NpdGUuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQlzY3JvbGxDb21wb3NpdGUuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSByID0gc2Nyb2xsQ29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQkJCXNjcm9sbENvbXBvc2l0ZS5zZXRNaW5TaXplKHBhcmVudC5jb21wdXRlU2l6ZShyLndpZHRoLCBTV1QuREVGQVVMVCkpOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNjIxMWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSB0d28gU2Nyb2xsZWRDb21wb3NpdGVzIHRoYXQgc2Nyb2xsIGluIHRhbmRlbS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlCdXR0b24gYnV0dG9uMSA9IG5ldyBCdXR0b24gKHNjMSwgU1dULlBVU0gpOwotCWJ1dHRvbjEuc2V0VGV4dCAoIkJ1dHRvbiAxIik7Ci0JYnV0dG9uMS5zZXRTaXplICg0MDAsIDMwMCk7Ci0Jc2MxLnNldENvbnRlbnQgKGJ1dHRvbjEpOwotCi0JZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MyID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKHNjMiwgU1dULlBVU0gpOwotCWJ1dHRvbjIuc2V0VGV4dCAoIkJ1dHRvbiAyIik7Ci0JYnV0dG9uMi5zZXRTaXplICgzMDAsIDQwMCk7Ci0Jc2MyLnNldENvbnRlbnQgKGJ1dHRvbjIpOwotCi0JZmluYWwgU2Nyb2xsQmFyIHZCYXIxID0gc2MxLmdldFZlcnRpY2FsQmFyICgpOwotCWZpbmFsIFNjcm9sbEJhciB2QmFyMiA9IHNjMi5nZXRWZXJ0aWNhbEJhciAoKTsKLQlmaW5hbCBTY3JvbGxCYXIgaEJhcjEgPSBzYzEuZ2V0SG9yaXpvbnRhbEJhciAoKTsKLQlmaW5hbCBTY3JvbGxCYXIgaEJhcjIgPSBzYzIuZ2V0SG9yaXpvbnRhbEJhciAoKTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjEgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpbnQgeCA9ICBoQmFyMS5nZXRTZWxlY3Rpb24oKSAqIChoQmFyMi5nZXRNYXhpbXVtKCkgLSBoQmFyMi5nZXRUaHVtYigpKSAvIE1hdGgubWF4KDEsIGhCYXIxLmdldE1heGltdW0oKSAtIGhCYXIxLmdldFRodW1iKCkpOwotCQkJaW50IHkgPSAgdkJhcjEuZ2V0U2VsZWN0aW9uKCkgKiAodkJhcjIuZ2V0TWF4aW11bSgpIC0gdkJhcjIuZ2V0VGh1bWIoKSkgLyBNYXRoLm1heCgxLCB2QmFyMS5nZXRNYXhpbXVtKCkgLSB2QmFyMS5nZXRUaHVtYigpKTsKLQkJCXNjMi5zZXRPcmlnaW4gKHgsIHkpOwotCQl9Ci0JfTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpbnQgeCA9ICBoQmFyMi5nZXRTZWxlY3Rpb24oKSAqIChoQmFyMS5nZXRNYXhpbXVtKCkgLSBoQmFyMS5nZXRUaHVtYigpKSAvIE1hdGgubWF4KDEsIGhCYXIyLmdldE1heGltdW0oKSAtIGhCYXIyLmdldFRodW1iKCkpOwotCQkJaW50IHkgPSAgdkJhcjIuZ2V0U2VsZWN0aW9uKCkgKiAodkJhcjEuZ2V0TWF4aW11bSgpIC0gdkJhcjEuZ2V0VGh1bWIoKSkgLyBNYXRoLm1heCgxLCB2QmFyMi5nZXRNYXhpbXVtKCkgLSB2QmFyMi5nZXRUaHVtYigpKTsKLQkJCXNjMS5zZXRPcmlnaW4gKHgsIHkpOwotCQl9Ci0JfTsKLQl2QmFyMS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobGlzdGVuZXIxKTsKLQloQmFyMS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobGlzdGVuZXIxKTsKLQl2QmFyMi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobGlzdGVuZXIyKTsKLQloQmFyMi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobGlzdGVuZXIyKTsKLQotCXNoZWxsLnNldFNpemUgKDQwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNzI2ZDMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYXcgbGluZXMgYW5kIHBvbHlnb25zIHdpdGggZGlmZmVyZW50IGNhcCBhbmQgam9pbiBzdHlsZXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTY4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgeCA9IDIwLCB5ID0gMjAsIHcgPSAxMjAsIGggPSA2MDsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLQkJCWdjLnNldExpbmVXaWR0aCgxMCk7Ci0JCQlpbnRbXSBjYXBzID0ge1NXVC5DQVBfRkxBVCwgU1dULkNBUF9ST1VORCwgU1dULkNBUF9TUVVBUkV9OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZ2Muc2V0TGluZUNhcChjYXBzW2ldKTsKLQkJCQlnYy5kcmF3TGluZSh4LCB5LCB4ICsgdywgeSk7Ci0JCQkJeSArPSAyMDsKLQkJCX0KLQkJCWludFtdIGpvaW5zID0ge1NXVC5KT0lOX0JFVkVMLCBTV1QuSk9JTl9NSVRFUiwgU1dULkpPSU5fUk9VTkR9OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2lucy5sZW5ndGg7IGkrKykgewotCQkJCWdjLnNldExpbmVKb2luKGpvaW5zW2ldKTsKLQkJCQlnYy5kcmF3UG9seWdvbihuZXcgaW50W10ge3gsIHksIHggKyB3LzIsIHkgKyBoLCB4ICsgdywgeX0pOwotCQkJCXkgKz0gaCArIDIwOwotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0JCQotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2RhMzIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBNYWtlIGEgdG9nZ2xlIGJ1dHRvbiBoYXZlIHJhZGlvIGJlaGF2aW9yCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTY5IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlDb250cm9sIFtdIGNoaWxkcmVuID0gc2hlbGwuZ2V0Q2hpbGRyZW4gKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW4gW2ldOwotCQkJCWlmIChlLndpZGdldCAhPSBjaGlsZCAmJiBjaGlsZCBpbnN0YW5jZW9mIEJ1dHRvbiAmJiAoY2hpbGQuZ2V0U3R5bGUgKCkgJiBTV1QuVE9HR0xFKSAhPSAwKSB7Ci0JCQkJCSgoQnV0dG9uKSBjaGlsZCkuc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQkJKChCdXR0b24pIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQl9Ci0JfTsKLQlmb3IgKGludCBpPTA7IGk8MjA7IGkrKykgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5UT0dHTEUpOwotCQlidXR0b24uc2V0VGV4dCAoIkIiICsgaSk7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlpZiAoaSA9PSAwKSBidXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQl9Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmZjgzYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTbGlkZXIgZXhhbXBsZSBzbmlwcGV0OiBwcmludCBzY3JvbGwgZXZlbnQgZGV0YWlscwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVNsaWRlciBzbGlkZXIgPSBuZXcgU2xpZGVyIChzaGVsbCwgU1dULkhPUklaT05UQUwpOwotCXNsaWRlci5zZXRCb3VuZHMgKDEwLCAxMCwgMjAwLCAzMik7Ci0Jc2xpZGVyLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiU1dULk5PTkUiOwotCQkJc3dpdGNoIChldmVudC5kZXRhaWwpIHsKLQkJCQljYXNlIFNXVC5EUkFHOiBzdHJpbmcgPSAiU1dULkRSQUciOyBicmVhazsKLQkJCQljYXNlIFNXVC5IT01FOiBzdHJpbmcgPSAiU1dULkhPTUUiOyBicmVhazsKLQkJCQljYXNlIFNXVC5FTkQ6IHN0cmluZyA9ICJTV1QuRU5EIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuQVJST1dfRE9XTjogc3RyaW5nID0gIlNXVC5BUlJPV19ET1dOIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuQVJST1dfVVA6IHN0cmluZyA9ICJTV1QuQVJST1dfVVAiOyBicmVhazsKLQkJCQljYXNlIFNXVC5QQUdFX0RPV046IHN0cmluZyA9ICJTV1QuUEFHRV9ET1dOIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuUEFHRV9VUDogc3RyaW5nID0gIlNXVC5QQUdFX1VQIjsgYnJlYWs7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJTY3JvbGwgZGV0YWlsIC0+ICIgKyBzdHJpbmcpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTdiOWU3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSBUcmVlIHdpdGggY29sdW1ucwotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3MCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCQljb2x1bW4xLnNldFRleHQoIkNvbHVtbiAxIik7Ci0JCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQkJVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbjIuc2V0VGV4dCgiQ29sdW1uIDIiKTsKLQkJY29sdW1uMi5zZXRXaWR0aCgyMDApOwotCQlUcmVlQ29sdW1uIGNvbHVtbjMgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuUklHSFQpOwotCQljb2x1bW4zLnNldFRleHQoIkNvbHVtbiAzIik7Ci0JCWNvbHVtbjMuc2V0V2lkdGgoMjAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ICJpdGVtICIgKyBpLCAiYWJjIiwgImRlZmdoaSIgfSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IDQ7IGorKykgewotCQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJCXN1Ykl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyAic3ViaXRlbSAiICsgaiwgImprbG1ub3AiLCAicXJzIiB9KTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykgewotCQkJCQlUcmVlSXRlbSBzdWJzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHN1Ykl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJc3Vic3ViSXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ICJzdWJzdWJpdGVtICIgKyBrLCAidHV2IiwgInd4eXoiIH0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgewotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJCX0KLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTdiYWVjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRlZmluZSBkYXRhIHRyYW5zZmVyIHR5cGVzIHRoYXQgc3ViY2xhc3MgZWFjaAotICogb3RoZXIKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3MSB7Ci0KLS8qCi0gKiBUaGUgZGF0YSBiZWluZyB0cmFuc2ZlcnJlZCBpcyBhbiA8Ym9sZD5hcnJheSBvZiB0eXBlIE15VHlwZTwvYm9sZD4gd2hlcmUKLSAqIE15VHlwZSBpcyBkZWZpbmUgYXM6Ci0gKi8KLXN0YXRpYyBjbGFzcyBNeVR5cGUgewotCVN0cmluZyBmaWxlTmFtZTsKLQlsb25nIGZpbGVMZW5ndGg7Ci0JbG9uZyBsYXN0TW9kaWZpZWQ7Ci19Ci0KLXN0YXRpYyBjbGFzcyBNeVRyYW5zZmVyIGV4dGVuZHMgQnl0ZUFycmF5VHJhbnNmZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1ZVFlQRU5BTUUgPSAiTXl0eXBlVHJhbnNmZXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNWVRZUEVJRCA9IHJlZ2lzdGVyVHlwZShNWVRZUEVOQU1FKTsKLQlwcml2YXRlIHN0YXRpYyBNeVRyYW5zZmVyIF9pbnN0YW5jZSA9IG5ldyBNeVRyYW5zZmVyKCk7Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zZmVyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gX2luc3RhbmNlOwotCX0KLQotCWJ5dGVbXSBqYXZhVG9CeXRlQXJyYXkoT2JqZWN0IG9iamVjdCkgewotCQlNeVR5cGUgZGF0YSA9IChNeVR5cGUpIG9iamVjdDsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlEYXRhT3V0cHV0U3RyZWFtIHdyaXRlT3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0KTsKLQkJCWJ5dGVbXSBidWZmZXIgPSBkYXRhLmZpbGVOYW1lLmdldEJ5dGVzKCk7Ci0JCQl3cml0ZU91dC53cml0ZUludChidWZmZXIubGVuZ3RoKTsKLQkJCXdyaXRlT3V0LndyaXRlKGJ1ZmZlcik7Ci0JCQl3cml0ZU91dC53cml0ZUxvbmcoZGF0YS5maWxlTGVuZ3RoKTsKLQkJCXdyaXRlT3V0LndyaXRlTG9uZyhkYXRhLmxhc3RNb2RpZmllZCk7Ci0JCQlidWZmZXIgPSBvdXQudG9CeXRlQXJyYXkoKTsKLQkJCXdyaXRlT3V0LmNsb3NlKCk7Ci0JCQlyZXR1cm4gYnVmZmVyOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JT2JqZWN0IGJ5dGVBcnJheVRvSmF2YShieXRlW10gYnl0ZXMpIHsKLQkJTXlUeXBlIGRhdGEgPSBuZXcgTXlUeXBlKCk7Ci0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0JCQlEYXRhSW5wdXRTdHJlYW0gcmVhZEluID0gbmV3IERhdGFJbnB1dFN0cmVhbShpbik7Ci0JCQlpbnQgc2l6ZSA9IHJlYWRJbi5yZWFkSW50KCk7Ci0JCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQlyZWFkSW4ucmVhZChidWZmZXIpOwotCQkJZGF0YS5maWxlTmFtZSA9IG5ldyBTdHJpbmcoYnVmZmVyKTsKLQkJCWRhdGEuZmlsZUxlbmd0aCA9IHJlYWRJbi5yZWFkTG9uZygpOwotCQkJZGF0YS5sYXN0TW9kaWZpZWQgPSByZWFkSW4ucmVhZExvbmcoKTsKLQkJCXJlYWRJbi5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JcHVibGljIHZvaWQgamF2YVRvTmF0aXZlKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkJaWYgKCFjaGVja015VHlwZShvYmplY3QpIHx8ICFpc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSkgewotCQkJRE5ELmVycm9yKERORC5FUlJPUl9JTlZBTElEX0RBVEEpOwotCQl9Ci0JCWJ5dGVbXSBidWZmZXIgPSBqYXZhVG9CeXRlQXJyYXkob2JqZWN0KTsKLQkJc3VwZXIuamF2YVRvTmF0aXZlKGJ1ZmZlciwgdHJhbnNmZXJEYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JCWlmIChpc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSkgewotCQkJYnl0ZVtdIGJ1ZmZlciA9IChieXRlW10pIHN1cGVyLm5hdGl2ZVRvSmF2YSh0cmFuc2ZlckRhdGEpOwotCQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGJ5dGVBcnJheVRvSmF2YShidWZmZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBNWVRZUEVOQU1FIH07Ci0JfQotCi0JcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKSB7Ci0JCXJldHVybiBuZXcgaW50W10geyBNWVRZUEVJRCB9OwotCX0KLQotCWJvb2xlYW4gY2hlY2tNeVR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgTXlUeXBlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGNoZWNrTXlUeXBlKG9iamVjdCk7Ci0JfQotfQotCi0vKgotICogVGhlIGRhdGEgYmVpbmcgdHJhbnNmZXJyZWQgaXMgYW4gPGJvbGQ+YXJyYXkgb2YgdHlwZSBNeVR5cGUyPC9ib2xkPgotICogd2hlcmUgTXlUeXBlMiBpcyBkZWZpbmUgYXM6Ci0gKi8KLXN0YXRpYyBjbGFzcyBNeVR5cGUyIGV4dGVuZHMgTXlUeXBlIHsKLQlTdHJpbmcgdmVyc2lvbjsKLX0KLQotc3RhdGljIGNsYXNzIE15VHJhbnNmZXIyIGV4dGVuZHMgTXlUcmFuc2ZlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVlUWVBFMk5BTUUgPSAiTXl0eXBlMlRyYW5zZmVyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVlUWVBFMklEID0gcmVnaXN0ZXJUeXBlKE1ZVFlQRTJOQU1FKTsKLQlwcml2YXRlIHN0YXRpYyBNeVRyYW5zZmVyIF9pbnN0YW5jZSA9IG5ldyBNeVRyYW5zZmVyMigpOwotCi0JcHVibGljIHN0YXRpYyBUcmFuc2ZlciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgTVlUWVBFMk5BTUUgfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpIHsKLQkJcmV0dXJuIG5ldyBpbnRbXSB7IE1ZVFlQRTJJRCB9OwotCX0KLQotCWJ5dGVbXSBqYXZhVG9CeXRlQXJyYXkoT2JqZWN0IG9iamVjdCkgewotCQlNeVR5cGUyIGRhdGEgPSAoTXlUeXBlMikgb2JqZWN0OwotCQl0cnkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCURhdGFPdXRwdXRTdHJlYW0gd3JpdGVPdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShvdXQpOwotCQkJYnl0ZVtdIGJ1ZmZlciA9IGRhdGEuZmlsZU5hbWUuZ2V0Qnl0ZXMoKTsKLQkJCXdyaXRlT3V0LndyaXRlSW50KGJ1ZmZlci5sZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGUoYnVmZmVyKTsKLQkJCXdyaXRlT3V0LndyaXRlTG9uZyhkYXRhLmZpbGVMZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGVMb25nKGRhdGEubGFzdE1vZGlmaWVkKTsKLQkJCWJ1ZmZlciA9IGRhdGEudmVyc2lvbi5nZXRCeXRlcygpOwotCQkJd3JpdGVPdXQud3JpdGVJbnQoYnVmZmVyLmxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZShidWZmZXIpOwotCQkJYnVmZmVyID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0JCQl3cml0ZU91dC5jbG9zZSgpOwotCQkJcmV0dXJuIGJ1ZmZlcjsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCU9iamVjdCBieXRlQXJyYXlUb0phdmEoYnl0ZVtdIGJ5dGVzKSB7Ci0JCU15VHlwZTIgZGF0YSA9IG5ldyBNeVR5cGUyKCk7Ci0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0JCQlEYXRhSW5wdXRTdHJlYW0gcmVhZEluID0gbmV3IERhdGFJbnB1dFN0cmVhbShpbik7Ci0JCQlpbnQgc2l6ZSA9IHJlYWRJbi5yZWFkSW50KCk7Ci0JCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQlyZWFkSW4ucmVhZChidWZmZXIpOwotCQkJZGF0YS5maWxlTmFtZSA9IG5ldyBTdHJpbmcoYnVmZmVyKTsKLQkJCWRhdGEuZmlsZUxlbmd0aCA9IHJlYWRJbi5yZWFkTG9uZygpOwotCQkJZGF0YS5sYXN0TW9kaWZpZWQgPSByZWFkSW4ucmVhZExvbmcoKTsKLQkJCXNpemUgPSByZWFkSW4ucmVhZEludCgpOwotCQkJYnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQlyZWFkSW4ucmVhZChidWZmZXIpOwotCQkJZGF0YS52ZXJzaW9uID0gbmV3IFN0cmluZyhidWZmZXIpOwotCQkJcmVhZEluLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZGF0YTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCQlpZiAoIWNoZWNrTXlUeXBlMihvYmplY3QpKSB7Ci0JCQlETkQuZXJyb3IoRE5ELkVSUk9SX0lOVkFMSURfREFUQSk7Ci0JCX0KLQkJc3VwZXIuamF2YVRvTmF0aXZlKG9iamVjdCwgdHJhbnNmZXJEYXRhKTsKLQl9Ci0KLQlib29sZWFuIGNoZWNrTXlUeXBlMihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghY2hlY2tNeVR5cGUob2JqZWN0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIG9iamVjdCBpbnN0YW5jZW9mIE15VHlwZTI7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gY2hlY2tNeVR5cGUyKG9iamVjdCk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCWxhYmVsMS5zZXRUZXh0KCJEcmFnIFNvdXJjZSBmb3IgTXlEYXRhIGFuZCBNeURhdGEyIik7Ci0JZmluYWwgTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCWxhYmVsMi5zZXRUZXh0KCJEcm9wIFRhcmdldCBmb3IgTXlEYXRhIik7Ci0JZmluYWwgTGFiZWwgbGFiZWwzID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCWxhYmVsMy5zZXRUZXh0KCJEcm9wIFRhcmdldCBmb3IgTXlEYXRhMiIpOwotCi0JRHJhZ1NvdXJjZSBzb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZShsYWJlbDEsIERORC5EUk9QX0NPUFkpOwotCXNvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7IE15VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKLQkJCU15VHJhbnNmZXIyLmdldEluc3RhbmNlKCkgfSk7Ci0Jc291cmNlLmFkZERyYWdMaXN0ZW5lcihuZXcgRHJhZ1NvdXJjZUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJTXlUeXBlMiBteVR5cGUgPSBuZXcgTXlUeXBlMigpOwotCQkJbXlUeXBlLmZpbGVOYW1lID0gIkM6XFxhYmMudHh0IjsKLQkJCW15VHlwZS5maWxlTGVuZ3RoID0gMTAwMDsKLQkJCW15VHlwZS5sYXN0TW9kaWZpZWQgPSAxMjMxMjMxMzsKLQkJCW15VHlwZS52ZXJzaW9uID0gInZlcnNpb24gMiI7Ci0JCQlldmVudC5kYXRhID0gbXlUeXBlOwotCQl9Ci0JfSk7Ci0JRHJvcFRhcmdldCB0YXJnZXRNeVR5cGUgPSBuZXcgRHJvcFRhcmdldChsYWJlbDIsIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9ERUZBVUxUKTsKLQl0YXJnZXRNeVR5cGUuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10geyBNeVRyYW5zZmVyLmdldEluc3RhbmNlKCkgfSk7Ci0JdGFyZ2V0TXlUeXBlLmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpCi0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGF0YSAhPSBudWxsKSB7Ci0JCQkJTXlUeXBlIG15VHlwZSA9IChNeVR5cGUpIGV2ZW50LmRhdGE7Ci0JCQkJaWYgKG15VHlwZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBzdHJpbmcgPSAiTXlUeXBlOiAiICsgbXlUeXBlLmZpbGVOYW1lOwotCQkJCQlsYWJlbDIuc2V0VGV4dChzdHJpbmcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfSk7Ci0JRHJvcFRhcmdldCB0YXJnZXRNeVR5cGUyID0gbmV3IERyb3BUYXJnZXQobGFiZWwzLCBETkQuRFJPUF9DT1BZCXwgRE5ELkRST1BfREVGQVVMVCk7Ci0JdGFyZ2V0TXlUeXBlMi5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7IE15VHJhbnNmZXIyLmdldEluc3RhbmNlKCkgfSk7Ci0JdGFyZ2V0TXlUeXBlMi5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpCi0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKQotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRhdGEgIT0gbnVsbCkgewotCQkJCU15VHlwZTIgbXlUeXBlID0gKE15VHlwZTIpIGV2ZW50LmRhdGE7Ci0JCQkJaWYgKG15VHlwZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBzdHJpbmcgPSAiTXlUeXBlMjogIiArIG15VHlwZS5maWxlTmFtZSArICI6IgotCQkJCQkJCSsgbXlUeXBlLnZlcnNpb247Ci0JCQkJCWxhYmVsMy5zZXRUZXh0KHN0cmluZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDMwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MWVmZjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEdyaWRMYXlvdXQgc25pcHBldDogYWxpZ24gd2lkZ2V0cyBpbiBhIEdyaWRMYXlvdXQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTcyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoNCwgZmFsc2UpOwotCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiTEVGVCwgVE9QIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULlRPUCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJMRUZULCBDRU5URVIiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuQ0VOVEVSLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkxFRlQsIEJPVFRPTSIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5CT1RUT00sIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiTEVGVCwgRklMTCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkNFTlRFUiwgVE9QIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuVE9QLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkNFTlRFUiwgQ0VOVEVSIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkNFTlRFUiwgQk9UVE9NIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQk9UVE9NLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkNFTlRFUiwgRklMTCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkZJTEwsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUklHSFQsIFRPUCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuVE9QLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlJJR0hULCBDRU5URVIiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJSSUdIVCwgQk9UVE9NIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5CT1RUT00sIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUklHSFQsIEZJTEwiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiRklMTCwgVE9QIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJGSUxMLCBDRU5URVIiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkZJTEwsIEJPVFRPTSIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CT1RUT00sIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiRklMTCwgRklMTCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JCi0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiM2JlYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTczLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBzbmlwcGV0OiBicmluZyB1cCBhIGJyb3dzZXIgKHBvcC11cCBibG9ja2VyKQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIk1haW4gV2luZG93Iik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JaW5pdGlhbGl6ZShkaXNwbGF5LCBicm93c2VyKTsKLQlzaGVsbC5vcGVuKCk7Ci0JLyogYW55IHdlYnNpdGUgd2l0aCBwb3B1cHMgKi8KLQlicm93c2VyLnNldFVybCgiaHR0cDovL3d3dy5jbm4uY29tIik7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQotLyogcmVnaXN0ZXIgV2luZG93RXZlbnQgbGlzdGVuZXJzICovCi1zdGF0aWMgdm9pZCBpbml0aWFsaXplKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgQnJvd3NlciBicm93c2VyKSB7Ci0JYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCQlzaGVsbC5zZXRUZXh0KCJOZXcgV2luZG93Iik7Ci0JCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQkJaW5pdGlhbGl6ZShkaXNwbGF5LCBicm93c2VyKTsKLQkJCWV2ZW50LmJyb3dzZXIgPSBicm93c2VyOwotCQl9Ci0JfSk7Ci0JYnJvd3Nlci5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIobmV3IFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJU2hlbGwgc2hlbGwgPSBicm93c2VyLmdldFNoZWxsKCk7Ci0JCQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzaG93KFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCS8qIHBvcHVwIGJsb2NrZXIgLSBpZ25vcmUgd2luZG93cyB3aXRoIG5vIHN0eWxlICovCi0JCQlpZiAoIWV2ZW50LmFkZHJlc3NCYXIgJiYgIWV2ZW50Lm1lbnVCYXIgJiYgIWV2ZW50LnN0YXR1c0JhciAmJiAhZXZlbnQudG9vbEJhcikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUG9wdXAgYmxvY2tlZC4iKTsKLQkJCQlldmVudC5kaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoZXZlbnQubG9jYXRpb24gIT0gbnVsbCkgc2hlbGwuc2V0TG9jYXRpb24oZXZlbnQubG9jYXRpb24pOwotCQkJaWYgKGV2ZW50LnNpemUgIT0gbnVsbCkgewotCQkJCVBvaW50IHNpemUgPSBldmVudC5zaXplOwotCQkJCXNoZWxsLnNldFNpemUoc2hlbGwuY29tcHV0ZVNpemUoc2l6ZS54LCBzaXplLnkpKTsKLQkJCX0KLQkJCXNoZWxsLm9wZW4oKTsKLQkJfQotCX0pOwotCWJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihuZXcgQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2xvc2UoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCVNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJc2hlbGwuY2xvc2UoKTsKLQkJfQotCX0pOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQwMTRhMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNlYmFzdGlhbiBEYXZpZHMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU1dUIE9wZW5HTCBzbmlwcGV0OiBkcmF3IGEgc3F1YXJlCi0gKiAKLSAqIFRoaXMgc25pcHBldCByZXF1aXJlcyB0aGUgZXhwZXJpbWVudGFsIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wgcGx1Z2luLCB3aGljaAotICogaXMgbm90IGluY2x1ZGVkIGluIHN3dCBieSBkZWZhdWx0LiAgRm9yIGluZm9ybWF0aW9uIG9uIHRoaXMgcGx1Z2luIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvb3BlbmdsL29wZW5nbC5odG1sICAKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotICAgIHNoZWxsLnNldFRleHQoIk9wZW5HTCBpbiBTV1QiKTsKLSAgICBzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgR0xEYXRhIGRhdGEgPSBuZXcgR0xEYXRhKCk7Ci0gICAgZGF0YS5kb3VibGVCdWZmZXIgPSB0cnVlOwotICAgIGZpbmFsIEdMQ2FudmFzIGNhbnZhcyA9IG5ldyBHTENhbnZhcyhzaGVsbCwgU1dULk5PX0JBQ0tHUk9VTkQsIGRhdGEpOwotICAgIGNhbnZhcy5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgcmVzaXplKGNhbnZhcyk7Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICBpbml0KGNhbnZhcyk7Ci0gICAgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAoY2FudmFzLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotICAgICAgICAgICAgcmVuZGVyKCk7Ci0gICAgICAgICAgICBjYW52YXMuc3dhcEJ1ZmZlcnMoKTsKLSAgICAgICAgICAgIGNhbnZhcy5nZXREaXNwbGF5KCkudGltZXJFeGVjKDUwLCB0aGlzKTsKLSAgICAgICAgfQotICAgIH0ucnVuKCk7Ci0gICAgc2hlbGwub3BlbigpOwotICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotICAgIH0KLSAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotc3RhdGljIHZvaWQgaW5pdChHTENhbnZhcyBjYW52YXMpIHsKLSAgICBjYW52YXMuc2V0Q3VycmVudCgpOwotICAgIHJlc2l6ZShjYW52YXMpOwotICAgIEdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLSAgICBHTC5nbENvbG9yM2YoMC4wZiwgMC4wZiwgMC4wZik7Ci0gICAgR0wuZ2xDbGVhckRlcHRoKDEuMGYpOwotICAgIEdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotICAgIEdMLmdsSGludChHTC5HTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsIEdMLkdMX05JQ0VTVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlbmRlcigpIHsKLSAgICBHTC5nbENsZWFyKEdMLkdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUKTsKLSAgICBHTC5nbExvYWRJZGVudGl0eSgpOwotICAgIEdMLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCAtNi4wZik7Ci0gICAgR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0gICAgR0wuZ2xWZXJ0ZXgzZigtMS4wZiwgMS4wZiwgMC4wZik7Ci0gICAgR0wuZ2xWZXJ0ZXgzZigxLjBmLCAxLjBmLCAwLjBmKTsKLSAgICBHTC5nbFZlcnRleDNmKDEuMGYsIC0xLjBmLCAwLjBmKTsKLSAgICBHTC5nbFZlcnRleDNmKC0xLjBmLCAtMS4wZiwgMC4wZik7Ci0gICAgR0wuZ2xFbmQoKTsKLX0KLQotc3RhdGljIHZvaWQgcmVzaXplKEdMQ2FudmFzIGNhbnZhcykgewotICAgIGNhbnZhcy5zZXRDdXJyZW50KCk7Ci0gICAgUmVjdGFuZ2xlIHJlY3QgPSBjYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotICAgIGludCB3aWR0aCA9IHJlY3Qud2lkdGg7Ci0gICAgaW50IGhlaWdodCA9IE1hdGgubWF4KHJlY3QuaGVpZ2h0LCAxKTsKLSAgICBHTC5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgIEdMLmdsTWF0cml4TW9kZShHTC5HTF9QUk9KRUNUSU9OKTsKLSAgICBHTC5nbExvYWRJZGVudGl0eSgpOwotICAgIGZsb2F0IGFzcGVjdCA9IChmbG9hdCkgd2lkdGggLyAoZmxvYXQpIGhlaWdodDsKLSAgICBHTFUuZ2x1UGVyc3BlY3RpdmUoNDUuMGYsIGFzcGVjdCwgMC41ZiwgNDAwLjBmKTsKLSAgICBHTC5nbE1hdHJpeE1vZGUoR0wuR0xfTU9ERUxWSUVXKTsKLSAgICBHTC5nbExvYWRJZGVudGl0eSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGZjOTczLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIEV4Y2x1ZGUgYSB3aWRnZXQgZnJvbSBhIEdyaWRMYXlvdXQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTc1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDAiKTsKLQotCWZpbmFsIEJ1dHRvbiBiSGlkZGVuID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJIaWRkZW4uc2V0VGV4dCgiQnV0dG9uIDEiKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JZGF0YS5leGNsdWRlID0gdHJ1ZTsKLQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQliSGlkZGVuLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDIiKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDMiKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDQiKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiaGlkZSIpOwotCWIuc2V0U2VsZWN0aW9uKHRydWUpOwotCWIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pIGUud2lkZ2V0OwotCQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgYkhpZGRlbi5nZXRMYXlvdXREYXRhKCk7Ci0JCQlkYXRhLmV4Y2x1ZGUgPSBiLmdldFNlbGVjdGlvbigpOwotCQkJYkhpZGRlbi5zZXRWaXNpYmxlKCFkYXRhLmV4Y2x1ZGUpOwotCQkJc2hlbGwubGF5b3V0KGZhbHNlKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoNDAwLCA0MDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjYzMGRiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBHcmlkTGF5b3V0IHNuaXBwZXQ6IGFsaWduIHdpZGdldHMgaW4gYSBob3Jpem9udGFsIHJvdwotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzYgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JUm93TGF5b3V0IGxheW91dCA9IG5ldyBSb3dMYXlvdXQoU1dULkhPUklaT05UQUwpOwotCWxheW91dC53cmFwID0gdHJ1ZTsKLQlsYXlvdXQuZmlsbCA9IGZhbHNlOwotCWxheW91dC5qdXN0aWZ5ID0gdHJ1ZTsKLQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDEiKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCi0JYi5zZXRUZXh0KCJCdXR0b24gMiIpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAzIik7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiTm90IHNob3duIik7Ci0JYi5zZXRWaXNpYmxlKGZhbHNlKTsKLQlSb3dEYXRhIGRhdGEgPSBuZXcgUm93RGF0YSgpOwotCWRhdGEuZXhjbHVkZSA9IHRydWU7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAyMDAgaGlnaCIpOwotCWRhdGEgPSBuZXcgUm93RGF0YSgpOwotCWRhdGEuaGVpZ2h0ID0gMjAwOwotCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMjAwIHdpZGUiKTsKLQlkYXRhID0gbmV3IFJvd0RhdGEoKTsKLQlkYXRhLndpZHRoID0gMjAwOwotCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhYjQ5Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogR3JpZExheW91dCBzbmlwcGV0OiBhbGlnbiB3aWRnZXRzIGluIGEgdmVydGljYWwgY29sdW1uCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCVJvd0xheW91dCBsYXlvdXQgPSBuZXcgUm93TGF5b3V0KFNXVC5WRVJUSUNBTCk7Ci0JbGF5b3V0LndyYXAgPSB0cnVlOwotCWxheW91dC5maWxsID0gdHJ1ZTsKLQlsYXlvdXQuanVzdGlmeSA9IGZhbHNlOwotCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMSIpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0KLQliLnNldFRleHQoIkJ1dHRvbiAyIik7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDMiKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJOb3Qgc2hvd24iKTsKLQliLnNldFZpc2libGUoZmFsc2UpOwotCVJvd0RhdGEgZGF0YSA9IG5ldyBSb3dEYXRhKCk7Ci0JZGF0YS5leGNsdWRlID0gdHJ1ZTsKLQliLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDIwMCBoaWdoIik7Ci0JZGF0YSA9IG5ldyBSb3dEYXRhKCk7Ci0JZGF0YS5oZWlnaHQgPSAyMDA7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAyMDAgd2lkZSIpOwotCWRhdGEgPSBuZXcgUm93RGF0YSgpOwotCWRhdGEud2lkdGggPSAyMDA7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDc1NGJjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogSG93IHRvIGFjY2VzcyBBYm91dCwgUHJlZmVyZW5jZXMgYW5kIFF1aXQgbWVudXMgb24gY2FyYm9uLgotICogTk9URTogVGhpcyBzbmlwcGV0IHVzZXMgaW50ZXJuYWwgU1dUIHBhY2thZ2VzIHRoYXQgYXJlCi0gKiBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzggewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtISUNvbW1hbmRQcmVmZXJlbmNlcyA9ICgncCcgPDwgMjQpICsgKCdyJyA8PCAxNikKLQkJCSsgKCdlJyA8PCA4KSArICdmJzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrSElDb21tYW5kQWJvdXQgPSAoJ2EnIDw8IDI0KSArICgnYicgPDwgMTYpCi0JCQkrICgnbycgPDwgOCkgKyAndSc7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga0hJQ29tbWFuZFNlcnZpY2VzID0gKCdzJyA8PCAyNCkgKyAoJ2UnIDw8IDE2KQotCQkJKyAoJ3InIDw8IDgpICsgJ3YnOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmcpIHsKLQlEaXNwbGF5LnNldEFwcE5hbWUoIkFwcE1lbnUiKTsgLy8gc2V0cyBuYW1lIGluIERvY2sKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWhvb2tBcHBsaWNhdGlvbk1lbnUoZGlzcGxheSwgIkFib3V0IEFwcE1lbnUiKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJNYWluIFdpbmRvdyIpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCi0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhvb2tBcHBsaWNhdGlvbk1lbnUoRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTdHJpbmcgYWJvdXROYW1lKSB7Ci0JLy8gQ2FsbGJhY2sgdGFyZ2V0Ci0JT2JqZWN0IHRhcmdldCA9IG5ldyBPYmplY3QoKSB7Ci0JCWludCBjb21tYW5kUHJvYyhpbnQgbmV4dEhhbmRsZXIsIGludCB0aGVFdmVudCwgaW50IHVzZXJEYXRhKSB7Ci0JCQlpZiAoT1MuR2V0RXZlbnRLaW5kKHRoZUV2ZW50KSA9PSBPUy5rRXZlbnRQcm9jZXNzQ29tbWFuZCkgewotCQkJCUhJQ29tbWFuZCBjb21tYW5kID0gbmV3IEhJQ29tbWFuZCgpOwotCQkJCU9TLkdldEV2ZW50UGFyYW1ldGVyKHRoZUV2ZW50LCBPUy5rRXZlbnRQYXJhbURpcmVjdE9iamVjdCwKLQkJCQkJCU9TLnR5cGVISUNvbW1hbmQsIG51bGwsIEhJQ29tbWFuZC5zaXplb2YsIG51bGwsCi0JCQkJCQljb21tYW5kKTsKLQkJCQlzd2l0Y2ggKGNvbW1hbmQuY29tbWFuZElEKSB7Ci0JCQkJY2FzZSBrSElDb21tYW5kUHJlZmVyZW5jZXM6Ci0JCQkJCXJldHVybiBoYW5kbGVDb21tYW5kKCJQcmVmZXJlbmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSBrSElDb21tYW5kQWJvdXQ6Ci0JCQkJCXJldHVybiBoYW5kbGVDb21tYW5kKGFib3V0TmFtZSk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIE9TLmV2ZW50Tm90SGFuZGxlZEVycjsKLQkJfQotCi0JCWludCBoYW5kbGVDb21tYW5kKFN0cmluZyBjb21tYW5kKSB7Ci0JCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCgpOwotCQkJTWVzc2FnZUJveCBwcmVmZXJlbmNlcyA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9XQVJOSU5HKTsKLQkJCXByZWZlcmVuY2VzLnNldFRleHQoY29tbWFuZCk7Ci0JCQlwcmVmZXJlbmNlcy5vcGVuKCk7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQlyZXR1cm4gT1Mubm9FcnI7Ci0JCX0KLQl9OwotCi0JZmluYWwgQ2FsbGJhY2sgY29tbWFuZENhbGxiYWNrID0gbmV3IENhbGxiYWNrKHRhcmdldCwgImNvbW1hbmRQcm9jIiwgMyk7IC8vJE5PTi1OTFMtMSQKLQlpbnQgY29tbWFuZFByb2MgPSBjb21tYW5kQ2FsbGJhY2suZ2V0QWRkcmVzcygpOwotCWlmIChjb21tYW5kUHJvYyA9PSAwKSB7Ci0JCWNvbW1hbmRDYWxsYmFjay5kaXNwb3NlKCk7Ci0JCXJldHVybjsgLy8gZ2l2ZSB1cAotCX0KLQotCS8vIEluc3RhbGwgZXZlbnQgaGFuZGxlciBmb3IgY29tbWFuZHMKLQlpbnRbXSBtYXNrID0gbmV3IGludFtdIHsgT1Mua0V2ZW50Q2xhc3NDb21tYW5kLCBPUy5rRXZlbnRQcm9jZXNzQ29tbWFuZCB9OwotCU9TLkluc3RhbGxFdmVudEhhbmRsZXIoT1MuR2V0QXBwbGljYXRpb25FdmVudFRhcmdldCgpLCBjb21tYW5kUHJvYywKLQkJCW1hc2subGVuZ3RoIC8gMiwgbWFzaywgMCwgbnVsbCk7Ci0KLQkvLyBjcmVhdGUgQWJvdXQgLi4uIG1lbnUgY29tbWFuZAotCWludFtdIG91dE1lbnUgPSBuZXcgaW50WzFdOwotCXNob3J0W10gb3V0SW5kZXggPSBuZXcgc2hvcnRbMV07Ci0JaWYgKE9TLkdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCgwLCBrSElDb21tYW5kUHJlZmVyZW5jZXMsIDEsCi0JCQlvdXRNZW51LCBvdXRJbmRleCkgPT0gT1Mubm9FcnIKLQkJCSYmIG91dE1lbnVbMF0gIT0gMCkgewotCQlpbnQgbWVudSA9IG91dE1lbnVbMF07Ci0KLQkJaW50IGwgPSBhYm91dE5hbWUubGVuZ3RoKCk7Ci0JCWNoYXIgYnVmZmVyW10gPSBuZXcgY2hhcltsXTsKLQkJYWJvdXROYW1lLmdldENoYXJzKDAsIGwsIGJ1ZmZlciwgMCk7Ci0JCWludCBzdHIgPSBPUy5DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKE9TLmtDRkFsbG9jYXRvckRlZmF1bHQsCi0JCQkJYnVmZmVyLCBsKTsKLQkJT1MuSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKG1lbnUsIHN0ciwgKHNob3J0KSAwLCAwLAotCQkJCWtISUNvbW1hbmRBYm91dCk7Ci0JCU9TLkNGUmVsZWFzZShzdHIpOwotCi0JCS8vIGFkZCBzZXBhcmF0b3IgYmV0d2VlbiBBYm91dCAmIFByZWZlcmVuY2VzCi0JCU9TLkluc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhtZW51LCAwLCAoc2hvcnQpIDEsCi0JCQkJT1Mua01lbnVJdGVtQXR0clNlcGFyYXRvciwgMCk7Ci0KLQkJLy8gZW5hYmxlIHByZWYgbWVudQotCQlPUy5FbmFibGVNZW51Q29tbWFuZChtZW51LCBrSElDb21tYW5kUHJlZmVyZW5jZXMpOwotCi0JCS8vIGRpc2FibGUgc2VydmljZXMgbWVudQotCQlPUy5EaXNhYmxlTWVudUNvbW1hbmQobWVudSwga0hJQ29tbWFuZFNlcnZpY2VzKTsKLQl9Ci0KLQkvLyBzY2hlZHVsZSBkaXNwb3NhbCBvZiBjYWxsYmFjayBvYmplY3QKLQlkaXNwbGF5LmRpc3Bvc2VFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJY29tbWFuZENhbGxiYWNrLmRpc3Bvc2UoKTsKLQkJfQotCX0pOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzgwNWY4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHZlcmlmeSBpbnB1dCAoZm9ybWF0IGZvciBkYXRlKQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0VGV4dCgiWVlZWS9NTS9ERCIpOzsJCi0JZmluYWwgQ2FsZW5kYXIgY2FsZW5kYXIgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCXRleHQuYWRkTGlzdGVuZXIoU1dULlZlcmlmeSwgbmV3IExpc3RlbmVyKCkgewotCQlib29sZWFuIGlnbm9yZTsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGlnbm9yZSkgcmV0dXJuOwotCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihlLnRleHQpOwotCQkJY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbYnVmZmVyLmxlbmd0aCgpXTsKLQkJCWJ1ZmZlci5nZXRDaGFycygwLCBjaGFycy5sZW5ndGgsIGNoYXJzLCAwKTsKLQkJCWlmIChlLmNoYXJhY3RlciA9PSAnXGInKSB7Ci0JCQkJZm9yIChpbnQgaSA9IGUuc3RhcnQ7IGkgPCBlLmVuZDsgaSsrKSB7Ci0JCQkJCXN3aXRjaCAoaSkgewotCQkJCQkJY2FzZSAwOiAvKiBbWV1ZWVkgKi8KLQkJCQkJCWNhc2UgMTogLyogWVtZXVlZICovCi0JCQkJCQljYXNlIDI6IC8qIFlZW1ldWSAqLwotCQkJCQkJY2FzZSAzOiAvKiBZWVlbWV0gKi8gewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJ1knKTsgCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJY2FzZSA1OiAvKiBbTV1NKi8KLQkJCQkJCWNhc2UgNjogLyogTVtNXSAqL3sKLQkJCQkJCQlidWZmZXIuYXBwZW5kKCdNJyk7IGJyZWFrOwotCQkJCQkJfQotCQkJCQkJY2FzZSA4OiAvKiBbRF1EICovCi0JCQkJCQljYXNlIDk6IC8qIERbRF0gKi8gewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJ0QnKTsgYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQljYXNlIDQ6IC8qIFlZWVlbL11NTSAqLwotCQkJCQkJY2FzZSA3OiAvKiBNTVsvXUREICovIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKCcvJyk7IGJyZWFrOwotCQkJCQkJfQotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGV4dC5zZXRTZWxlY3Rpb24oZS5zdGFydCwgZS5zdGFydCArIGJ1ZmZlci5sZW5ndGgoKSk7Ci0JCQkJaWdub3JlID0gdHJ1ZTsKLQkJCQl0ZXh0Lmluc2VydChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQkJaWdub3JlID0gZmFsc2U7Ci0JCQkJdGV4dC5zZXRTZWxlY3Rpb24oZS5zdGFydCwgZS5zdGFydCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkKLQkJCWludCBzdGFydCA9IGUuc3RhcnQ7Ci0JCQlpZiAoc3RhcnQgPiA5KSByZXR1cm47Ci0JCQlpbnQgaW5kZXggPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzdGFydCArIGluZGV4ID09IDQgfHwgc3RhcnQgKyBpbmRleCA9PSA3KSB7Ci0JCQkJCWlmIChjaGFyc1tpXSA9PSAnLycpIHsKLQkJCQkJCWluZGV4Kys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWZmZXIuaW5zZXJ0KGluZGV4KyssICcvJyk7Ci0JCQkJfQotCQkJCWlmIChjaGFyc1tpXSA8ICcwJyB8fCAnOScgPCBjaGFyc1tpXSkgcmV0dXJuOwotCQkJCWlmIChzdGFydCArIGluZGV4ID09IDUgJiYgICcxJyA8IGNoYXJzW2ldKSByZXR1cm47IC8qIFtNXU0gKi8KLQkJCQlpZiAoc3RhcnQgKyBpbmRleCA9PSA4ICYmICAnMycgPCBjaGFyc1tpXSkgcmV0dXJuOyAvKiBbRF1EICovCi0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJCVN0cmluZyBuZXdUZXh0ID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQlpbnQgbGVuZ3RoID0gbmV3VGV4dC5sZW5ndGgoKTsKLQkJCVN0cmluZ0J1ZmZlciBkYXRlID0gbmV3IFN0cmluZ0J1ZmZlcih0ZXh0LmdldFRleHQoKSk7Ci0JCQlkYXRlLnJlcGxhY2UoZS5zdGFydCwgZS5zdGFydCArIGxlbmd0aCwgbmV3VGV4dCk7Ci0JCQljYWxlbmRhci5zZXQoQ2FsZW5kYXIuWUVBUiwgMTkwMSk7Ci0JCQljYWxlbmRhci5zZXQoQ2FsZW5kYXIuTU9OVEgsIENhbGVuZGFyLkpBTlVBUlkpOwotCQkJY2FsZW5kYXIuc2V0KENhbGVuZGFyLkRBVEUsIDEpOwotCQkJU3RyaW5nIHl5eXkgPSBkYXRlLnN1YnN0cmluZygwLCA0KTsKLQkJCWlmICh5eXl5LmluZGV4T2YoJ1knKSA9PSAtMSkgewotCQkJCWludCB5ZWFyID0gSW50ZWdlci5wYXJzZUludCh5eXl5KTsKLQkJCQljYWxlbmRhci5zZXQoQ2FsZW5kYXIuWUVBUiwgeWVhcik7Ci0JCQl9Ci0JCQlTdHJpbmcgbW0gPSBkYXRlLnN1YnN0cmluZyg1LCA3KTsKLQkJCWlmIChtbS5pbmRleE9mKCdNJykgPT0gLTEpIHsKLQkJCQlpbnQgbW9udGggPSAgSW50ZWdlci5wYXJzZUludChtbSkgLSAxOwotCQkJCWludCBtYXhNb250aCA9IGNhbGVuZGFyLmdldEFjdHVhbE1heGltdW0oQ2FsZW5kYXIuTU9OVEgpOwotCQkJCWlmICgwID4gbW9udGggfHwgbW9udGggPiBtYXhNb250aCkgcmV0dXJuOwotCQkJCWNhbGVuZGFyLnNldChDYWxlbmRhci5NT05USCwgbW9udGgpOwotCQkJfQotCQkJU3RyaW5nIGRkID0gZGF0ZS5zdWJzdHJpbmcoOCwxMCk7Ci0JCQlpZiAoZGQuaW5kZXhPZignRCcpID09IC0xKSB7Ci0JCQkJaW50IGRheSA9IEludGVnZXIucGFyc2VJbnQoZGQpOwotCQkJCWludCBtYXhEYXkgPSBjYWxlbmRhci5nZXRBY3R1YWxNYXhpbXVtKENhbGVuZGFyLkRBVEUpOwotCQkJCWlmICgxID4gZGF5IHx8IGRheSA+IG1heERheSkgcmV0dXJuOwotCQkJCWNhbGVuZGFyLnNldChDYWxlbmRhci5EQVRFLCBkYXkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1PTlRIKSAgPT0gQ2FsZW5kYXIuRkVCUlVBUlkpIHsKLQkJCQkJY2hhciBmaXJzdENoYXIgPSBkYXRlLmNoYXJBdCg4KTsKLQkJCQkJaWYgKGZpcnN0Q2hhciAhPSAnRCcgJiYgJzInIDwgZmlyc3RDaGFyKSByZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJdGV4dC5zZXRTZWxlY3Rpb24oZS5zdGFydCwgZS5zdGFydCArIGxlbmd0aCk7Ci0JCQlpZ25vcmUgPSB0cnVlOwotCQkJdGV4dC5pbnNlcnQobmV3VGV4dCk7Ci0JCQlpZ25vcmUgPSBmYWxzZTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOGJmYjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRvb2wgYmFyICh0ZXh0KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKCk7Ci0JVG9vbEJhciBiYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTw4OyBpKyspIHsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAoYmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQliYXIucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCURpc3BsYXkgZGlzcGxheSA9IHNoZWxsLmdldERpc3BsYXkgKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfSAKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3ZjMxYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3JlYXRlIGEgbm9uLXJlY3Rhbmd1bGFyIHNoZWxsIHRvIHNpbXVsYXRlIHRyYW5zcGFyZW5jeQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBJbWFnZSBpbWFnZSA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fV0FSTklORyk7Ci0JLy9TaGVsbCBtdXN0IGJlIGNyZWF0ZWQgd2l0aCBzdHlsZSBTV1QuTk9fVFJJTQotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5OT19UUklNIHwgU1dULk9OX1RPUCk7Ci0Jc2hlbGwuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkvL2RlZmluZSBhIHJlZ2lvbiAKLQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCVJlY3RhbmdsZSBwaXhlbCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMSwgMSk7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCAyMDA7IHkrPTIpIHsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgMjAwOyB4Kz0yKSB7Ci0JCQkJcGl4ZWwueCA9IHg7Ci0JCQkJcGl4ZWwueSA9IHk7Ci0JCQkJcmVnaW9uLmFkZChwaXhlbCk7Ci0JCQl9Ci0JCX0KLQkvL2RlZmluZSB0aGUgc2hhcGUgb2YgdGhlIHNoZWxsIHVzaW5nIHNldFJlZ2lvbgotCXNoZWxsLnNldFJlZ2lvbihyZWdpb24pOwotCVJlY3RhbmdsZSBzaXplID0gcmVnaW9uLmdldEJvdW5kcygpOwotCXNoZWxsLnNldFNpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpOwotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHNpemUgPSBzaGVsbC5nZXRTaXplKCk7Ci0JCQllLmdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCAxMCwgMTAsIHNpemUueC0yMCwgc2l6ZS55LTIwKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCXJlZ2lvbi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDE1ODguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEFsbG93IHVzZXIgdG8gcmVvcmRlciBjb2x1bW5zIGFuZCByZW9yZGVyIGNvbHVtbnMgcHJvZ3JhbW1hdGljYWxseS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTgxIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7Ci0JCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkNIRUNLKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgUm93RGF0YSgtMSwgMzAwKSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDAiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAxIik7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5DRU5URVIpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDMiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiA0Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJU3RyaW5nW10gdGV4dCA9IG5ldyBTdHJpbmdbXXtpKyIgMCIsIGkrIiAxIiwgaSsiIDIiLCBpKyIgMyIsIGkrIiA0In07Ci0JCQlpdGVtLnNldFRleHQodGV4dCk7Ci0JCX0KLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb3ZlICIrZS53aWRnZXQpOwotCQkJfQotCQl9OwotCQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJY29sdW1uc1tpXS5wYWNrKCk7Ci0JCQljb2x1bW5zW2ldLnNldE1vdmVhYmxlKHRydWUpOwotCQkJY29sdW1uc1tpXS5hZGRMaXN0ZW5lcihTV1QuTW92ZSwgbGlzdGVuZXIpOwotCQl9Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQliLnNldFRleHQoImludmVydCBjb2x1bW4gb3JkZXIiKTsKLQkJYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaW50W10gb3JkZXIgPSB0YWJsZS5nZXRDb2x1bW5PcmRlcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoIC8gMjsgaSsrKSB7Ci0JCQkJCWludCB0ZW1wID0gb3JkZXJbaV07Ci0JCQkJCW9yZGVyW2ldID0gb3JkZXJbb3JkZXIubGVuZ3RoIC0gaSAtIDFdOwotCQkJCQlvcmRlcltvcmRlci5sZW5ndGggLSBpIC0gMV0gPSB0ZW1wOwotCQkJCX0KLQkJCQl0YWJsZS5zZXRDb2x1bW5PcmRlcihvcmRlcik7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzEwZjIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBMaW5rIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgbGluayB3aWRnZXQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODIgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJTGluayBsaW5rID0gbmV3IExpbmsoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlsaW5rLnNldFRleHQoIlRoaXMgYSB2ZXJ5IHNpbXBsZSA8QT5saW5rPC9BPiB3aWRnZXQuIik7Ci0JCWxpbmsuc2V0U2l6ZSgxNDAsIDQwKTsKLQkJc2hlbGwucGFjayAoKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGM1YTFlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBMaW5rIGV4YW1wbGUgc25pcHBldDogZGV0ZWN0IHNlbGVjdGlvbiBldmVudHMgaW4gYSBsaW5rIHdpZGdldAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTgzIHsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhzaGVsbCwgU1dULk5PTkUpOwotCQlTdHJpbmcgdGV4dCA9ICJUaGUgU1dUIGNvbXBvbmVudCBpcyBkZXNpZ25lZCB0byBwcm92aWRlIDxhPmVmZmljaWVudDwvYT4sIDxhPnBvcnRhYmxlPC9hPiA8YSBocmVmPVwibmF0aXZlXCI+YWNjZXNzIHRvIHRoZSB1c2VyLWludGVyZmFjZSBmYWNpbGl0aWVzIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtczwvYT4gb24gd2hpY2ggaXQgaXMgaW1wbGVtZW50ZWQuIjsKLQkJbGluay5zZXRUZXh0KHRleHQpOwotCQlsaW5rLnNldFNpemUoNDAwLCA0MDApOwotCQlsaW5rLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNlbGVjdGlvbjogIiArIGV2ZW50LnRleHQpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwucGFjayAoKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzE4OTVhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTcGlubmVyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGFuZCBpbml0aWFsaXplIGEgc3Bpbm5lciB3aWRnZXQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODQgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJc3Bpbm5lci5zZXRNaW5pbXVtKDApOwotCQlzcGlubmVyLnNldE1heGltdW0oMTAwMCk7Ci0JCXNwaW5uZXIuc2V0U2VsZWN0aW9uKDUwMCk7Ci0JCXNwaW5uZXIuc2V0SW5jcmVtZW50KDEpOwotCQlzcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQoMTAwKTsKLQkJc3Bpbm5lci5wYWNrKCk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGMzMWE0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRHJvcHBlZCBkYXRhIHR5cGUgZGVwZW5kcyBvbiB0YXJnZXQgaXRlbSBpbiB0YWJsZQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsYWJlbDEuc2V0VGV4dCgiRHJhZyBTb3VyY2UiKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWlmIChpICUgMiA9PSAwKSBpdGVtLnNldFRleHQoIkRyb3AgYSBmaWxlIik7Ci0JCWlmIChpICUgMiA9PSAxKSBpdGVtLnNldFRleHQoIkRyb3AgdGV4dCIpOwotCX0KLQlEcmFnU291cmNlIGRyYWdTb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZShsYWJlbDEsIERORC5EUk9QX0NPUFkpOwotCWRyYWdTb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCWRyYWdTb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCJ0ZW1wIik7Ci0JCQkJZXZlbnQuZGF0YSA9IG5ldyBTdHJpbmdbXSB7ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKX07Ci0JCQl9Ci0JCQlpZiAoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotCQkJCWV2ZW50LmRhdGEgPSAib25jZSB1cG9uIGEgdGltZSI7Ci0JCQl9Ci0JCX0gCi0JfSk7Ci0JRHJvcFRhcmdldCBkcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodGFibGUsIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9ERUZBVUxUKTsKLQlkcm9wVGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwgRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQlkcm9wVGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCUZpbGVUcmFuc2ZlciBmaWxlVHJhbnNmZXIgPSBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJVGV4dFRyYW5zZmVyIHRleHRUcmFuc2ZlciA9IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWV2ZW50Lml0ZW07Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgaXRlbUluZGV4ID0gdGFibGUuaW5kZXhPZihpdGVtKTsKLQkJCWlmIChpdGVtSW5kZXggJSAyID09IDApIHsKLQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCXdoaWxlIChpbmRleCA8IGV2ZW50LmRhdGFUeXBlcy5sZW5ndGgpIHsKLQkJCQkJaWYgKGZpbGVUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGVzW2luZGV4XSkpIGJyZWFrOwotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCQlpZiAoaW5kZXggPCBldmVudC5kYXRhVHlwZXMubGVuZ3RoKSB7Ci0JCQkJCWV2ZW50LmN1cnJlbnREYXRhVHlwZSA9IGV2ZW50LmRhdGFUeXBlc1tpbmRleF07Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJd2hpbGUgKGluZGV4IDwgZXZlbnQuZGF0YVR5cGVzLmxlbmd0aCkgewotCQkJCQlpZiAodGV4dFRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZXNbaW5kZXhdKSkgYnJlYWs7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJCWlmIChpbmRleCA8IGV2ZW50LmRhdGFUeXBlcy5sZW5ndGgpIHsKLQkJCQkJZXZlbnQuY3VycmVudERhdGFUeXBlID0gZXZlbnQuZGF0YVR5cGVzW2luZGV4XTsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCWlmIChpdGVtID09IG51bGwpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChmaWxlVHJhbnNmZXIuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpIHsKLQkJCQlTdHJpbmdbXSBmaWxlcyA9IChTdHJpbmdbXSlldmVudC5kYXRhOwotCQkJCWlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJaXRlbS5zZXRUZXh0KGZpbGVzWzBdKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodGV4dFRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKWV2ZW50LmRhdGE7Ci0JCQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJCQlpdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCX0pOwotCXNoZWxsLnNldFNpemUoMzAwLCAxNTApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg2Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg2Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5Zjg4MDMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ni5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPEhUTUw+Ci0gIDxIRUFEPgotICAgIDxUSVRMRT5Qb3N0PC9USVRMRT4KLQk8cD5UZXN0IGZvciBQb3N0aW5nIERhdGEgaW4gSUU8L3A+Ci0KLSAgPC9IRUFEPgotCi0gIDxCT0RZPgotICAgIDxGT1JNIE1FVEhPRD0icG9zdCIKLSAgICAgICBBQ1RJT049Imh0dHA6Ly9ob3N0L2NnaS1iaW4vbWFzX2Zvcm0iPgotICAgIDxJTlBVVCBUWVBFPSJ0ZXh0IiBOQU1FPSJuYW1lIgotICAgICAgIFNJWkU9MjAgVkFMVUU9IlRyeSBpdCAocG9zdCkiPgotIDwvRk9STT4KLSAKLSAgPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M3Yzk1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUmVhZGluZyBhbmQgd3JpdGluZyB0byBhIFNBRkVBUlJBWQotICogCi0gKiBUaGlzIGV4YW1wbGUgcmVhZHMgZnJvbSBhIFBvc3REYXRhIG9iamVjdCBpbiBhIEJlZm9yZU5hdmlnYXRlMiBldmVudCBhbmQKLSAqIGNyZWF0ZXMgYSBQb3N0RGF0YSBvYmplY3QgaW4gYSBjYWxsIHRvIE5hdmlnYXRlLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4NiB7Ci0KLXN0YXRpYyBpbnQgQ29kZVBhZ2UgPSBPUy5HZXRBQ1AoKTsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMSwgMSkpOwotCUJ1dHRvbiBnbyA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlnby5zZXRUZXh0KCJHbyIpOwotCU9sZUZyYW1lIG9sZUZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0Jb2xlRnJhbWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0JT2xlQ29udHJvbFNpdGUgY29udHJvbFNpdGU7Ci0JT2xlQXV0b21hdGlvbiBhdXRvbWF0aW9uOwotCXRyeSB7Ci0JCWNvbnRyb2xTaXRlID0gbmV3IE9sZUNvbnRyb2xTaXRlKG9sZUZyYW1lLCBTV1QuTk9ORSwgIlNoZWxsLkV4cGxvcmVyIik7Ci0JCWF1dG9tYXRpb24gPSBuZXcgT2xlQXV0b21hdGlvbihjb250cm9sU2l0ZSk7Ci0JCWNvbnRyb2xTaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfSU5QTEFDRUFDVElWQVRFKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJcmV0dXJuOwotCX0KLQkKLQlmaW5hbCBPbGVBdXRvbWF0aW9uIGF1dG8gPSBhdXRvbWF0aW9uOwotCWdvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJU3RyaW5nIHVybCA9IHRleHQuZ2V0VGV4dCgpOwotCQkJaW50W10gcmdkaXNwaWQgPSBhdXRvLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJOYXZpZ2F0ZSIsICJVUkwifSk7IAotCQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQkJVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50WzFdOwotCQkJcmd2YXJnWzBdID0gbmV3IFZhcmlhbnQodXJsKTsKLQkJCWludFtdIHJnZGlzcGlkTmFtZWRBcmdzID0gbmV3IGludFsxXTsKLQkJCXJnZGlzcGlkTmFtZWRBcmdzWzBdID0gcmdkaXNwaWRbMV07Ci0JCQlhdXRvLmludm9rZShkaXNwSWRNZW1iZXIsIHJndmFyZywgcmdkaXNwaWROYW1lZEFyZ3MpOwotCQl9Ci0JfSk7Ci0JCi0JCi0JLy8gUmVhZCBQb3N0RGF0YSB3aGVuZXZlciB3ZSBuYXZpZ2F0ZSB0byBhIHNpdGUgdGhhdCB1c2VzIGl0Ci0JaW50IEJlZm9yZU5hdmlnYXRlMiA9IDB4ZmE7Ci0JY29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihCZWZvcmVOYXZpZ2F0ZTIsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCVZhcmlhbnQgdXJsID0gZXZlbnQuYXJndW1lbnRzWzFdOwotCQkJVmFyaWFudCBwb3N0RGF0YSA9IGV2ZW50LmFyZ3VtZW50c1s0XTsKLQkJCWlmIChwb3N0RGF0YSAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJQb3N0RGF0YSA9ICIrcmVhZFNhZmVBcnJheShwb3N0RGF0YSkrIiwgVVJMID0gIit1cmwuZ2V0U3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JLy8gTmF2aWdhdGUgdG8gdGhpcyB3ZWIgc2l0ZSB3aGljaCB1c2VzIHBvc3QgZGF0YSB0byBmaWxsIGluIHRoZSB0ZXh0IGZpZWxkCi0JLy8gYW5kIHB1dCB0aGUgc3RyaW5nICJoZWxsbyB3b3JsZCIgaW50byB0aGUgdGV4dCBib3gKLQl0ZXh0LnNldFRleHQoImZpbGU6Ly8iK1NuaXBwZXQxODYuY2xhc3MuZ2V0UmVzb3VyY2UoIlNuaXBwZXQxODYuaHRtbCIpLmdldEZpbGUoKSk7Ci0JaW50W10gcmdkaXNwaWQgPSBhdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJOYXZpZ2F0ZSIsICJVUkwiLCAiUG9zdERhdGEifSk7IAotCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsJCi0JVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50WzJdOwotCXJndmFyZ1swXSA9IG5ldyBWYXJpYW50KHRleHQuZ2V0VGV4dCgpKTsKLQlyZ3ZhcmdbMV0gPSB3cml0ZVNhZmVBcnJheSgiaGVsbG8gd29ybGQiKTsKLQlpbnRbXSByZ2Rpc3BpZE5hbWVkQXJncyA9IG5ldyBpbnRbMl07Ci0JcmdkaXNwaWROYW1lZEFyZ3NbMF0gPSByZ2Rpc3BpZFsxXTsKLQlyZ2Rpc3BpZE5hbWVkQXJnc1sxXSA9IHJnZGlzcGlkWzJdOwotCWF1dG9tYXRpb24uaW52b2tlKGRpc3BJZE1lbWJlciwgcmd2YXJnLCByZ2Rpc3BpZE5hbWVkQXJncyk7Ci0JCQotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotLy8gVGhlIGZvbGxvd2luZyBzdHJ1Y3RzIGFyZSBhY2Nlc3NlZCBpbiB0aGUgcmVhZFNhZmVBcnJheSBhbmQgd3JpdGVTYWZlQXJyYXkKLS8vIGZ1bmN0aW9uczoKLS8vCi0vLyBWQVJJQU5UOgotLy8gCQlzaG9ydCB2dAotLy8gCQlzaG9ydCB3UmVzZXJ2ZWQxCi0vLyAJCXNob3J0IHdSZXNlcnZlZDIKLS8vIAkJc2hvcnQgd1Jlc2VydmVkMwotLy8gCQlpbnQgcGFycmF5Ci0vLwotLy8gU0FGRUFSUkFZOgotLy8gICAgICBzaG9ydCBjRGltcyAgICAgIC8vIENvdW50IG9mIGRpbWVuc2lvbnMgaW4gdGhpcyBhcnJheQotLy8gICAgICBzaG9ydCBmRmVhdHVyZXMgIC8vIEZsYWdzIHVzZWQgYnkgdGhlIFNhZmVBcnJheQotLy8gICAgICBpbnQgY2JFbGVtZW50cyAgIC8vIFNpemUgb2YgYW4gZWxlbWVudCBvZiB0aGUgYXJyYXkKLS8vICAgICAgaW50IGNMb2NrcyAgICAgICAvLyBOdW1iZXIgb2YgdGltZXMgdGhlIGFycmF5IGhhcyBiZWVuIGxvY2tlZCB3aXRob3V0IGNvcnJlc3BvbmRpbmcgdW5sb2NrCi0vLyAgICAgIGludCBwdkRhdGEgICAgICAgLy8gUG9pbnRlciB0byB0aGUgZGF0YQotLy8gICAgICBTQUZFQVJSQVlCT1VORFtdIHJnc2Fib3VuZCAvLyBPbmUgYm91bmQgZm9yIGVhY2ggZGltZW5zaW9uCi0vLwotLy8gU0FGRUFSUkFZQk9VTkQ6Ci0vLyAgICAgIGludCBjRWxlbWVudHMgICAgLy8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZGltZW5zaW9uCi0vLyAgICAgIGludCBsTGJvdW5kICAgICAgLy8gdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBkaW1lbnNpb24gCi0KLXN0YXRpYyBTdHJpbmcgcmVhZFNhZmVBcnJheShWYXJpYW50IHZhcmlhbnRCeVJlZikgewotCS8vIFJlYWQgYSBzYWZlYXJyYXkgdGhhdCBjb250YWlucyBkYXRhIG9mIAotCS8vIHR5cGUgVlRfVUkxICh1bnNpZ25lZCBzaG9ydHMpIHdoaWNoIGNvbnRhaW5zCi0JLy8gYSB0ZXh0IHN0cmVhbS4KLSAgICBpbnQgcFBvc3REYXRhID0gdmFyaWFudEJ5UmVmLmdldEJ5UmVmKCk7Ci0gICAgc2hvcnRbXSB2dF90eXBlID0gbmV3IHNob3J0WzFdOwotICAgIE9TLk1vdmVNZW1vcnkodnRfdHlwZSwgcFBvc3REYXRhLCAyKTsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAodnRfdHlwZVswXSA9PSAoc2hvcnQpKE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9WQVJJQU5UKSkgewotICAgICAgICBpbnRbXSBwVmFyaWFudCA9IG5ldyBpbnRbMV07Ci0gICAgICAgIE9TLk1vdmVNZW1vcnkocFZhcmlhbnQsIHBQb3N0RGF0YSArIDgsIDQpOwotICAgICAgICB2dF90eXBlID0gbmV3IHNob3J0WzFdOwotICAgICAgICBPUy5Nb3ZlTWVtb3J5KHZ0X3R5cGUsIHBWYXJpYW50WzBdLCAyKTsKLSAgICAgICAgaWYgKHZ0X3R5cGVbMF0gPT0gKHNob3J0KShPTEUuVlRfQVJSQVkgfCBPTEUuVlRfVUkxKSkgewotICAgICAgICAgICAgaW50W10gcFNhZmVhcnJheSA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICBPUy5Nb3ZlTWVtb3J5KHBTYWZlYXJyYXksIHBWYXJpYW50WzBdICsgOCwgNCk7Ci0gICAgICAgICAgICBzaG9ydFtdIGNEaW1zID0gbmV3IHNob3J0WzFdOwotICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShjRGltcywgcFNhZmVhcnJheVswXSwgMik7Ci0gICAgICAgICAgICBpbnRbXSBwdkRhdGEgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShwdkRhdGEsIHBTYWZlYXJyYXlbMF0gKyAxMiwgNCk7Ci0gICAgICAgICAgICBpbnQgc2FmZWFycmF5Ym91bmRPZmZzZXQgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjRGltc1swXTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50W10gY0VsZW1lbnRzID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgICAgICBPUy5Nb3ZlTWVtb3J5KGNFbGVtZW50cywgcFNhZmVhcnJheVswXSArIDE2ICsgc2FmZWFycmF5Ym91bmRPZmZzZXQsIDQpOwotICAgICAgICAgICAgICAgIHNhZmVhcnJheWJvdW5kT2Zmc2V0ICs9IDg7Ci0gICAgICAgICAgICAgICAgaW50IGNjaFdpZGVDaGFyID0gT1MuTXVsdGlCeXRlVG9XaWRlQ2hhciAoQ29kZVBhZ2UsIE9TLk1CX1BSRUNPTVBPU0VELCAgcHZEYXRhWzBdLCAtMSwgbnVsbCwgMCk7Ci0JCQkJaWYgKGNjaFdpZGVDaGFyID09IDApIHJldHVybiBudWxsOwotCQkJCWNoYXJbXSBscFdpZGVDaGFyU3RyID0gbmV3IGNoYXIgW2NjaFdpZGVDaGFyIC0gMV07Ci0JCQkJT1MuTXVsdGlCeXRlVG9XaWRlQ2hhciAoQ29kZVBhZ2UsIE9TLk1CX1BSRUNPTVBPU0VELCAgcHZEYXRhWzBdLCAtMSwgbHBXaWRlQ2hhclN0ciwgbHBXaWRlQ2hhclN0ci5sZW5ndGgpOwotCQkJCXJlc3VsdCA9IG5ldyBTdHJpbmcobHBXaWRlQ2hhclN0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIFZhcmlhbnQgd3JpdGVTYWZlQXJyYXkgKFN0cmluZyBzdHJpbmcpIHsKLQkvLyBDcmVhdGUgYSBvbmUgZGltZW5zaW9uYWwgc2FmZWFycmF5IGNvbnRhaW5pbmcgdHdvIFZUX1VJMSB2YWx1ZXMKLQkvLyB3aGVyZSBWVF9VSTEgaXMgYW4gdW5zaWduZWQgY2hhcgotCQotCS8vIERlZmluZSBjRGltcywgZkZlYXR1cmVzIGFuZCBjYkVsZW1lbnRzCi0Jc2hvcnQgY0RpbXMgPSAxOwotCXNob3J0IEZBREZfRklYRURTSVpFID0gMHgxMDsKLQlzaG9ydCBGQURGX0hBVkVWQVJUWVBFID0gMHg4MDsKLQlzaG9ydCBmRmVhdHVyZXMgPSAoc2hvcnQpKEZBREZfRklYRURTSVpFIHwgRkFERl9IQVZFVkFSVFlQRSk7Ci0JaW50IGNiRWxlbWVudHMgPSAxOwotCS8vIENyZWF0ZSBhIHBvaW50ZXIgYW5kIGNvcHkgdGhlIGRhdGEgaW50byBpdAotCWludCBjb3VudCA9IHN0cmluZy5sZW5ndGgoKTsKLQljaGFyW10gY2hhcnMgPSBuZXcgY2hhcltjb3VudCArIDFdOwotCXN0cmluZy5nZXRDaGFycygwLCBjb3VudCwgY2hhcnMsIDApOwotCWludCBjY2hNdWx0aUJ5dGUgPSBPUy5XaWRlQ2hhclRvTXVsdGlCeXRlKENvZGVQYWdlLCAwLCBjaGFycywgLTEsIG51bGwsIDAsIG51bGwsIG51bGwpOwotCWlmIChjY2hNdWx0aUJ5dGUgPT0gMCkgcmV0dXJuIG51bGw7Ci0JaW50IHB2RGF0YSA9IE9TLkdsb2JhbEFsbG9jKE9TLkdNRU1fRklYRUQgfCBPUy5HTUVNX1pFUk9JTklULCBjY2hNdWx0aUJ5dGUpOwotCU9TLldpZGVDaGFyVG9NdWx0aUJ5dGUoQ29kZVBhZ2UsIDAsIGNoYXJzLCAtMSwgcHZEYXRhLCBjY2hNdWx0aUJ5dGUsIG51bGwsIG51bGwpOwotCWludCBjRWxlbWVudHMxID0gY2NoTXVsdGlCeXRlOwotCWludCBsTGJvdW5kMSA9IDA7Ci0JLy8gQ3JlYXRlIGEgc2FmZWFycmF5IGluIG1lbW9yeQotCS8vIDEyIGJ5dGVzIGZvciBjRGltcywgZkZlYXR1cmVzIGFuZCBjYkVsZW1lbnRzICsgNCBieXRlcyBmb3IgcHZEYXRhICsgbnVtYmVyIG9mIGRpbWVuc2lvbnMgKiAoc2l6ZSBvZiBzYWZlYXJyYXlib3VuZCkKLQlpbnQgc2l6ZW9mU2FmZUFycmF5ID0gMTIgKyA0ICsgMSo4OwotCWludCBwU2FmZUFycmF5ID0gT1MuR2xvYmFsQWxsb2MoT1MuR01FTV9GSVhFRCB8IE9TLkdNRU1fWkVST0lOSVQsIHNpemVvZlNhZmVBcnJheSk7Ci0JLy8gQ29weSB0aGUgZGF0YSBpbnRvIHRoZSBzYWZlIGFycmF5Ci0JaW50IG9mZnNldCA9IDA7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgc2hvcnRbXSB7Y0RpbXN9LCAyKTsgb2Zmc2V0ICs9IDI7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgc2hvcnRbXSB7ZkZlYXR1cmVzfSwgMik7IG9mZnNldCArPSAyOwotCU9TLk1vdmVNZW1vcnkocFNhZmVBcnJheSArIG9mZnNldCwgbmV3IGludFtdIHtjYkVsZW1lbnRzfSwgNCk7IG9mZnNldCArPSA0OwotCU9TLk1vdmVNZW1vcnkocFNhZmVBcnJheSArIG9mZnNldCwgbmV3IGludFtdIHswfSwgNCk7IG9mZnNldCArPSA0OwotCU9TLk1vdmVNZW1vcnkocFNhZmVBcnJheSArIG9mZnNldCwgbmV3IGludFtdIHtwdkRhdGF9LCA0KTsgb2Zmc2V0ICs9IDQ7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgaW50W10ge2NFbGVtZW50czF9LCA0KTsgb2Zmc2V0ICs9IDQ7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgaW50W10ge2xMYm91bmQxfSwgNCk7IG9mZnNldCArPSA0OwotCS8vIENyZWF0ZSBhIHZhcmlhbnQgaW4gbWVtb3J5IHRvIGhvbGQgdGhlIHNhZmVhcnJheQotCWludCBwVmFyaWFudCA9IE9TLkdsb2JhbEFsbG9jKE9TLkdNRU1fRklYRUQgfCBPUy5HTUVNX1pFUk9JTklULCBWYXJpYW50LnNpemVvZik7Ci0Jc2hvcnQgdnQgPSAoc2hvcnQpKE9MRS5WVF9BUlJBWSB8IE9MRS5WVF9VSTEpOwotCU9TLk1vdmVNZW1vcnkocFZhcmlhbnQsIG5ldyBzaG9ydFtdIHt2dH0sIDIpOwotCU9TLk1vdmVNZW1vcnkocFZhcmlhbnQgKyA4LCBuZXcgaW50W117cFNhZmVBcnJheX0sIDQpOwotCS8vIENyZWF0ZSBhIGJ5IHJlZiB2YXJpYW50Ci0JVmFyaWFudCB2YXJpYW50QnlSZWYgPSBuZXcgVmFyaWFudChwVmFyaWFudCwgKHNob3J0KShPTEUuVlRfQllSRUYgfCBPTEUuVlRfVkFSSUFOVCkpOwotCXJldHVybiB2YXJpYW50QnlSZWY7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YjI3NjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ny5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPEhUTUw+Ci0gIDxIRUFEPgotICAgIDxUSVRMRT5FdmFsdWF0ZTwvVElUTEU+Ci0JPHA+VGVzdCBmb3IgSUUgU2NyaXB0PC9wPgotICAgIDxTQ1JJUFQ+Ci0gICAgICBmdW5jdGlvbiBldmFsdWF0ZSh4KQotICAgICAgewotICAgICAgICAgYWxlcnQoImhlbGxvIikKLSAgICAgICAgIHJldHVybiBldmFsKHgpCi0gICAgICB9Ci0gICA8L1NDUklQVD4KLSAgPC9IRUFEPgotCi0gIDxCT0RZPgotICA8L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MjI0NzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBSdW5uaW5nIGEgc2NyaXB0IHdpdGhpbiBJRS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4NyB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JT2xlQ29udHJvbFNpdGUgY29udHJvbFNpdGU7Ci0JdHJ5IHsKLQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29udHJvbFNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiU2hlbGwuRXhwbG9yZXIiKTsKLQkJY29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJcmV0dXJuOwotCX0KLQkKLQkvLyBJV2ViQnJvd3NlcgotCWZpbmFsIE9sZUF1dG9tYXRpb24gd2ViQnJvd3NlciA9IG5ldyBPbGVBdXRvbWF0aW9uKGNvbnRyb2xTaXRlKTsKLQotCS8vIFdoZW4gdGhlIGRvY3VtZW50IGlzIGxvYWRlZCwgYWNjZXNzIHRoZSBkb2N1bWVudCBvYmplY3QgZm9yIHRoZSBuZXcgcGFnZQotCS8vIGFuZCBldmFsdXRlIGV4cHJlc3Npb24gdXNpbmcgU2NyaXB0LgotCWludCBEb3dubG9hZENvbXBsZXRlID0gMTA0OwotCWNvbnRyb2xTaXRlLmFkZEV2ZW50TGlzdGVuZXIoRG93bmxvYWRDb21wbGV0ZSwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJaW50W10gaHRtbERvY3VtZW50SUQgPSB3ZWJCcm93c2VyLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJEb2N1bWVudCJ9KTsgCi0JCQlpZiAoaHRtbERvY3VtZW50SUQgPT0gbnVsbCkgcmV0dXJuOwotCQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gd2ViQnJvd3Nlci5nZXRQcm9wZXJ0eShodG1sRG9jdW1lbnRJRFswXSk7Ci0JCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IDApIHJldHVybjsKLQkJCS8vSUhUTUxEb2N1bWVudDIKLQkJCU9sZUF1dG9tYXRpb24gaHRtbERvY3VtZW50ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaHRtbERvY3VtZW50ID0gcFZhclJlc3VsdC5nZXRBdXRvbWF0aW9uKCk7Ci0JCQkJcFZhclJlc3VsdC5kaXNwb3NlKCk7Ci0JCi0JCQkJaW50W10gc2NyaXB0SUQgPSBodG1sRG9jdW1lbnQuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IlNjcmlwdCJ9KTsgCi0JCQkJaWYgKHNjcmlwdElEID09IG51bGwpIHJldHVybjsKLQkJCQlwVmFyUmVzdWx0ID0gaHRtbERvY3VtZW50LmdldFByb3BlcnR5KHNjcmlwdElEWzBdKTsKLQkJCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IDApIHJldHVybjsKLQkJCQlPbGVBdXRvbWF0aW9uIGh0bWxXaW5kb3cgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCS8vSUhUTUxXaW5kb3cyCi0JCQkJCWh0bWxXaW5kb3cgPSBwVmFyUmVzdWx0LmdldEF1dG9tYXRpb24oKTsKLQkJCQkJcFZhclJlc3VsdC5kaXNwb3NlKCk7Ci0JCQkJCWludFtdIGV2YWx1YXRlSUQgPSBodG1sV2luZG93LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsiZXZhbHVhdGUifSk7Ci0JCQkJCWlmIChldmFsdWF0ZUlEID09IG51bGwpIHJldHVybjsKLQkJCQkJU3RyaW5nIGV4cHJlc3Npb24gPSAiNStNYXRoLnNpbig5KSI7Ci0JCQkJCVZhcmlhbnRbXSByZ3ZhcmcgPSBuZXcgVmFyaWFudFtdIHtuZXcgVmFyaWFudChleHByZXNzaW9uKX07Ci0JCQkJCXBWYXJSZXN1bHQgPSBodG1sV2luZG93Lmludm9rZShldmFsdWF0ZUlEWzBdLCByZ3ZhcmcsIG51bGwpOwotCQkJCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IDApIHJldHVybjsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGV4cHJlc3Npb24rIiA9IitwVmFyUmVzdWx0LmdldFN0cmluZygpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlodG1sV2luZG93LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWh0bWxEb2N1bWVudC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQkvLyBOYXZpZ2F0ZSB0byBhIHdlYiBzaXRlCi0JaW50W10gaWRzID0gd2ViQnJvd3Nlci5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiTmF2aWdhdGUiLCAiVVJMIn0pOyAKLQlWYXJpYW50W10gcmd2YXJnID0gbmV3IFZhcmlhbnRbXSB7bmV3IFZhcmlhbnQoImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvJTdFY2hlY2tvdXQlN0Uvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ny5odG1sIil9OwotCWludFtdIHJnZGlzcGlkTmFtZWRBcmdzID0gbmV3IGludFtde2lkc1sxXX07Ci0Jd2ViQnJvd3Nlci5pbnZva2UoaWRzWzBdLCByZ3ZhcmcsIHJnZGlzcGlkTmFtZWRBcmdzKTsKLQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCS8vUmVtZW1iZXIgdG8gcmVsZWFzZSBPbGVBdXRvbWF0aW9uIE9iamVjdAotCXdlYkJyb3dzZXIuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotCQotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjY2I4Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogU2Nyb2xsIHdpZGdldHMgaW50byB2aWV3IHdoZW4gdGhleSBnZXQgZm9jdXMKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTg4IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JQnV0dG9uIGIxID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIxLnNldFRleHQoInRvcCIpOwotCWIxLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDEsIDEpKTsKLQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYyA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0Jc2Muc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHNjLCBTV1QuTk9ORSk7Ci0JYy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMTAsIHRydWUpKTsKLQlmb3IgKGludCBpID0gMCA7IGkgPCAzMDA7IGkrKykgewotCQlCdXR0b24gYiA9IG5ldyBCdXR0b24oYywgU1dULlBVU0gpOwotCQliLnNldFRleHQoIkJ1dHRvbiAiK2kpOwotCX0KLQlCdXR0b24gYjIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYjIuc2V0VGV4dCgiYm90dG9tIik7Ci0JYjIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSwgMSwgMSkpOwotCQotCXNjLnNldENvbnRlbnQoYyk7Ci0Jc2Muc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQlzYy5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQlzYy5zZXRNaW5TaXplKGMuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0KLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJQ29udHJvbCBjaGlsZCA9IChDb250cm9sKWUud2lkZ2V0OwotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGNoaWxkLmdldEJvdW5kcygpOwotCQkJUmVjdGFuZ2xlIGFyZWEgPSBzYy5nZXRDbGllbnRBcmVhKCk7Ci0JCQlQb2ludCBvcmlnaW4gPSBzYy5nZXRPcmlnaW4oKTsKLQkJCWlmIChvcmlnaW4ueCA+IGJvdW5kcy54KSBvcmlnaW4ueCA9IE1hdGgubWF4KDAsIGJvdW5kcy54KTsKLQkJCWlmIChvcmlnaW4ueSA+IGJvdW5kcy55KSBvcmlnaW4ueSA9IE1hdGgubWF4KDAsIGJvdW5kcy55KTsKLQkJCWlmIChvcmlnaW4ueCArIGFyZWEud2lkdGggPCBib3VuZHMueCArIGJvdW5kcy53aWR0aCkgb3JpZ2luLnggPSBNYXRoLm1heCgwLCBib3VuZHMueCArIGJvdW5kcy53aWR0aCAtIGFyZWEud2lkdGgpOwotCQkJaWYgKG9yaWdpbi55ICsgYXJlYS5oZWlnaHQgPCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpIG9yaWdpbi55ID0gTWF0aC5tYXgoMCwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0IC0gYXJlYS5oZWlnaHQpOwotCQkJc2Muc2V0T3JpZ2luKG9yaWdpbik7Ci0JCX0KLQl9OwotCUNvbnRyb2xbXSBjb250cm9scyA9IGMuZ2V0Q2hpbGRyZW4oKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbnRyb2xzW2ldLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbGlzdGVuZXIpOwotCX0KLQlzaGVsbC5zZXRTaXplKDMwMCwgNTAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGYzMGIyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBUZXh0IHdpdGggdW5kZXJsaW5lIGFuZCBzdHJpa2UgdGhyb3VnaAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODkgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIlN0eWxlZFRleHQgd2l0aCB1bmRlcmxpbmUgYW5kIHN0cmlrZSB0aHJvdWdoIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCVN0eWxlZFRleHQgdGV4dCA9IG5ldyBTdHlsZWRUZXh0IChzaGVsbCwgU1dULkJPUkRFUik7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5IEFCQ0RFRkdISUpLTE0gTk9QUVJTVFVWV1hZWiIpOwotCS8vIG1ha2UgMDEyMzQ1Njc4OSBhcHBlYXIgdW5kZXJsaW5lZAotCVN0eWxlUmFuZ2Ugc3R5bGUxID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTEuc3RhcnQgPSAwOwotCXN0eWxlMS5sZW5ndGggPSAxMDsKLQlzdHlsZTEudW5kZXJsaW5lID0gdHJ1ZTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUxKTsKLQkvLyBtYWtlIEFCQ0RFRkdISUpLTE0gaGF2ZSBhIHN0cmlrZSB0aHJvdWdoCi0JU3R5bGVSYW5nZSBzdHlsZTIgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMi5zdGFydCA9IDExOwotCXN0eWxlMi5sZW5ndGggPSAxMzsKLQlzdHlsZTIuc3RyaWtlb3V0ID0gdHJ1ZTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUyKTsKLQkvLyBtYWtlIE5PUFFSU1RVVldYWVogYXBwZWFyIHVuZGVybGluZWQgYW5kIGhhdmUgYSBzdHJpa2UgdGhyb3VnaAotCVN0eWxlUmFuZ2Ugc3R5bGUzID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTMuc3RhcnQgPSAyNTsKLQlzdHlsZTMubGVuZ3RoID0gMTM7Ci0Jc3R5bGUzLnVuZGVybGluZSA9IHRydWU7Ci0Jc3R5bGUzLnN0cmlrZW91dCA9IHRydWU7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlMyk7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNjkxNjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHZlcmlmeSBpbnB1dCAob25seSBhbGxvdyBkaWdpdHMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQl0ZXh0LnNldEJvdW5kcyAoMTAsIDEwLCAyMDAsIDIwMCk7Ci0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULlZlcmlmeSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBlLnRleHQ7Ci0JCQljaGFyIFtdIGNoYXJzID0gbmV3IGNoYXIgW3N0cmluZy5sZW5ndGggKCldOwotCQkJc3RyaW5nLmdldENoYXJzICgwLCBjaGFycy5sZW5ndGgsIGNoYXJzLCAwKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjaGFycy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghKCcwJyA8PSBjaGFycyBbaV0gJiYgY2hhcnMgW2ldIDw9ICc5JykpIHsKLQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YTM5NzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBGbG9hdGluZyBwb2ludCB2YWx1ZXMgaW4gU3Bpbm5lcgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTAgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIlNwaW5uZXIgd2l0aCBmbG9hdCB2YWx1ZXMiKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JZmluYWwgU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkvLyBhbGxvdyAzIGRlY2ltYWwgcGxhY2VzCi0Jc3Bpbm5lci5zZXREaWdpdHMoMyk7Ci0JLy8gc2V0IHRoZSBtaW5pbXVtIHZhbHVlIHRvIDAuMDAxCi0Jc3Bpbm5lci5zZXRNaW5pbXVtKDEpOwotCS8vIHNldCB0aGUgbWF4aW11bSB2YWx1ZSB0byAyMAotCXNwaW5uZXIuc2V0TWF4aW11bSgyMDAwMCk7Ci0JLy8gc2V0IHRoZSBpbmNyZW1lbnQgdmFsdWUgdG8gMC4wMTAKLQlzcGlubmVyLnNldEluY3JlbWVudCgxMCk7Ci0JLy8gc2V0IHRoZSBzZWxldGlvbiB0byAzLjQ1NgotCXNwaW5uZXIuc2V0U2VsZWN0aW9uKDM0NTYpOwotCXNwaW5uZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWludCBzZWxlY3Rpb24gPSBzcGlubmVyLmdldFNlbGVjdGlvbigpOwotCQkJaW50IGRpZ2l0cyA9IHNwaW5uZXIuZ2V0RGlnaXRzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNlbGVjdGlvbiBpcyAiKyhzZWxlY3Rpb24gLyBNYXRoLnBvdygxMCwgZGlnaXRzKSkpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmFjMWE2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIERldGVjdCB3aGVuIHRoZSB1c2VyIHNjcm9sbHMgYSB0ZXh0IGNvbnRyb2wKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5MSB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDMyOyBpKyspIHsKLQkJdGV4dC5hcHBlbmQgKGkgKyAiLVRoaXMgaXMgYSBsaW5lIG9mIHRleHQgaW4gYSB3aWRnZXQtIiArIGkgKyAiXG4iKTsKLQl9Ci0JdGV4dC5zZXRTZWxlY3Rpb24gKDApOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJaW50IGxhc3RJbmRleCA9IHRleHQuZ2V0VG9wSW5kZXggKCk7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlpbnQgaW5kZXggPSB0ZXh0LmdldFRvcEluZGV4ICgpOwotCQkJaWYgKGluZGV4ICE9IGxhc3RJbmRleCkgewotCQkJCWxhc3RJbmRleCA9IGluZGV4OwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNjcm9sbGVkLCB0b3BJbmRleD0iICsgaW5kZXgpOwotCQkJfQotCQl9Ci0JfTsKLQkvKiBOT1RFOiBPbmx5IGRldGVjdHMgc2Nyb2xsaW5nIGJ5IHRoZSB1c2VyICovCi0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZU1vdmUsIGxpc3RlbmVyKTsKLQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuTW91c2VVcCwgbGlzdGVuZXIpOwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5LZXlEb3duLCBsaXN0ZW5lcik7Ci0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULktleVVwLCBsaXN0ZW5lcik7Ci0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbGlzdGVuZXIpOwotCVNjcm9sbEJhciBoQmFyID0gdGV4dC5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JaWYgKGhCYXIgIT0gbnVsbCkgewotCQloQmFyLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JfQotCVNjcm9sbEJhciB2QmFyID0gdGV4dC5nZXRWZXJ0aWNhbEJhcigpOwotCWlmICh2QmFyICE9IG51bGwpIHsKLQkJdkJhci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCX0KLQlzaGVsbC5wYWNrICgpOwotCVBvaW50IHNpemUgPSBzaGVsbC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQlzaGVsbC5zZXRTaXplIChzaXplLiB4IC0gMzIsIHNpemUueSAvIDIpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkOGQ2ZDAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogU2hvdyBhIHNvcnQgaW5kaWNhdG9yIGluIHRoZSBjb2x1bW4gaGVhZGVyCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5MiB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JLy8gaW5pdGlhbGl6ZSBkYXRhIHdpdGgga2V5cyBhbmQgcmFuZG9tIHZhbHVlcwotCWludCBzaXplID0gMTAwOwotCVJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0JZmluYWwgaW50W11bXSBkYXRhID0gbmV3IGludFtzaXplXVtdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQlkYXRhW2ldID0gbmV3IGludFtdIHtpLCByYW5kb20ubmV4dEludCgpfTsKLQl9Ci0JLy8gY3JlYXRlIGEgdmlydHVhbCB0YWJsZSB0byBkaXNwbGF5IGRhdGEKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZJUlRVQUwpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldEl0ZW1Db3VudChzaXplKTsKLQlmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JY29sdW1uMS5zZXRUZXh0KCJLZXkiKTsKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjIuc2V0VGV4dCgiVmFsdWUiKTsKLQljb2x1bW4yLnNldFdpZHRoKDIwMCk7Ci0JdGFibGUuYWRkTGlzdGVuZXIoU1dULlNldERhdGEsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSBlLml0ZW07Ci0JCQlpbnQgaW5kZXggPSB0YWJsZS5pbmRleE9mKGl0ZW0pOwotCQkJaW50W10gZGF0dW0gPSBkYXRhW2luZGV4XTsKLQkJCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10ge0ludGVnZXIudG9TdHJpbmcoZGF0dW1bMF0pLAotCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGRhdHVtWzFdKSB9KTsKLQkJfQotCX0pOwotCS8vIEFkZCBzb3J0IGluZGljYXRvciBhbmQgc29ydCBkYXRhIHdoZW4gY29sdW1uIHNlbGVjdGVkCi0JTGlzdGVuZXIgc29ydExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkvLyBkZXRlcm1pbmUgbmV3IHNvcnQgY29sdW1uIGFuZCBkaXJlY3Rpb24KLQkJCVRhYmxlQ29sdW1uIHNvcnRDb2x1bW4gPSB0YWJsZS5nZXRTb3J0Q29sdW1uKCk7Ci0JCQlUYWJsZUNvbHVtbiBjdXJyZW50Q29sdW1uID0gKFRhYmxlQ29sdW1uKSBlLndpZGdldDsKLQkJCWludCBkaXIgPSB0YWJsZS5nZXRTb3J0RGlyZWN0aW9uKCk7Ci0JCQlpZiAoc29ydENvbHVtbiA9PSBjdXJyZW50Q29sdW1uKSB7Ci0JCQkJZGlyID0gZGlyID09IFNXVC5VUCA/IFNXVC5ET1dOIDogU1dULlVQOwotCQkJfSBlbHNlIHsKLQkJCQl0YWJsZS5zZXRTb3J0Q29sdW1uKGN1cnJlbnRDb2x1bW4pOwotCQkJCWRpciA9IFNXVC5VUDsKLQkJCX0KLQkJCS8vIHNvcnQgdGhlIGRhdGEgYmFzZWQgb24gY29sdW1uIGFuZCBkaXJlY3Rpb24KLQkJCWZpbmFsIGludCBpbmRleCA9IGN1cnJlbnRDb2x1bW4gPT0gY29sdW1uMSA/IDAgOiAxOwotCQkJZmluYWwgaW50IGRpcmVjdGlvbiA9IGRpcjsKLQkJCUFycmF5cy5zb3J0KGRhdGEsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLQkJCQkJaW50W10gYSA9IChpbnRbXSkgYXJnMDsKLQkJCQkJaW50W10gYiA9IChpbnRbXSkgYXJnMTsKLQkJCQkJaWYgKGFbaW5kZXhdID09IGJbaW5kZXhdKSByZXR1cm4gMDsKLQkJCQkJaWYgKGRpcmVjdGlvbiA9PSBTV1QuVVApIHsKLQkJCQkJCXJldHVybiBhW2luZGV4XSA8IGJbaW5kZXhdID8gLTEgOiAxOwotCQkJCQl9Ci0JCQkJCXJldHVybiBhW2luZGV4XSA8IGJbaW5kZXhdID8gMSA6IC0xOwotCQkJCX0KLQkJCX0pOwotCQkJLy8gdXBkYXRlIGRhdGEgZGlzcGxheWVkIGluIHRhYmxlCi0JCQl0YWJsZS5zZXRTb3J0RGlyZWN0aW9uKGRpcik7Ci0JCQl0YWJsZS5jbGVhckFsbCgpOwotCQl9Ci0JfTsKLQljb2x1bW4xLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHNvcnRMaXN0ZW5lcik7Ci0JY29sdW1uMi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBzb3J0TGlzdGVuZXIpOwotCXRhYmxlLnNldFNvcnRDb2x1bW4oY29sdW1uMSk7Ci0JdGFibGUuc2V0U29ydERpcmVjdGlvbihTV1QuVVApOwotCXNoZWxsLnNldFNpemUoc2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54LCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q0NDFjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQWxsb3cgdXNlciB0byByZW9yZGVyIGNvbHVtbnMgYW5kIHJlb3JkZXIgY29sdW1ucyBwcm9ncmFtbWF0aWNhbGx5LgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTMgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoU1dULkhPUklaT05UQUwpKTsKLQkJZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuQ0hFQ0spOwotCQl0cmVlLnNldExheW91dERhdGEobmV3IFJvd0RhdGEoLTEsIDMwMCkpOwotCQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDAiKTsKLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gMSIpOwotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuUklHSFQpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDMiKTsKLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gNCIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCQlTdHJpbmdbXSB0ZXh0ID0gbmV3IFN0cmluZ1tde2krIjowIiwgaSsiOjEiLCBpKyI6MiIsIGkrIjozIiwgaSsiOjQifTsKLQkJCWl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgNTsgaisrKSB7Ci0JCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJdGV4dCA9IG5ldyBTdHJpbmdbXXtpKyIsIitqKyI6MCIsIGkrIiwiK2orIjoxIiwgaSsiLCIraisiOjIiLCBpKyIsIitqKyI6MyIsIGkrIiwiK2orIjo0In07Ci0JCQkJc3ViSXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNTsgaysrKSB7Ci0JCQkJCVRyZWVJdGVtIHN1YnN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oc3ViSXRlbSwgU1dULk5PTkUpOwotCQkJCQl0ZXh0ID0gbmV3IFN0cmluZ1tde2krIiwiK2orIiwiK2srIjowIiwgaSsiLCIraisiLCIraysiOjEiLCBpKyIsIitqKyIsIitrKyI6MiIsIGkrIiwiK2orIiwiK2srIjozIiwgaSsiLCIraisiLCIraysiOjQifTsKLQkJCQkJc3Vic3ViSXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1vdmUgIitlLndpZGdldCk7Ci0JCQl9Ci0JCX07Ci0JCVRyZWVDb2x1bW5bXSBjb2x1bW5zID0gdHJlZS5nZXRDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJY29sdW1uc1tpXS5zZXRXaWR0aCgxMDApOwotCQkJY29sdW1uc1tpXS5zZXRNb3ZlYWJsZSh0cnVlKTsKLQkJCWNvbHVtbnNbaV0uYWRkTGlzdGVuZXIoU1dULk1vdmUsIGxpc3RlbmVyKTsKLQkJfQotCQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYi5zZXRUZXh0KCJpbnZlcnQgY29sdW1uIG9yZGVyIik7Ci0JCWIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWludFtdIG9yZGVyID0gdHJlZS5nZXRDb2x1bW5PcmRlcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoIC8gMjsgaSsrKSB7Ci0JCQkJCWludCB0ZW1wID0gb3JkZXJbaV07Ci0JCQkJCW9yZGVyW2ldID0gb3JkZXJbb3JkZXIubGVuZ3RoIC0gaSAtIDFdOwotCQkJCQlvcmRlcltvcmRlci5sZW5ndGggLSBpIC0gMV0gPSB0ZW1wOwotCQkJCX0KLQkJCQl0cmVlLnNldENvbHVtbk9yZGVyKG9yZGVyKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZWUyYzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFdyaXRlIGFuIGFuaW1hdGVkIEdJRiB0byBhIGZpbGUuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5NCB7Ci0JRGlzcGxheSBkaXNwbGF5OwotCUNvbG9yIHdoaXRlLCByZWQsIGdyZWVuLCBibHVlOwotCUZvbnQgZm9udDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJbmV3IFNuaXBwZXQxOTQoKS5ydW4oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJUkdCIHdoaXRlUkdCID0gbmV3IFJHQigweGZmLCAweGZmLCAweGZmKTsKLQkJUkdCIHJlZFJHQiA9IG5ldyBSR0IoMHhmZiwgMCwgMCk7Ci0JCVJHQiBncmVlblJHQiA9IG5ldyBSR0IoMCwgMHhmZiwgMCk7Ci0JCVJHQiBibHVlUkdCID0gbmV3IFJHQigwLCAwLCAweGZmKTsKLQkJUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10gewotCQkJCXdoaXRlUkdCLAkvLyAwCi0JCQkJcmVkUkdCLAkJLy8gMQotCQkJCWdyZWVuUkdCLAkvLyAyCi0JCQkJYmx1ZVJHQiB9KTsJLy8gMwotCQl3aGl0ZSA9IG5ldyBDb2xvcihkaXNwbGF5LCB3aGl0ZVJHQik7Ci0JCXJlZCA9IG5ldyBDb2xvcihkaXNwbGF5LCByZWRSR0IpOwotCQlncmVlbiA9IG5ldyBDb2xvcihkaXNwbGF5LCBncmVlblJHQik7Ci0JCWJsdWUgPSBuZXcgQ29sb3IoZGlzcGxheSwgYmx1ZVJHQik7Ci0JCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiQ29taWMgU2FucyBNUyIsIDI0LCBTV1QuQk9MRCk7Ci0JCQotCQlJbWFnZURhdGFbXSBkYXRhID0gbmV3IEltYWdlRGF0YVs0XTsKLQkJZGF0YVswXSA9IG5ld0ZyYW1lKCIiLCAgd2hpdGUsIHBhbGV0dGUsIGZhbHNlLCAwLCAwLCAxMDEsIDU1LCBTV1QuRE1fRklMTF9OT05FLCA0MCk7Ci0JCWRhdGFbMV0gPSBuZXdGcmFtZSgiUyIsIHJlZCwgICBwYWxldHRlLCB0cnVlLCAgMCwgMCwgIDMwLCA1NSwgU1dULkRNX0ZJTExfTk9ORSwgNDApOwotCQlkYXRhWzJdID0gbmV3RnJhbWUoIlciLCBncmVlbiwgcGFsZXR0ZSwgdHJ1ZSwgMjgsIDAsICAzOSwgNTUsIFNXVC5ETV9GSUxMX05PTkUsIDQwKTsKLQkJZGF0YVszXSA9IG5ld0ZyYW1lKCJUIiwgYmx1ZSwgIHBhbGV0dGUsIHRydWUsIDY5LCAwLCAgMzIsIDU1LCBTV1QuRE1fRklMTF9CQUNLR1JPVU5ELCAyMDApOwotCQkKLQkJSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCWxvYWRlci5kYXRhID0gZGF0YTsKLQkJbG9hZGVyLmJhY2tncm91bmRQaXhlbCA9IDA7Ci0JCWxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0ID0gZGF0YVswXS5oZWlnaHQ7Ci0JCWxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGggPSBkYXRhWzBdLndpZHRoOwotCQlsb2FkZXIucmVwZWF0Q291bnQgPSAwOyAvLyBydW4gZm9yZXZlcgotCQlsb2FkZXIuc2F2ZSgic3d0LmdpZiIsIFNXVC5JTUFHRV9HSUYpOwotCi0JCXdoaXRlLmRpc3Bvc2UoKTsKLQkJcmVkLmRpc3Bvc2UoKTsKLQkJZ3JlZW4uZGlzcG9zZSgpOwotCQlibHVlLmRpc3Bvc2UoKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQotCUltYWdlRGF0YSBuZXdGcmFtZShTdHJpbmcgbGV0dGVyLCBDb2xvciBjb2xvciwgUGFsZXR0ZURhdGEgcGFsZXR0ZSwgYm9vbGVhbiB0cmFuc3BhcmVudCwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkaXNwb3NhbE1ldGhvZCwgaW50IGRlbGF5VGltZSkgewotCQlJbWFnZURhdGEgdGVtcCA9IG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodCwgcGFsZXR0ZS5nZXRSR0JzKCkubGVuZ3RoLCBwYWxldHRlKTsKLQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgdGVtcCk7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQkJZ2Muc2V0QmFja2dyb3VuZCh3aGl0ZSk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0JCWdjLnNldEZvcmVncm91bmQoY29sb3IpOwotCQlnYy5zZXRGb250KGZvbnQpOwotCQlnYy5kcmF3U3RyaW5nKGxldHRlciwgNSwgNSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJSW1hZ2VEYXRhIGZyYW1lID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JCWlmICh0cmFuc3BhcmVudCkgZnJhbWUudHJhbnNwYXJlbnRQaXhlbCA9IDA7IC8vIHdoaXRlCi0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZnJhbWUueCA9IHg7Ci0JCWZyYW1lLnkgPSB5OwotCQlmcmFtZS5kaXNwb3NhbE1ldGhvZCA9IGRpc3Bvc2FsTWV0aG9kOwotCQlmcmFtZS5kZWxheVRpbWUgPSBkZWxheVRpbWU7Ci0JCXJldHVybiBmcmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOGQxNTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTENhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkdMRGF0YTsKLWltcG9ydCBvcmcubHdqZ2wub3BlbmdsLkdMMTE7Ci1pbXBvcnQgb3JnLmx3amdsLm9wZW5nbC5HTENvbnRleHQ7Ci1pbXBvcnQgb3JnLmx3amdsLm9wZW5nbC5nbHUuR0xVOwotaW1wb3J0IG9yZy5sd2pnbC5MV0pHTEV4Y2VwdGlvbjsKLQotLyoKLSAqIFNXVCBPcGVuR0wgc25pcHBldDogdXNlIExXSkdMIHRvIGRyYXcgdG8gYW4gU1dUIEdMQ2FudmFzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5NSB7Ci0Jc3RhdGljIHZvaWQgZHJhd1RvcnVzKGZsb2F0IHIsIGZsb2F0IFIsIGludCBuc2lkZXMsIGludCByaW5ncykgewotCQlmbG9hdCByaW5nRGVsdGEgPSAyLjBmICogKGZsb2F0KSBNYXRoLlBJIC8gcmluZ3M7Ci0JCWZsb2F0IHNpZGVEZWx0YSA9IDIuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyBuc2lkZXM7Ci0JCWZsb2F0IHRoZXRhID0gMC4wZiwgY29zVGhldGEgPSAxLjBmLCBzaW5UaGV0YSA9IDAuMGY7Ci0JCWZvciAoaW50IGkgPSByaW5ncyAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlmbG9hdCB0aGV0YTEgPSB0aGV0YSArIHJpbmdEZWx0YTsKLQkJCWZsb2F0IGNvc1RoZXRhMSA9IChmbG9hdCkgTWF0aC5jb3ModGhldGExKTsKLQkJCWZsb2F0IHNpblRoZXRhMSA9IChmbG9hdCkgTWF0aC5zaW4odGhldGExKTsKLQkJCUdMMTEuZ2xCZWdpbihHTDExLkdMX1FVQURfU1RSSVApOwotCQkJZmxvYXQgcGhpID0gMC4wZjsKLQkJCWZvciAoaW50IGogPSBuc2lkZXM7IGogPj0gMDsgai0tKSB7Ci0JCQkJcGhpICs9IHNpZGVEZWx0YTsKLQkJCQlmbG9hdCBjb3NQaGkgPSAoZmxvYXQpIE1hdGguY29zKHBoaSk7Ci0JCQkJZmxvYXQgc2luUGhpID0gKGZsb2F0KSBNYXRoLnNpbihwaGkpOwotCQkJCWZsb2F0IGRpc3QgPSBSICsgciAqIGNvc1BoaTsKLQkJCQlHTDExLmdsTm9ybWFsM2YoY29zVGhldGExICogY29zUGhpLCAtc2luVGhldGExICogY29zUGhpLCBzaW5QaGkpOwotCQkJCUdMMTEuZ2xWZXJ0ZXgzZihjb3NUaGV0YTEgKiBkaXN0LCAtc2luVGhldGExICogZGlzdCwgciAqIHNpblBoaSk7Ci0JCQkJR0wxMS5nbE5vcm1hbDNmKGNvc1RoZXRhICogY29zUGhpLCAtc2luVGhldGEgKiBjb3NQaGksIHNpblBoaSk7Ci0JCQkJR0wxMS5nbFZlcnRleDNmKGNvc1RoZXRhICogZGlzdCwgLXNpblRoZXRhICogZGlzdCwgciAqIHNpblBoaSk7Ci0JCQl9Ci0JCQlHTDExLmdsRW5kKCk7Ci0JCQl0aGV0YSA9IHRoZXRhMTsKLQkJCWNvc1RoZXRhID0gY29zVGhldGExOwotCQkJc2luVGhldGEgPSBzaW5UaGV0YTE7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29tcC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSAoKTsKLQkJZGF0YS5kb3VibGVCdWZmZXIgPSB0cnVlOwotCQlmaW5hbCBHTENhbnZhcyBjYW52YXMgPSBuZXcgR0xDYW52YXMoY29tcCwgU1dULk5PTkUsIGRhdGEpOwotCi0JCWNhbnZhcy5zZXRDdXJyZW50KCk7Ci0JCXRyeSB7Ci0gICAgICAgIAkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLSAgICAgICAgfSBjYXRjaChMV0pHTEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KLSAgICAgICAgCi0gICAgICAgIGNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIAlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAJCVJlY3RhbmdsZSBib3VuZHMgPSBjYW52YXMuZ2V0Qm91bmRzKCk7Ci0gICAgICAgIAkJZmxvYXQgZkFzcGVjdCA9IChmbG9hdCkgYm91bmRzLndpZHRoIC8gKGZsb2F0KSBib3VuZHMuaGVpZ2h0OwotCQkJCWNhbnZhcy5zZXRDdXJyZW50KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLQkJICAgICAgICB9IGNhdGNoKExXSkdMRXhjZXB0aW9uIGUpIHsgZS5wcmludFN0YWNrVHJhY2UoKTsgfQotICAgICAgICAJCUdMMTEuZ2xWaWV3cG9ydCgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotICAgICAgICAJCUdMMTEuZ2xNYXRyaXhNb2RlKEdMMTEuR0xfUFJPSkVDVElPTik7Ci0gICAgICAgIAkJR0wxMS5nbExvYWRJZGVudGl0eSgpOwotICAgICAgICAJCUdMVS5nbHVQZXJzcGVjdGl2ZSg0NS4wZiwgZkFzcGVjdCwgMC41ZiwgNDAwLjBmKTsKLSAgICAgICAgCQlHTDExLmdsTWF0cml4TW9kZShHTDExLkdMX01PREVMVklFVyk7Ci0gICAgICAgIAkJR0wxMS5nbExvYWRJZGVudGl0eSgpOwotICAgICAgICAJfQotICAgICAgICB9KTsKLQotCQlHTDExLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wxMS5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMMTEuZ2xIaW50KEdMMTEuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTDExLkdMX05JQ0VTVCk7Ci0JCUdMMTEuZ2xDbGVhckRlcHRoKDEuMCk7Ci0JCUdMMTEuZ2xMaW5lV2lkdGgoMik7Ci0JCUdMMTEuZ2xFbmFibGUoR0wxMS5HTF9ERVBUSF9URVNUKTsKLQotCQlzaGVsbC5zZXRUZXh0KCJTV1QvTFdKR0wgRXhhbXBsZSIpOwotCQlzaGVsbC5zZXRTaXplKDY0MCwgNDgwKTsKLQkJc2hlbGwub3BlbigpOwotCi0JICAgIGRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkgICAgCWludCByb3QgPSAwOwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghY2FudmFzLmlzRGlzcG9zZWQoKSkgewotCQkJCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQkJCQl0cnkgewotCQkJCQkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLQkJCSAgICAgICAgfSBjYXRjaChMV0pHTEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KLQkJCQkJR0wxMS5nbENsZWFyKEdMMTEuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMMTEuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCQkJCUdMMTEuZ2xDbGVhckNvbG9yKC4zZiwgLjVmLCAuOGYsIDEuMGYpOwotCQkJCQlHTDExLmdsTG9hZElkZW50aXR5KCk7Ci0JCQkJCUdMMTEuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIC0xMC4wZik7Ci0JCQkJCWZsb2F0IGZyb3QgPSByb3Q7Ci0JCQkJCUdMMTEuZ2xSb3RhdGVmKDAuMTVmICogcm90LCAyLjBmICogZnJvdCwgMTAuMGYgKiBmcm90LCAxLjBmKTsKLQkJCQkJR0wxMS5nbFJvdGF0ZWYoMC4zZiAqIHJvdCwgMy4wZiAqIGZyb3QsIDEuMGYgKiBmcm90LCAxLjBmKTsKLQkJCQkJcm90Kys7Ci0JCQkJCUdMMTEuZ2xQb2x5Z29uTW9kZShHTDExLkdMX0ZST05UX0FORF9CQUNLLCBHTDExLkdMX0xJTkUpOwotCQkJCQlHTDExLmdsQ29sb3IzZigwLjlmLCAwLjlmLCAwLjlmKTsKLQkJCQkJZHJhd1RvcnVzKDEsIDEuOWYgKyAoKGZsb2F0KSBNYXRoLnNpbigoMC4wMDRmICogZnJvdCkpKSwgMTUsIDE1KTsKLQkJCQkJY2FudmFzLnN3YXBCdWZmZXJzKCk7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODA4MWQ0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHVzZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byB2ZXJpZnkgaW5wdXQKLSAqIEluIHRoaXMgY2FzZSBhIHBob25lIG51bWJlciBpcyB1c2VkLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTYgewotCS8qCi0JICogUGhvbmUgbnVtYmVycyBmb2xsb3cgdGhlIHJ1bGUgWyhdWzEtOV1bMS05XVsxLTldWyldWzEtOV1bMS05XVsxLTldWy1dWzEtOV1bMS05XVsxLTldWzEtOV0KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVggPSAiWyhdXFxkezN9WyldXFxkezN9Wy1dXFxkezR9IjsgIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGVtcGxhdGUgPSAiKCMjIykjIyMtIyMjIyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdFRleHQgPSAiKDAwMCkwMDAtMDAwMCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUik7Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgIkNvdXJpZXIgTmV3IiwgMTAsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCXRleHQuc2V0Rm9udChmb250KTsKLQl0ZXh0LnNldFRleHQodGVtcGxhdGUpOwkKLQl0ZXh0LmFkZExpc3RlbmVyKFNXVC5WZXJpZnksIG5ldyBMaXN0ZW5lcigpIHsKLQkJLy9jcmVhdGUgdGhlIHBhdHRlcm4gZm9yIHZlcmlmaWNhdGlvbgotCQlQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoUkVHRVgpOwkKLQkJLy9pZ25vcmUgZXZlbnQgd2hlbiBjYXVzZWQgYnkgaW5zZXJ0aW5nIHRleHQgaW5zaWRlIGV2ZW50IGhhbmRsZXIKLQkJYm9vbGVhbiBpZ25vcmU7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChpZ25vcmUpIHJldHVybjsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJaWYgKGUuc3RhcnQgPiAxMyB8fCBlLmVuZCA+IDE0KSByZXR1cm47Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihlLnRleHQpOwotCQkJCi0JCQkvL2hhbmRsZSBiYWNrc3BhY2UKLQkJCWlmIChlLmNoYXJhY3RlciA9PSAnXGInKSB7Ci0JCQkJZm9yIChpbnQgaSA9IGUuc3RhcnQ7IGkgPCBlLmVuZDsgaSsrKSB7Ci0JCQkJCS8vIHNraXAgb3ZlciBzZXBhcmF0b3JzCi0JCQkJCXN3aXRjaCAoaSkgewotCQkJCQkJY2FzZSAwOiAKLQkJCQkJCQlpZiAoZS5zdGFydCArIDEgPT0gZS5lbmQpIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDQ6Ci0JCQkJCQkJaWYgKGUuc3RhcnQgKyAxID09IGUuZW5kKSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQobmV3IGNoYXIgW10geycjJywnKSd9KTsKLQkJCQkJCQkJZS5zdGFydC0tOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDg6Ci0JCQkJCQkJaWYgKGUuc3RhcnQgKyAxID09IGUuZW5kKSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQobmV3IGNoYXIgW10geycjJywnLSd9KTsKLQkJCQkJCQkJZS5zdGFydC0tOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJy0nKTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OiBidWZmZXIuYXBwZW5kKCcjJyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGV4dC5zZXRTZWxlY3Rpb24oZS5zdGFydCwgZS5zdGFydCArIGJ1ZmZlci5sZW5ndGgoKSk7Ci0JCQkJaWdub3JlID0gdHJ1ZTsKLQkJCQl0ZXh0Lmluc2VydChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQkJaWdub3JlID0gZmFsc2U7Ci0JCQkJLy8gbW92ZSBjdXJzb3IgYmFja3dhcmRzIG92ZXIgc2VwYXJhdG9ycwotCQkJCWlmIChlLnN0YXJ0ID09IDUgfHwgZS5zdGFydCA9PSA5KSBlLnN0YXJ0LS07Ci0JCQkJdGV4dC5zZXRTZWxlY3Rpb24oZS5zdGFydCwgZS5zdGFydCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlTdHJpbmdCdWZmZXIgbmV3VGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoZGVmYXVsdFRleHQpOwotCQkJY2hhcltdIGNoYXJzID0gZS50ZXh0LnRvQ2hhckFycmF5KCk7Ci0JCQlpbnQgaW5kZXggPSBlLnN0YXJ0IC0gMTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZS50ZXh0Lmxlbmd0aCgpOyBpKyspIHsKLQkJCQlpbmRleCsrOwotCQkJCXN3aXRjaCAoaW5kZXgpIHsKLQkJCQkJY2FzZSAwOgotCQkJCQkJaWYgKGNoYXJzW2ldID09ICcoJykgY29udGludWU7Ci0JCQkJCQlpbmRleCsrOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgNDoKLQkJCQkJCWlmIChjaGFyc1tpXSA9PSAnKScpIGNvbnRpbnVlOwotCQkJCQkJaW5kZXgrKzsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDg6Ci0JCQkJCQlpZiAoY2hhcnNbaV0gPT0gJy0nKSBjb250aW51ZTsKLQkJCQkJCWluZGV4Kys7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGluZGV4ID49IG5ld1RleHQubGVuZ3RoKCkpIHJldHVybjsKLQkJCQluZXdUZXh0LnNldENoYXJBdChpbmRleCwgY2hhcnNbaV0pOwotCQkJfQotCQkJLy8gaWYgdGV4dCBpcyBzZWxlY3RlZCwgZG8gbm90IHBhc3RlIGJleW9uZCByYW5nZSBvZiBzZWxlY3Rpb24KLQkJCWlmIChlLnN0YXJ0IDwgZS5lbmQgJiYgaW5kZXggKyAxICE9IGUuZW5kKSByZXR1cm47Ci0JCQlNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobmV3VGV4dCk7Ci0JCQlpZiAobWF0Y2hlci5sb29raW5nQXQoKSkgewotCQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGluZGV4ICsgMSk7Ci0JCQkJaWdub3JlID0gdHJ1ZTsKLQkJCQl0ZXh0Lmluc2VydChuZXdUZXh0LnN1YnN0cmluZyhlLnN0YXJ0LCBpbmRleCArIDEpKTsKLQkJCQlpZ25vcmUgPSBmYWxzZTsKLQkJCX0JCQkKLQkJfQotCX0pOwotCQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZm9udC5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNjA5YmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYXcgd3JhcHBlZCB0ZXh0IHVzaW5nIFRleHRMYXlvdXQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTcgewotCWZpbmFsIHN0YXRpYyBTdHJpbmcgbG9uZ1N0cmluZyA9ICJUaGUgcHJlZmVycmVkIHNpemUgb2YgYSB3aWRnZXQgaXMgdGhlIG1pbmltdW0gc2l6ZSBuZWVkZWQgdG8gc2hvdyBpdHMgY29udGVudC4gSW4gdGhlIGNhc2Ugb2YgYSBDb21wb3NpdGUsIHRoZSBwcmVmZXJyZWQgc2l6ZSBpcyB0aGUgc21hbGxlc3QgcmVjdGFuZ2xlIHRoYXQgY29udGFpbnMgYWxsIG9mIGl0cyBjaGlsZHJlbi4gSWYgY2hpbGRyZW4gaGF2ZSBiZWVuIHBvc2l0aW9uZWQgYnkgdGhlIGFwcGxpY2F0aW9uLCB0aGUgQ29tcG9zaXRlIGNvbXB1dGVzIGl0cyBvd24gcHJlZmVycmVkIHNpemUgYmFzZWQgb24gdGhlIHNpemUgYW5kIHBvc2l0aW9uIG9mIHRoZSBjaGlsZHJlbi4gSWYgYSBDb21wb3NpdGUgaXMgdXNpbmcgYSBsYXlvdXQgY2xhc3MgdG8gcG9zaXRpb24gaXRzIGNoaWxkcmVuLCBpdCBhc2tzIHRoZSBMYXlvdXQgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiBpdHMgY2xpZW50QXJlYSwgYW5kIHRoZW4gaXQgYWRkcyBpbiB0aGUgdHJpbSB0byBkZXRlcm1pbmUgaXRzIHByZWZlcnJlZCBzaXplLiI7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlmaW5hbCBUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCWxheW91dC5zZXRUZXh0KGxvbmdTdHJpbmcpOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJY2FzZSBTV1QuUGFpbnQ6Ci0JCQkJbGF5b3V0LmRyYXcoZXZlbnQuZ2MsIDEwLCAxMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5SZXNpemU6Ci0JCQkJbGF5b3V0LnNldFdpZHRoKHNoZWxsLmdldFNpemUoKS54IC0gMjApOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NjIxZmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSBhIHBhdGggZnJvbSBzb21lIHRleHQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTggewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JRm9udERhdGEgZGF0YSA9IGRpc3BsYXkuZ2V0U3lzdGVtRm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZGF0YS5nZXROYW1lKCksIDk2LCBTV1QuQk9MRCB8IFNXVC5JVEFMSUMpOwotCWZpbmFsIENvbG9yIGdyZWVuID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pOwotCWZpbmFsIENvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQlmaW5hbCBQYXRoIHBhdGg7Ci0JdHJ5IHsKLQkJcGF0aCA9IG5ldyBQYXRoKGRpc3BsYXkpOwotCQlwYXRoLmFkZFN0cmluZygiU1dUIiwgMCwgMCwgZm9udCk7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJLy9BZHZhbmNlZCBHcmFwaGljcyBub3Qgc3VwcG9ydGVkLiAgCi0JCS8vVGhpcyBuZXcgQVBJIHJlcXVpcmVzIHRoZSBDYWlybyBWZWN0b3IgZW5naW5lIG9uIEdUSyBhbmQgTW90aWYgYW5kIEdESSsgb24gV2luZG93cy4KLQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJcmV0dXJuOwotCX0KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewkJCQotCQkJR0MgZ2MgPSBlLmdjOwotCQkJZ2Muc2V0QmFja2dyb3VuZChncmVlbik7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGJsdWUpOwotCQkJZ2MuZmlsbFBhdGgocGF0aCk7Ci0JCQlnYy5kcmF3UGF0aChwYXRoKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCXBhdGguZGlzcG9zZSgpOwotCWZvbnQuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTA4MDIwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBMaXN0ZW4gZm9yIGV2ZW50cyBpbiBFeGNlbAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5OSB7Ci0Jc3RhdGljIFN0cmluZyBJSURfQXBwRXZlbnRzID0gInswMDAyNDQxMy0wMDAwLTAwMDAtQzAwMC0wMDAwMDAwMDAwNDZ9IjsKLQkvLyBFdmVudCBJRAotCXN0YXRpYyBpbnQgTmV3V29ya2Jvb2sgICAgICAgICAgICA9IDB4MDAwMDA2MWQ7Ci0Jc3RhdGljIGludCBTaGVldFNlbGVjdGlvbkNoYW5nZSAgID0gMHgwMDAwMDYxNjsKLQlzdGF0aWMgaW50IFNoZWV0QmVmb3JlRG91YmxlQ2xpY2sgPSAweDAwMDAwNjE3OwotCXN0YXRpYyBpbnQgU2hlZXRCZWZvcmVSaWdodENsaWNrICA9IDB4MDAwMDA2MTg7Ci0Jc3RhdGljIGludCBTaGVldEFjdGl2YXRlICAgICAgICAgID0gMHgwMDAwMDYxOTsKLQlzdGF0aWMgaW50IFNoZWV0RGVhY3RpdmF0ZSAgICAgICAgPSAweDAwMDAwNjFhOwotCXN0YXRpYyBpbnQgU2hlZXRDYWxjdWxhdGUgICAgICAgICA9IDB4MDAwMDA2MWI7Ci0Jc3RhdGljIGludCBTaGVldENoYW5nZSAgICAgICAgICAgID0gMHgwMDAwMDYxYzsKLQlzdGF0aWMgaW50IFdvcmtib29rT3BlbiAgICAgICAgICAgPSAweDAwMDAwNjFmOwotCXN0YXRpYyBpbnQgV29ya2Jvb2tBY3RpdmF0ZSAgICAgICA9IDB4MDAwMDA2MjA7Ci0Jc3RhdGljIGludCBXb3JrYm9va0RlYWN0aXZhdGUgICAgID0gMHgwMDAwMDYyMTsKLQlzdGF0aWMgaW50IFdvcmtib29rQmVmb3JlQ2xvc2UgICAgPSAweDAwMDAwNjIyOwotCXN0YXRpYyBpbnQgV29ya2Jvb2tCZWZvcmVTYXZlICAgICA9IDB4MDAwMDA2MjM7Ci0Jc3RhdGljIGludCBXb3JrYm9va0JlZm9yZVByaW50ICAgID0gMHgwMDAwMDYyNDsKLQlzdGF0aWMgaW50IFdvcmtib29rTmV3U2hlZXQgICAgICAgPSAweDAwMDAwNjI1OwotCXN0YXRpYyBpbnQgV29ya2Jvb2tBZGRpbkluc3RhbGwgICA9IDB4MDAwMDA2MjY7Ci0Jc3RhdGljIGludCBXb3JrYm9va0FkZGluVW5pbnN0YWxsID0gMHgwMDAwMDYyNzsKLQlzdGF0aWMgaW50IFdpbmRvd1Jlc2l6ZSAgICAgICAgICAgPSAweDAwMDAwNjEyOwotCXN0YXRpYyBpbnQgV2luZG93QWN0aXZhdGUgICAgICAgICA9IDB4MDAwMDA2MTQ7Ci0Jc3RhdGljIGludCBXaW5kb3dEZWFjdGl2YXRlICAgICAgID0gMHgwMDAwMDYxNTsKLQlzdGF0aWMgaW50IFNoZWV0Rm9sbG93SHlwZXJsaW5rICAgPSAweDAwMDAwNzNlOwotCi0gcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlPbGVDb250cm9sU2l0ZSBjb250cm9sU2l0ZTsKLQl0cnkgewotCQlPbGVGcmFtZSBmcmFtZSA9IG5ldyBPbGVGcmFtZShzaGVsbCwgU1dULk5PTkUpOwotCQljb250cm9sU2l0ZSA9IG5ldyBPbGVDb250cm9sU2l0ZShmcmFtZSwgU1dULk5PTkUsICJFeGNlbC5TaGVldCIpOwotCQljb250cm9sU2l0ZS5kb1ZlcmIoT0xFLk9MRUlWRVJCX0lOUExBQ0VBQ1RJVkFURSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQlyZXR1cm47Ci0JfQotCXNoZWxsLm9wZW4oKTsKLQotCU9sZUF1dG9tYXRpb24gZXhjZWxTaGVldCA9IG5ldyBPbGVBdXRvbWF0aW9uKGNvbnRyb2xTaXRlKTsKLQlpbnRbXSBkaXNwSURzID0gZXhjZWxTaGVldC5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7IkFwcGxpY2F0aW9uIn0pOwotCVZhcmlhbnQgcFZhclJlc3VsdCA9IGV4Y2VsU2hlZXQuZ2V0UHJvcGVydHkoZGlzcElEc1swXSk7Ci0JT2xlQXV0b21hdGlvbiBhcHBsaWNhdGlvbiA9IHBWYXJSZXN1bHQuZ2V0QXV0b21hdGlvbigpOwotCXBWYXJSZXN1bHQuZGlzcG9zZSgpOwotCWV4Y2VsU2hlZXQuZGlzcG9zZSgpOwotCQotCWludCBldmVudElEID0gU2hlZXRTZWxlY3Rpb25DaGFuZ2U7Ci0JT2xlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChPbGVFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInNlbGVjdGlvbiBoYXMgY2hhbmdlZCIpOwotCQkJLy8gdHdvIGFyZ3VtZW50cyB3aGljaCBtdXN0IGJlIHJlbGVhc2VkIChyb3cgYW5kIGNvbHVtbikKLQkJCVZhcmlhbnRbXSBhcmdzID0gZS5hcmd1bWVudHM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oYXJnc1tpXSk7Ci0JCQkJYXJncyBbaV0uZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfTsKLQljb250cm9sU2l0ZS5hZGRFdmVudExpc3RlbmVyKGFwcGxpY2F0aW9uLCBJSURfQXBwRXZlbnRzLCBldmVudElELCBsaXN0ZW5lcik7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWFwcGxpY2F0aW9uLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZTViZDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IHNvcnQgYSB0YWJsZSBieSBjb2x1bW4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0gICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotICAgIHNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLSAgICBmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkJPUkRFUik7Ci0gICAgdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgY29sdW1uMS5zZXRUZXh0KCJDb2x1bW4gMSIpOwotICAgIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLSAgICBjb2x1bW4yLnNldFRleHQoIkNvbHVtbiAyIik7Ci0gICAgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImEiLCAiMyJ9KTsKLSAgICBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgIGl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJiIiwgIjIifSk7Ci0gICAgaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICBpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiYyIsICIxIn0pOwotICAgIGNvbHVtbjEuc2V0V2lkdGgoMTAwKTsKLSAgICBjb2x1bW4yLnNldFdpZHRoKDEwMCk7Ci0gICAgTGlzdGVuZXIgc29ydExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0gICAgICAgICAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICBDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZS5nZXREZWZhdWx0KCkpOwotICAgICAgICAgICAgVGFibGVDb2x1bW4gY29sdW1uID0gKFRhYmxlQ29sdW1uKWUud2lkZ2V0OwotICAgICAgICAgICAgaW50IGluZGV4ID0gY29sdW1uID09IGNvbHVtbjEgPyAwIDogMTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUxID0gaXRlbXNbaV0uZ2V0VGV4dChpbmRleCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUyID0gaXRlbXNbal0uZ2V0VGV4dChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2xsYXRvci5jb21wYXJlKHZhbHVlMSwgdmFsdWUyKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IHtpdGVtc1tpXS5nZXRUZXh0KDApLCBpdGVtc1tpXS5nZXRUZXh0KDEpfTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUsIGopOwotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRhYmxlLnNldFNvcnRDb2x1bW4oY29sdW1uKTsKLSAgICAgICAgfQotICAgIH07Ci0gICAgY29sdW1uMS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBzb3J0TGlzdGVuZXIpOwotICAgIGNvbHVtbjIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgc29ydExpc3RlbmVyKTsKLSAgICB0YWJsZS5zZXRTb3J0Q29sdW1uKGNvbHVtbjEpOwotICAgIHRhYmxlLnNldFNvcnREaXJlY3Rpb24oU1dULlVQKTsKLSAgICBzaGVsbC5zZXRTaXplKHNoZWxsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueCwgMzAwKTsKLSAgICBzaGVsbC5vcGVuKCk7Ci0gICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0gICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0gICAgfQotICAgIGRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZmMGJkOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb29sQmFyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY29vbCBiYXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlDb29sQmFyIGJhciA9IG5ldyBDb29sQmFyIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaT0wOyBpPDI7IGkrKykgewotCQlDb29sSXRlbSBpdGVtID0gbmV3IENvb2xJdGVtIChiYXIsIFNXVC5OT05FKTsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGJhciwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCAoIkJ1dHRvbiAiICsgaSk7Ci0JCVBvaW50IHNpemUgPSBidXR0b24uY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWl0ZW0uc2V0UHJlZmVycmVkU2l6ZSAoaXRlbS5jb21wdXRlU2l6ZSAoc2l6ZS54LCBzaXplLnkpKTsKLQkJaXRlbS5zZXRDb250cm9sIChidXR0b24pOwotCX0KLQliYXIucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTYzMTU3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBGaWxsIGEgc2hhcGUgd2l0aCBhIHByZWRlZmluZWQgcGF0dGVybgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDAgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JLy9kZWZpbmUgYSBwYXR0ZXJuIG9uIGFuIGltYWdlCi0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAwMCwgMTAwMCk7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCUNvbG9yIHllbGxvdyA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVyk7Ci0JQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSk7Ci0JR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQod2hpdGUpOwotCWdjLnNldEZvcmVncm91bmQoeWVsbG93KTsKLQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoMCwgMCwgMTAwMCwgMTAwMCwgdHJ1ZSk7Ci0JZm9yIChpbnQgaT0tNTAwOyBpPDEwMDA7IGkrPTEwKSB7Ci0JCWdjLnNldEZvcmVncm91bmQoYmx1ZSk7Ci0JCWdjLmRyYXdMaW5lKGksIDAsIDUwMCArIGksIDEwMDApOwotCQlnYy5kcmF3TGluZSg1MDAgKyBpLCAwLCBpLCAxMDAwKTsKLQl9CQotCWdjLmRpc3Bvc2UoKTsKLQlmaW5hbCBQYXR0ZXJuIHBhdHRlcm47Ci0JdHJ5IHsKLQkJcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRpc3BsYXksIGltYWdlKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkvL0FkdmFuY2VkIEdyYXBoaWNzIG5vdCBzdXBwb3J0ZWQuICAKLQkJLy9UaGlzIG5ldyBBUEkgcmVxdWlyZXMgdGhlIENhaXJvIFZlY3RvciBlbmdpbmUgb24gR1RLIGFuZCBNb3RpZiBhbmQgR0RJKyBvbiBXaW5kb3dzLgotCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQlyZXR1cm47Ci0JfQotCQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5ET1VCTEVfQlVGRkVSRUQpOwotCWMuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlSZWN0YW5nbGUgciA9ICgoQ29tcG9zaXRlKWV2ZW50LndpZGdldCkuZ2V0Q2xpZW50QXJlYSgpOwotCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCQkJZ2MuZmlsbE92YWwoNSwgNSwgci53aWR0aCAtIDEwLCByLmhlaWdodCAtIDEwKTsJCi0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlwYXR0ZXJuLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0ZjgzMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVmlydHVhbCBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYmxlIHdpdGggMSwwMDAsMDAwIGl0ZW1zIChsYXp5LCBwYWdlIHNpemUgNjQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwMSB7Ci0KLXN0YXRpYyBmaW5hbCBpbnQgUEFHRV9TSVpFID0gNjQ7Ci1zdGF0aWMgZmluYWwgaW50IENPVU5UID0gMTAwMDAwOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoU1dULlZFUlRJQ0FMKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuVklSVFVBTCB8IFNXVC5CT1JERVIpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuU2V0RGF0YSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQlpbnQgaW5kZXggPSB0YWJsZS5pbmRleE9mIChpdGVtKTsKLQkJCWludCBzdGFydCA9IE1hdGgubWF4ICgwLCBpbmRleCAtIFBBR0VfU0laRSAvIDIpOwotCQkJaW50IGVuZCA9IE1hdGgubWluICh0YWJsZS5nZXRJdGVtQ291bnQgKCksIGluZGV4ICsgUEFHRV9TSVpFIC8gMik7Ci0JCQlmb3IgKGludCBpPXN0YXJ0OyBpPGVuZDsgaSsrKSB7Ci0JCQkJaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGkpOwotCQkJCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JdGFibGUuc2V0TGF5b3V0RGF0YSAobmV3IFJvd0RhdGEgKDIwMCwgMjAwKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJBZGQgSXRlbXMiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlsb25nIHQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzICgpOwotCQkJdGFibGUuc2V0SXRlbUNvdW50IChDT1VOVCk7Ci0JCQlsb25nIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzICgpOwotCQkJbGFiZWwuc2V0VGV4dCAoIkl0ZW1zOiAiICsgQ09VTlQgKyAiLCBUaW1lOiAiICsgKHQyIC0gdDEpICsgIiAobXMpIFtwYWdlPSIgKyBQQUdFX1NJWkUgKyAiXSIpOwotCQkJc2hlbGwubGF5b3V0ICgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWI5MDQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBWaXJ0dWFsIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBwb3B1bGF0ZSB0cmVlIGxhemlseQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuVklSVFVBTCB8IFNXVC5CT1JERVIpOwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULlNldERhdGEsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCVRyZWVJdGVtIHBhcmVudEl0ZW0gPSBpdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCWlmIChwYXJlbnRJdGVtID09IG51bGwpIHsKLQkJCQl0ZXh0ID0gIm5vZGUgIit0cmVlLmluZGV4T2YoaXRlbSk7Ci0JCQl9IGVsc2UgewotCQkJCXRleHQgPSBwYXJlbnRJdGVtLmdldFRleHQoKSsiIC0gIitwYXJlbnRJdGVtLmluZGV4T2YoaXRlbSk7Ci0JCQl9Ci0JCQlpdGVtLnNldFRleHQodGV4dCk7Ci0JCQlpdGVtLnNldEl0ZW1Db3VudCgxMCk7Ci0JCX0KLQl9KTsKLQl0cmVlLnNldEl0ZW1Db3VudCgyMCk7Ci0Jc2hlbGwuc2V0U2l6ZSg0MDAsIDMwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmI2ZGU4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0TGF5b3V0IGV4YW1wbGUgc25pcHBldDogdXNpbmcgVGV4dExheW91dCBqdXN0aWZ5LCBhbGlnbm1lbnQgYW5kIGluZGVudCAKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDMgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0gfCBTV1QuRE9VQkxFX0JVRkZFUkVEKTsJCi0Jc2hlbGwuc2V0VGV4dCgiSW5kZW50LCBKdXN0aWZ5LCBBbGlnbiIpOwotCVN0cmluZ1tdIHRleHRzID0gewotCQkiUGxhbnMgZG8gbm90IG1hdGVyaWFsaXplIG91dCBvZiBub3doZXJlLCBub3IgYXJlIHRoZXkgZW50aXJlbHkgc3RhdGljLiBUbyBlbnN1cmUgdGhlIHBsYW5uaW5nIHByb2Nlc3MgaXMgdHJhbnNwYXJlbnQgYW5kIG9wZW4gdG8gdGhlIGVudGlyZSBFY2xpcHNlIGNvbW11bml0eSwgd2UgKHRoZSBFY2xpcHNlIFBNQykgcG9zdCBwbGFucyBpbiBhbiBlbWJyeW9uaWMgZm9ybSBhbmQgcmV2aXNlIHRoZW0gdGhyb3VnaG91dCB0aGUgcmVsZWFzZSBjeWNsZS4iLAotCQkiVGhlIGZpcnN0IHBhcnQgb2YgdGhlIHBsYW4gZGVhbHMgd2l0aCB0aGUgaW1wb3J0YW50IG1hdHRlcnMgb2YgcmVsZWFzZSBkZWxpdmVyYWJsZXMsIHJlbGVhc2UgbWlsZXN0b25lcywgdGFyZ2V0IG9wZXJhdGluZyBlbnZpcm9ubWVudHMsIGFuZCByZWxlYXNlLXRvLXJlbGVhc2UgY29tcGF0aWJpbGl0eS4gVGhlc2UgYXJlIGFsbCB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIGNsZWFyIGZvciBhbnkgcmVsZWFzZSwgZXZlbiBpZiBubyBmZWF0dXJlcyB3ZXJlIHRvIGNoYW5nZS4iLAotCQkiVGhlIHJlbWFpbmRlciBvZiB0aGUgcGxhbiBjb25zaXN0cyBvZiBwbGFuIGl0ZW1zIGZvciB0aGUgdmFyaW91cyBFY2xpcHNlIHN1YnByb2plY3RzLiBFYWNoIHBsYW4gaXRlbSBjb3ZlcnMgYSBmZWF0dXJlIG9yIEFQSSB0aGF0IGlzIHRvIGJlIGFkZGVkIHRvIEVjbGlwc2UsIG9yIHNvbWUgYXNwZWN0IG9mIEVjbGlwc2UgdGhhdCBpcyB0byBiZSBpbXByb3ZlZC4gRWFjaCBwbGFuIGl0ZW0gaGFzIGl0cyBvd24gZW50cnkgaW4gdGhlIEVjbGlwc2UgYnVnemlsbGEgZGF0YWJhc2UsIHdpdGggYSB0aXRsZSBhbmQgYSBjb25jaXNlIHN1bW1hcnkgKHVzdWFsbHkgYSBzaW5nbGUgcGFyYWdyYXBoKSB0aGF0IGV4cGxhaW5zIHRoZSB3b3JrIGl0ZW0gYXQgYSBzdWl0YWJseSBoaWdoIGVub3VnaCBsZXZlbCBzbyB0aGF0IGV2ZXJ5b25lIGNhbiByZWFkaWx5IHVuZGVyc3RhbmQgd2hhdCB0aGUgd29yayBpdGVtIGlzIHdpdGhvdXQgaGF2aW5nIHRvIHVuZGVyc3RhbmQgdGhlIG5pdHR5LWdyaXR0eSBkZXRhaWwuIiwKLQl9OwotCWludFtdIGFsaWdubWVudHMgPSB7U1dULkxFRlQsIFNXVC5DRU5URVIsIFNXVC5SSUdIVH07Ci0JZmluYWwgVGV4dExheW91dFtdIGxheW91dHMgPSBuZXcgVGV4dExheW91dFt0ZXh0cy5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGF5b3V0cy5sZW5ndGg7IGkrKykgewotCQlUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCQlsYXlvdXQuc2V0VGV4dCh0ZXh0c1tpXSk7Ci0JCWxheW91dC5zZXRJbmRlbnQoMzApOwotCQlsYXlvdXQuc2V0SnVzdGlmeSh0cnVlKTsKLQkJbGF5b3V0LnNldEFsaWdubWVudChhbGlnbm1lbnRzW2ldKTsJCQotCQlsYXlvdXRzW2ldID0gbGF5b3V0OwotCX0KLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVBvaW50IHBvaW50ID0gbmV3IFBvaW50KDEwLCAxMCk7Ci0JCQlpbnQgd2lkdGggPSBzaGVsbC5nZXRDbGllbnRBcmVhKCkud2lkdGggLSAyICogcG9pbnQueDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGF5b3V0cy5sZW5ndGg7IGkrKykgewotCQkJCVRleHRMYXlvdXQgbGF5b3V0ID0gbGF5b3V0c1tpXTsKLQkJCQlsYXlvdXQuc2V0V2lkdGgod2lkdGgpOwotCQkJCWxheW91dC5kcmF3KGV2ZW50LmdjLCBwb2ludC54LCBwb2ludC55KTsKLQkJCQlwb2ludC55ICs9IGxheW91dC5nZXRCb3VuZHMoKS5oZWlnaHQgKyAxMDsKLQkJCX0JCQkKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsYXlvdXRzLmxlbmd0aDsgaSsrKSB7Ci0JCWxheW91dHNbaV0uZGlzcG9zZSgpOwkJCi0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGI2MDhkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dExheW91dCBleGFtcGxlIHNuaXBwZXQ6IHVzaW5nIHRoZSByaXNlIGZpZWxkIG9mIGEgVGV4dFN0eWxlLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwNCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuU0hFTExfVFJJTSB8IFNXVC5ET1VCTEVfQlVGRkVSRUQpOwotCXNoZWxsLnNldFRleHQoIk1vZGlmeSBSaXNlIik7Ci0JRm9udERhdGEgZGF0YSA9IGRpc3BsYXkuZ2V0U3lzdGVtRm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZGF0YS5nZXROYW1lKCksIDI0LCBTV1QuTk9STUFMKTsKLQlGb250IHNtYWxsRm9udCA9IG5ldyBGb250KGRpc3BsYXksIGRhdGEuZ2V0TmFtZSgpLCA4LCBTV1QuTk9STUFMKTsKLQlHQyBnYyA9IG5ldyBHQyhzaGVsbCk7Ci0JZ2Muc2V0Rm9udChzbWFsbEZvbnQpOwotCUZvbnRNZXRyaWNzIHNtYWxsTWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JZmluYWwgaW50IHNtYWxsQmFzZWxpbmUgPSBzbWFsbE1ldHJpY3MuZ2V0QXNjZW50KCkgKyBzbWFsbE1ldHJpY3MuZ2V0TGVhZGluZygpOwotCWdjLnNldEZvbnQoZm9udCk7Ci0JRm9udE1ldHJpY3MgbWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JZmluYWwgaW50IGJhc2VsaW5lID0gbWV0cmljcy5nZXRBc2NlbnQoKSArIG1ldHJpY3MuZ2V0TGVhZGluZygpOwotCWdjLmRpc3Bvc2UoKTsKLQkKLQlmaW5hbCBUZXh0TGF5b3V0IGxheW91dDAgPSBuZXcgVGV4dExheW91dChkaXNwbGF5KTsKLQlsYXlvdXQwLnNldFRleHQoIlN1YnNjcmlwdFNjcmlwdFN1cGVyc2NyaXB0Iik7Ci0JbGF5b3V0MC5zZXRGb250KGZvbnQpOwotCVRleHRTdHlsZSBzdWJzY3JpcHQwID0gbmV3IFRleHRTdHlsZShzbWFsbEZvbnQsIG51bGwsIG51bGwpOwotCVRleHRTdHlsZSBzdXBlcnNjcmlwdDAgPSBuZXcgVGV4dFN0eWxlKHNtYWxsRm9udCwgbnVsbCwgbnVsbCk7Ci0Jc3VwZXJzY3JpcHQwLnJpc2UgPSBiYXNlbGluZSAtIHNtYWxsQmFzZWxpbmU7Ci0JbGF5b3V0MC5zZXRTdHlsZShzdWJzY3JpcHQwLCAwLCA4KTsKLQlsYXlvdXQwLnNldFN0eWxlKHN1cGVyc2NyaXB0MCwgMTUsIDI1KTsKLQkJCi0JZmluYWwgVGV4dExheW91dCBsYXlvdXQxID0gbmV3IFRleHRMYXlvdXQoZGlzcGxheSk7Ci0JbGF5b3V0MS5zZXRUZXh0KCJTdWJzY3JpcHRTY3JpcHRTdXBlcnNjcmlwdCIpOwotCWxheW91dDEuc2V0Rm9udChmb250KTsKLQlUZXh0U3R5bGUgc3Vic2NyaXB0MSA9IG5ldyBUZXh0U3R5bGUoc21hbGxGb250LCBudWxsLCBudWxsKTsKLQlzdWJzY3JpcHQxLnJpc2UgPSAtc21hbGxCYXNlbGluZTsKLQlUZXh0U3R5bGUgc3VwZXJzY3JpcHQxID0gbmV3IFRleHRTdHlsZShzbWFsbEZvbnQsIG51bGwsIG51bGwpOwotCXN1cGVyc2NyaXB0MS5yaXNlID0gYmFzZWxpbmU7Ci0JbGF5b3V0MS5zZXRTdHlsZShzdWJzY3JpcHQxLCAwLCA4KTsKLQlsYXlvdXQxLnNldFN0eWxlKHN1cGVyc2NyaXB0MSwgMTUsIDI1KTsKLQkKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCURpc3BsYXkgZGlzcGxheSA9IGV2ZW50LmRpc3BsYXk7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCi0JCQlSZWN0YW5nbGUgcmVjdDAgPSBsYXlvdXQwLmdldEJvdW5kcygpOwotCQkJcmVjdDAueCArPSAxMDsKLQkJCXJlY3QwLnkgKz0gMTA7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JCQlnYy5maWxsUmVjdGFuZ2xlKHJlY3QwKTsKLQkJCWxheW91dDAuZHJhdyhnYywgcmVjdDAueCwgcmVjdDAueSk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX01BR0VOVEEpKTsKLQkJCWdjLmRyYXdMaW5lKHJlY3QwLngsIHJlY3QwLnksIHJlY3QwLnggKyByZWN0MC53aWR0aCwgcmVjdDAueSk7Ci0JCQlnYy5kcmF3TGluZShyZWN0MC54LCByZWN0MC55ICsgYmFzZWxpbmUsIHJlY3QwLnggKyByZWN0MC53aWR0aCwgcmVjdDAueSArIGJhc2VsaW5lKTsKLQkJCWdjLmRyYXdMaW5lKHJlY3QwLnggKyByZWN0MC53aWR0aCAvIDIsIHJlY3QwLnksIHJlY3QwLnggKyByZWN0MC53aWR0aCAvIDIsIHJlY3QwLnkgKyByZWN0MC5oZWlnaHQpOwotCQkJCi0JCQlSZWN0YW5nbGUgcmVjdDEgPSBsYXlvdXQxLmdldEJvdW5kcygpOwotCQkJcmVjdDEueCArPSAxMDsKLQkJCXJlY3QxLnkgKz0gMjAgKyByZWN0MC5oZWlnaHQ7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JCQlnYy5maWxsUmVjdGFuZ2xlKHJlY3QxKTsJCQkKLQkJCWxheW91dDEuZHJhdyhnYywgcmVjdDEueCwgcmVjdDEueSk7Ci0JCQkKLQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTUFHRU5UQSkpOwotCQkJZ2MuZHJhd0xpbmUocmVjdDEueCwgcmVjdDEueSArIHNtYWxsQmFzZWxpbmUsIHJlY3QxLnggKyByZWN0MS53aWR0aCwgcmVjdDEueSArIHNtYWxsQmFzZWxpbmUpOwotCQkJZ2MuZHJhd0xpbmUocmVjdDEueCwgcmVjdDEueSArIGJhc2VsaW5lICsgc21hbGxCYXNlbGluZSwgcmVjdDEueCArIHJlY3QxLndpZHRoLCByZWN0MS55ICsgYmFzZWxpbmUgKyBzbWFsbEJhc2VsaW5lKTsKLQkJCWdjLmRyYXdMaW5lKHJlY3QxLnggKyByZWN0MS53aWR0aCAvIDIsIHJlY3QxLnksIHJlY3QxLnggKyByZWN0MS53aWR0aCAvIDIsIHJlY3QxLnkgKyByZWN0MS5oZWlnaHQpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlsYXlvdXQwLmRpc3Bvc2UoKTsKLQlsYXlvdXQxLmRpc3Bvc2UoKTsKLQlzbWFsbEZvbnQuZGlzcG9zZSgpOwotCWZvbnQuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzhmMTM1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0TGF5b3V0IGV4YW1wbGUgc25pcHBldDogdXNpbmcgdGhlIEdseXBoTWV0cmljcyB0byBlbWJlZGRlZCBpbWFnZXMgaW4gCi0gKiBhIFRleHRMYXlvdXQuIAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjA1IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5TSEVMTF9UUklNIHwgU1dULkRPVUJMRV9CVUZGRVJFRCk7Ci0Jc2hlbGwuc2V0VGV4dCgiRW1iZWRkaW5nIG9iamVjdHMgaW4gdGV4dCIpOwotCWZpbmFsIEltYWdlW10gaW1hZ2VzID0ge25ldyBJbWFnZShkaXNwbGF5LCAzMiwgMzIpLCBuZXcgSW1hZ2UoZGlzcGxheSwgMjAsIDQwKSwgbmV3IEltYWdlKGRpc3BsYXksIDQwLCAyMCl9OwotCWludFtdIGNvbG9ycyAgPSB7U1dULkNPTE9SX0JMVUUsIFNXVC5DT0xPUl9NQUdFTlRBLCBTV1QuQ09MT1JfR1JFRU59OwotCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlc1tpXSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihjb2xvcnNbaV0pKTsKLQkJZ2MuZmlsbFJlY3RhbmdsZShpbWFnZXNbaV0uZ2V0Qm91bmRzKCkpOwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCQotCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIkJ1dHRvbiIpOwotCWJ1dHRvbi5wYWNrKCk7Ci0JU3RyaW5nIHRleHQgPSAiSGVyZSBpcyBzb21lIHRleHQgd2l0aCBhIGJsdWUgaW1hZ2UgXHVGRkZDLCBhIG1hZ2VudGEgaW1hZ2UgXHVGRkZDLCBhIGdyZWVuIGltYWdlIFx1RkZGQywgYW5kIGEgYnV0dG9uOiBcdUZGRkMuIjsKLQlmaW5hbCBpbnRbXSBpbWFnZU9mZnNldHMgPSB7MzYsIDU1LCA3Mn07Ci0JZmluYWwgVGV4dExheW91dCBsYXlvdXQgPSBuZXcgVGV4dExheW91dChkaXNwbGF5KTsKLQlsYXlvdXQuc2V0VGV4dCh0ZXh0KTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykgewotCQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2VzW2ldLmdldEJvdW5kcygpOwotCQlUZXh0U3R5bGUgaW1hZ2VTdHlsZSA9IG5ldyBUZXh0U3R5bGUobnVsbCwgbnVsbCwgbnVsbCk7Ci0JCWltYWdlU3R5bGUubWV0cmljcyA9IG5ldyBHbHlwaE1ldHJpY3MoYm91bmRzLmhlaWdodCwgMCwgYm91bmRzLndpZHRoKTsgCi0JCWxheW91dC5zZXRTdHlsZShpbWFnZVN0eWxlLCBpbWFnZU9mZnNldHNbaV0sIGltYWdlT2Zmc2V0c1tpXSk7Ci0JfQotCVJlY3RhbmdsZSBib3VuZHMgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JVGV4dFN0eWxlIGJ1dHRvblN0eWxlID0gbmV3IFRleHRTdHlsZShudWxsLCBudWxsLCBudWxsKTsKLQlidXR0b25TdHlsZS5tZXRyaWNzID0gbmV3IEdseXBoTWV0cmljcyhib3VuZHMuaGVpZ2h0LCAwLCBib3VuZHMud2lkdGgpOyAKLQlmaW5hbCBpbnQgYnV0dG9uT2Zmc2V0ID0gdGV4dC5sZW5ndGgoKSAtIDI7Ci0JbGF5b3V0LnNldFN0eWxlKGJ1dHRvblN0eWxlLCBidXR0b25PZmZzZXQsIGJ1dHRvbk9mZnNldCk7Ci0JCi0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJUG9pbnQgbWFyZ2luID0gbmV3IFBvaW50KDEwLCAxMCk7Ci0JCQlsYXlvdXQuc2V0V2lkdGgoc2hlbGwuZ2V0Q2xpZW50QXJlYSgpLndpZHRoIC0gMiAqIG1hcmdpbi54KTsKLQkJCWxheW91dC5kcmF3KGV2ZW50LmdjLCBtYXJnaW4ueCwgbWFyZ2luLnkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnQgb2Zmc2V0ID0gaW1hZ2VPZmZzZXRzW2ldOwotCQkJCWludCBsaW5lSW5kZXggPSBsYXlvdXQuZ2V0TGluZUluZGV4KG9mZnNldCk7Ci0JCQkJRm9udE1ldHJpY3MgbGluZU1ldHJpY3MgPSBsYXlvdXQuZ2V0TGluZU1ldHJpY3MobGluZUluZGV4KTsKLQkJCQlQb2ludCBwb2ludCA9IGxheW91dC5nZXRMb2NhdGlvbihvZmZzZXQsIGZhbHNlKTsKLQkJCQlHbHlwaE1ldHJpY3MgZ2x5cGhNZXRyaWNzID0gbGF5b3V0LmdldFN0eWxlKG9mZnNldCkubWV0cmljczsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2VzW2ldLCBwb2ludC54ICsgbWFyZ2luLngsIHBvaW50LnkgKyBtYXJnaW4ueSArIGxpbmVNZXRyaWNzLmdldEFzY2VudCgpIC0gZ2x5cGhNZXRyaWNzLmFzY2VudCk7Ci0JCQl9Ci0JCQlpbnQgbGluZUluZGV4ID0gbGF5b3V0LmdldExpbmVJbmRleChidXR0b25PZmZzZXQpOwotCQkJRm9udE1ldHJpY3MgbGluZU1ldHJpY3MgPSBsYXlvdXQuZ2V0TGluZU1ldHJpY3MobGluZUluZGV4KTsKLQkJCVBvaW50IHBvaW50ID0gbGF5b3V0LmdldExvY2F0aW9uKGJ1dHRvbk9mZnNldCwgZmFsc2UpOwotCQkJR2x5cGhNZXRyaWNzIGdseXBoTWV0cmljcyA9IGxheW91dC5nZXRTdHlsZShidXR0b25PZmZzZXQpLm1ldHJpY3M7Ci0JCQlidXR0b24uc2V0TG9jYXRpb24ocG9pbnQueCArIG1hcmdpbi54LCBwb2ludC55ICsgbWFyZ2luLnkgKyBsaW5lTWV0cmljcy5nZXRBc2NlbnQoKSAtIGdseXBoTWV0cmljcy5hc2NlbnQpOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWxheW91dC5kaXNwb3NlKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJaW1hZ2VzW2ldLmRpc3Bvc2UoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNDUzYjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEEgYnV0dG9uIHdpdGggdGV4dCBhbmQgaW1hZ2UKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjA2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JSW1hZ2UgaW1hZ2UgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1FVRVNUSU9OKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0KCkpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldEltYWdlKGltYWdlKTsKLQlidXR0b24uc2V0VGV4dCgiQnV0dG9uIik7Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWUwOTBlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVXNlIHRyYW5zZm9ybWF0aW9uIG1hdHJpY2VzIHRvIHJlZmxlY3QsIHJvdGF0ZSBhbmQgc2hlYXIgaW1hZ2VzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDcgewkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCQotCQlmaW5hbCBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMTAsIDYwKTsKLQkJR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiVGltZXMiLCAzMCwgU1dULkJPTEQpOwotCQlnYy5zZXRGb250KGZvbnQpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIDExMCwgNjApOwotCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCWdjLmRyYXdUZXh0KCJTV1QiLCAxMCwgMTAsIHRydWUpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQkKLQkJZmluYWwgUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoIk1hdHJpeCBUcmFuZm9ybWF0aW9ucyIpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIENhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuRE9VQkxFX0JVRkZFUkVEKTsKLQkJY2FudmFzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewkKLQkJCQlHQyBnYyA9IGUuZ2M7Ci0JCQkJZ2Muc2V0QWR2YW5jZWQodHJ1ZSk7Ci0JCQkJaWYgKCFnYy5nZXRBZHZhbmNlZCgpKXsKLQkJCQkJZ2MuZHJhd1RleHQoIkFkdmFuY2VkIGdyYXBoaWNzIG5vdCBzdXBwb3J0ZWQiLCAzMCwgMzAsIHRydWUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJCS8vIE9yaWdpbmFsIGltYWdlCi0JCQkJaW50IHggPSAzMCwgeSA9IDMwOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgeCwgeSk7IAotCQkJCXggKz0gcmVjdC53aWR0aCArIDMwOwotCQkJCQotCQkJCVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRpc3BsYXkpOwotCQkJCQotCQkJCS8vIE5vdGUgdGhhdCB0aGUgdHJhbmZvcm0gaXMgYXBwbGllZCB0byB0aGUgd2hvbGUgR0MgdGhlcmVmb3JlCi0JCQkJLy8gdGhlIGNvb3JkaW5hdGVzIG5lZWQgdG8gYmUgYWRqdXN0ZWQgdG9vLgotCQkJCQotCQkJCS8vIFJlZmxlY3QgYXJvdW5kIHRoZSB5IGF4aXMuCi0JCQkJdHJhbnNmb3JtLnNldEVsZW1lbnRzKC0xLCAwLCAwLCAxLCAwICwwKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIC0xKngtcmVjdC53aWR0aCwgeSk7Ci0JCQkJCi0JCQkJeCA9IDMwOyB5ICs9IHJlY3QuaGVpZ2h0ICsgMzA7Ci0JCQkJCi0JCQkJLy8gUmVmbGVjdCBhcm91bmQgdGhlIHggYXhpcy4gCi0JCQkJdHJhbnNmb3JtLnNldEVsZW1lbnRzKDEsIDAsIDAsIC0xLCAwLCAwKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIHgsIC0xKnktcmVjdC5oZWlnaHQpOwotCQkJCQotCQkJCXggKz0gcmVjdC53aWR0aCArIDMwOwotCQkJCQotCQkJCS8vIFJlZmxlY3QgYXJvdW5kIHRoZSB4IGFuZCB5IGF4ZXMJCi0JCQkJdHJhbnNmb3JtLnNldEVsZW1lbnRzKC0xLCAwLCAwLCAtMSwgMCwgMCk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCAtMSp4LXJlY3Qud2lkdGgsIC0xKnktcmVjdC5oZWlnaHQpOwotCQkJCQotCQkJCXggPSAzMDsgeSArPSByZWN0LmhlaWdodCArIDMwOwotCQkJCQotCQkJCS8vIFNoZWFyIGluIHRoZSB4LWRpcmVjdGlvbgotCQkJCXRyYW5zZm9ybS5zZXRFbGVtZW50cygxLCAwLCAtMSwgMSwgMCwgMCk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCAzMDAsIHkpOwotCQkJCQotCQkJCS8vIFNoZWFyIGluIHktZGlyZWN0aW9uCi0JCQkJdHJhbnNmb3JtLnNldEVsZW1lbnRzKDEsIC0xLCAwLCAxLCAwLCAwKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDE1MCwgNDc1KTsKLQkJCQkKLQkJCQkvLyBSb3RhdGUgYnkgNDUgZGVncmVlcwkKLQkJCQlmbG9hdCBjb3M0NSA9IChmbG9hdClNYXRoLmNvcyg0NSk7Ci0JCQkJZmxvYXQgc2luNDUgPSAoZmxvYXQpTWF0aC5zaW4oNDUpOwotCQkJCXRyYW5zZm9ybS5zZXRFbGVtZW50cyhjb3M0NSwgc2luNDUsIC1zaW40NSwgY29zNDUsIDAsIDApOwotCQkJCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgMzUwLCAxMDApOwotCQkJCQotCQkJCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwuc2V0U2l6ZSgzNTAsIDU1MCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0JCi0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNThhNGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy9wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENoYW5nZSBodWUsIHNhdHVyYXRpb24gYW5kIGJyaWdodG5lc3Mgb2YgYSBjb2xvcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwOCB7CSAKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YSgweGZmLCAweGZmMDAsIDB4ZmYwMDAwKTsJCi0JCi0JLy8gSW1hZ2VEYXRhIHNob3dpbmcgdmFyaWF0aW9ucyBvZiBodWUJCi0JSW1hZ2VEYXRhIGh1ZURhdGEgPSBuZXcgSW1hZ2VEYXRhKDM2MCwgMTAwLCAyNCwgcGFsZXR0ZSk7CQotCWZsb2F0IGh1ZSA9IDA7Ci0JZm9yIChpbnQgeCA9IDA7IHggPCBodWVEYXRhLndpZHRoOyB4KyspIHsKLQkJZm9yIChpbnQgeSA9IDA7IHkgPCBodWVEYXRhLmhlaWdodDsgeSsrKSB7Ci0JCQlpbnQgcGl4ZWwgPSBwYWxldHRlLmdldFBpeGVsKG5ldyBSR0IoaHVlLCAxZiwgMWYpKTsKLQkJCWh1ZURhdGEuc2V0UGl4ZWwoeCwgeSwgcGl4ZWwpOwotCQl9Ci0JCWh1ZSArPSAzNjBmIC8gaHVlRGF0YS53aWR0aDsKLQl9Ci0KLQkvLyBJbWFnZURhdGEgc2hvd2luZyBzYXR1cmF0aW9uIG9uIHggYXhpcyBhbmQgYnJpZ2h0bmVzcyBvbiB5IGF4aXMKLQlJbWFnZURhdGEgc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhID0gbmV3IEltYWdlRGF0YSgzNjAsIDM2MCwgMjQsIHBhbGV0dGUpOwotCWZsb2F0IHNhdHVyYXRpb24gPSAwZjsKLQlmbG9hdCBicmlnaHRuZXNzID0gMWY7Ci0JZm9yIChpbnQgeCA9IDA7IHggPCBzYXR1cmF0aW9uQnJpZ2h0bmVzc0RhdGEud2lkdGg7IHgrKykgewotCQlicmlnaHRuZXNzID0gMWY7Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhLmhlaWdodDsgeSsrKSB7Ci0JCQlpbnQgcGl4ZWwgPSBwYWxldHRlLmdldFBpeGVsKG5ldyBSR0IoMzYwZiwgc2F0dXJhdGlvbiwgYnJpZ2h0bmVzcykpOwkKLQkJCXNhdHVyYXRpb25CcmlnaHRuZXNzRGF0YS5zZXRQaXhlbCh4LCB5LCBwaXhlbCk7Ci0JCQlicmlnaHRuZXNzIC09IDFmIC8gc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhLmhlaWdodDsKLQkJfQotCQlzYXR1cmF0aW9uICs9IDFmIC8gc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhLndpZHRoOwotCX0KLQkJCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlJbWFnZSBodWVJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBodWVEYXRhKTsKLQlJbWFnZSBzYXR1cmF0aW9uSW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJIdWUsIFNhdHVyYXRpb24sIEJyaWdodG5lc3MiKTsKLQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxMDsKLQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAxNjsKLQlzaGVsbC5zZXRMYXlvdXQoZ3JpZExheW91dCk7CQkKLQkKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0SW1hZ2UoaHVlSW1hZ2UpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDIsIDEpOwotCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CQotCQotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQ0VOVEVSKTsgLy9zcGFjZXIKLQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0VGV4dCgiSHVlIik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5DRU5URVIpOyAvL3NwYWNlcgotCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAyLCAxKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTEVGVCk7Ci0JbGFiZWwuc2V0VGV4dCgiQnJpZ2h0bmVzcyIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0SW1hZ2Uoc2F0dXJhdGlvbkltYWdlKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCi0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5DRU5URVIpOyAvL3NwYWNlcgotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQ0VOVEVSKTsKLQlsYWJlbC5zZXRUZXh0KCJTYXR1cmF0aW9uIik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHsKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCX0KLQlodWVJbWFnZS5kaXNwb3NlKCk7Ci0Jc2F0dXJhdGlvbkltYWdlLmRpc3Bvc2UoKTsJCi0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmJhMDA4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENhbnZhcyBleGFtcGxlIHNuaXBwZXQ6IGltcGxlbWVudCB0YWIgdHJhdmVyc2FsIChiZWhhdmUgbGlrZSBhIHRhYiBncm91cCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIENvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCWZpbmFsIENvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxVRSk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldEJvdW5kcyAoMTAsIDEwLCAxMDAsIDMyKTsKLQliLnNldFRleHQgKCJCdXR0b24iKTsKLQlzaGVsbC5zZXREZWZhdWx0QnV0dG9uIChiKTsKLQlmaW5hbCBDYW52YXMgYyA9IG5ldyBDYW52YXMgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljLnNldEJvdW5kcyAoMTAsIDUwLCAxMDAsIDMyKTsKLQljLmFkZExpc3RlbmVyIChTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJLyogRG8gdGFiIGdyb3VwIHRyYXZlcnNhbCAqLwotCQkJCWNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfVEFCX05FWFQ6CQotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUzoKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9QQUdFX05FWFQ6CQotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1BBR0VfUFJFVklPVVM6Ci0JCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfSk7Ci0JYy5hZGRMaXN0ZW5lciAoU1dULkZvY3VzSW4sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQljLnNldEJhY2tncm91bmQgKHJlZCk7Ci0JCX0KLQl9KTsKLQljLmFkZExpc3RlbmVyIChTV1QuRm9jdXNPdXQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQljLnNldEJhY2tncm91bmQgKGJsdWUpOwotCQl9Ci0JfSk7Ci0JYy5hZGRMaXN0ZW5lciAoU1dULktleURvd24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJLRVkiKTsKLQkJCWZvciAoaW50IGk9MDsgaTw2NDsgaSsrKSB7Ci0JCQkJQ29sb3IgYzEgPSByZWQsIGMyID0gYmx1ZTsKLQkJCQlpZiAoYy5pc0ZvY3VzQ29udHJvbCAoKSkgewotCQkJCQljMSA9IGJsdWU7ICBjMiA9IHJlZDsKLQkJCQl9Ci0JCQkJYy5zZXRCYWNrZ3JvdW5kIChjMSk7Ci0JCQkJYy51cGRhdGUgKCk7Ci0JCQkJYy5zZXRCYWNrZ3JvdW5kIChjMik7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlUZXh0IHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQl0LnNldEJvdW5kcyAoMTAsIDg1LCAxMDAsIDMyKTsKLQotCVRleHQgciA9IG5ldyBUZXh0IChzaGVsbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0Jci5zZXRCb3VuZHMgKDEwLCAxMjAsIDEwMCwgMzIpOwotCQotCWMuc2V0Rm9jdXMgKCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NWI1YmEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHNlbGVjdCBhbGwgdGhlIHRleHQgaW4gdGhlIGNvbnRyb2wKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIDApOwotCXRleHQuc2V0VGV4dCAoIkFTREYiKTsKLQl0ZXh0LnNldFNpemUgKDY0LCAzMik7Ci0JdGV4dC5zZWxlY3RBbGwgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTIzNjkwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyYWNrZXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0cmFja2VyIChkcmFnIG9uIG1vdXNlIGRvd24pCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVRyYWNrZXIgdHJhY2tlciA9IG5ldyBUcmFja2VyIChzaGVsbCwgU1dULk5PTkUpOwotCQkJdHJhY2tlci5zZXRSZWN0YW5nbGVzIChuZXcgUmVjdGFuZ2xlIFtdIHsKLQkJCQluZXcgUmVjdGFuZ2xlIChlLngsIGUueSwgMTAwLCAxMDApLAotCQkJfSk7Ci0JCQl0cmFja2VyLm9wZW4gKCk7Ci0JCX0KLQl9KTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhMjE3Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBDUiBpbiBhIHRleHQgb3IgY29tYm8gY29udHJvbCAoZGVmYXVsdCBzZWxlbGVjdGlvbikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyAoc2hlbGwsIFNXVC5OT05FKTsKLQljb21iby5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IkEtMSIsICJCLTEiLCAiQy0xIn0pOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCXRleHQuc2V0VGV4dCAoInNvbWUgdGV4dCIpOwotCWNvbWJvLmFkZExpc3RlbmVyIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoZS53aWRnZXQgKyAiIC0gRGVmYXVsdCBTZWxlY3Rpb24iKTsKLQkJfQotCX0pOwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuIChlLndpZGdldCArICIgLSBEZWZhdWx0IFNlbGVjdGlvbiIpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2JjN2UyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ29udHJvbCBleGFtcGxlIHNuaXBwZXQ6IHByaW50IGtleSBzdGF0ZSwgY29kZSBhbmQgY2hhcmFjdGVyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNSB7Ci0KLXN0YXRpYyBTdHJpbmcgc3RhdGVNYXNrIChpbnQgc3RhdGVNYXNrKSB7Ci0JU3RyaW5nIHN0cmluZyA9ICIiOwotCWlmICgoc3RhdGVNYXNrICYgU1dULkNUUkwpICE9IDApIHN0cmluZyArPSAiIENUUkwiOwotCWlmICgoc3RhdGVNYXNrICYgU1dULkFMVCkgIT0gMCkgc3RyaW5nICs9ICIgQUxUIjsKLQlpZiAoKHN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkgc3RyaW5nICs9ICIgU0hJRlQiOwotCWlmICgoc3RhdGVNYXNrICYgU1dULkNPTU1BTkQpICE9IDApIHN0cmluZyArPSAiIENPTU1BTkQiOwotCXJldHVybiBzdHJpbmc7Ci19Ci0KLXN0YXRpYyBTdHJpbmcgY2hhcmFjdGVyIChjaGFyIGNoYXJhY3RlcikgewotCXN3aXRjaCAoY2hhcmFjdGVyKSB7Ci0JCWNhc2UgMDogCQlyZXR1cm4gIidcXDAnIjsKLQkJY2FzZSBTV1QuQlM6CXJldHVybiAiJ1xcYiciOwotCQljYXNlIFNXVC5DUjoJcmV0dXJuICInXFxyJyI7Ci0JCWNhc2UgU1dULkRFTDoJcmV0dXJuICJERUwiOwotCQljYXNlIFNXVC5FU0M6CXJldHVybiAiRVNDIjsKLQkJY2FzZSBTV1QuTEY6CXJldHVybiAiJ1xcbiciOwotCQljYXNlIFNXVC5UQUI6CXJldHVybiAiJ1xcdCciOwotCX0KLQlyZXR1cm4gIiciICsgY2hhcmFjdGVyICsiJyI7Ci19Ci0KLXN0YXRpYyBTdHJpbmcga2V5Q29kZSAoaW50IGtleUNvZGUpIHsKLQlzd2l0Y2ggKGtleUNvZGUpIHsKLQkJCi0JCS8qIEtleWJvYXJkIGFuZCBNb3VzZSBNYXNrcyAqLwotCQljYXNlIFNXVC5BTFQ6IAkJcmV0dXJuICJBTFQiOwotCQljYXNlIFNXVC5TSElGVDogCXJldHVybiAiU0hJRlQiOwotCQljYXNlIFNXVC5DT05UUk9MOglyZXR1cm4gIkNPTlRST0wiOwotCQljYXNlIFNXVC5DT01NQU5EOglyZXR1cm4gIkNPTU1BTkQiOwotCQkJCi0JCS8qIE5vbi1OdW1lcmljIEtleXBhZCBLZXlzICovCi0JCWNhc2UgU1dULkFSUk9XX1VQOgkJcmV0dXJuICJBUlJPV19VUCI7Ci0JCWNhc2UgU1dULkFSUk9XX0RPV046CXJldHVybiAiQVJST1dfRE9XTiI7Ci0JCWNhc2UgU1dULkFSUk9XX0xFRlQ6CXJldHVybiAiQVJST1dfTEVGVCI7Ci0JCWNhc2UgU1dULkFSUk9XX1JJR0hUOglyZXR1cm4gIkFSUk9XX1JJR0hUIjsKLQkJY2FzZSBTV1QuUEFHRV9VUDoJCXJldHVybiAiUEFHRV9VUCI7Ci0JCWNhc2UgU1dULlBBR0VfRE9XTjoJCXJldHVybiAiUEFHRV9ET1dOIjsKLQkJY2FzZSBTV1QuSE9NRToJCQlyZXR1cm4gIkhPTUUiOwotCQljYXNlIFNXVC5FTkQ6CQkJcmV0dXJuICJFTkQiOwotCQljYXNlIFNXVC5JTlNFUlQ6CQlyZXR1cm4gIklOU0VSVCI7Ci0KLQkJLyogVmlydHVhbCBhbmQgQXNjaWkgS2V5cyAqLwotCQljYXNlIFNXVC5CUzoJcmV0dXJuICJCUyI7Ci0JCWNhc2UgU1dULkNSOglyZXR1cm4gIkNSIjsJCQotCQljYXNlIFNXVC5ERUw6CXJldHVybiAiREVMIjsKLQkJY2FzZSBTV1QuRVNDOglyZXR1cm4gIkVTQyI7Ci0JCWNhc2UgU1dULkxGOglyZXR1cm4gIkxGIjsKLQkJY2FzZSBTV1QuVEFCOglyZXR1cm4gIlRBQiI7Ci0JCi0JCS8qIEZ1bmN0aW9ucyBLZXlzICovCi0JCWNhc2UgU1dULkYxOglyZXR1cm4gIkYxIjsKLQkJY2FzZSBTV1QuRjI6CXJldHVybiAiRjIiOwotCQljYXNlIFNXVC5GMzoJcmV0dXJuICJGMyI7Ci0JCWNhc2UgU1dULkY0OglyZXR1cm4gIkY0IjsKLQkJY2FzZSBTV1QuRjU6CXJldHVybiAiRjUiOwotCQljYXNlIFNXVC5GNjoJcmV0dXJuICJGNiI7Ci0JCWNhc2UgU1dULkY3OglyZXR1cm4gIkY3IjsKLQkJY2FzZSBTV1QuRjg6CXJldHVybiAiRjgiOwotCQljYXNlIFNXVC5GOToJcmV0dXJuICJGOSI7Ci0JCWNhc2UgU1dULkYxMDoJcmV0dXJuICJGMTAiOwotCQljYXNlIFNXVC5GMTE6CXJldHVybiAiRjExIjsKLQkJY2FzZSBTV1QuRjEyOglyZXR1cm4gIkYxMiI7Ci0JCWNhc2UgU1dULkYxMzoJcmV0dXJuICJGMTMiOwotCQljYXNlIFNXVC5GMTQ6CXJldHVybiAiRjE0IjsKLQkJY2FzZSBTV1QuRjE1OglyZXR1cm4gIkYxNSI7Ci0JCQotCQkvKiBOdW1lcmljIEtleXBhZCBLZXlzICovCi0JCWNhc2UgU1dULktFWVBBRF9BREQ6CQlyZXR1cm4gIktFWVBBRF9BREQiOwotCQljYXNlIFNXVC5LRVlQQURfU1VCVFJBQ1Q6CXJldHVybiAiS0VZUEFEX1NVQlRSQUNUIjsKLQkJY2FzZSBTV1QuS0VZUEFEX01VTFRJUExZOglyZXR1cm4gIktFWVBBRF9NVUxUSVBMWSI7Ci0JCWNhc2UgU1dULktFWVBBRF9ESVZJREU6CQlyZXR1cm4gIktFWVBBRF9ESVZJREUiOwotCQljYXNlIFNXVC5LRVlQQURfREVDSU1BTDoJcmV0dXJuICJLRVlQQURfREVDSU1BTCI7Ci0JCWNhc2UgU1dULktFWVBBRF9DUjoJCQlyZXR1cm4gIktFWVBBRF9DUiI7Ci0JCWNhc2UgU1dULktFWVBBRF8wOgkJCXJldHVybiAiS0VZUEFEXzAiOwotCQljYXNlIFNXVC5LRVlQQURfMToJCQlyZXR1cm4gIktFWVBBRF8xIjsKLQkJY2FzZSBTV1QuS0VZUEFEXzI6CQkJcmV0dXJuICJLRVlQQURfMiI7Ci0JCWNhc2UgU1dULktFWVBBRF8zOgkJCXJldHVybiAiS0VZUEFEXzMiOwotCQljYXNlIFNXVC5LRVlQQURfNDoJCQlyZXR1cm4gIktFWVBBRF80IjsKLQkJY2FzZSBTV1QuS0VZUEFEXzU6CQkJcmV0dXJuICJLRVlQQURfNSI7Ci0JCWNhc2UgU1dULktFWVBBRF82OgkJCXJldHVybiAiS0VZUEFEXzYiOwotCQljYXNlIFNXVC5LRVlQQURfNzoJCQlyZXR1cm4gIktFWVBBRF83IjsKLQkJY2FzZSBTV1QuS0VZUEFEXzg6CQkJcmV0dXJuICJLRVlQQURfOCI7Ci0JCWNhc2UgU1dULktFWVBBRF85OgkJCXJldHVybiAiS0VZUEFEXzkiOwotCQljYXNlIFNXVC5LRVlQQURfRVFVQUw6CQlyZXR1cm4gIktFWVBBRF9FUVVBTCI7Ci0KLQkJLyogT3RoZXIga2V5cyAqLwotCQljYXNlIFNXVC5DQVBTX0xPQ0s6CQlyZXR1cm4gIkNBUFNfTE9DSyI7Ci0JCWNhc2UgU1dULk5VTV9MT0NLOgkJcmV0dXJuICJOVU1fTE9DSyI7Ci0JCWNhc2UgU1dULlNDUk9MTF9MT0NLOglyZXR1cm4gIlNDUk9MTF9MT0NLIjsKLQkJY2FzZSBTV1QuUEFVU0U6CQkJcmV0dXJuICJQQVVTRSI7Ci0JCWNhc2UgU1dULkJSRUFLOgkJCXJldHVybiAiQlJFQUsiOwotCQljYXNlIFNXVC5QUklOVF9TQ1JFRU46CXJldHVybiAiUFJJTlRfU0NSRUVOIjsKLQkJY2FzZSBTV1QuSEVMUDoJCQlyZXR1cm4gIkhFTFAiOwotCX0KLQlyZXR1cm4gY2hhcmFjdGVyICgoY2hhcikga2V5Q29kZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZS50eXBlID09IFNXVC5LZXlEb3duID8gIkRPV046IiA6ICJVUCAgOiI7Ci0JCQlzdHJpbmcgKz0gIiBzdGF0ZU1hc2s9MHgiICsgSW50ZWdlci50b0hleFN0cmluZyAoZS5zdGF0ZU1hc2spICsgc3RhdGVNYXNrIChlLnN0YXRlTWFzaykgKyAiLCI7Ci0JCQlzdHJpbmcgKz0gIiBrZXlDb2RlPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcgKGUua2V5Q29kZSkgKyAiICIgKyBrZXlDb2RlIChlLmtleUNvZGUpICsgIiwiOwotCQkJc3RyaW5nICs9ICIgY2hhcmFjdGVyPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcgKGUuY2hhcmFjdGVyKSArICIgIiArIGNoYXJhY3RlciAoZS5jaGFyYWN0ZXIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuIChzdHJpbmcpOwotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULktleURvd24sIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULktleVVwLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjY2U1ZTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29tYm8gZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBjb21ibyBib3ggKG5vbi1lZGl0YWJsZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyAoc2hlbGwsIFNXVC5SRUFEX09OTFkpOwotCWNvbWJvLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiQSIsICJCIiwgIkMifSk7Ci0JY29tYm8uc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzYTljMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IG9wZW4gYSBzaGVsbCBtaW5pbWl6ZWQgKGljb25pZmllZCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRNaW5pbWl6ZWQgKHRydWUpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OTFmY2MuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBvcGVuIGEgc2hlbGwgbWF4aW1pemVkIChmdWxsIHNjcmVlbikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyOCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRNYXhpbWl6ZWQgKHRydWUpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNDdmZmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTWVudSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGJhciBhbmQgcHVsbCBkb3duIG1lbnUgKGFjY2VsZXJhdG9ycywgbW5lbW9uaWNzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCU1lbnUgYmFyID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuQkFSKTsKLQlzaGVsbC5zZXRNZW51QmFyIChiYXIpOwotCU1lbnVJdGVtIGZpbGVJdGVtID0gbmV3IE1lbnVJdGVtIChiYXIsIFNXVC5DQVNDQURFKTsKLQlmaWxlSXRlbS5zZXRUZXh0ICgiRmlsZSIpOwotCU1lbnUgc3VibWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JZmlsZUl0ZW0uc2V0TWVudSAoc3VibWVudSk7Ci0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAoc3VibWVudSwgU1dULlBVU0gpOwotCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJTZWxlY3QgQWxsIik7Ci0JCX0KLQl9KTsKLQlpdGVtLnNldFRleHQgKCJTZWxlY3QgJkFsbFx0Q3RybCtBIik7Ci0JaXRlbS5zZXRBY2NlbGVyYXRvciAoU1dULkNUUkwgKyAnQScpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTVmMWVkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBmaW5kIGEgdGFibGUgY2VsbCBmcm9tIG1vdXNlIGRvd24gKFNXVC5GVUxMX1NFTEVDVElPTikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwKLQkJCXwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlmaW5hbCBpbnQgcm93Q291bnQgPSA2NCwgY29sdW1uQ291bnQgPSA0OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAiICsgaSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb2x1bW5Db3VudDsgaisrKSB7Ci0JCQlpdGVtLnNldFRleHQoaiwgIkl0ZW0gIiArIGkgKyAiLSIgKyBqKTsKLQkJfQotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJdGFibGUuZ2V0Q29sdW1uKGkpLnBhY2soKTsKLQl9Ci0JUG9pbnQgc2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCAyMDApOwotCXRhYmxlLnNldFNpemUoc2l6ZSk7Ci0Jc2hlbGwucGFjaygpOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVBvaW50IHB0ID0gbmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpOwotCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtKHB0KTsKLQkJCWlmIChpdGVtID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyhpKTsKLQkJCQlpZiAocmVjdC5jb250YWlucyhwdCkpIHsKLQkJCQkJaW50IGluZGV4ID0gdGFibGUuaW5kZXhPZihpdGVtKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJJdGVtICIgKyBpbmRleCArICItIiArIGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjgxMzg5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFByb2dyYW0gZXhhbXBsZSBzbmlwcGV0OiBpbnZva2UgdGhlIHN5c3RlbSB0ZXh0IGVkaXRvciBvbiBhdXRvZXhlYy5iYXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDMwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JUHJvZ3JhbSBwID0gUHJvZ3JhbS5maW5kUHJvZ3JhbSAoIi50eHQiKTsKLQlpZiAocCAhPSBudWxsKSBwLmV4ZWN1dGUgKCJjOlxcYXV0b2V4ZWMuYmF0Iik7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5OGMxZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmFja2VyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdHJhY2tlciAoZHJhZyB3aGVuICJ0b3JuIG9mZiIpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlQb2ludCBwb2ludCA9IG51bGw7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgSklUVEVSID0gODsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5Nb3VzZURvd246Ci0JCQkJCXBvaW50ID0gbmV3IFBvaW50IChldmVudC54LCBldmVudC55KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VNb3ZlOgotCQkJCQlpZiAocG9pbnQgPT0gbnVsbCkgcmV0dXJuOwotCQkJCQlpbnQgZGVsdGFYID0gcG9pbnQueCAtIGV2ZW50LngsIGRlbHRhWSA9IHBvaW50LnkgLSBldmVudC55OwotCQkJCQlpZiAoTWF0aC5hYnMgKGRlbHRhWCkgPCBKSVRURVIgJiYgTWF0aC5hYnMgKGRlbHRhWSkgPCBKSVRURVIpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlUcmFja2VyIHRyYWNrZXIgPSBuZXcgVHJhY2tlciAoZGlzcGxheSwgU1dULk5PTkUpOwotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGRpc3BsYXkubWFwIChzaGVsbCwgbnVsbCwgc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKSk7Ci0JCQkJCXJlY3QueCAtPSBkZWx0YVg7Ci0JCQkJCXJlY3QueSAtPSBkZWx0YVk7Ci0JCQkJCXRyYWNrZXIuc2V0UmVjdGFuZ2xlcyAobmV3IFJlY3RhbmdsZSBbXSB7cmVjdH0pOwotCQkJCQl0cmFja2VyLm9wZW4gKCk7Ci0JCQkJCS8vRkFMTCBUSFJPVUdICi0JCQkJY2FzZSBTV1QuTW91c2VVcDoKLQkJCQkJcG9pbnQgPSBudWxsOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlTW92ZSwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VVcCwgbGlzdGVuZXIpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxY2JkYTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUHJvZ3JhbSBleGFtcGxlIHNuaXBwZXQ6IGZpbmQgdGhlIGljb24gb2YgdGhlIHByb2dyYW0gdGhhdCBlZGl0cyAuYm1wIGZpbGVzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0ICgiQ2FuJ3QgZmluZCBpY29uIGZvciAuYm1wIik7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCVByb2dyYW0gcCA9IFByb2dyYW0uZmluZFByb2dyYW0gKCIuYm1wIik7Ci0JaWYgKHAgIT0gbnVsbCkgewotCQlJbWFnZURhdGEgZGF0YSA9IHAuZ2V0SW1hZ2VEYXRhICgpOwotCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgZGF0YSk7Ci0JCQlsYWJlbC5zZXRJbWFnZSAoaW1hZ2UpOwotCQl9Ci0JfQotCWxhYmVsLnBhY2sgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZmM5MTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRGlyZWN0b3J5RGlhbG9nIGV4YW1wbGUgc25pcHBldDogcHJvbXB0IGZvciBhIGRpcmVjdG9yeQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDMzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0JRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cgKHNoZWxsKTsKLQlkaWFsb2cuc2V0RmlsdGVyUGF0aCAoImM6XFwiKTsgLy9XaW5kb3dzIHNwZWNpZmljCi0JU3lzdGVtLm91dC5wcmludGxuICgiUkVTVUxUPSIgKyBkaWFsb2cub3BlbiAoKSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3NjVjYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogTGFiZWwgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBsYWJlbCAod2l0aCBhbiBpbWFnZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzNCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMTYsIDE2KTsKLQlDb2xvciBjb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCWdjLmZpbGxSZWN0YW5nbGUgKGltYWdlLmdldEJvdW5kcyAoKSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsYWJlbC5zZXRJbWFnZSAoaW1hZ2UpOwotCWxhYmVsLnBhY2sgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOyAKLQl9IAotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgzODdjZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0YWJsZSAobm8gY29sdW1ucywgbm8gaGVhZGVycykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzNSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIDApOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdGFibGUuc2V0U2l6ZSAoMTAwLCAxMDApOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZTcyODQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBmbGF0IHRvb2wgYmFyIChpbWFnZXMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxNiwgMTYpOwotCUNvbG9yIGNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChjb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoaW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5GTEFUIHwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGltYWdlKTsKLQl9Ci0JdG9vbEJhci5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNmNmNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIExhYmVsIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgbGFiZWwgKGEgc2VwYXJhdG9yKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQluZXcgTGFiZWwgKHNoZWxsLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCW5ldyBMYWJlbCAoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuVkVSVElDQUwpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhZTNhNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYmxlIChjb2x1bW5zLCBoZWFkZXJzLCBsaW5lcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzOCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSAodHJ1ZSk7Ci0JU3RyaW5nW10gdGl0bGVzID0geyIgIiwgIkMiLCAiISIsICJEZXNjcmlwdGlvbiIsICJSZXNvdXJjZSIsICJJbiBGb2xkZXIiLCAiTG9jYXRpb24ifTsKLQlmb3IgKGludCBpPTA7IGk8dGl0bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQgKHRpdGxlcyBbaV0pOwotCX0JCi0JaW50IGNvdW50ID0gMTI4OwotCWZvciAoaW50IGk9MDsgaTxjb3VudDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgwLCAieCIpOwotCQlpdGVtLnNldFRleHQgKDEsICJ5Iik7Ci0JCWl0ZW0uc2V0VGV4dCAoMiwgIiEiKTsKLQkJaXRlbS5zZXRUZXh0ICgzLCAidGhpcyBzdHVmZiBiZWhhdmVzIHRoZSB3YXkgSSBleHBlY3QiKTsKLQkJaXRlbS5zZXRUZXh0ICg0LCAiYWxtb3N0IGV2ZXJ5d2hlcmUiKTsKLQkJaXRlbS5zZXRUZXh0ICg1LCAic29tZS5mb2xkZXIiKTsKLQkJaXRlbS5zZXRUZXh0ICg2LCAibGluZSAiICsgaSArICIgaW4gbm93aGVyZSIpOwotCX0KLQlmb3IgKGludCBpPTA7IGk8dGl0bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCXRhYmxlLmdldENvbHVtbiAoaSkucGFjayAoKTsKLQl9CQotCXRhYmxlLnNldFNpemUgKHRhYmxlLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgMjAwKSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjNDJhNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzkgewotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZjODQxMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IHByZXZlbnQgZXNjYXBlIGZyb20gY2xvc2luZyBhIGRpYWxvZwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQliLnNldFRleHQoIk9wZW4gRGlhbG9nIC4uLiIpOwotCQliLnBhY2soKTsKLQkJYi5zZXRMb2NhdGlvbigxMCwgMTApOwotCQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKLQkJCQlTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSk7Ci0JCQkJZGlhbG9nLmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0VTQ0FQRSkgewotCQkJCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODI1NzZiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBNZW51IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgcG9wdXAgbWVudSAoc2V0IGluIG11bHRpcGxlIGNvbnRyb2xzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUNvbXBvc2l0ZSBjMSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljMS5zZXRTaXplICgxMDAsIDEwMCk7Ci0JQ29tcG9zaXRlIGMyID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWMyLnNldEJvdW5kcyAoMTAwLCAwLCAxMDAsIDEwMCk7Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0ICgiUG9wdXAiKTsKLQljMS5zZXRNZW51IChtZW51KTsKLQljMi5zZXRNZW51IChtZW51KTsKLQlzaGVsbC5zZXRNZW51IChtZW51KTsKLQlzaGVsbC5zZXRTaXplICgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYTFjNzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbCBUaXBzIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIHRvb2wgdGlwcyBmb3IgYSB0YWIgZm9sZGVyLCB0b29sIGJhciBhbmQgY29udHJvbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JU3RyaW5nIHN0cmluZyA9ICJUaGlzIGlzIGEgc3RyaW5nXG53aXRoIGEgbmV3IGxpbmUuIjsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlUYWJGb2xkZXIgZm9sZGVyID0gbmV3IFRhYkZvbGRlciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvbGRlci5zZXRTaXplICgyMDAsIDIwMCk7Ci0JVGFiSXRlbSBpdGVtMCA9IG5ldyBUYWJJdGVtIChmb2xkZXIsIDApOwotCWl0ZW0wLnNldFRvb2xUaXBUZXh0IChzdHJpbmcpOwotCVRvb2xCYXIgYmFyID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQliYXIuc2V0Qm91bmRzICgwLCAyMDAsIDIwMCwgNjQpOwotCVRvb2xJdGVtIGl0ZW0xID0gbmV3IFRvb2xJdGVtIChiYXIsIDApOwotCWl0ZW0xLnNldFRvb2xUaXBUZXh0IChzdHJpbmcpOwotCXNoZWxsLnNldFRvb2xUaXBUZXh0IChzdHJpbmcpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMyNjlmOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEaXNwbGF5IGV4YW1wbGUgc25pcHBldDogZ2V0IHRoZSBib3VuZHMgYW5kIGNsaWVudCBhcmVhIG9mIGEgZGlzcGxheQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU3lzdGVtLm91dC5wcmludGxuICgiQk9VTkRTPSIgKyBkaXNwbGF5LmdldEJvdW5kcyAoKSArICIgQ0xJRU5UPSIgKyBkaXNwbGF5LmdldENsaWVudEFyZWEgKCkpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGU2MzQ0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENhcmV0IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY2FyZXQgKHVzaW5nIGFuIGltYWdlKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0JQ2FyZXQgY2FyZXQgPSBuZXcgQ2FyZXQgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGJsYWNrID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMQUNLKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGJsYWNrKTsKLQlnYy5maWxsUmVjdGFuZ2xlICgwLCAwLCAyMCwgMjApOwotCWdjLnNldEZvcmVncm91bmQgKHdoaXRlKTsKLQlnYy5kcmF3TGluZSAoMCwgMCwgMTksIDE5KTsKLQlnYy5kcmF3TGluZSAoMTksIDAsIDAsIDE5KTsKLQlnYy5kaXNwb3NlICgpOwotCWNhcmV0LnNldExvY2F0aW9uICgxMCwgMTApOwotCWNhcmV0LnNldEltYWdlIChpbWFnZSk7Ci0JZ2MgPSBuZXcgR0MgKHNoZWxsKTsKLQlnYy5kcmF3SW1hZ2UgKGltYWdlLCAxMCwgNjQpOwotCWNhcmV0LnNldFZpc2libGUgKGZhbHNlKTsKLQlnYy5kcmF3U3RyaW5nICgiVGVzdCIsIDEyLCAxMik7Ci0JY2FyZXQuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1Njg2OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDdXJzb3IgZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIGhhbmQgY3Vyc29yIGludG8gYSBjb250cm9sCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvciAoZGlzcGxheSwgU1dULkNVUlNPUl9IQU5EKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlmaW5hbCBCdXR0b24gYiA9IG5ldyBCdXR0b24gKHNoZWxsLCAwKTsKLQliLnNldEJvdW5kcyAoMTAsIDEwLCAyMDAsIDIwMCk7Ci0JYi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCWIuc2V0Q3Vyc29yIChjdXJzb3IpOwotCQl9Ci0JfSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWN1cnNvci5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmFjZWUzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNjYWxlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgc2NhbGUgKG1heGltdW0gNDAsIHBhZ2UgaW5jcmVtZW50IDUpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JU2NhbGUgc2NhbGUgPSBuZXcgU2NhbGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlzY2FsZS5zZXRTaXplICgyMDAsIDY0KTsKLQlzY2FsZS5zZXRNYXhpbXVtICg0MCk7Ci0Jc2NhbGUuc2V0UGFnZUluY3JlbWVudCAoNSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YWM2MjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIENvbXBvc2l0ZSBleGFtcGxlIHNuaXBwZXQ6IGludGVyY2VwdCBtb3VzZSBldmVudHMgKGRyYWcgYSBidXR0b24gd2l0aCB0aGUgbW91c2UpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQ2IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5OT05FKTsKLQljb21wb3NpdGUuc2V0RW5hYmxlZCAoZmFsc2UpOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJCdXR0b24iKTsKLQljb21wb3NpdGUucGFjayAoKTsKLQljb21wb3NpdGUuc2V0TG9jYXRpb24gKDEwLCAxMCk7Ci0JZmluYWwgUG9pbnQgW10gb2Zmc2V0ID0gbmV3IFBvaW50IFsxXTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGNvbXBvc2l0ZS5nZXRCb3VuZHMgKCk7Ci0JCQkJCWlmIChyZWN0LmNvbnRhaW5zIChldmVudC54LCBldmVudC55KSkgewotCQkJCQkJUG9pbnQgcHQxID0gY29tcG9zaXRlLnRvRGlzcGxheSAoMCwgMCk7Ci0JCQkJCQlQb2ludCBwdDIgPSBzaGVsbC50b0Rpc3BsYXkgKGV2ZW50LngsIGV2ZW50LnkpOyAKLQkJCQkJCW9mZnNldCBbMF0gPSBuZXcgUG9pbnQgKHB0Mi54IC0gcHQxLngsIHB0Mi55IC0gcHQxLnkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlTW92ZToKLQkJCQkJaWYgKG9mZnNldCBbMF0gIT0gbnVsbCkgewotCQkJCQkJUG9pbnQgcHQgPSBvZmZzZXQgWzBdOwotCQkJCQkJY29tcG9zaXRlLnNldExvY2F0aW9uIChldmVudC54IC0gcHQueCwgZXZlbnQueSAtIHB0LnkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlVXA6Ci0JCQkJCW9mZnNldCBbMF0gPSBudWxsOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlVXAsIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlTW92ZSwgbGlzdGVuZXIpOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGYwNzBmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgdG9vbCBiYXIgKG5vcm1hbCwgaG90IGFuZCBkaXNhYmxlZCBpbWFnZXMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0KLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQlDb2xvciBjb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTFVFKTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGNvbG9yKTsKLQlnYy5maWxsUmVjdGFuZ2xlIChpbWFnZS5nZXRCb3VuZHMgKCkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JCi0JSW1hZ2UgZGlzYWJsZWRJbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQljb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9HUkVFTik7Ci0JZ2MgPSBuZXcgR0MgKGRpc2FibGVkSW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGNvbG9yKTsKLQlnYy5maWxsUmVjdGFuZ2xlIChkaXNhYmxlZEltYWdlLmdldEJvdW5kcyAoKSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQkKLQlJbWFnZSBob3RJbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQljb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCWdjID0gbmV3IEdDIChob3RJbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCWdjLmZpbGxSZWN0YW5nbGUgKGhvdEltYWdlLmdldEJvdW5kcyAoKSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQkKLQlUb29sQmFyIGJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5GTEFUKTsKLQliYXIuc2V0U2l6ZSAoMjAwLCAzMik7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAoYmFyLCAwKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW1hZ2UpOwotCQlpdGVtLnNldERpc2FibGVkSW1hZ2UgKGRpc2FibGVkSW1hZ2UpOwotCQlpdGVtLnNldEhvdEltYWdlIChob3RJbWFnZSk7Ci0JCWlmIChpICUgMyA9PSAwKSBpdGVtLnNldEVuYWJsZWQgKGZhbHNlKTsKLQl9Ci0JCi0Jc2hlbGwub3BlbiAoKTsKLQliYXIuZ2V0SXRlbXMgKCkgWzFdLnNldEltYWdlIChkaXNhYmxlZEltYWdlKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNhYmxlZEltYWdlLmRpc3Bvc2UgKCk7Ci0JaG90SW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MxYzUzYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIENhbnZhcyBleGFtcGxlIHNuaXBwZXQ6IHNjcm9sbCBhbiBpbWFnZSAoZmxpY2tlciBmcmVlLCBubyBkb3VibGUgYnVmZmVyaW5nKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQ4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXksCi0JCVNXVC5TSEVMTF9UUklNIHwgU1dULk5PX0JBQ0tHUk9VTkQgfAotCQlTV1QuTk9fUkVEUkFXX1JFU0laRSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JSW1hZ2Ugb3JpZ2luYWxJbWFnZSA9IG51bGw7Ci0JRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyAoc2hlbGwsIFNXVC5PUEVOKTsKLQlkaWFsb2cuc2V0VGV4dCAoIk9wZW4gYW4gaW1hZ2UgZmlsZSBvciBjYW5jZWwiKTsKLQlTdHJpbmcgc3RyaW5nID0gZGlhbG9nLm9wZW4gKCk7Ci0JaWYgKHN0cmluZyAhPSBudWxsKSB7Ci0JCW9yaWdpbmFsSW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIHN0cmluZyk7Ci0JfQotCWlmIChvcmlnaW5hbEltYWdlID09IG51bGwpIHsKLQkJaW50IHdpZHRoID0gMTUwLCBoZWlnaHQgPSAyMDA7Ci0JCW9yaWdpbmFsSW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIHdpZHRoLCBoZWlnaHQpOwotCQlHQyBnYyA9IG5ldyBHQyAob3JpZ2luYWxJbWFnZSk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUgKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCQlnYy5kcmF3TGluZSAoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0JCWdjLmRyYXdMaW5lICgwLCBoZWlnaHQsIHdpZHRoLCAwKTsKLQkJZ2MuZHJhd1RleHQgKCJEZWZhdWx0IEltYWdlIiwgMTAsIDEwKTsKLQkJZ2MuZGlzcG9zZSAoKTsKLQl9Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBvcmlnaW5hbEltYWdlOwotCWZpbmFsIFBvaW50IG9yaWdpbiA9IG5ldyBQb2ludCAoMCwgMCk7Ci0JZmluYWwgU2Nyb2xsQmFyIGhCYXIgPSBzaGVsbC5nZXRIb3Jpem9udGFsQmFyICgpOwotCWhCYXIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlpbnQgaFNlbGVjdGlvbiA9IGhCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJaW50IGRlc3RYID0gLWhTZWxlY3Rpb24gLSBvcmlnaW4ueDsKLQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzICgpOwotCQkJc2hlbGwuc2Nyb2xsIChkZXN0WCwgMCwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIGZhbHNlKTsKLQkJCW9yaWdpbi54ID0gLWhTZWxlY3Rpb247Ci0JCX0KLQl9KTsKLQlmaW5hbCBTY3JvbGxCYXIgdkJhciA9IHNoZWxsLmdldFZlcnRpY2FsQmFyICgpOwotCXZCYXIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlpbnQgdlNlbGVjdGlvbiA9IHZCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJaW50IGRlc3RZID0gLXZTZWxlY3Rpb24gLSBvcmlnaW4ueTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzICgpOwotCQkJc2hlbGwuc2Nyb2xsICgwLCBkZXN0WSwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIGZhbHNlKTsKLQkJCW9yaWdpbi55ID0gLXZTZWxlY3Rpb247Ci0JCX0KLQl9KTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcyAoKTsKLQkJCVJlY3RhbmdsZSBjbGllbnQgPSBzaGVsbC5nZXRDbGllbnRBcmVhICgpOwotCQkJaEJhci5zZXRNYXhpbXVtIChyZWN0LndpZHRoKTsKLQkJCXZCYXIuc2V0TWF4aW11bSAocmVjdC5oZWlnaHQpOwotCQkJaEJhci5zZXRUaHVtYiAoTWF0aC5taW4gKHJlY3Qud2lkdGgsIGNsaWVudC53aWR0aCkpOwotCQkJdkJhci5zZXRUaHVtYiAoTWF0aC5taW4gKHJlY3QuaGVpZ2h0LCBjbGllbnQuaGVpZ2h0KSk7Ci0JCQlpbnQgaFBhZ2UgPSByZWN0LndpZHRoIC0gY2xpZW50LndpZHRoOwotCQkJaW50IHZQYWdlID0gcmVjdC5oZWlnaHQgLSBjbGllbnQuaGVpZ2h0OwotCQkJaW50IGhTZWxlY3Rpb24gPSBoQmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCWludCB2U2VsZWN0aW9uID0gdkJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlpZiAoaFNlbGVjdGlvbiA+PSBoUGFnZSkgewotCQkJCWlmIChoUGFnZSA8PSAwKSBoU2VsZWN0aW9uID0gMDsKLQkJCQlvcmlnaW4ueCA9IC1oU2VsZWN0aW9uOwotCQkJfQotCQkJaWYgKHZTZWxlY3Rpb24gPj0gdlBhZ2UpIHsKLQkJCQlpZiAodlBhZ2UgPD0gMCkgdlNlbGVjdGlvbiA9IDA7Ci0JCQkJb3JpZ2luLnkgPSAtdlNlbGVjdGlvbjsKLQkJCX0KLQkJCXNoZWxsLnJlZHJhdyAoKTsKLQkJfQotCX0pOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlHQyBnYyA9IGUuZ2M7Ci0JCQlnYy5kcmF3SW1hZ2UgKGltYWdlLCBvcmlnaW4ueCwgb3JpZ2luLnkpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMgKCk7Ci0JCQlSZWN0YW5nbGUgY2xpZW50ID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCWludCBtYXJnaW5XaWR0aCA9IGNsaWVudC53aWR0aCAtIHJlY3Qud2lkdGg7Ci0JCQlpZiAobWFyZ2luV2lkdGggPiAwKSB7Ci0JCQkJZ2MuZmlsbFJlY3RhbmdsZSAocmVjdC53aWR0aCwgMCwgbWFyZ2luV2lkdGgsIGNsaWVudC5oZWlnaHQpOwotCQkJfQotCQkJaW50IG1hcmdpbkhlaWdodCA9IGNsaWVudC5oZWlnaHQgLSByZWN0LmhlaWdodDsKLQkJCWlmIChtYXJnaW5IZWlnaHQgPiAwKSB7Ci0JCQkJZ2MuZmlsbFJlY3RhbmdsZSAoMCwgcmVjdC5oZWlnaHQsIGNsaWVudC53aWR0aCwgbWFyZ2luSGVpZ2h0KTsKLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMTUwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjZhMTI4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgdG9vbCBiYXIgKHdyYXAgb24gcmVzaXplKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQ5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULldSQVApOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhICgpOwotCQkJUG9pbnQgc2l6ZSA9IHRvb2xCYXIuY29tcHV0ZVNpemUgKHJlY3Qud2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJCXRvb2xCYXIuc2V0U2l6ZSAoc2l6ZSk7Ci0JCX0KLQl9KTsKLQl0b29sQmFyLnBhY2sgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZWE5NzguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTY3JvbGxlZENvbXBvc2l0ZSBleGFtcGxlIHNuaXBwZXQ6IHNjcm9sbCBhIGNvbnRyb2wgaW4gYSBzY3JvbGxlZCBjb21wb3NpdGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIAotewotICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLSAgICBzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLSAgICAvLyB0aGlzIGJ1dHRvbiBpcyBhbHdheXMgNDAwIHggNDAwLiBTY3JvbGxiYXJzIGFwcGVhciBpZiB0aGUgd2luZG93IGlzIHJlc2l6ZWQgdG8gYmUKLSAgICAvLyB0b28gc21hbGwgdG8gc2hvdyBwYXJ0IG9mIHRoZSBidXR0b24KLSAgICBTY3JvbGxlZENvbXBvc2l0ZSBjMSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgQnV0dG9uIGIxID0gbmV3IEJ1dHRvbihjMSwgU1dULlBVU0gpOwotICAgIGIxLnNldFRleHQoImZpeGVkIHNpemUgYnV0dG9uIik7Ci0gICAgYjEuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0gICAgYzEuc2V0Q29udGVudChiMSk7Ci0KLSAgICAvLyB0aGlzIGJ1dHRvbiBoYXMgYSBtaW5pbXVtIHNpemUgb2YgNDAwIHggNDAwLiBJZiB0aGUgd2luZG93IGlzIHJlc2l6ZWQgdG8gYmUgYmlnCi0gICAgLy8gZW5vdWdoIHRvIHNob3cgbW9yZSB0aGFuIDQwMCB4IDQwMCwgdGhlIGJ1dHRvbiB3aWxsIGdyb3cgaW4gc2l6ZS4gSWYgdGhlIHdpbmRvdwotICAgIC8vIGlzIG1hZGUgdG9vIHNtYWxsIHRvIHNob3cgNDAwIHggNDAwLCBzY3JvbGxiYXJzIHdpbGwgYXBwZWFyLgotICAgIFNjcm9sbGVkQ29tcG9zaXRlIGMyID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLSAgICBCdXR0b24gYjIgPSBuZXcgQnV0dG9uKGMyLCBTV1QuUFVTSCk7Ci0gICAgYjIuc2V0VGV4dCgiZXhwYW5kaW5nIGJ1dHRvbiIpOwotICAgIGMyLnNldENvbnRlbnQoYjIpOwotICAgIGMyLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0gICAgYzIuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0gICAgYzIuc2V0TWluV2lkdGgoNDAwKTsKLSAgICBjMi5zZXRNaW5IZWlnaHQoNDAwKTsKLQotICAgIHNoZWxsLnNldFNpemUoNjAwLCAzMDApOwotICAgIHNoZWxsLm9wZW4gKCk7Ci0gICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0gICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0gICAgfQotICAgIGRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2ZDI5OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBkaWFsb2cgc2hlbGwKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1MCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0ICgiU2hlbGwiKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHNoZWxsKTsKLQlkaWFsb2cuc2V0VGV4dCAoIkRpYWxvZyIpOwotCWRpYWxvZy5zZXRTaXplICgyMDAsIDIwMCk7Ci0JZGlhbG9nLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFiZDc0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogc2Nyb2xsIGEgdGFibGUgKHNldCB0aGUgdG9wIGluZGV4KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDUxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWZvciAoaW50IGk9MDsgaTwxMjg7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQl0YWJsZS5zZXRUb3BJbmRleCAoOTUpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NDI0NjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBzZWxlY3QgYW4gaW5kZXggKHNlbGVjdCBhbmQgc2Nyb2xsKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDUyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWZvciAoaW50IGk9MDsgaTwxMjg7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQl0YWJsZS5zZXRTZWxlY3Rpb24gKDk1KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmNhZTQ1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IHJlbW92ZSBzZWxlY3RlZCBpdGVtcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDUzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWZvciAoaW50IGk9MDsgaTwxMjg7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQlNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCXRhYmxlLnNldE1lbnUgKG1lbnUpOwotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKCJEZWxldGUgU2VsZWN0aW9uIik7Ci0JaXRlbS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQl0YWJsZS5yZW1vdmUgKHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMgKCkpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwYjNhNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogU2FzaCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHNhc2ggKGFsbG93IGl0IHRvIGJlIG1vdmVkKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDU0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFNhc2ggc2FzaCA9IG5ldyBTYXNoIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WRVJUSUNBTCk7Ci0Jc2FzaC5zZXRCb3VuZHMgKDEwLCAxMCwgMzIsIDEwMCk7Ci0Jc2FzaC5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCXNhc2guc2V0Qm91bmRzIChlLngsIGUueSwgZS53aWR0aCwgZS5oZWlnaHQpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlzYXNoLnNldEZvY3VzICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2YTgzZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHJlc2l6ZSBhIHRleHQgY29udHJvbCAoc2hvdyBhYm91dCAxMCBjaGFyYWN0ZXJzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDU1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULkJPUkRFUik7Ci0JaW50IGNvbHVtbnMgPSAxMDsKLQlHQyBnYyA9IG5ldyBHQyAodGV4dCk7Ci0JRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcyAoKTsKLQlpbnQgd2lkdGggPSBjb2x1bW5zICogZm0uZ2V0QXZlcmFnZUNoYXJXaWR0aCAoKTsKLQlpbnQgaGVpZ2h0ID0gZm0uZ2V0SGVpZ2h0ICgpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JdGV4dC5zZXRTaXplICh0ZXh0LmNvbXB1dGVTaXplICh3aWR0aCwgaGVpZ2h0KSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlYWJiOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBQcm9ncmVzc0JhciBleGFtcGxlIHNuaXBwZXQ6IHVwZGF0ZSBhIHByb2dyZXNzIGJhciAoZnJvbSBhbm90aGVyIHRocmVhZCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1NiB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlmaW5hbCBQcm9ncmVzc0JhciBiYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoc2hlbGwsIFNXVC5TTU9PVEgpOwotCQliYXIuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAzMik7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJZmluYWwgaW50IG1heGltdW0gPSBiYXIuZ2V0TWF4aW11bSgpOwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWZvciAoZmluYWwgaW50W10gaSA9IG5ldyBpbnRbMV07IGlbMF0gPD0gbWF4aW11bTsgaVswXSsrKSB7Ci0JCQkJdHJ5IHtUaHJlYWQuc2xlZXAgKDEwMCk7fSBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7fQotCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGJhci5pc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0JCQkJCQkJYmFyLnNldFNlbGVjdGlvbihpWzBdKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0Mjk1ZjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUHJvZ3Jlc3NCYXIgZXhhbXBsZSBzbmlwcGV0OiB1cGRhdGUgYSBwcm9ncmVzcyBiYXIgKGZyb20gdGhlIFVJIHRocmVhZCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlQcm9ncmVzc0JhciBiYXIgPSBuZXcgUHJvZ3Jlc3NCYXIgKHNoZWxsLCBTV1QuU01PT1RIKTsKLQliYXIuc2V0Qm91bmRzICgxMCwgMTAsIDIwMCwgMzIpOwotCXNoZWxsLm9wZW4gKCk7Ci0JZm9yIChpbnQgaT0wOyBpPD1iYXIuZ2V0TWF4aW11bSAoKTsgaSsrKSB7Ci0JCXRyeSB7VGhyZWFkLnNsZWVwICgxMDApO30gY2F0Y2ggKFRocm93YWJsZSB0aCkge30KLQkJYmFyLnNldFNlbGVjdGlvbiAoaSk7Ci0JfQotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkxNDQxNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sQmFyIGV4YW1wbGUgc25pcHBldDogcGxhY2UgYSBjb21ibyBib3ggaW4gYSB0b29sIGJhcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDU4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRvb2xCYXIgYmFyID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGJhciwgMCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQlUb29sSXRlbSBzZXAgPSBuZXcgVG9vbEl0ZW0gKGJhciwgU1dULlNFUEFSQVRPUik7Ci0JaW50IHN0YXJ0ID0gYmFyLmdldEl0ZW1Db3VudCAoKTsKLQlmb3IgKGludCBpPXN0YXJ0OyBpPHN0YXJ0KzQ7IGkrKykgewotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtIChiYXIsIDApOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8gKGJhciwgU1dULlJFQURfT05MWSk7Ci0JZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQljb21iby5hZGQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JY29tYm8ucGFjayAoKTsKLQlzZXAuc2V0V2lkdGggKGNvbWJvLmdldFNpemUgKCkueCk7Ci0Jc2VwLnNldENvbnRyb2wgKGNvbWJvKTsKLQliYXIucGFjayAoKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzhkYWNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIExpc3QgZXhhbXBsZSBzbmlwcGV0OiBwcmludCBzZWxlY3RlZCBpdGVtcyBpbiBhIGxpc3QKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1OSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBMaXN0IGxpc3QgPSBuZXcgTGlzdCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTwxMjg7IGkrKykgbGlzdC5hZGQgKCJJdGVtICIgKyBpKTsKLQlsaXN0LnNldEJvdW5kcyAoMCwgMCwgMTAwLCAxMDApOwotCWxpc3QuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JCQlpbnQgW10gc2VsZWN0aW9uID0gbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgc3RyaW5nICs9IHNlbGVjdGlvbiBbaV0gKyAiICI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJTZWxlY3Rpb249eyIgKyBzdHJpbmcgKyAifSIpOwotCQl9Ci0JfSk7Ci0JbGlzdC5hZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JCQlpbnQgW10gc2VsZWN0aW9uID0gbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgc3RyaW5nICs9IHNlbGVjdGlvbiBbaV0gKyAiICI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJEZWZhdWx0U2VsZWN0aW9uPXsiICsgc3RyaW5nICsgIn0iKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzMyNDc3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogR3JpZExheW91dCBleGFtcGxlIHNuaXBwZXQ6IGluc2VydCB3aWRnZXRzIGludG8gYSBncmlkIGxheW91dAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLSAgICBmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0gICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgIGZpbmFsIENvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgYy5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICAgICAgQnV0dG9uIGIgPSBuZXcgQnV0dG9uKGMsIFNXVC5QVVNIKTsKLSAgICAgICAgYi5zZXRUZXh0KCJCdXR0b24gIitpKTsKLSAgICB9Ci0KLSAgICBCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLSAgICBiLnNldFRleHQoImFkZCBhIG5ldyBidXR0b24gYXQgcm93IDIgY29sdW1uIDEiKTsKLSAgICBmaW5hbCBpbnRbXSBpbmRleCA9IG5ldyBpbnRbMV07Ci0gICAgYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLSAgICAgICAgICAgIEJ1dHRvbiBzID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0gICAgICAgICAgICBzLnNldFRleHQoIlNwZWNpYWwgIitpbmRleFswXSk7Ci0gICAgICAgICAgICBpbmRleFswXSsrOwotICAgICAgICAgICAgQ29udHJvbFtdIGNoaWxkcmVuID0gYy5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgcy5tb3ZlQWJvdmUoY2hpbGRyZW5bM10pOwotICAgICAgICAgICAgc2hlbGwubGF5b3V0KG5ldyBDb250cm9sW10ge3N9KTsKLSAgICAgICAgfQotICAgIH0pOwotCi0gICAgc2hlbGwub3BlbiAoKTsKLSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLSAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLSAgICB9Ci0gICAgZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmJjZTEyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERpc3BsYXkgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgdHdvIG9uZSBzaG90IHRpbWVycyAoNTAwMCBtcywgMjAwMCBtcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2MCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlkaXNwbGF5LnRpbWVyRXhlYyAoNTAwMCwgbmV3IFJ1bm5hYmxlICgpIHsKLQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIjUwMDAiKTsKLQkJfQotCX0pOwotCWRpc3BsYXkudGltZXJFeGVjICgyMDAwLCBuZXcgUnVubmFibGUgKCkgewotCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiMjAwMCIpOwotCQl9Ci0JfSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDgyODgwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBwcmludCBzZWxlY3RlZCBpdGVtcyBpbiBhIHRyZWUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbTAgPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIDApOwotCQlpdGVtMC5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JCWZvciAoaW50IGo9MDsgajw0OyBqKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0xID0gbmV3IFRyZWVJdGVtIChpdGVtMCwgMCk7Ci0JCQlpdGVtMS5zZXRUZXh0ICgiU3ViSXRlbSAiICsgaSArICIgIiArIGopOwotCQkJZm9yIChpbnQgaz0wOyBrPDQ7IGsrKykgewotCQkJCVRyZWVJdGVtIGl0ZW0yID0gbmV3IFRyZWVJdGVtIChpdGVtMSwgMCk7Ci0JCQkJaXRlbTIuc2V0VGV4dCAoIlN1Ykl0ZW0gIiArIGkgKyAiICIgKyBqICsgIiAiICsgayk7Ci0JCQl9CQotCQl9Ci0JfQotCXRyZWUuc2V0Qm91bmRzICgwLCAwLCAxMDAsIDEwMCk7Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJCVRyZWVJdGVtIFtdIHNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgc3RyaW5nICs9IHNlbGVjdGlvbiBbaV0gKyAiICI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJTZWxlY3Rpb249eyIgKyBzdHJpbmcgKyAifSIpOwotCQl9Ci0JfSk7Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JCQlUcmVlSXRlbSBbXSBzZWxlY3Rpb24gPSB0cmVlLmdldFNlbGVjdGlvbiAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHN0cmluZyArPSBzZWxlY3Rpb24gW2ldICsgIiAiOwotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRGVmYXVsdFNlbGVjdGlvbj17IiArIHN0cmluZyArICJ9Iik7Ci0JCX0KLQl9KTsKLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuRXhwYW5kLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRXhwYW5kPXsiICsgZS5pdGVtICsgIn0iKTsKLQkJfQotCX0pOwotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5Db2xsYXBzZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkNvbGxhcHNlPXsiICsgZS5pdGVtICsgIn0iKTsKLQkJfQotCX0pOwotCXRyZWUuZ2V0SXRlbXMgKCkgWzBdLnNldEV4cGFuZGVkICh0cnVlKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWZiZWM5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDb250cm9sIGV4YW1wbGUgc25pcHBldDogcHJpbnQgbW91c2Ugc3RhdGUgYW5kIGJ1dHRvbiAoZG93biwgbW92ZSwgdXApCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIlVua25vd24iOwotCQkJc3dpdGNoIChlLnR5cGUpIHsKLQkJCQljYXNlIFNXVC5Nb3VzZURvd246IHN0cmluZyA9ICJET1dOIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VNb3ZlOiBzdHJpbmcgPSAiTU9WRSI7IGJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlVXA6IHN0cmluZyA9ICJVUCI7IGJyZWFrOwotCQkJfQotCQkJc3RyaW5nICs9IjogYnV0dG9uOiAiICsgZS5idXR0b24gKyAiLCAiOwotCQkJc3RyaW5nICs9ICJzdGF0ZU1hc2s9MHgiICsgSW50ZWdlci50b0hleFN0cmluZyAoZS5zdGF0ZU1hc2spOwotCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5CVVRUT04xKSAhPSAwKSBzdHJpbmcgKz0gIiBCVVRUT04xIjsKLQkJCWlmICgoZS5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9OMikgIT0gMCkgc3RyaW5nICs9ICIgQlVUVE9OMiI7Ci0JCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULkJVVFRPTjMpICE9IDApIHN0cmluZyArPSAiIEJVVFRPTjMiOwotCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5CVVRUT040KSAhPSAwKSBzdHJpbmcgKz0gIiBCVVRUT040IjsKLQkJCWlmICgoZS5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9ONSkgIT0gMCkgc3RyaW5nICs9ICIgQlVUVE9ONSI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKHN0cmluZyk7Ci0JCX0KLQl9OwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZU1vdmUsIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlVXAsIGxpc3RlbmVyKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGQ3NzMxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgZGlhbG9nIHNoZWxsIChwcm9tcHQgZm9yIGEgdmFsdWUpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDYzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlmaW5hbCBib29sZWFuIFtdIHJlc3VsdCA9IG5ldyBib29sZWFuIFsxXTsKLQlmaW5hbCBTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCWRpYWxvZy5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCWZpbmFsIEJ1dHRvbiBvayA9IG5ldyBCdXR0b24gKGRpYWxvZywgU1dULlBVU0gpOwotCW9rLnNldFRleHQgKCJPayIpOwotCUJ1dHRvbiBjYW5jZWwgPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQljYW5jZWwuc2V0VGV4dCAoIkNhbmNlbCIpOwotCUxpc3RlbmVyIGxpc3RlbmVyID1uZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXJlc3VsdCBbMF0gPSBldmVudC53aWRnZXQgPT0gb2s7Ci0JCQlkaWFsb2cuY2xvc2UgKCk7Ci0JCX0KLQl9OwotCW9rLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JY2FuY2VsLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JZGlhbG9nLnBhY2sgKCk7Ci0JZGlhbG9nLm9wZW4gKCk7Ci0JU3lzdGVtLm91dC5wcmludGxuICgiUHJvbXB0IC4uLiIpOwotCXdoaWxlICghZGlhbG9nLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JU3lzdGVtLm91dC5wcmludGxuICgiUmVzdWx0OiAiICsgcmVzdWx0IFswXSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YThkYjEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IHByaW50IHNlbGVjdGVkIGl0ZW1zIGluIGEgdGFibGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTwxNjsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIDApOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdGFibGUuc2V0Qm91bmRzICgwLCAwLCAxMDAsIDEwMCk7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JCQlUYWJsZUl0ZW0gW10gc2VsZWN0aW9uID0gdGFibGUuZ2V0U2VsZWN0aW9uICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgc3RyaW5nICs9IHNlbGVjdGlvbiBbaV0gKyAiICI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJTZWxlY3Rpb249eyIgKyBzdHJpbmcgKyAifSIpOwotCQl9Ci0JfSk7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQkJVGFibGVJdGVtIFtdIHNlbGVjdGlvbiA9IHRhYmxlLmdldFNlbGVjdGlvbiAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHN0cmluZyArPSBzZWxlY3Rpb24gW2ldICsgIiAiOwotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRGVmYXVsdFNlbGVjdGlvbj17IiArIHN0cmluZyArICJ9Iik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2I2N2E3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBGb3JtTGF5b3V0IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgc2ltcGxlIGRpYWxvZyB1c2luZyBmb3JtIGxheW91dAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5XUkFQKTsKLQlsYWJlbC5zZXRUZXh0ICgiVGhpcyBpcyBhIGxvbmcgdGV4dCBzdHJpbmcgdGhhdCB3aWxsIHdyYXAgd2hlbiB0aGUgZGlhbG9nIGlzIHJlc2l6ZWQuIik7Ci0JTGlzdCBsaXN0ID0gbmV3IExpc3QgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlsaXN0LnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiSXRlbSAxIiwgIkl0ZW0yIn0pOwotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24xLnNldFRleHQgKCJPayIpOwotCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24yLnNldFRleHQgKCJDYW5jZWwiKTsKLQkKLQlmaW5hbCBpbnQgaW5zZXRYID0gNCwgaW5zZXRZID0gNDsKLQlGb3JtTGF5b3V0IGZvcm1MYXlvdXQgPSBuZXcgRm9ybUxheW91dCAoKTsKLQlmb3JtTGF5b3V0Lm1hcmdpbldpZHRoID0gaW5zZXRYOwotCWZvcm1MYXlvdXQubWFyZ2luSGVpZ2h0ID0gaW5zZXRZOwotCXNoZWxsLnNldExheW91dCAoZm9ybUxheW91dCk7Ci0JCi0JUG9pbnQgc2l6ZSA9IGxhYmVsLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCWZpbmFsIEZvcm1EYXRhIGxhYmVsRGF0YSA9IG5ldyBGb3JtRGF0YSAoc2l6ZS54LCBTV1QuREVGQVVMVCk7Ci0JbGFiZWxEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCWxhYmVsRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhIChsYWJlbERhdGEpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhICgpOwotCQkJbGFiZWxEYXRhLndpZHRoID0gcmVjdC53aWR0aCAtIGluc2V0WCAqIDI7Ci0JCQlzaGVsbC5sYXlvdXQgKCk7Ci0JCX0KLQl9KTsKLQkJCi0JRm9ybURhdGEgYnV0dG9uMkRhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JYnV0dG9uMkRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgLWluc2V0WCk7Ci0JYnV0dG9uMkRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50ICgxMDAsIDApOwotCWJ1dHRvbjIuc2V0TGF5b3V0RGF0YSAoYnV0dG9uMkRhdGEpOwotCQotCUZvcm1EYXRhIGJ1dHRvbjFEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCWJ1dHRvbjFEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50IChidXR0b24yLCAtaW5zZXRYKTsKLQlidXR0b24xRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JYnV0dG9uMS5zZXRMYXlvdXREYXRhIChidXR0b24xRGF0YSk7Ci0JCi0JRm9ybURhdGEgbGlzdERhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JbGlzdERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMCwgMCk7Ci0JbGlzdERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JbGlzdERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50IChsYWJlbCwgaW5zZXRZKTsKLQlsaXN0RGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGJ1dHRvbjIsIC1pbnNldFkpOwotCWxpc3Quc2V0TGF5b3V0RGF0YSAobGlzdERhdGEpOwotCQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMjhmODcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogR0MgZXhhbXBsZSBzbmlwcGV0OiBpbXBsZW1lbnQgYSBzaW1wbGUgc2NyaWJibGUgcHJvZ3JhbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJaW50IGxhc3RYID0gMCwgbGFzdFkgPSAwOwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJCWNhc2UgU1dULk1vdXNlTW92ZToKLQkJCQkJaWYgKChldmVudC5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9OMSkgPT0gMCkgYnJlYWs7Ci0JCQkJCUdDIGdjID0gbmV3IEdDIChzaGVsbCk7Ci0JCQkJCWdjLmRyYXdMaW5lIChsYXN0WCwgbGFzdFksIGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCQlnYy5kaXNwb3NlICgpOwotCQkJCQkvL0ZBTEwgVEhST1VHSAotCQkJCWNhc2UgU1dULk1vdXNlRG93bjoKLQkJCQkJbGFzdFggPSBldmVudC54OwotCQkJCQlsYXN0WSA9IGV2ZW50Lnk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCBsaXN0ZW5lcik7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMTRlOWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IHBsYWNlIGEgZHJvcCBkb3duIG1lbnUgaW4gYSB0b29sIGJhcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULk5PTkUpOwotCWZpbmFsIE1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JZm9yIChpbnQgaT0wOyBpPDg7IGkrKykgewotCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQlmaW5hbCBUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQlpdGVtLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gU1dULkFSUk9XKSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyAoKTsKLQkJCQlQb2ludCBwdCA9IG5ldyBQb2ludCAocmVjdC54LCByZWN0LnkgKyByZWN0LmhlaWdodCk7Ci0JCQkJcHQgPSB0b29sQmFyLnRvRGlzcGxheSAocHQpOwotCQkJCW1lbnUuc2V0TG9jYXRpb24gKHB0LngsIHB0LnkpOwotCQkJCW1lbnUuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQl0b29sQmFyLnBhY2sgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQltZW51LmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NTJiMWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIERpc3BsYXkgZXhhbXBsZSBzbmlwcGV0OiBzdG9wIGEgcmVwZWF0aW5nIHRpbWVyIHdoZW4gYSBidXR0b24gaXMgcHJlc3NlZAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2OCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIENvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCWZpbmFsIENvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxVRSk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJTdG9wIFRpbWVyIik7Ci0JZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsYWJlbC5zZXRCYWNrZ3JvdW5kIChyZWQpOwotCWZpbmFsIGludCB0aW1lID0gNTAwOwotCWZpbmFsIFJ1bm5hYmxlIHRpbWVyID0gbmV3IFJ1bm5hYmxlICgpIHsKLQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCWlmIChsYWJlbC5pc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0JCQlDb2xvciBjb2xvciA9IGxhYmVsLmdldEJhY2tncm91bmQgKCkuZXF1YWxzIChyZWQpID8gYmx1ZSA6IHJlZDsKLQkJCWxhYmVsLnNldEJhY2tncm91bmQgKGNvbG9yKTsKLQkJCWRpc3BsYXkudGltZXJFeGVjICh0aW1lLCB0aGlzKTsKLQkJfQotCX07Ci0JZGlzcGxheS50aW1lckV4ZWMgKHRpbWUsIHRpbWVyKTsKLQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJZGlzcGxheS50aW1lckV4ZWMgKC0xLCB0aW1lcik7Ci0JCX0KLQl9KTsKLQlidXR0b24ucGFjayAoKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhIChuZXcgUm93RGF0YSAoYnV0dG9uLmdldFNpemUgKCkpKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGJmOTk5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEZvcm1MYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiBjZW50ZXIgYSBsYWJlbCBhbmQgc2luZ2xlIGxpbmUgdGV4dCB1c2luZyBhIGZvcm0gbGF5b3V0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULk5PTkUgfCBTV1QuQk9SREVSKTsKLQlsYWJlbC5zZXRUZXh0ICgiTmFtZSIpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULk5PTkUpOwotCi0JRm9ybUxheW91dCBsYXlvdXQgPSBuZXcgRm9ybUxheW91dCAoKTsKLQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKLQlzaGVsbC5zZXRMYXlvdXQgKGxheW91dCk7Ci0KLQlHQyBnYyA9IG5ldyBHQyAodGV4dCk7Ci0JRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcyAoKTsKLQlpbnQgY2hhcldpZHRoID0gZm0uZ2V0QXZlcmFnZUNoYXJXaWR0aCAoKTsKLQlpbnQgd2lkdGggPSB0ZXh0LmNvbXB1dGVTaXplIChjaGFyV2lkdGggKiA4LCBTV1QuREVGQVVMVCkueDsKLQlnYy5kaXNwb3NlICgpOwotCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEgKHdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JdGV4dC5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGxhYmVsLCA1KTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCAobGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4MzYzZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdGFibGUgKGxhenkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDcgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDE2LCAxNik7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoaW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0ICgiTGF6eSBUYWJsZSIpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkICgpIHsKLQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCWZvciAoaW50IGk9MDsgaTwyMDAwMDsgaSsrKSB7Ci0JCQkJaWYgKHRhYmxlLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJCQlmaW5hbCBpbnQgW10gaW5kZXggPSBuZXcgaW50IFtdIHtpfTsKLQkJCQlkaXNwbGF5LnN5bmNFeGVjIChuZXcgUnVubmFibGUgKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJCQkJaWYgKHRhYmxlLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJCQkJCWl0ZW0uc2V0VGV4dCAoIlRhYmxlIEl0ZW0gIiArIGluZGV4IFswXSk7Ci0JCQkJCQlpdGVtLnNldEltYWdlIChpbWFnZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX07Ci0JdGhyZWFkLnN0YXJ0ICgpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYzI3NzkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogR0MgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYW4gaWNvbiAoaW4gbWVtb3J5KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDcwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGJsYWNrID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMQUNLKTsKLQkKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKHJlZCk7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoNSwgNSwgMTAsIDEwKTsKLQlnYy5kaXNwb3NlICgpOwotCUltYWdlRGF0YSBpbWFnZURhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEgKCk7Ci0JCi0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YSAoCi0JCW5ldyBSR0IgW10gewotCQkJbmV3IFJHQiAoMCwgMCwgMCksCi0JCQluZXcgUkdCICgweEZGLCAweEZGLCAweEZGKSwKLQkJfSk7Ci0JSW1hZ2VEYXRhIG1hc2tEYXRhID0gbmV3IEltYWdlRGF0YSAoMjAsIDIwLCAxLCBwYWxldHRlKTsKLQlJbWFnZSBtYXNrID0gbmV3IEltYWdlIChkaXNwbGF5LCBtYXNrRGF0YSk7Ci0JZ2MgPSBuZXcgR0MgKG1hc2spOwotCWdjLnNldEJhY2tncm91bmQgKGJsYWNrKTsKLQlnYy5maWxsUmVjdGFuZ2xlICgwLCAwLCAyMCwgMjApOwotCWdjLnNldEJhY2tncm91bmQgKHdoaXRlKTsKLQlnYy5maWxsUmVjdGFuZ2xlICg1LCA1LCAxMCwgMTApOwotCWdjLmRpc3Bvc2UgKCk7Ci0JbWFza0RhdGEgPSBtYXNrLmdldEltYWdlRGF0YSAoKTsKLQkKLQlJbWFnZSBpY29uID0gbmV3IEltYWdlIChkaXNwbGF5LCBpbWFnZURhdGEsIG1hc2tEYXRhKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldEltYWdlIChpY29uKTsKLQlidXR0b24uc2V0U2l6ZSAoNjAsIDYwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpY29uLmRpc3Bvc2UgKCk7Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQltYXNrLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMGQ0ZmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRm9ybUxheW91dCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHNpbXBsZSBPSy9DQU5DRUwgZGlhbG9nIHVzaW5nIGZvcm0gbGF5b3V0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDcxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0pOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChkaWFsb2csIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0ICgiRXhpdCB0aGUgYXBwbGljYXRpb24/Iik7Ci0JQnV0dG9uIG9rQnV0dG9uID0gbmV3IEJ1dHRvbiAoZGlhbG9nLCBTV1QuUFVTSCk7Ci0Jb2tCdXR0b24uc2V0VGV4dCAoIiZPSyIpOwotCUJ1dHRvbiBjYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQljYW5jZWxCdXR0b24uc2V0VGV4dCAoIiZDYW5jZWwiKTsKLQkKLQlGb3JtTGF5b3V0IGZvcm0gPSBuZXcgRm9ybUxheW91dCAoKTsKLQlmb3JtLm1hcmdpbldpZHRoID0gZm9ybS5tYXJnaW5IZWlnaHQgPSA4OwotCWRpYWxvZy5zZXRMYXlvdXQgKGZvcm0pOwotCUZvcm1EYXRhIG9rRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlva0RhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50IChsYWJlbCwgOCk7Ci0Jb2tCdXR0b24uc2V0TGF5b3V0RGF0YSAob2tEYXRhKTsKLQlGb3JtRGF0YSBjYW5jZWxEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCWNhbmNlbERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAob2tCdXR0b24sIDgpOwotCWNhbmNlbERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50IChva0J1dHRvbiwgMCwgU1dULlRPUCk7Ci0JY2FuY2VsQnV0dG9uLnNldExheW91dERhdGEgKGNhbmNlbERhdGEpOwotCQotCWRpYWxvZy5zZXREZWZhdWx0QnV0dG9uIChva0J1dHRvbik7Ci0JZGlhbG9nLnBhY2sgKCk7Ci0JZGlhbG9nLm9wZW4gKCk7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDZjODlhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEZpbGVEaWFsb2cgZXhhbXBsZSBzbmlwcGV0OiBwcm9tcHQgZm9yIGEgZmlsZSBuYW1lICh0byBzYXZlKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDcyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0JRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyAoc2hlbGwsIFNXVC5TQVZFKTsKLQlkaWFsb2cuc2V0RmlsdGVyTmFtZXMgKG5ldyBTdHJpbmcgW10geyJCYXRjaCBGaWxlcyIsICJBbGwgRmlsZXMgKCouKikifSk7Ci0JZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMgKG5ldyBTdHJpbmcgW10geyIqLmJhdCIsICIqLioifSk7IC8vV2luZG93cyB3aWxkIGNhcmRzCi0JZGlhbG9nLnNldEZpbHRlclBhdGggKCJjOlxcIik7IC8vV2luZG93cyBwYXRoCi0JZGlhbG9nLnNldEZpbGVOYW1lICgiZnJlZC5iYXQiKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJTYXZlIHRvOiAiICsgZGlhbG9nLm9wZW4gKCkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDczLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkODU1Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBNZW51IGV4YW1wbGUgc25pcHBldDogZW5hYmxlIG1lbnUgaXRlbXMgZHluYW1pY2FsbHkgKHdoZW4gbWVudSBzaG93bikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCWZpbmFsIE1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JdHJlZS5zZXRNZW51IChtZW51KTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUcmVlSXRlbSB0cmVlSXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5PTkUpOwotCQl0cmVlSXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JCU1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCW1lbnVJdGVtLnNldFRleHQgKHRyZWVJdGVtLmdldFRleHQgKCkpOwotCX0KLQltZW51LmFkZExpc3RlbmVyIChTV1QuU2hvdywgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlNZW51SXRlbSBbXSBtZW51SXRlbXMgPSBtZW51LmdldEl0ZW1zICgpOwotCQkJVHJlZUl0ZW0gW10gdHJlZUl0ZW1zID0gdHJlZS5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8bWVudUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBtZW51SXRlbXMgW2ldLmdldFRleHQgKCk7Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQl3aGlsZSAoaW5kZXg8dHJlZUl0ZW1zLmxlbmd0aCkgewotCQkJCQlpZiAodHJlZUl0ZW1zIFtpbmRleF0uZ2V0VGV4dCAoKS5lcXVhbHMgKHRleHQpKSBicmVhazsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQkJbWVudUl0ZW1zIFtpXS5zZXRFbmFibGVkIChpbmRleCAhPSB0cmVlSXRlbXMubGVuZ3RoKTsKLQkJCX0KLQkJfQotCX0pOwotCXRyZWUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4YmRiMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDYXJldCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGNhcmV0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQ2FyZXQgY2FyZXQgPSBuZXcgQ2FyZXQgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JY2FyZXQuc2V0Qm91bmRzICgxMCwgMTAsIDIsIDMyKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxNzgwZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb21wb3NpdGUgZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIHRhYiB0cmF2ZXJzYWwgb3JkZXIgb2YgY2hpbGRyZW4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQkKLQlDb21wb3NpdGUgYzEgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JYzEuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlCdXR0b24gYjEgPSBuZXcgQnV0dG9uIChjMSwgU1dULlBVU0gpOwotCWIxLnNldFRleHQgKCJCMSIpOwotCUJ1dHRvbiBbXSByYWRpb3MgPSBuZXcgQnV0dG9uIFszXTsKLQlmb3IgKGludCBpPTA7IGk8cmFkaW9zLmxlbmd0aDsgaSsrKSB7Ci0JCXJhZGlvcyBbaV0gPSBuZXcgQnV0dG9uIChjMSwgU1dULlJBRElPKTsKLQkJcmFkaW9zIFtpXS5zZXRUZXh0ICgiUiIgKyAoaSA9PTEgPyAiJiIgOiAiIikgKyBpKTsKLQl9Ci0JQnV0dG9uIGIyID0gbmV3IEJ1dHRvbiAoYzEsIFNXVC5QVVNIKTsKLQliMi5zZXRUZXh0ICgiQjIiKTsKLQlMaXN0IGwxID0gbmV3IExpc3QgKGMxLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JbDEuc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyJMMSJ9KTsKLQlCdXR0b24gYjMgPSBuZXcgQnV0dG9uIChjMSwgU1dULlBVU0gpOwotCWIzLnNldFRleHQgKCJCJjMiKTsKLQlCdXR0b24gYjNfMSA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUFVTSCk7Ci0JYjNfMS5zZXRUZXh0ICgiQjNfMSIpOwotCQotCUNvbXBvc2l0ZSBjMiA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljMi5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUJ1dHRvbiBiNCA9IG5ldyBCdXR0b24gKGMyLCBTV1QuUFVTSCk7Ci0JYjQuc2V0VGV4dCAoIkImNCIpOwotCUJ1dHRvbiBiNSA9IG5ldyBCdXR0b24gKGMyLCBTV1QuUFVTSCk7Ci0JYjUuc2V0VGV4dCAoIkImNSIpOwotCQotCUxpc3QgbDIgPSBuZXcgTGlzdCAoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQlsMi5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IkwyIn0pOwotCQotCVRvb2xCYXIgdGIxID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuRkxBVCB8IFNXVC5CT1JERVIpOwotCVRvb2xJdGVtIGkxID0gbmV3IFRvb2xJdGVtICh0YjEsIFNXVC5SQURJTyk7Ci0JaTEuc2V0VGV4dCAoIkkxIik7Ci0JVG9vbEl0ZW0gaTIgPSBuZXcgVG9vbEl0ZW0gKHRiMSwgU1dULlJBRElPKTsKLQlpMi5zZXRUZXh0ICgiSSYyIik7Ci0JQ29tYm8gY29tYm8xID0gbmV3IENvbWJvICh0YjEsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQljb21ibzEuc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyJDMSJ9KTsKLQljb21ibzEuc2V0VGV4dCAoIkMxIik7Ci0JY29tYm8xLnBhY2sgKCk7Ci0JVG9vbEl0ZW0gaTMgPSBuZXcgVG9vbEl0ZW0gKHRiMSwgU1dULlNFUEFSQVRPUik7Ci0JaTMuc2V0V2lkdGggKGNvbWJvMS5nZXRTaXplICgpLngpOwotCWkzLnNldENvbnRyb2wgKGNvbWJvMSk7Ci0JaTMuc2V0VGV4dCAoIkkzIik7Ci0JVG9vbEl0ZW0gaTQgPSBuZXcgVG9vbEl0ZW0gKHRiMSwgU1dULlBVU0gpOwotCWk0LnNldFRleHQgKCJJNCIpOwotCVRvb2xJdGVtIGk1ID0gbmV3IFRvb2xJdGVtICh0YjEsIFNXVC5DSEVDSyk7Ci0JaTUuc2V0VGV4dCAoIkk1Iik7Ci0JCi0JQnV0dG9uIGI2ID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQliNi5zZXRUZXh0ICgiQiY2Iik7Ci0JCi0JQ29tcG9zaXRlIGM0ID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWM0LnNldFNpemUgKDMyLCAzMik7Ci0JQ29tcG9zaXRlIGM1ID0gbmV3IENvbXBvc2l0ZSAoYzQsIFNXVC5CT1JERVIpOwotCWM1LnNldFNpemUgKDIwLCAyMCk7Ci0KLQlDb250cm9sIFtdIGxpc3QxID0gbmV3IENvbnRyb2wgW10ge2IyLCBiMSwgYjNfMSwgYjN9OwotCWMxLnNldFRhYkxpc3QgKGxpc3QxKTsKLQlDb250cm9sIFtdIGxpc3QyID0gbmV3IENvbnRyb2wgW10ge2MxLCBiNiwgdGIxLCBjNCwgYzIsIGwyfTsKLQlzaGVsbC5zZXRUYWJMaXN0IChsaXN0Mik7Ci0KLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmE1ODBlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYkZvbGRlciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYiBmb2xkZXIgKHNpeCBwYWdlcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3NiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUYWJGb2xkZXIgdGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTw2OyBpKyspIHsKLQkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0gKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJUYWJJdGVtICIgKyBpKTsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHRhYkZvbGRlciwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCAoIlBhZ2UgIiArIGkpOwotCQlpdGVtLnNldENvbnRyb2wgKGJ1dHRvbik7Ci0JfQotCXRhYkZvbGRlci5zZXRTaXplICg0MDAsIDIwMCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI1NTMyOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IHJlc2l6ZSBjb2x1bW5zIGFzIHRhYmxlIHJlc2l6ZXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDc3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkKLQlmaW5hbCBDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShjb21wLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JY29sdW1uMS5zZXRUZXh0KCJDb2x1bW4gMSIpOwotCWZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4yLnNldFRleHQoIkNvbHVtbiAyIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiaXRlbSAwIiArIGksICJpdGVtIDEiK2l9KTsKLQl9Ci0JY29tcC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJUmVjdGFuZ2xlIGFyZWEgPSBjb21wLmdldENsaWVudEFyZWEoKTsKLQkJCVBvaW50IHByZWZlcnJlZFNpemUgPSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIqdGFibGUuZ2V0Qm9yZGVyV2lkdGgoKTsKLQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCArIHRhYmxlLmdldEhlYWRlckhlaWdodCgpKSB7Ci0JCQkJLy8gU3VidHJhY3QgdGhlIHNjcm9sbGJhciB3aWR0aCBmcm9tIHRoZSB0b3RhbCBjb2x1bW4gd2lkdGgKLQkJCQkvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0JCQkJUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLQkJCQl3aWR0aCAtPSB2QmFyU2l6ZS54OwotCQkJfQotCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCWlmIChvbGRTaXplLnggPiBhcmVhLndpZHRoKSB7Ci0JCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMgCi0JCQkJLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0JCQkJLy8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aC8zKTsKLQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC0gY29sdW1uMS5nZXRXaWR0aCgpKTsKLQkJCQl0YWJsZS5zZXRTaXplKGFyZWEud2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBiaWdnZXIgc28gbWFrZSB0aGUgdGFibGUgCi0JCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkvLyB0byBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQl0YWJsZS5zZXRTaXplKGFyZWEud2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoLzMpOwotCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLSBjb2x1bW4xLmdldFdpZHRoKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxZGE5MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZHJhZyB0ZXh0IGJldHdlZW4gdHdvIGxhYmVscwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIExhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWxhYmVsMS5zZXRUZXh0ICgiVEVYVCIpOwotCWZpbmFsIExhYmVsIGxhYmVsMiA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCXNldERyYWdEcm9wIChsYWJlbDEpOwotCXNldERyYWdEcm9wIChsYWJlbDIpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci1wdWJsaWMgc3RhdGljIHZvaWQgc2V0RHJhZ0Ryb3AgKGZpbmFsIExhYmVsIGxhYmVsKSB7Ci0JCi0JVHJhbnNmZXJbXSB0eXBlcyA9IG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX07Ci0JaW50IG9wZXJhdGlvbnMgPSBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTks7Ci0JCi0JZmluYWwgRHJhZ1NvdXJjZSBzb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZSAobGFiZWwsIG9wZXJhdGlvbnMpOwotCXNvdXJjZS5zZXRUcmFuc2Zlcih0eXBlcyk7Ci0Jc291cmNlLmFkZERyYWdMaXN0ZW5lciAobmV3IERyYWdTb3VyY2VMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmRvaXQgPSAobGFiZWwuZ2V0VGV4dCAoKS5sZW5ndGggKCkgIT0gMCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEgKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJZXZlbnQuZGF0YSA9IGxhYmVsLmdldFRleHQgKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9NT1ZFKQotCQkJCWxhYmVsLnNldFRleHQgKCIiKTsKLQkJfQotCX0pOwotCi0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldChsYWJlbCwgb3BlcmF0aW9ucyk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKHR5cGVzKTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyIChuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGF0YSA9PSBudWxsKSB7Ci0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlsYWJlbC5zZXRUZXh0ICgoU3RyaW5nKSBldmVudC5kYXRhKTsKLQkJfQotCX0pOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1ZDM1Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRlZmluZSBteSBvd24gZGF0YSB0cmFuc2ZlciB0eXBlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDc5IHsKLQotLyogVGhlIGRhdGEgYmVpbmcgdHJhbnNmZXJyZWQgaXMgYW4gPGJvbGQ+YXJyYXkgb2YgdHlwZSBNeVR5cGU8L2JvbGQ+IHdoZXJlIE15VHlwZSBpcyBkZWZpbmUgYXM6ICovCi1zdGF0aWMgY2xhc3MgTXlUeXBlIHsKLQlTdHJpbmcgZmlsZU5hbWU7Ci0JbG9uZyBmaWxlTGVuZ3RoOwotCWxvbmcgbGFzdE1vZGlmaWVkOwotfQotCi1zdGF0aWMgY2xhc3MgTXlUcmFuc2ZlciBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNWVRZUEVOQU1FID0gIm5hbWVfZm9yX215X3R5cGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNWVRZUEVJRCA9IHJlZ2lzdGVyVHlwZSAoTVlUWVBFTkFNRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgTXlUcmFuc2ZlciBfaW5zdGFuY2UgPSBuZXcgTXlUcmFuc2ZlciAoKTsKLQotcHVibGljIHN0YXRpYyBNeVRyYW5zZmVyIGdldEluc3RhbmNlICgpIHsKLQlyZXR1cm4gX2luc3RhbmNlOwotfQotCi1wdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUgKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQlpZiAoIWNoZWNrTXlUeXBlKG9iamVjdCkgfHwgIWlzU3VwcG9ydGVkVHlwZSAodHJhbnNmZXJEYXRhKSkgewotCQlETkQuZXJyb3IoRE5ELkVSUk9SX0lOVkFMSURfREFUQSk7Ci0JfQotCU15VHlwZSBbXSBteVR5cGVzID0gKE15VHlwZSBbXSkgb2JqZWN0OwotCXRyeSB7Ci0JCS8vIHdyaXRlIGRhdGEgdG8gYSBieXRlIGFycmF5IGFuZCB0aGVuIGFzayBzdXBlciB0byBjb252ZXJ0IHRvIHBNZWRpdW0KLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gKCk7Ci0JCURhdGFPdXRwdXRTdHJlYW0gd3JpdGVPdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbSAob3V0KTsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG15VHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWJ5dGUgW10gYnVmZmVyID0gbXlUeXBlcyBbaV0uZmlsZU5hbWUuZ2V0Qnl0ZXMgKCk7Ci0JCQl3cml0ZU91dC53cml0ZUludCAoYnVmZmVyLmxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZSAoYnVmZmVyKTsKLQkJCXdyaXRlT3V0LndyaXRlTG9uZyAobXlUeXBlcyBbaV0uZmlsZUxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZUxvbmcgKG15VHlwZXMgW2ldLmxhc3RNb2RpZmllZCk7Ci0JCX0KLQkJYnl0ZSBbXSBidWZmZXIgPSBvdXQudG9CeXRlQXJyYXkgKCk7Ci0JCXdyaXRlT3V0LmNsb3NlICgpOwotCQlzdXBlci5qYXZhVG9OYXRpdmUgKGJ1ZmZlciwgdHJhbnNmZXJEYXRhKTsKLQl9Ci0JY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci19Ci0KLXB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhIChUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JaWYgKGlzU3VwcG9ydGVkVHlwZSAodHJhbnNmZXJEYXRhKSkgewotCQlieXRlIFtdIGJ1ZmZlciA9IChieXRlIFtdKSBzdXBlci5uYXRpdmVUb0phdmEgKHRyYW5zZmVyRGF0YSk7Ci0JCWlmIChidWZmZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLQkJTXlUeXBlIFtdIG15RGF0YSA9IG5ldyBNeVR5cGUgWzBdOwotCQl0cnkgewotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0gKGJ1ZmZlcik7Ci0JCQlEYXRhSW5wdXRTdHJlYW0gcmVhZEluID0gbmV3IERhdGFJbnB1dFN0cmVhbSAoaW4pOwotCQkJd2hpbGUgKHJlYWRJbi5hdmFpbGFibGUgKCkgPiAyMCkgewotCQkJCU15VHlwZSBkYXR1bSA9IG5ldyBNeVR5cGUgKCk7Ci0JCQkJaW50IHNpemUgPSByZWFkSW4ucmVhZEludCAoKTsKLQkJCQlieXRlIFtdIG5hbWUgPSBuZXcgYnl0ZSBbc2l6ZV07Ci0JCQkJcmVhZEluLnJlYWQgKG5hbWUpOwotCQkJCWRhdHVtLmZpbGVOYW1lID0gbmV3IFN0cmluZyAobmFtZSk7Ci0JCQkJZGF0dW0uZmlsZUxlbmd0aCA9IHJlYWRJbi5yZWFkTG9uZyAoKTsKLQkJCQlkYXR1bS5sYXN0TW9kaWZpZWQgPSByZWFkSW4ucmVhZExvbmcgKCk7Ci0JCQkJTXlUeXBlIFtdIG5ld015RGF0YSA9IG5ldyBNeVR5cGUgW215RGF0YS5sZW5ndGggKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5IChteURhdGEsIDAsIG5ld015RGF0YSwgMCwgbXlEYXRhLmxlbmd0aCk7Ci0JCQkJbmV3TXlEYXRhIFtteURhdGEubGVuZ3RoXSA9IGRhdHVtOwotCQkJCW15RGF0YSA9IG5ld015RGF0YTsKLQkJCX0KLQkJCXJlYWRJbi5jbG9zZSAoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBteURhdGE7Ci0JfQotCi0JcmV0dXJuIG51bGw7Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgW10gZ2V0VHlwZU5hbWVzICgpIHsKLQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7TVlUWVBFTkFNRX07Ci19Ci0KLXByb3RlY3RlZCBpbnQgW10gZ2V0VHlwZUlkcyAoKSB7Ci0JcmV0dXJuIG5ldyBpbnQgW10ge01ZVFlQRUlEfTsKLX0KLQotYm9vbGVhbiBjaGVja015VHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JaWYgKG9iamVjdCA9PSBudWxsIHx8IAotCQkhKG9iamVjdCBpbnN0YW5jZW9mIE15VHlwZVtdKSB8fCAKLQkJKChNeVR5cGVbXSlvYmplY3QpLmxlbmd0aCA9PSAwKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JTXlUeXBlW10gbXlUeXBlcyA9IChNeVR5cGVbXSlvYmplY3Q7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBteVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChteVR5cGVzW2ldID09IG51bGwgfHwgCi0JCQlteVR5cGVzW2ldLmZpbGVOYW1lID09IG51bGwgfHwgCi0JCQlteVR5cGVzW2ldLmZpbGVOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoT2JqZWN0IG9iamVjdCkgewotCXJldHVybiBjaGVja015VHlwZShvYmplY3QpOwotfQotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQlsYWJlbDEuc2V0VGV4dCAoIkRyYWcgU291cmNlIGZvciBNeURhdGFbXSIpOwotCWZpbmFsIExhYmVsIGxhYmVsMiA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JbGFiZWwyLnNldFRleHQgKCJEcm9wIFRhcmdldCBmb3IgTXlEYXRhW10iKTsKLQotCURyYWdTb3VyY2Ugc291cmNlID0gbmV3IERyYWdTb3VyY2UgKGxhYmVsMSwgRE5ELkRST1BfQ09QWSk7Ci0Jc291cmNlLnNldFRyYW5zZmVyIChuZXcgVHJhbnNmZXIgW10ge015VHJhbnNmZXIuZ2V0SW5zdGFuY2UgKCl9KTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyIChuZXcgRHJhZ1NvdXJjZUFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YSAoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlNeVR5cGUgbXlUeXBlMSA9IG5ldyBNeVR5cGUgKCk7Ci0JCQlteVR5cGUxLmZpbGVOYW1lID0gIkM6XFxhYmMudHh0IjsKLQkJCW15VHlwZTEuZmlsZUxlbmd0aCA9IDEwMDA7Ci0JCQlteVR5cGUxLmxhc3RNb2RpZmllZCA9IDEyMzEyMzEzOwotCQkJTXlUeXBlIG15VHlwZTIgPSBuZXcgTXlUeXBlICgpOwotCQkJbXlUeXBlMi5maWxlTmFtZSA9ICJDOlxceHl6LnR4dCI7Ci0JCQlteVR5cGUyLmZpbGVMZW5ndGggPSA1MDA7Ci0JCQlteVR5cGUyLmxhc3RNb2RpZmllZCA9IDEyMzEyMzIzOwotCQkJZXZlbnQuZGF0YSA9IG5ldyBNeVR5cGUgW10ge215VHlwZTEsIG15VHlwZTJ9OwotCQl9Ci0JfSk7Ci0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldCAobGFiZWwyLCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfREVGQVVMVCk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyIChuZXcgVHJhbnNmZXIgW10ge015VHJhbnNmZXIuZ2V0SW5zdGFuY2UgKCl9KTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyIChuZXcgRHJvcFRhcmdldEFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIgKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkIChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgewotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkcm9wIChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kYXRhICE9IG51bGwpIHsKLQkJCQlNeVR5cGUgW10gbXlUeXBlcyA9IChNeVR5cGUgW10pIGV2ZW50LmRhdGE7Ci0JCQkJaWYgKG15VHlwZXMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbXlUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJc3RyaW5nICs9IG15VHlwZXMgW2ldLmZpbGVOYW1lICsgIiAiOwotCQkJCQl9Ci0JCQkJCWxhYmVsMi5zZXRUZXh0IChzdHJpbmcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxMmI3OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdHJlZSAobGF6eSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCAoIkxhenkgVHJlZSIpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JRmlsZSBbXSByb290cyA9IEZpbGUubGlzdFJvb3RzICgpOwotCWZvciAoaW50IGk9MDsgaTxyb290cy5sZW5ndGg7IGkrKykgewotCQlUcmVlSXRlbSByb290ID0gbmV3IFRyZWVJdGVtICh0cmVlLCAwKTsKLQkJcm9vdC5zZXRUZXh0IChyb290cyBbaV0udG9TdHJpbmcgKCkpOwotCQlyb290LnNldERhdGEgKHJvb3RzIFtpXSk7Ci0JCW5ldyBUcmVlSXRlbSAocm9vdCwgMCk7Ci0JfQotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5FeHBhbmQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChmaW5hbCBFdmVudCBldmVudCkgewotCQkJZmluYWwgVHJlZUl0ZW0gcm9vdCA9IChUcmVlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCVRyZWVJdGVtIFtdIGl0ZW1zID0gcm9vdC5nZXRJdGVtcyAoKTsKLQkJCWZvciAoaW50IGk9IDA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaXRlbXMgW2ldLmdldERhdGEgKCkgIT0gbnVsbCkgcmV0dXJuOwotCQkJCWl0ZW1zIFtpXS5kaXNwb3NlICgpOwotCQkJfQotCQkJRmlsZSBmaWxlID0gKEZpbGUpIHJvb3QuZ2V0RGF0YSAoKTsKLQkJCUZpbGUgW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcyAoKTsKLQkJCWlmIChmaWxlcyA9PSBudWxsKSByZXR1cm47Ci0JCQlmb3IgKGludCBpPSAwOyBpPGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSAocm9vdCwgMCk7Ci0JCQkJaXRlbS5zZXRUZXh0IChmaWxlcyBbaV0uZ2V0TmFtZSAoKSk7Ci0JCQkJaXRlbS5zZXREYXRhIChmaWxlcyBbaV0pOwotCQkJCWlmIChmaWxlcyBbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCQluZXcgVHJlZUl0ZW0gKGl0ZW0sIDApOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCVBvaW50IHNpemUgPSB0cmVlLmNvbXB1dGVTaXplICgzMDAsIFNXVC5ERUZBVUxUKTsKLQlpbnQgd2lkdGggPSBNYXRoLm1heCAoMzAwLCBzaXplLngpOwotCWludCBoZWlnaHQgPSBNYXRoLm1heCAoMzAwLCBzaXplLnkpOwotCXNoZWxsLnNldFNpemUgKHNoZWxsLmNvbXB1dGVTaXplICh3aWR0aCwgaGVpZ2h0KSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwNTU4Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogbGltaXQgc2VsZWN0aW9uIHRvIGl0ZW1zIHRoYXQgbWF0Y2ggYSBwYXR0ZXJuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4MCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIml0ZW0gIiArIGkpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IDI7IGorKykgewotCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQlzdWJJdGVtLnNldFRleHQoIml0ZW0gIiArIGopOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCAyOyBrKyspIHsKLQkJCQlUcmVlSXRlbSBzdWJzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHN1Ykl0ZW0sIFNXVC5OT05FKTsKLQkJCQlzdWJzdWJJdGVtLnNldFRleHQoIml0ZW0gIiArIGspOwotCQkJfQotCQl9Ci0JfQotCQotCXRyZWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVRyZWVJdGVtW10gc2VsZWN0aW9uID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCVRyZWVJdGVtW10gcmV2aXNlZFNlbGVjdGlvbiA9IG5ldyBUcmVlSXRlbVswXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBzZWxlY3Rpb25baV0uZ2V0VGV4dCgpOwotCQkJCWlmICh0ZXh0LmluZGV4T2YoIjEiKSA+IDApIHsKLQkJCQkJVHJlZUl0ZW1bXSBuZXdTZWxlY3Rpb24gPSBuZXcgVHJlZUl0ZW1bcmV2aXNlZFNlbGVjdGlvbi5sZW5ndGggKyAxXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShyZXZpc2VkU2VsZWN0aW9uLCAwLCBuZXdTZWxlY3Rpb24sIDAsIHJldmlzZWRTZWxlY3Rpb24ubGVuZ3RoKTsKLQkJCQkJbmV3U2VsZWN0aW9uW3JldmlzZWRTZWxlY3Rpb24ubGVuZ3RoXSA9IHNlbGVjdGlvbltpXTsKLQkJCQkJcmV2aXNlZFNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjsKLQkJCQl9Ci0JCQl9Ci0JCQl0cmVlLnNldFNlbGVjdGlvbihyZXZpc2VkU2VsZWN0aW9uKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2U1OWQyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogT0xFIGFuZCBBY3RpdmVYIGV4YW1wbGUgc25pcHBldDogYnJvd3NlIHRoZSB0eXBlbGliaW5mbyBmb3IgYSBwcm9ncmFtIGlkCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4MSB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCi0JaWYgKGFyZ3MubGVuZ3RoID09IDApIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogamF2YSBNYWluIDxwcm9ncmFtIGlkPiIpOwotCQlyZXR1cm47Ci0JfQotCi0JU3RyaW5nIHByb2dJRCA9IGFyZ3NbMF07Ci0JCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQotCU9sZUZyYW1lIGZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JT2xlQ29udHJvbFNpdGUgc2l0ZSA9IG51bGw7Ci0JT2xlQXV0b21hdGlvbiBhdXRvID0gbnVsbDsKLQl0cnkgewotCQlzaXRlID0gbmV3IE9sZUNvbnRyb2xTaXRlKGZyYW1lLCBTV1QuTk9ORSwgcHJvZ0lEKTsJCi0JCWF1dG8gPSBuZXcgT2xlQXV0b21hdGlvbihzaXRlKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiB0eXBlIGxpYnJhcnkgZm9yICIrcHJvZ0lEKTsKLQkJcmV0dXJuOwotCX0KLQkJCi0JcHJpbnRUeXBlSW5mbyhhdXRvKTsKLQkKLQlhdXRvLmRpc3Bvc2UoKTsKLQlzaGVsbC5kaXNwb3NlKCk7Ci0KLX0KLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFR5cGVJbmZvKE9sZUF1dG9tYXRpb24gYXV0bykgewotCVRZUEVBVFRSIHR5cGVhdHRyID0gYXV0by5nZXRUeXBlSW5mb0F0dHJpYnV0ZXMoKTsKLQlpZiAodHlwZWF0dHIgIT0gbnVsbCkgewkJCi0JCWlmICh0eXBlYXR0ci5jRnVuY3MgPiAwKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZ1bmN0aW9ucyA6XG4iKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlYXR0ci5jRnVuY3M7IGkrKykgewkJCQotCQkJT2xlRnVuY3Rpb25EZXNjcmlwdGlvbiBkYXRhID0gYXV0by5nZXRGdW5jdGlvbkRlc2NyaXB0aW9uKGkpOwotCQkJU3RyaW5nIGFyZ0xpc3QgPSAiIjsKLQkJCWludCBmaXJzdE9wdGlvbmFsQXJnSW5kZXggPSBkYXRhLmFyZ3MubGVuZ3RoIC0gZGF0YS5vcHRpb25hbEFyZ0NvdW50OwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkYXRhLmFyZ3MubGVuZ3RoOyBqKyspIHsKLQkJCQlhcmdMaXN0ICs9ICJbIjsKLQkJCQlpZiAoaiA+PSBmaXJzdE9wdGlvbmFsQXJnSW5kZXgpIGFyZ0xpc3QgKz0gIm9wdGlvbmFsLCAiOwotCQkJCWFyZ0xpc3QgKz0gZ2V0RGlyZWN0aW9uKGRhdGEuYXJnc1tqXS5mbGFncykrIl0gIitnZXRUeXBlTmFtZShkYXRhLmFyZ3Nbal0udHlwZSkrIiAiK2RhdGEuYXJnc1tqXS5uYW1lOwotCQkJCWlmICggaiA8IGRhdGEuYXJncy5sZW5ndGggLSAxKSBhcmdMaXN0ICs9ICIsICI7Ci0JCQl9CQkJCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0SW52b2tlS2luZChkYXRhLmludm9rZUtpbmQpKyIgKGlkID0gIitkYXRhLmlkKyIpIDogIgotCQkJCQkgICAgICAgICsiXG5cdFNpZ25hdHVyZSAgIDogIitnZXRUeXBlTmFtZShkYXRhLnJldHVyblR5cGUpKyIgIitkYXRhLm5hbWUrIigiK2FyZ0xpc3QrIikiCi0JCQkgICAgICAgICAgICAgICAgICAgICsiXG5cdERlc2NyaXB0aW9uIDogIitkYXRhLmRvY3VtZW50YXRpb24KLQkJCSAgICAgICAgICAgICAgICAgICAgKyJcblx0SGVscCBGaWxlICAgOiAiK2RhdGEuaGVscEZpbGUrIlxuIik7Ci0JCX0KLQkJCi0JCWlmICh0eXBlYXR0ci5jVmFycyA+IDApIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cblZhcmlhYmxlcyAgOlxuIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZWF0dHIuY1ZhcnM7IGkrKykgewotCQkJT2xlUHJvcGVydHlEZXNjcmlwdGlvbiBkYXRhID0gYXV0by5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKGkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQUk9QRVJUWSAoaWQgPSAiK2RhdGEuaWQrIikgOiIKLQkJCSAgICAgICAgICAgICAgICAgICAgKyJcblx0TmFtZSA6ICIrZGF0YS5uYW1lCi0JCQkgICAgICAgICAgICAgICAgICAgICsiXG5cdFR5cGUgOiAiK2dldFR5cGVOYW1lKGRhdGEudHlwZSkrIlxuIik7Ci0JCX0KLQl9Ci19Ci1wcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoaW50IHR5cGUpIHsKLQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBPTEUuVlRfQk9PTCA6IHJldHVybiAiYm9vbGVhbiI7Ci0JCWNhc2UgT0xFLlZUX1I0IDogcmV0dXJuICJmbG9hdCI7Ci0JCWNhc2UgT0xFLlZUX1I4IDogcmV0dXJuICJkb3VibGUiOwotCQljYXNlIE9MRS5WVF9JNCA6IHJldHVybiAiaW50IjsKLQkJY2FzZSBPTEUuVlRfRElTUEFUQ0ggOiByZXR1cm4gIklEaXNwYXRjaCI7Ci0JCWNhc2UgT0xFLlZUX1VOS05PV04gOiByZXR1cm4gIklVbmtub3duIjsKLQkJY2FzZSBPTEUuVlRfSTIgOiByZXR1cm4gInNob3J0IjsKLQkJY2FzZSBPTEUuVlRfQlNUUiA6IHJldHVybiAiU3RyaW5nIjsKLQkJY2FzZSBPTEUuVlRfVkFSSUFOVCA6IHJldHVybiAiVmFyaWFudCI7Ci0JCWNhc2UgT0xFLlZUX0NZIDogcmV0dXJuICJDdXJyZW5jeSI7Ci0JCWNhc2UgT0xFLlZUX0RBVEUgOiByZXR1cm4gIkRhdGUiOwotCQljYXNlIE9MRS5WVF9VSTEgOiByZXR1cm4gInVuc2lnbmVkIGNoYXIiOwotCQljYXNlIE9MRS5WVF9VSTQgOiByZXR1cm4gInVuc2lnbmVkIGludCI7Ci0JCWNhc2UgT0xFLlZUX1VTRVJERUZJTkVEIDogcmV0dXJuICJVc2VyRGVmaW5lZCI7Ci0JCWNhc2UgT0xFLlZUX0hSRVNVTFQgOiByZXR1cm4gImludCI7Ci0JCWNhc2UgT0xFLlZUX1ZPSUQgOiByZXR1cm4gInZvaWQiOwotCQkKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfQk9PTCA6IHJldHVybiAiYm9vbGVhbiAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfUjQgOiByZXR1cm4gImZsb2F0ICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9SOCA6IHJldHVybiAiZG91YmxlICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9JNCA6IHJldHVybiAiaW50ICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9ESVNQQVRDSCA6IHJldHVybiAiSURpc3BhdGNoICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9VTktOT1dOIDogcmV0dXJuICJJVW5rbm93biAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfSTIgOiByZXR1cm4gInNob3J0ICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9CU1RSIDogcmV0dXJuICJTdHJpbmcgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1ZBUklBTlQgOiByZXR1cm4gIlZhcmlhbnQgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX0NZIDogcmV0dXJuICJDdXJyZW5jeSAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfREFURSA6IHJldHVybiAiRGF0ZSAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfVUkxIDogcmV0dXJuICJ1bnNpZ25lZCBjaGFyICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9VSTQgOiByZXR1cm4gInVuc2lnbmVkIGludCAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfVVNFUkRFRklORUQgOiByZXR1cm4gIlVzZXJEZWZpbmVkICoiOwotCX0KLQlyZXR1cm4gInVua25vd24gIisgdHlwZTsJCi19Ci1wcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGlyZWN0aW9uKGludCBkaXJlY3Rpb24pewotCVN0cmluZyBkaXJTdHJpbmcgPSAiIjsKLQlib29sZWFuIGNvbW1hID0gZmFsc2U7Ci0JaWYgKChkaXJlY3Rpb24gJiBPTEUuSURMRkxBR19GSU4pICE9IDApIHsKLQkJZGlyU3RyaW5nICs9ICJpbiI7Ci0JCWNvbW1hID0gdHJ1ZTsKLQl9Ci0JaWYgKChkaXJlY3Rpb24gJiBPTEUuSURMRkxBR19GT1VUKSAhPSAwKXsKLQkJaWYgKGNvbW1hKSBkaXJTdHJpbmcgKz0gIiwgIjsKLQkJZGlyU3RyaW5nICs9ICJvdXQiOwotCQljb21tYSA9IHRydWU7Ci0JfQotCWlmICgoZGlyZWN0aW9uICYgT0xFLklETEZMQUdfRkxDSUQpICE9IDApewotCQlpZiAoY29tbWEpIGRpclN0cmluZyArPSAiLCAiOwotCQlkaXJTdHJpbmcgKz0gImxjaWQiOwotCQljb21tYSA9IHRydWU7Ci0JfQotCWlmICgoZGlyZWN0aW9uICYgT0xFLklETEZMQUdfRlJFVFZBTCkgIT0gMCl7Ci0JCWlmIChjb21tYSkgZGlyU3RyaW5nICs9ICIsICI7IAotCQlkaXJTdHJpbmcgKz0gInJldHZhbCI7Ci0JfQotCQotCXJldHVybiBkaXJTdHJpbmc7Ci19Ci1wcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SW52b2tlS2luZChpbnQgaW52S2luZCkgewotCXN3aXRjaCAoaW52S2luZCkgewotCQljYXNlIE9MRS5JTlZPS0VfRlVOQyA6IHJldHVybiAiTUVUSE9EIjsKLQkJY2FzZSBPTEUuSU5WT0tFX1BST1BFUlRZR0VUIDogcmV0dXJuICJQUk9QRVJUWSBHRVQiOwotCQljYXNlIE9MRS5JTlZPS0VfUFJPUEVSVFlQVVQgOiByZXR1cm4gIlBST1BFUlRZIFBVVCI7Ci0JCWNhc2UgT0xFLklOVk9LRV9QUk9QRVJUWVBVVFJFRiA6IHJldHVybiAiUFJPUEVSVFkgUFVUIEJZIFJFRiI7Ci0JfQotCXJldHVybiAidW5rbm93biAiK2ludktpbmQ7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmQ3MjMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDVGFiRm9sZGVyIGV4YW1wbGUgc25pcHBldDogcHJldmVudCBhbiBpdGVtIGZyb20gY2xvc2luZwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4MiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JQ1RhYkZvbGRlciBmb2xkZXIgPSBuZXcgQ1RhYkZvbGRlcihzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJQ1RhYkl0ZW0gaXRlbSA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5DTE9TRSk7Ci0JCWl0ZW0uc2V0VGV4dCgiSXRlbSAiK2kpOwotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChmb2xkZXIsIFNXVC5NVUxUSSk7Ci0JCXRleHQuc2V0VGV4dCgiQ29udGVudCBmb3IgSXRlbSAiK2kpOwotCQlpdGVtLnNldENvbnRyb2wodGV4dCk7Ci0JfQotCQotCWZpbmFsIENUYWJJdGVtIHNwZWNpYWxJdGVtID0gbmV3IENUYWJJdGVtKGZvbGRlciwgU1dULkNMT1NFKTsKLQlzcGVjaWFsSXRlbS5zZXRUZXh0KCJEb24ndCBDbG9zZSBNZSIpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0KGZvbGRlciwgU1dULk1VTFRJKTsKLQl0ZXh0LnNldFRleHQoIlRoaXMgdGFiIGNhbiBuZXZlciBiZSBjbG9zZWQiKTsKLQlzcGVjaWFsSXRlbS5zZXRDb250cm9sKHRleHQpOwotCQkKLQlmb2xkZXIuYWRkQ1RhYkZvbGRlcjJMaXN0ZW5lcihuZXcgQ1RhYkZvbGRlcjJBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBjbG9zZShDVGFiRm9sZGVyRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5pdGVtLmVxdWFscyhzcGVjaWFsSXRlbSkpIHsKLQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlmaW5hbCBDVGFiSXRlbSBub0Nsb3NlSXRlbSA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLQlub0Nsb3NlSXRlbS5zZXRUZXh0KCJObyBDbG9zZSBCdXR0b24iKTsKLQlUZXh0IHRleHQyID0gbmV3IFRleHQoZm9sZGVyLCBTV1QuTVVMVEkpOwotCXRleHQyLnNldFRleHQoIlRoaXMgdGFiIGRvZXMgbm90IGhhdmUgYSBjbG9zZSBidXR0b24iKTsKLQlub0Nsb3NlSXRlbS5zZXRDb250cm9sKHRleHQyKTsKLQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTEzNDkyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRldGVybWluZSBkYXRhIHR5cGVzIGF2YWlsYWJsZSAod2luMzIgb25seSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4MyBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyIHsKLQotcHJpdmF0ZSBzdGF0aWMgU25pcHBldDgzIF9pbnN0YW5jZSA9IG5ldyBTbmlwcGV0ODMoKTsKLXByaXZhdGUgaW50W10gaWRzOwotcHJpdmF0ZSBTdHJpbmdbXSBuYW1lczsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUYWJsZSBjb250cm9sID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbnRyb2wsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQoIkRyYWcgZGF0YSBvdmVyIHRoaXMgc2l0ZSB0byBzZWUgdGhlIG5hdGl2ZSB0cmFuc2ZlciB0eXBlLiIpOwotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQoY29udHJvbCwgRE5ELkRST1BfREVGQVVMVCB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LIHwgRE5ELkRST1BfTU9WRSk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtTbmlwcGV0ODMuZ2V0SW5zdGFuY2UoKX0pOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7CQkJCi0JCQlTdHJpbmcgb3BzID0gIiI7Ci0JCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9DT1BZKSAhPSAwKSBvcHMgKz0gIkNvcHk7IjsKLQkJCWlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX01PVkUpICE9IDApIG9wcyArPSAiTW92ZTsiOwotCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfTElOSykgIT0gMCkgb3BzICs9ICJMaW5rOyI7Ci0JCQljb250cm9sLnJlbW92ZUFsbCgpOwotCQkJVGFibGVJdGVtIGl0ZW0xID0gbmV3IFRhYmxlSXRlbShjb250cm9sLFNXVC5OT05FKTsKLQkJCWl0ZW0xLnNldFRleHQoIkFsbG93ZWQgT3BlcmF0aW9ucyBhcmUgIitvcHMpOwotCQkJCi0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9DT1BZKSAhPSAwKSB7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkJfSBlbHNlIGlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0xJTkspICE9IDApIHsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTElOSzsKLQkJCQl9IGVsc2UgaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfTU9WRSkgIT0gMCkgewotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9NT1ZFOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJVHJhbnNmZXJEYXRhW10gZGF0YSA9IGV2ZW50LmRhdGFUeXBlczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJCWludCBpZCA9IGRhdGFbaV0udHlwZTsKLQkJCQlTdHJpbmcgbmFtZSA9IGdldE5hbWVGcm9tSWQoaWQpOwotCQkJCVRhYmxlSXRlbSBpdGVtMiA9IG5ldyBUYWJsZUl0ZW0oY29udHJvbCxTV1QuTk9ORSk7Ci0JCQkJaXRlbTIuc2V0VGV4dCgiRGF0YSB0eXBlIGlzICIraWQrIiAiK25hbWUpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0Jc2hlbGwuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgU25pcHBldDgzIGdldEluc3RhbmNlICgpIHsKLQlyZXR1cm4gX2luc3RhbmNlOwotfQotU25pcHBldDgzKCkgewotCWlkcyA9IG5ldyBpbnRbODAwMDBdOwotCW5hbWVzID0gbmV3IFN0cmluZ1s4MDAwMF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKLQkJaWRzW2ldID0gaTsKLQkJbmFtZXNbaV0gPSBnZXROYW1lRnJvbUlkKGkpOwotCX0KLX0KLXB1YmxpYyB2b2lkIGphdmFUb05hdGl2ZSAoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotfQotcHVibGljIE9iamVjdCBuYXRpdmVUb0phdmEoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSl7Ci0JcmV0dXJuICJIZWxsbyBXb3JsZCI7Ci19Ci1wcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZU5hbWVzKCl7Ci0JcmV0dXJuIG5hbWVzOwotfQotcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKXsKLQlyZXR1cm4gaWRzOwotfQotc3RhdGljIFN0cmluZyBnZXROYW1lRnJvbUlkKGludCBpZCkgewotCVN0cmluZyBuYW1lID0gbnVsbDsKLQlpbnQgbWF4U2l6ZSA9IDEyODsKLQlUQ0hBUiBidWZmZXIgPSBuZXcgVENIQVIoMCwgbWF4U2l6ZSk7Ci0JaW50IHNpemUgPSBDT00uR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZShpZCwgYnVmZmVyLCBtYXhTaXplKTsKLQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JaWYgKHNpemUgIT0gMCkgewotCQluYW1lID0gYnVmZmVyLnRvU3RyaW5nKDAsIHNpemUpOwotCX0gZWxzZSB7Ci0JCXN3aXRjaCAoaWQpIHsKLQkJCWNhc2UgQ09NLkNGX0hEUk9QOgotCQkJCW5hbWUgPSAiQ0ZfSERST1AiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfVEVYVDoKLQkJCQluYW1lID0gIkNGX1RFWFQiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfQklUTUFQOgotCQkJCW5hbWUgPSAiQ0ZfQklUTUFQIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX01FVEFGSUxFUElDVDoKLQkJCQluYW1lID0gIkNGX01FVEFGSUxFUElDVCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9TWUxLOgotCQkJCW5hbWUgPSAiQ0ZfU1lMSyI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9ESUY6Ci0JCQkJbmFtZSA9ICJDRl9ESUYiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfVElGRjoKLQkJCQluYW1lID0gIkNGX1RJRkYiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfT0VNVEVYVDoKLQkJCQluYW1lID0gIkNGX09FTVRFWFQiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfRElCOgotCQkJCW5hbWUgPSAiQ0ZfRElCIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1BBTEVUVEU6Ci0JCQkJbmFtZSA9ICJDRl9QQUxFVFRFIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1BFTkRBVEE6Ci0JCQkJbmFtZSA9ICJDRl9QRU5EQVRBIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1JJRkY6Ci0JCQkJbmFtZSA9ICJDRl9SSUZGIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1dBVkU6Ci0JCQkJbmFtZSA9ICJDRl9XQVZFIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1VOSUNPREVURVhUOgotCQkJCW5hbWUgPSAiQ0ZfVU5JQ09ERVRFWFQiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfRU5ITUVUQUZJTEU6Ci0JCQkJbmFtZSA9ICJDRl9FTkhNRVRBRklMRSI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9MT0NBTEU6Ci0JCQkJbmFtZSA9ICJDRl9MT0NBTEUiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfTUFYOgotCQkJCW5hbWUgPSAiQ0ZfTUFYIjsKLQkJCQlicmVhazsKLQkJfQotCQkKLQl9Ci0JcmV0dXJuIG5hbWU7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWZmMTEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZGVmaW5lIGEgZGVmYXVsdCBvcGVyYXRpb24gKGluIHRoaXMgZXhhbXBsZSwgQ29weSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg0IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkKLQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUik7Ci0JbGFiZWwuc2V0VGV4dCgiRHJhZyBTb3VyY2UiKTsKLQlEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlKGxhYmVsLCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTkspOwotCXNvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kYXRhID0gIlRleHQgVHJhbnNmZXJyZWQiOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kb2l0KSB7Ci0JCQkJU3RyaW5nIG9wZXJhdGlvbiA9IG51bGw7Ci0JCQkJc3dpdGNoIChldmVudC5kZXRhaWwpIHsKLQkJCQljYXNlIERORC5EUk9QX01PVkU6Ci0JCQkJCW9wZXJhdGlvbiA9ICJtb3ZlZCI7IGJyZWFrOwotCQkJCWNhc2UgRE5ELkRST1BfQ09QWToKLQkJCQkJb3BlcmF0aW9uID0gImNvcGllZCI7IGJyZWFrOwotCQkJCWNhc2UgRE5ELkRST1BfTElOSzoKLQkJCQkJb3BlcmF0aW9uID0gImxpbmtlZCI7IGJyZWFrOwotCQkJCWNhc2UgRE5ELkRST1BfTk9ORToKLQkJCQkJb3BlcmF0aW9uID0gImRpc2FsbG93ZWQiOyBicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlvcGVyYXRpb24gPSAidW5rbm93biI7IGJyZWFrOwotCQkJCX0KLQkJCQlsYWJlbC5zZXRUZXh0KCJEcmFnIFNvdXJjZSAoZGF0YSAiK29wZXJhdGlvbisiKSIpOwotCQkJfSBlbHNlIHsKLQkJCQlsYWJlbC5zZXRUZXh0KCJEcmFnIFNvdXJjZSAoZHJhZyBjYW5jZWxsZWQpIik7Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0ZXh0LnNldFRleHQoIkRyb3AgVGFyZ2V0Iik7Ci0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldCh0ZXh0LCBETkQuRFJPUF9ERUZBVUxUIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LKTsKLQl0YXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JdGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJU3RyaW5nIG9wZXJhdGlvbiA9IG51bGw7Ci0JCQlzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotCQkJY2FzZSBETkQuRFJPUF9NT1ZFOgotCQkJCW9wZXJhdGlvbiA9ICJtb3ZlZCI7IGJyZWFrOwotCQkJY2FzZSBETkQuRFJPUF9DT1BZOgotCQkJCW9wZXJhdGlvbiA9ICJjb3BpZWQiOyBicmVhazsKLQkJCWNhc2UgRE5ELkRST1BfTElOSzoKLQkJCQlvcGVyYXRpb24gPSAibGlua2VkIjsgYnJlYWs7Ci0JCQljYXNlIERORC5EUk9QX05PTkU6Ci0JCQkJb3BlcmF0aW9uID0gImRpc2FsbG93ZWQiOyBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJb3BlcmF0aW9uID0gInVua25vd24iOyBicmVhazsKLQkJCX0KLQkJCXRleHQuYXBwZW5kKCJcbiIrb3BlcmF0aW9uKyhTdHJpbmcpZXZlbnQuZGF0YSk7Ci0JCX0KLQl9KTsKLQkKLQlzaGVsbC5zZXRTaXplKDQwMCwgNDAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyY2QwOGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUG9ja2V0UEMgZXhhbXBsZSBzbmlwcGV0OiBIZWxsbyBXb3JsZAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0KLQkvKiAKLQkgKiBDcmVhdGUgYSBTaGVsbCB3aXRoIHRoZSBkZWZhdWx0IHN0eWxlCi0JICogaS5lLiBmdWxsIHNjcmVlbiwgbm8gZGVjb3JhdGlvbiBvbiBQb2NrZXRQQy4KLQkgKi8KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQotCS8qIAotCSAqIFNldCBhIHRleHQgc28gdGhhdCB0aGUgdG9wIGxldmVsIFNoZWxsCi0JICogYWxzbyBhcHBlYXJzIGluIHRoZSBQb2NrZXRQQyB0YXNrIGxpc3QKLQkgKi8KLQlzaGVsbC5zZXRUZXh0KCJNYWluIik7Ci0KLQkvKgotCSAqIFNldCBhIG1lbnViYXIgdG8gZm9sbG93IFVJIGd1aWRlbGluZXMKLQkgKiBvbiBQb2NrZXRQQwotCSAqLwotCU1lbnUgbWIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0Jc2hlbGwuc2V0TWVudUJhcihtYik7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyOTkyNDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUG9ja2V0UEMgU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiAnT2snIGJ1dHRvbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULkNMT1NFKTsKLQlzaGVsbC5zZXRUZXh0KCJNYWluIik7Ci0JTWVudSBtYiA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQlzaGVsbC5zZXRNZW51QmFyKG1iKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MDA2ODYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFBvY2tldFBDIFNoZWxsIGV4YW1wbGUgc25pcHBldDogcmVzaXplIGF1dG9tYXRpY2FsbHkgYXMgU0lQIGlzIG9uIG9yIG9mZgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5SRVNJWkUpOwotCXNoZWxsLnNldFRleHQoIk1haW4iKTsKLQlNZW51IG1iID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIobWIpOwotCS8qIEFkZCBhIGJ1dHRvbiB0byBtYWtlIHRoZSByZXNpemUgbW9yZSB2aXN1YWwgKi8KLQlGaWxsTGF5b3V0IGxheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7Ci0Jc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiTWFpbiIpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZjNjBkZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZUVkaXRvciBleGFtcGxlIHNuaXBwZXQ6IGVkaXQgdGhlIHRleHQgb2YgYSB0YWJsZSBpdGVtIChpbiBwbGFjZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4OCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5ISURFX1NFTEVDVElPTik7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJpdGVtICIgKyBpLCAiZWRpdCB0aGlzIHZhbHVlIn0pOwotCX0KLQljb2x1bW4xLnBhY2soKTsKLQljb2x1bW4yLnBhY2soKTsKLQkKLQlmaW5hbCBUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IodGFibGUpOwotCS8vVGhlIGVkaXRvciBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgY2VsbCBhbmQgbXVzdAotCS8vbm90IGJlIGFueSBzbWFsbGVyIHRoYW4gNTAgcGl4ZWxzLgotCWVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQllZGl0b3IubWluaW11bVdpZHRoID0gNTA7Ci0JLy8gZWRpdGluZyB0aGUgc2Vjb25kIGNvbHVtbgotCWZpbmFsIGludCBFRElUQUJMRUNPTFVNTiA9IDE7Ci0JCi0JdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCS8vIENsZWFuIHVwIGFueSBwcmV2aW91cyBlZGl0b3IgY29udHJvbAotCQkJQ29udHJvbCBvbGRFZGl0b3IgPSBlZGl0b3IuZ2V0RWRpdG9yKCk7Ci0JCQlpZiAob2xkRWRpdG9yICE9IG51bGwpIG9sZEVkaXRvci5kaXNwb3NlKCk7Ci0JCi0JCQkvLyBJZGVudGlmeSB0aGUgc2VsZWN0ZWQgcm93Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZS5pdGVtOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQotCQkJLy8gVGhlIGNvbnRyb2wgdGhhdCB3aWxsIGJlIHRoZSBlZGl0b3IgbXVzdCBiZSBhIGNoaWxkIG9mIHRoZSBUYWJsZQotCQkJVGV4dCBuZXdFZGl0b3IgPSBuZXcgVGV4dCh0YWJsZSwgU1dULk5PTkUpOwotCQkJbmV3RWRpdG9yLnNldFRleHQoaXRlbS5nZXRUZXh0KEVESVRBQkxFQ09MVU1OKSk7Ci0JCQluZXdFZGl0b3IuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgbWUpIHsKLQkJCQkJVGV4dCB0ZXh0ID0gKFRleHQpZWRpdG9yLmdldEVkaXRvcigpOwotCQkJCQllZGl0b3IuZ2V0SXRlbSgpLnNldFRleHQoRURJVEFCTEVDT0xVTU4sIHRleHQuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCW5ld0VkaXRvci5zZWxlY3RBbGwoKTsKLQkJCW5ld0VkaXRvci5zZXRGb2N1cygpOwotCQkJZWRpdG9yLnNldEVkaXRvcihuZXdFZGl0b3IsIGl0ZW0sIEVESVRBQkxFQ09MVU1OKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjcyNWJjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBNZW51IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgbWVudSB3aXRoIHJhZGlvIGl0ZW1zCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg5IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTWVudUl0ZW0gaXRlbSA9IChNZW51SXRlbSllLndpZGdldDsKLQkJCQlpZiAoaXRlbS5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuIChpdGVtICsgIiBzZWxlY3RlZCIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoaXRlbSArICIgdW5zZWxlY3RlZCIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCXNoZWxsLnNldE1lbnUgKG1lbnUpOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2YWU3My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbXBvc2l0ZSBleGFtcGxlIHNuaXBwZXQ6IHNjcm9sbCBhIGNoaWxkIGNvbnRyb2wgYXV0b21hdGljYWxseQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDkgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXksIFNXVC5TSEVMTF9UUklNIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWNvbXBvc2l0ZS5zZXRTaXplICgyMDAsIDQwMCk7Ci0JZmluYWwgU2Nyb2xsQmFyIGhCYXIgPSBzaGVsbC5nZXRIb3Jpem9udGFsQmFyICgpOwotCWhCYXIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlQb2ludCBsb2NhdGlvbiA9IGNvbXBvc2l0ZS5nZXRMb2NhdGlvbiAoKTsKLQkJCWxvY2F0aW9uLnggPSAtaEJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQljb21wb3NpdGUuc2V0TG9jYXRpb24gKGxvY2F0aW9uKTsKLQkJfQotCX0pOwotCWZpbmFsIFNjcm9sbEJhciB2QmFyID0gc2hlbGwuZ2V0VmVydGljYWxCYXIgKCk7Ci0JdkJhci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVBvaW50IGxvY2F0aW9uID0gY29tcG9zaXRlLmdldExvY2F0aW9uICgpOwotCQkJbG9jYXRpb24ueSA9IC12QmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCWNvbXBvc2l0ZS5zZXRMb2NhdGlvbiAobG9jYXRpb24pOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsICBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJUG9pbnQgc2l6ZSA9IGNvbXBvc2l0ZS5nZXRTaXplICgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhICgpOwotCQkJaEJhci5zZXRNYXhpbXVtIChzaXplLngpOwotCQkJdkJhci5zZXRNYXhpbXVtIChzaXplLnkpOwotCQkJaEJhci5zZXRUaHVtYiAoTWF0aC5taW4gKHNpemUueCwgcmVjdC53aWR0aCkpOwotCQkJdkJhci5zZXRUaHVtYiAoTWF0aC5taW4gKHNpemUueSwgcmVjdC5oZWlnaHQpKTsKLQkJCWludCBoUGFnZSA9IHNpemUueCAtIHJlY3Qud2lkdGg7Ci0JCQlpbnQgdlBhZ2UgPSBzaXplLnkgLSByZWN0LmhlaWdodDsKLQkJCWludCBoU2VsZWN0aW9uID0gaEJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlpbnQgdlNlbGVjdGlvbiA9IHZCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJUG9pbnQgbG9jYXRpb24gPSBjb21wb3NpdGUuZ2V0TG9jYXRpb24gKCk7Ci0JCQlpZiAoaFNlbGVjdGlvbiA+PSBoUGFnZSkgewotCQkJCWlmIChoUGFnZSA8PSAwKSBoU2VsZWN0aW9uID0gMDsKLQkJCQlsb2NhdGlvbi54ID0gLWhTZWxlY3Rpb247Ci0JCQl9Ci0JCQlpZiAodlNlbGVjdGlvbiA+PSB2UGFnZSkgewotCQkJCWlmICh2UGFnZSA8PSAwKSB2U2VsZWN0aW9uID0gMDsKLQkJCQlsb2NhdGlvbi55ID0gLXZTZWxlY3Rpb247Ci0JCQl9Ci0JCQljb21wb3NpdGUuc2V0TG9jYXRpb24gKGxvY2F0aW9uKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmYxM2NkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBkZXRlY3QgbW91c2UgZG93biBpbiBhIHRyZWUgaXRlbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDkwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJdHJlZUl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVBvaW50IHBvaW50ID0gbmV3IFBvaW50IChldmVudC54LCBldmVudC55KTsKLQkJCVRyZWVJdGVtIGl0ZW0gPSB0cmVlLmdldEl0ZW0gKHBvaW50KTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJNb3VzZSBkb3duOiAiICsgaXRlbSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQl0cmVlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5zZXRTaXplICgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmY5NTM1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRyYWcgbGVhZiBpdGVtcyBpbiBhIHRyZWUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDkxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCi0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiaXRlbSAiK2kpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IDM7IGorKykgewotCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQlzdWJJdGVtLnNldFRleHQoIml0ZW0gIitpKyIgIitqKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgMzsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0gc3Vic3ViSXRlbSA9IG5ldyBUcmVlSXRlbShzdWJJdGVtLCBTV1QuTk9ORSk7Ci0JCQkJc3Vic3ViSXRlbS5zZXRUZXh0KCJpdGVtICIraSsiICIraisiICIrayk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JVHJhbnNmZXJbXSB0eXBlcyA9IG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX07Ci0JaW50IG9wZXJhdGlvbnMgPSBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTks7Ci0JCi0JZmluYWwgRHJhZ1NvdXJjZSBzb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZSAodHJlZSwgb3BlcmF0aW9ucyk7Ci0Jc291cmNlLnNldFRyYW5zZmVyKHR5cGVzKTsKLQlmaW5hbCBUcmVlSXRlbVtdIGRyYWdTb3VyY2VJdGVtID0gbmV3IFRyZWVJdGVtWzFdOwotCXNvdXJjZS5hZGREcmFnTGlzdGVuZXIgKG5ldyBEcmFnU291cmNlTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlUcmVlSXRlbVtdIHNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCA+IDAgJiYgc2VsZWN0aW9uWzBdLmdldEl0ZW1Db3VudCgpID09IDApIHsKLQkJCQlldmVudC5kb2l0ID0gdHJ1ZTsKLQkJCQlkcmFnU291cmNlSXRlbVswXSA9IHNlbGVjdGlvblswXTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJfQotCQl9OwotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YSAoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kYXRhID0gZHJhZ1NvdXJjZUl0ZW1bMF0uZ2V0VGV4dCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTU9WRSkKLQkJCQlkcmFnU291cmNlSXRlbVswXS5kaXNwb3NlKCk7Ci0JCQkJZHJhZ1NvdXJjZUl0ZW1bMF0gPSBudWxsOwotCQl9Ci0JfSk7Ci0KLQlEcm9wVGFyZ2V0IHRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KHRyZWUsIG9wZXJhdGlvbnMpOwotCXRhcmdldC5zZXRUcmFuc2Zlcih0eXBlcyk7Ci0JdGFyZ2V0LmFkZERyb3BMaXN0ZW5lciAobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX0VYUEFORCB8IERORC5GRUVEQkFDS19TQ1JPTEw7Ci0JCQlpZiAoZXZlbnQuaXRlbSAhPSBudWxsKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJCVBvaW50IHB0ID0gZGlzcGxheS5tYXAobnVsbCwgdHJlZSwgZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQkJaWYgKHB0LnkgPCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQvMykgewotCQkJCQlldmVudC5mZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfSU5TRVJUX0JFRk9SRTsKLQkJCQl9IGVsc2UgaWYgKHB0LnkgPiBib3VuZHMueSArIDIqYm91bmRzLmhlaWdodC8zKSB7Ci0JCQkJCWV2ZW50LmZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19JTlNFUlRfQUZURVI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXZlbnQuZmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX1NFTEVDVDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kYXRhID09IG51bGwpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZylldmVudC5kYXRhOwotCQkJaWYgKGV2ZW50Lml0ZW0gPT0gbnVsbCkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQkJCWl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJCVBvaW50IHB0ID0gZGlzcGxheS5tYXAobnVsbCwgdHJlZSwgZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQkJVHJlZUl0ZW0gcGFyZW50ID0gaXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCVRyZWVJdGVtW10gaXRlbXMgPSBwYXJlbnQuZ2V0SXRlbXMoKTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGl0ZW1zW2ldID09IGl0ZW0pIHsKLQkJCQkJCQlpbmRleCA9IGk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHB0LnkgPCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQvMykgewotCQkJCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbShwYXJlbnQsIFNXVC5OT05FLCBpbmRleCk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCX0gZWxzZSBpZiAocHQueSA+IGJvdW5kcy55ICsgMipib3VuZHMuaGVpZ2h0LzMpIHsKLQkJCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0ocGFyZW50LCBTV1QuTk9ORSwgaW5kZXgrMSk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJCW5ld0l0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJfQotCQkJCQkKLQkJCQl9IGVsc2UgewotCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZS5nZXRJdGVtcygpOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoaXRlbXNbaV0gPT0gaXRlbSkgewotCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocHQueSA8IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodC8zKSB7Ci0JCQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FLCBpbmRleCk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCX0gZWxzZSBpZiAocHQueSA+IGJvdW5kcy55ICsgMipib3VuZHMuaGVpZ2h0LzMpIHsKLQkJCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUsIGluZGV4KzEpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJCi0JCQl9Ci0JCX0KLQl9KTsKLQotCXNoZWxsLnNldFNpemUgKDQwMCwgNDAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTJmNTMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEN1cnNvciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGN1cnNvciBmcm9tIGEgc291cmNlIGFuZCBhIG1hc2sKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1dISVRFKTsKLQlDb2xvciBibGFjayA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTEFDSyk7Ci0JCi0JLy9DcmVhdGUgYSBzb3VyY2UgSW1hZ2VEYXRhIG9mIGRlcHRoIDEgKG1vbm9jaHJvbWUpCi0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YSAobmV3IFJHQiBbXSB7d2hpdGUuZ2V0UkdCKCksIGJsYWNrLmdldFJHQigpLH0pOwotCUltYWdlRGF0YSBzb3VyY2VEYXRhID0gbmV3IEltYWdlRGF0YSAoMjAsIDIwLCAxLCBwYWxldHRlKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpICsrKSB7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgMjA7IGorKykgewotCQkJc291cmNlRGF0YS5zZXRQaXhlbChpLCBqLCAxKTsKLQkJfQotCX0KLQkKLQkvL0NyZWF0ZSBhIG1hc2sgSW1hZ2VEYXRhIG9mIGRlcHRoIDEgKG1vbm9jaHJvbWUpCi0JcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YSAobmV3IFJHQiBbXSB7d2hpdGUuZ2V0UkdCKCksIGJsYWNrLmdldFJHQigpLH0pOwotCUltYWdlRGF0YSBtYXNrRGF0YSA9IG5ldyBJbWFnZURhdGEgKDIwLCAyMCwgMSwgcGFsZXR0ZSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSArKykgewotCQlmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspIHsKLQkJCW1hc2tEYXRhLnNldFBpeGVsKGksIGosIDEpOwotCQl9Ci0JfQotCS8vQ3JlYXRlIGN1cnNvcgotCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIHNvdXJjZURhdGEsIG1hc2tEYXRhLCAxMCwgMTApOwotCQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCWZpbmFsIEltYWdlIHNvdXJjZSA9IG5ldyBJbWFnZSAoZGlzcGxheSxzb3VyY2VEYXRhKTsKLQlmaW5hbCBJbWFnZSBtYXNrID0gbmV3IEltYWdlIChkaXNwbGF5LCBtYXNrRGF0YSk7Ci0JLy9EcmF3IHNvdXJjZSBhbmQgbWFzayBqdXN0IHRvIHNob3cgd2hhdCB0aGV5IGxvb2sgbGlrZQotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCUdDIGdjID0gZS5nYzsKLQkJCWdjLmRyYXdTdHJpbmcoInNvdXJjZTogIiwgMTAsIDEwKTsKLQkJCWdjLmRyYXdJbWFnZShzb3VyY2UsIDAsIDAsIDIwLCAyMCwgNTAsIDEwLCAyMCwgMjApOwotCQkJZ2MuZHJhd1N0cmluZygibWFzazogIiwxMCwgNDApOwotCQkJZ2MuZHJhd0ltYWdlKG1hc2ssIDAsIDAsIDIwLCAyMCwgNTAsIDQwLCAyMCwgMjApOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgxNTAsIDE1MCk7Ci0Jc2hlbGwub3BlbigpOwotCXNoZWxsLnNldEN1cnNvcihjdXJzb3IpOwotCQotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQlzb3VyY2UuZGlzcG9zZSgpOwotCW1hc2suZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU1NzI5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBHQyBleGFtcGxlIHNuaXBwZXQ6IG1lYXN1cmUgYSBzdHJpbmcKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5OT05FKTsKLQlHQyBnYyA9IG5ldyBHQyAobGFiZWwpOwotCVBvaW50IHNpemUgPSBnYy50ZXh0RXh0ZW50ICgiSGVsbG8iKTsKLQlnYy5kaXNwb3NlICgpOwotCWxhYmVsLnNldFRleHQgKCJIZWxsbyAtPiAiICsgc2l6ZSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWViMGM2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENsaXBib2FyZCBleGFtcGxlIHNuaXBwZXQ6IGNvcHkgYW5kIHBhc3RlIGRhdGEgd2l0aCB0aGUgY2xpcGJvYXJkCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgQ2xpcGJvYXJkIGNiID0gbmV3IENsaXBib2FyZChkaXNwbGF5KTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkKLQlCdXR0b24gY29weSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQljb3B5LnNldFRleHQoIkNvcHkiKTsKLQljb3B5LmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHRleHREYXRhID0gdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JCQlUZXh0VHJhbnNmZXIgdGV4dFRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQljYi5zZXRDb250ZW50cyhuZXcgT2JqZWN0W117dGV4dERhdGF9LCBuZXcgVHJhbnNmZXJbXXt0ZXh0VHJhbnNmZXJ9KTsKLQkJfQotCX0pOwotCQotCUJ1dHRvbiBwYXN0ZSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlwYXN0ZS5zZXRUZXh0KCJQYXN0ZSIpOwotCXBhc3RlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJVGV4dFRyYW5zZmVyIHRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQlTdHJpbmcgZGF0YSA9IChTdHJpbmcpY2IuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCXRleHQuaW5zZXJ0KGRhdGEpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNSk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JY29weS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvcHksIDUpOwotCXBhc3RlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNvcHksIC01KTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0Jc2hlbGwuc2V0U2l6ZSgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQljYi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2U3NTVhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBHQyBleGFtcGxlIHNuaXBwZXQ6IGNhcHR1cmUgYSB3aWRnZXQgaW1hZ2Ugd2l0aCBhIEdDCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDk1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiV2lkZ2V0Iik7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCQotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRCb3VuZHMoMTAsIDEwLCAxMDAsIDEwMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA5OyBpKyspIHsKLQkJbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpLnNldFRleHQoIml0ZW0iICsgaSk7Ci0JfQotCQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIkNhcHR1cmUiKTsKLQlidXR0b24uc2V0Qm91bmRzKDEwLCAxNDAsIDUwLCAyMCk7Ci0JYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVBvaW50IHRhYmxlU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCUdDIGdjID0gbmV3IEdDKHRhYmxlKTsKLQkJCWZpbmFsIEltYWdlIGltYWdlID0KLQkJCQluZXcgSW1hZ2UoZGlzcGxheSwgdGFibGVTaXplLngsIHRhYmxlU2l6ZS55KTsKLQkJCWdjLmNvcHlBcmVhKGltYWdlLCAwLCAwKTsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQotCQkJU2hlbGwgcG9wdXAgPSBuZXcgU2hlbGwoc2hlbGwpOwotCQkJcG9wdXAuc2V0VGV4dCgiSW1hZ2UiKTsKLQkJCXBvcHVwLnNldEJvdW5kcyg1MCwgNTAsIDIwMCwgMjAwKTsKLQkJCXBvcHVwLmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhwb3B1cCwgU1dULk5PTkUpOwotCQkJY2FudmFzLnNldEJvdW5kcygxMCwgMTAsIDE1MCwgMTUwKTsKLQkJCWNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApOwotCQkJCX0KLQkJCX0pOwotCQkJcG9wdXAub3BlbigpOwotCQl9Ci0JfSk7Ci0JCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNTVkZjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlQ3Vyc29yIGV4YW1wbGUgc25pcHBldDogbmF2aWdhdGUgYSB0YWJsZSBjZWxscyB3aXRoIGFycm93IGtleXMuIAotICogRWRpdCB3aGVuIHVzZXIgaGl0cyBSZXR1cm4ga2V5LiAgRXhpdCBlZGl0IG1vZGUgYnkgaGl0dGluZyBFc2NhcGUgKGNhbmNlbHMgZWRpdCkKLSAqIG9yIFJldHVybiAoYXBwbGllcyBlZGl0IHRvIHRhYmxlKS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5NiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCS8vIGNyZWF0ZSBhIGEgdGFibGUgd2l0aCAzIGNvbHVtbnMgYW5kIGZpbGwgd2l0aCBkYXRhCi0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMyA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJjZWxsICIgKyBpICsgIiAwIiwgCSJjZWxsICIgKyBpICsgIiAxIiwgImNlbGwgIiArIGkgKyAiIDIiIH0pOwotCX0KLQljb2x1bW4xLnBhY2soKTsKLQljb2x1bW4yLnBhY2soKTsKLQljb2x1bW4zLnBhY2soKTsKLQotCS8vIGNyZWF0ZSBhIFRhYmxlQ3Vyc29yIHRvIG5hdmlnYXRlIGFyb3VuZCB0aGUgdGFibGUKLQlmaW5hbCBUYWJsZUN1cnNvciBjdXJzb3IgPSBuZXcgVGFibGVDdXJzb3IodGFibGUsIFNXVC5OT05FKTsKLQkvLyBjcmVhdGUgYW4gZWRpdG9yIHRvIGVkaXQgdGhlIGNlbGwgd2hlbiB0aGUgdXNlciBoaXRzICJFTlRFUiIgCi0JLy8gd2hpbGUgb3ZlciBhIGNlbGwgaW4gdGhlIHRhYmxlCi0JZmluYWwgQ29udHJvbEVkaXRvciBlZGl0b3IgPSBuZXcgQ29udHJvbEVkaXRvcihjdXJzb3IpOwotCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JZWRpdG9yLmdyYWJWZXJ0aWNhbCA9IHRydWU7Ci0KLQljdXJzb3IuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCS8vIHdoZW4gdGhlIFRhYmxlRWRpdG9yIGlzIG92ZXIgYSBjZWxsLCBzZWxlY3QgdGhlIGNvcnJlc3BvbmRpbmcgcm93IGluIAotCQkvLyB0aGUgdGFibGUKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7IGN1cnNvci5nZXRSb3coKX0pOwotCQl9Ci0JCS8vIHdoZW4gdGhlIHVzZXIgaGl0cyAiRU5URVIiIGluIHRoZSBUYWJsZUN1cnNvciwgcG9wIHVwIGEgdGV4dCBlZGl0b3Igc28gdGhhdCAKLQkJLy8gdGhleSBjYW4gY2hhbmdlIHRoZSB0ZXh0IG9mIHRoZSBjZWxsCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChjdXJzb3IsIFNXVC5OT05FKTsKLQkJCVRhYmxlSXRlbSByb3cgPSBjdXJzb3IuZ2V0Um93KCk7Ci0JCQlpbnQgY29sdW1uID0gY3Vyc29yLmdldENvbHVtbigpOwotCQkJdGV4dC5zZXRUZXh0KHJvdy5nZXRUZXh0KGNvbHVtbikpOwotCQkJdGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkJLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIGFuZCBjb3B5IHRoZSBkYXRhIG92ZXIgCi0JCQkJCS8vIHdoZW4gdGhlIHVzZXIgaGl0cyAiRU5URVIiCi0JCQkJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLQkJCQkJCVRhYmxlSXRlbSByb3cgPSBjdXJzb3IuZ2V0Um93KCk7Ci0JCQkJCQlpbnQgY29sdW1uID0gY3Vyc29yLmdldENvbHVtbigpOwotCQkJCQkJcm93LnNldFRleHQoY29sdW1uLCB0ZXh0LmdldFRleHQoKSk7Ci0JCQkJCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCQkvLyBjbG9zZSB0aGUgdGV4dCBlZGl0b3Igd2hlbiB0aGUgdXNlciBoaXRzICJFU0MiCi0JCQkJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuRVNDKSB7Ci0JCQkJCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJZWRpdG9yLnNldEVkaXRvcih0ZXh0KTsKLQkJCXRleHQuc2V0Rm9jdXMoKTsKLQkJfQotCX0pOwotCS8vIEhpZGUgdGhlIFRhYmxlQ3Vyc29yIHdoZW4gdGhlIHVzZXIgaGl0cyB0aGUgIkNUUkwiIG9yICJTSElGVCIga2V5LgotCS8vIFRoaXMgYWxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IG11bHRpcGxlIGl0ZW1zIGluIHRoZSB0YWJsZS4KLQljdXJzb3IuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuQ1RSTAotCQkJCXx8IGUua2V5Q29kZSA9PSBTV1QuU0hJRlQKLQkJCQl8fCAoZS5zdGF0ZU1hc2sgJiBTV1QuQ09OVFJPTCkgIT0gMAotCQkJCXx8IChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkgewotCQkJCWN1cnNvci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0pOwotCS8vIFNob3cgdGhlIFRhYmxlQ3Vyc29yIHdoZW4gdGhlIHVzZXIgcmVsZWFzZXMgdGhlICJTSElGVCIgb3IgIkNUUkwiIGtleS4KLQkvLyBUaGlzIHNpZ25hbHMgdGhlIGVuZCBvZiB0aGUgbXVsdGlwbGUgc2VsZWN0aW9uIHRhc2suCi0JdGFibGUuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCWlmIChlLmtleUNvZGUgPT0gU1dULkNPTlRST0wgJiYgKGUuc3RhdGVNYXNrICYgU1dULlNISUZUKSAhPSAwKQotCQkJCXJldHVybjsKLQkJCWlmIChlLmtleUNvZGUgPT0gU1dULlNISUZUICYmIChlLnN0YXRlTWFzayAmIFNXVC5DT05UUk9MKSAhPSAwKQotCQkJCXJldHVybjsKLQkJCWlmIChlLmtleUNvZGUgIT0gU1dULkNPTlRST0wKLQkJCQkmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuQ09OVFJPTCkgIT0gMCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoZS5rZXlDb2RlICE9IFNXVC5TSElGVCAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApCi0JCQkJcmV0dXJuOwotCi0JCQlUYWJsZUl0ZW1bXSBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCVRhYmxlSXRlbSByb3cgPSAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwKSA/IHRhYmxlLmdldEl0ZW0odGFibGUuZ2V0VG9wSW5kZXgoKSkgOiBzZWxlY3Rpb25bMF07Ci0JCQl0YWJsZS5zaG93SXRlbShyb3cpOwotCQkJY3Vyc29yLnNldFNlbGVjdGlvbihyb3csIDApOwotCQkJY3Vyc29yLnNldFZpc2libGUodHJ1ZSk7Ci0JCQljdXJzb3Iuc2V0Rm9jdXMoKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDAxNzRjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBNZW51IGV4YW1wbGUgc25pcHBldDogZmlsbCBhIG1lbnUgZHluYW1pY2FsbHkgKHdoZW4gbWVudSBzaG93bikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCWZpbmFsIE1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JdHJlZS5zZXRNZW51IChtZW51KTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQltZW51LmFkZExpc3RlbmVyIChTV1QuU2hvdywgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlNZW51SXRlbSBbXSBtZW51SXRlbXMgPSBtZW51LmdldEl0ZW1zICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPG1lbnVJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCW1lbnVJdGVtcyBbaV0uZGlzcG9zZSAoKTsKLQkJCX0KLQkJCVRyZWVJdGVtIFtdIHRyZWVJdGVtcyA9IHRyZWUuZ2V0U2VsZWN0aW9uICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHRyZWVJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCU1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCQkJbWVudUl0ZW0uc2V0VGV4dCAodHJlZUl0ZW1zIFtpXS5nZXRUZXh0ICgpKTsKLQkJCX0KLQkJfQotCX0pOwotCXRyZWUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3OTE4Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ29tcG9zaXRlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGFuZCBkaXNwb3NlIGNoaWxkcmVuIG9mIGEgY29tcG9zaXRlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDk4IHsKLQotc3RhdGljIGludCBwYWdlTnVtID0gMDsKLXN0YXRpYyBDb21wb3NpdGUgcGFnZUNvbXBvc2l0ZTsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIlB1c2giKTsKLQlwYWdlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCXBhZ2VDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCXBhZ2VDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaWYgKChwYWdlQ29tcG9zaXRlICE9IG51bGwpICYmICghcGFnZUNvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQkJcGFnZUNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlwYWdlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQkJcGFnZUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlwYWdlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJaWYgKHBhZ2VOdW0rKyAlIDIgPT0gMCkgewotCQkJCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhZ2VDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQkJCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCQkJCW5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKS5zZXRUZXh0KCJ0YWJsZSBpdGVtICIgKyBpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW5ldyBCdXR0b24ocGFnZUNvbXBvc2l0ZSwgU1dULlJBRElPKS5zZXRUZXh0KCJyYWRpbyIpOwotCQkJfQotCQkJc2hlbGwubGF5b3V0KHRydWUpOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YTNhY2MuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogcHJldmVudCBhIHNoZWxsIGZyb20gY2xvc2luZyAocHJvbXB0IHRoZSB1c2VyKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDk5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuQ2xvc2UsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJaW50IHN0eWxlID0gU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULllFUyB8IFNXVC5OTzsKLQkJCU1lc3NhZ2VCb3ggbWVzc2FnZUJveCA9IG5ldyBNZXNzYWdlQm94IChzaGVsbCwgc3R5bGUpOwotCQkJbWVzc2FnZUJveC5zZXRUZXh0ICgiSW5mb3JtYXRpb24iKTsKLQkJCW1lc3NhZ2VCb3guc2V0TWVzc2FnZSAoIkNsb3NlIHRoZSBzaGVsbD8iKTsKLQkJCWV2ZW50LmRvaXQgPSBtZXNzYWdlQm94Lm9wZW4gKCkgPT0gU1dULllFUzsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGU1ZGI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJKVW5pdCBUZXN0cyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImRhdGEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4OGNmZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3QudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbEJyb3dzZXJUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxCcm93c2VyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ1MDI3Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbEJyb3dzZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogU3VpdGUgZm9yIHRlc3RpbmcgYWxsIG9mIHRoZSBncmFwaGljcyB0ZXN0IGNhc2VzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsQnJvd3NlclRlc3RzIHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Ccm93c2VyLnN1aXRlKCkpOwkKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25BZGFwdGVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzQWRhcHRlci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93QWRhcHRlci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3Qob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXIuVGVzdF9Ccm93c2VyU3VpdGUuc3VpdGUoKSk7Ci0KLQlyZXR1cm4gc3VpdGU7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbENhcmJvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbENhcmJvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YzBkMGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxDYXJib25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogU3VpdGUgZm9yIHJ1bm5pbmcgYWxsIFNXVCB0ZXN0IGNhc2VzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsQ2FyYm9uVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0vKioKLSAqIFRlc3RzIG5vdCBydW4gYmVjYXVzZSB0aGV5IGNvbnNpc3RlbnRseSBmYWlsCi0gKi8KLXN0YXRpYyBTdHJpbmdbXSBleGNsdWRlVGVzdHMgPSB7Ci0JInRlc3RfcG9zdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KSIsCi0JInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KSIsCi0JInRlc3RfZ2V0Qm91bmRzSShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0pIiwKLQkidGVzdF9nZXRCb3VuZHNJKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKSIsCi0JInRlc3RfZ2V0Qm91bmRzKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKSIsCi0JInRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmcob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X2dldFRvcFBpeGVsKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9nZXRUb3BJbmRleChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KSIsCi0JInRlc3RfY2xlYXJTZWxlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8pIiwKLQkidGVzdF9jb3B5KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKSIsCi0JInRlc3RfY3V0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKSIsCi0JInRlc3RfZ2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKSIsCi0JInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8pIiwKLQkidGVzdF9wYXN0ZShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibykiLAotCSJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8pIiwKLQkidGVzdF9zZXRTZWxlY3Rpb25JKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcikiLAotCSJCcm93c2VyNChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3Nlci5UZXN0X0Jyb3dzZXJTdWl0ZSkiLAotCSJCcm93c2VyNShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3Nlci5UZXN0X0Jyb3dzZXJTdWl0ZSkiLAotCS8vCi0JInRlc3RfY29weShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KSIsCi0JInRlc3RfY3V0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9wYXN0ZShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KSIsCi0JInRlc3Rfc2VsZWN0QWxsKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9jb3B5KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dCkiLAotCSJ0ZXN0X2N1dChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQpIiwKLQkidGVzdF9pbnZva2VBY3Rpb25JKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dCkiLAotCSJ0ZXN0X3Bhc3RlKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dCkiLAotfTsKLQotc3RhdGljIGJvb2xlYW4gaXNFeGNsdWRlZChTdHJpbmcgbmFtZSkgewotCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVkZVRlc3RzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChuYW1lLmVxdWFscyhleGNsdWRlVGVzdHNbaV0pKSByZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMgPSAwOwotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotCWlmIChTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyA+IDApIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbkNhbGxzIHRvIHdhcm5VbmltcGw6ICIgKyBTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG5FeGNsdWRlZCBUZXN0czogIiArIGV4Y2x1ZGVUZXN0cy5sZW5ndGgpOwotCX0KLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgZnVsbFN1aXRlID0gKFRlc3RTdWl0ZSlBbGxUZXN0cy5zdWl0ZSgpOwotCVRlc3RTdWl0ZSBmaWx0ZXJlZFN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZnVsbFN1aXRlLnRlc3RDb3VudCgpOyBpKyspIHsKLQkJVGVzdCBjYW5kaWRhdGVUZXN0ID0gZnVsbFN1aXRlLnRlc3RBdChpKTsKLQkJaWYgKGNhbmRpZGF0ZVRlc3QgaW5zdGFuY2VvZiBUZXN0U3VpdGUpIHsKLQkJCVRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpY2FuZGlkYXRlVGVzdDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc3VpdGUudGVzdENvdW50KCk7IGorKykgewotCQkJCVRlc3QgdGVzdCA9IHN1aXRlLnRlc3RBdChqKTsKLQkJCQlpZiAoIWlzRXhjbHVkZWQodGVzdC50b1N0cmluZygpKSkgZmlsdGVyZWRTdWl0ZS5hZGRUZXN0KHRlc3QpOwkJCQkKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gZmlsdGVyZWRTdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsR3JhcGhpY3NUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxHcmFwaGljc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhODM3MmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxHcmFwaGljc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBTdWl0ZSBmb3IgdGVzdGluZyBhbGwgb2YgdGhlIGdyYXBoaWNzIHRlc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxHcmFwaGljc1Rlc3RzIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCi0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250TWV0cmljcy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Uuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCLnN1aXRlKCkpOwotCQotCQotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50LnN1aXRlKCkpOwotCi0JcmV0dXJuIHN1aXRlOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxHdGtUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxHdGtUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWMwM2ZhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsR3RrVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIFN1aXRlIGZvciBydW5uaW5nIGFsbCBTV1QgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGNsYXNzIEFsbEd0a1Rlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotLyoqCi0gKiBUZXN0cyBub3QgcnVuIGJlY2F1c2UgdGhleSBjb25zaXN0ZW50bHkgZmFpbAotICovCi1zdGF0aWMgU3RyaW5nW10gZXhjbHVkZVRlc3RzID0gewotCSJ0ZXN0X2dldEFjdGl2ZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkpIiwKLQkidGVzdF9wb3N0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkpIiwKLQkidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcihvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UpIiwKLQkidGVzdF9nZXRCb3VuZHNJKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSkiLAotCSJ0ZXN0X2dldEJvdW5kc0kob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0pIiwKLQkidGVzdF9nZXRCb3VuZHMob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0pIiwKLQkidGVzdF9zZXREZWZhdWx0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51KSIsCi0JInRlc3Rfc2V0QWN0aXZlKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKSIsCi0JInRlc3RfZ2V0SXRlbUhlaWdodChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0KSIsCi0JInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0KSIsCi0JInRlc3Rfc2V0VG9wSW5kZXhJKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3QpIiwKLQkidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3QpIiwKLQkidGVzdF9nZXRUZXh0TGltaXQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X2dldFRvcFBpeGVsKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9zZXRUZXh0TGltaXRJKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9zZXRUb3BJbmRleEkob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X2dldEhlYWRlckhlaWdodChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlKSIsCi0JInRlc3Rfc2V0U2VsZWN0aW9uSShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIpIiwKLQkidGVzdF9nZXRTZWxlY3Rpb25JbmRleChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibykiLAotCSJ0ZXN0X2dldFJvd0NvdW50KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXIpIiwKLQkidGVzdF9nZXRIZWFkZXJIZWlnaHQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUpIiwKLX07Ci0KLXN0YXRpYyBib29sZWFuIGlzRXhjbHVkZWQoU3RyaW5nIG5hbWUpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVUZXN0cy5sZW5ndGg7IGkrKykgewotCQlpZiAobmFtZS5lcXVhbHMoZXhjbHVkZVRlc3RzW2ldKSkgcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVN3dFRlc3RDYXNlLnVuaW1wbGVtZW50ZWRNZXRob2RzID0gMDsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLQlpZiAoU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMgPiAwKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG5DYWxscyB0byB3YXJuVW5pbXBsOiAiICsgU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuRXhjbHVkZWQgVGVzdHM6ICIgKyBleGNsdWRlVGVzdHMubGVuZ3RoKTsKLQl9Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIGZ1bGxTdWl0ZSA9IChUZXN0U3VpdGUpQWxsVGVzdHMuc3VpdGUoKTsKLQlUZXN0U3VpdGUgZmlsdGVyZWRTdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZ1bGxTdWl0ZS50ZXN0Q291bnQoKTsgaSsrKSB7Ci0JCVRlc3QgY2FuZGlkYXRlVGVzdCA9IGZ1bGxTdWl0ZS50ZXN0QXQoaSk7Ci0JCWlmIChjYW5kaWRhdGVUZXN0IGluc3RhbmNlb2YgVGVzdFN1aXRlKSB7Ci0JCQlUZXN0U3VpdGUgc3VpdGUgPSAoVGVzdFN1aXRlKWNhbmRpZGF0ZVRlc3Q7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHN1aXRlLnRlc3RDb3VudCgpOyBqKyspIHsKLQkJCQlUZXN0IHRlc3QgPSBzdWl0ZS50ZXN0QXQoaik7Ci0JCQkJaWYgKCFpc0V4Y2x1ZGVkKHRlc3QudG9TdHJpbmcoKSkpIGZpbHRlcmVkU3VpdGUuYWRkVGVzdCh0ZXN0KTsJCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIGZpbHRlcmVkU3VpdGU7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViM2I0NTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIFN1aXRlIGZvciBydW5uaW5nIGFsbCBTV1QgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVN3dFRlc3RDYXNlLnVuaW1wbGVtZW50ZWRNZXRob2RzID0gMDsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLQlpZiAoU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMgPiAwKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG5DYWxscyB0byB3YXJuVW5pbXBsOiAiICsgU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMpOwotCX0KLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IEFsbFRlc3RzKCk7Ci19Ci0KLXB1YmxpYyBBbGxUZXN0cygpIHsKLQlzdXBlcigpOwotCS8qIFRoZSBsb2dpY2FsIG9yZGVyIHRvIHJ1biB0aGUgdGVzdHMgaW4gaXM6Ci0JICogLSBTV1QsIFNXVEVycm9yLCBTV1RFeGNlcHRpb24KLQkgKiAtIERpc3BsYXkKLQkgKiAtIGdyYXBoaWNzIGNsYXNzZXMKLQkgKiAtIGl0ZW1zIGFuZCBDYXJldCwgZXRjCi0JICogLSB3aWRnZXRzCi0JICogLSBkaWFsb2dzCi0JICogLSBsYXlvdXQKLQkgKiAtIGN1c3RvbSB3aWRnZXRzCi0JICogLSBwcmludGluZyBhbmQgcHJvZ3JhbQotCSAqIC0gZXZlbnRzCi0JICogLSBkcmFnICYgZHJvcAotCSAqIC0gYWNjZXNzaWJpbGl0eQotCSAqIC0gT0xFCi0JICogLSBicm93c2VyCi0JICovCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1Quc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFeGNlcHRpb24uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFcnJvci5zdWl0ZSgpKTsKLQotCS8qIE5PVEU6IElmIHRoZSBEaXNwbGF5IHRlc3Qgc3VpdGUgaXMgcnVuLCBpdCBtdXN0IGJlIHJ1bgotCSAqIGJlZm9yZSBhbnkgb3RoZXIgdGVzdHMgdGhhdCBuZWVkIGEgZGlzcGxheSAoaS5lLiBncmFwaGljcwotCSAqIG9yIHdpZGdldCB0ZXN0cywgZXRjKS4gT3RoZXJ3aXNlLCBhbiBJbnZhbGlkVGhyZWFkQWNjZXNzCi0JICogZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGZvciBlYWNoIERpc3BsYXkgdGVzdC4KLQkgKi8KLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheS5zdWl0ZSgpKTsKLQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Uuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3Iuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQi5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3Muc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlci5zdWl0ZSgpKTsKLQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0uc3VpdGUoKSk7Ci0JLy9hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1R5cGVkTGlzdGVuZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUuc3VpdGUoKSk7Ci0JLy9hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJhY2tlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyLnN1aXRlKCkpOwotCQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbC5zdWl0ZSgpKTsKLQkvL2FkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucy5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGFiZWwuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0J1dHRvbi5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsQmFyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TYXNoLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Hcm91cC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2NhbGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NsaWRlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfUHJvZ3Jlc3NCYXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGluay5zdWl0ZSgpKTsKLQkvL2FkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFyLnN1aXRlKCkpOwotCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbG9yRGlhbG9nLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXJlY3RvcnlEaWFsb2cuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZvbnREaWFsb2cuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lc3NhZ2VCb3guc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01vbml0b3Iuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZERhdGEuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93RGF0YS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkTGF5b3V0LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0ZpbGxMYXlvdXQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93TGF5b3V0LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1MYXlvdXQuc3VpdGUoKSk7Ci0KLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Nhc2hGb3JtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0FuaW1hdGVkUHJvZ3Jlc3Muc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21iby5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZpZXdGb3JtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJBZGFwdGVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVFZGl0b3Iuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2Nyb2xsZWRDb21wb3NpdGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVHJlZUVkaXRvci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Qb3B1cExpc3Quc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQnVzeUluZGljYXRvci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3Iuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU1Quc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlci5zdWl0ZSgpKTsKLQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tBZGFwdGVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQuc3VpdGUoKSk7Ci0JCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludERpYWxvZy5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJEYXRhLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlci5zdWl0ZSgpKTsKLQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJvZ3JhbV9Qcm9ncmFtLnN1aXRlKCkpOwotCi0vLwlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9GaWxlVHJhbnNmZXIuc3VpdGUoKSk7Ci0vLwlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlQWRhcHRlci5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRBZGFwdGVyLnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVGV4dFRyYW5zZmVyLnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50LnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZS5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RORC5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YS5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1JURlRyYW5zZmVyLnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQ2xpcGJvYXJkLnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50LnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldC5zdWl0ZSgpKTsKLQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BQ0Muc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVBZGFwdGVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyLnN1aXRlKCkpOwotCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT0xFLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDb250cm9sU2l0ZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGcmFtZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGdW5jdGlvbkRlc2NyaXB0aW9uLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVBhcmFtZXRlckRlc2NyaXB0aW9uLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQuc3VpdGUoKSk7Ci0KLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3Nlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25BZGFwdGVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzQWRhcHRlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93QWRhcHRlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3Qob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXIuVGVzdF9Ccm93c2VyU3VpdGUuc3VpdGUoKSk7Ci0KLQotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxXaWRnZXRUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxXaWRnZXRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQ4YjE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsV2lkZ2V0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBTdWl0ZSBmb3IgdGVzdGluZyBhbGwgb2YgdGhlIHdpZGdldCB0ZXN0IGNhc2VzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsV2lkZ2V0VGVzdHMgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuIChzdWl0ZSgpKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0KLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtLnN1aXRlKCkpOwotCS8vc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UeXBlZExpc3RlbmVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51LnN1aXRlKCkpOwotCS8vc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyYWNrZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplci5zdWl0ZSgpKTsKLQkKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwuc3VpdGUoKSk7Ci0JLy9zdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xhYmVsLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3Quc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbEJhci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2FzaC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21iby5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfR3JvdXAuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NjYWxlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TbGlkZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Byb2dyZXNzQmFyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUuc3VpdGUoKSk7Ci0JLy9zdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGluay5zdWl0ZSgpKTsKLQotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db2xvckRpYWxvZy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRmlsZURpYWxvZy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlyZWN0b3J5RGlhbG9nLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Gb250RGlhbG9nLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZXNzYWdlQm94LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Nb25pdG9yLnN1aXRlKCkpOwotCi0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVFdmVudC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUVkaXRvci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9BbmltYXRlZFByb2dyZXNzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2Uuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdGFja0xheW91dC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlFdmVudC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DTGFiZWwuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlRWRpdG9yLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RyZWVFZGl0b3Iuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fUG9wdXBMaXN0LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0J1c3lJbmRpY2F0b3Iuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1NULnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXIuc3VpdGUoKSk7Ci0KLQlyZXR1cm4gc3VpdGU7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0NvbnNpc3RlbmN5VXRpbGl0eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9Db25zaXN0ZW5jeVV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkZDUzMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0NvbnNpc3RlbmN5VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci0KLQotcHVibGljIGNsYXNzIENvbnNpc3RlbmN5VXRpbGl0eSB7Ci0KLSAgICBzdGF0aWMgSGFzaE1hcCBldmVudE9yZGVyaW5nID0gbmV3IEhhc2hNYXAoKTsKLSAgICBzdGF0aWMgSGFzaE1hcCBldmVudFR5cGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBzdGF0aWMgewotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkRvdWJsZUNsaWNrIiwgCQkJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VVcCIsICJNb3VzZURvd24iLCAiTW91c2VEb3VibGVDbGljayIsICJEZWZhdWx0U2VsZWN0aW9uIiwgIk1vdXNlVXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJEcmFnRGV0ZWN0IiwgCQkJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIkRyYWdEZXRlY3QiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkVudGVyU2VsZWN0aW9uIiwgCQluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpSZXR1cm4iLCAiS2V5RG93biIsICJEZWZhdWx0U2VsZWN0aW9uIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiS2V5U2VsZWN0aW9uIiwgCQkJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6QXJyb3cgTmV4dCIsICJLZXlEb3duIiwgIlNlbGVjdGlvbjoiLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJNZW51RGV0ZWN0IiwgCQkJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIk1lbnVEZXRlY3QiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJCdXR0b25Nb3VzZVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiTW91c2VVcCIsICJTZWxlY3Rpb246In0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ29tYm9Nb3VzZVNlbGVjdGlvbiIsCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJNb3VzZVVwIiwgIlZlcmlmeSIsICJNb2RpZnkiLCAiU2VsZWN0aW9uOiJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNDb21ib01vdXNlU2VsZWN0aW9uIiwJbmV3IFN0cmluZ1tdIHsiTW9kaWZ5IiwgIlNlbGVjdGlvbjoifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJMaXN0TW91c2VTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIk1vdXNlVXAiLCAiU2VsZWN0aW9uOiJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNhc2hNb3VzZVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJTZWxlY3Rpb246RHJhZyIsICJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJNb3VzZVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFiRm9sZGVyTW91c2VTZWxlY3Rpb24iLG5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246IiwgIk1vdXNlVXAiIH0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFibGVNb3VzZVNlbGVjdGlvbiIsCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246IiwgIk1vdXNlVXAiIH0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVG9vbEJhck1vdXNlU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJNb3VzZVVwIiwgIlNlbGVjdGlvbjoifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUcmVlTW91c2VTZWxlY3Rpb24iLAkJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VVcCIgfSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJsZVRyZWVNb3VzZVNlbGVjdGlvbiIsbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VVcCIgfSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDVGFiRm9sZGVyTW91c2VTZWxlY3Rpb24iLG5ldyBTdHJpbmdbXSB7IlNlbGVjdGlvbjoiLCAiTW91c2VEb3duIiwgIk1vdXNlVXAiIH0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkxpc3REb3VibGVDbGljayIsIAkJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIk1vdXNlVXAiLCAiU2VsZWN0aW9uOiIsICJNb3VzZURvd24iLCAiTW91c2VEb3VibGVDbGljayIsICJEZWZhdWx0U2VsZWN0aW9uIiwgIk1vdXNlVXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJCdXR0b25FbnRlclNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpSZXR1cm4iLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNDb21ib0VudGVyU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7IlRyYXZlcnNlOlJldHVybiIsICJEZWZhdWx0U2VsZWN0aW9uIiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUb29sQmFyRW50ZXJTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6UmV0dXJuIiwgIlNlbGVjdGlvbjoiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRyZWVEcmFnRGV0ZWN0IiwgCQluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJEcmFnRGV0ZWN0IiwgIk1vdXNlVXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJsZVRyZWVEcmFnRGV0ZWN0IiwgCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246IiwgIkRyYWdEZXRlY3QiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYmxlTWVudURldGVjdCIsIAkJbmV3IFN0cmluZ1tdIHsiTWVudURldGVjdCIsICJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJNb3VzZVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFibGVUcmVlTWVudURldGVjdCIsCW5ldyBTdHJpbmdbXSB7Ik1lbnVEZXRlY3QiLCAiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJCdXR0b25TcGFjZVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpNbmVtb25pYyIsICJLZXlEb3duIiwgIktleVVwIiwgIlNlbGVjdGlvbjoifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJMaXN0U3BhY2VTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiU2VsZWN0aW9uOiIsICJLZXlEb3duIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVG9vbEJhclNwYWNlU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJNb3VzZVVwIiwgIlNlbGVjdGlvbjoiLCAiVHJhdmVyc2U6TW5lbW9uaWMiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRyZWVTcGFjZVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJTZWxlY3Rpb246IiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJsZVRyZWVTcGFjZVNlbGVjdGlvbiIsbmV3IFN0cmluZ1tdIHsiS2V5RG93biIsICJLZXlVcCJ9KTsgCi0gICAgICAgIAotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ29tYm9LZXlTZWxlY3Rpb24iLCAJCW5ldyBTdHJpbmdbXSB7IktleURvd24iLCAiVmVyaWZ5IiwgIk1vZGlmeSIsICJTZWxlY3Rpb246IiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ0NvbWJvS2V5U2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7IlRyYXZlcnNlOkFycm93IE5leHQiLCAiTW9kaWZ5IiwgIlNlbGVjdGlvbjoiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNUYWJGb2xkZXJLZXlTZWxlY3Rpb24iLAluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpBcnJvdyBOZXh0IiwgIlNlbGVjdGlvbjoiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNsaWRlcktleVNlbGVjdGlvbiIsCQluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpBcnJvdyBOZXh0IiwgIktleURvd24iLCAiU2VsZWN0aW9uOkFycm93IERvd24iLCAiS2V5VXAiIH0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNsaWRlckFycm93U2VsZWN0aW9uIiwJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjpBcnJvdyBEb3duIiwgIk1vdXNlVXAiIH0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNvb2xCYXJDaGV2cm9uRHJhZ0RldGVjdCIsbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIkRyYWdEZXRlY3QifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDb29sQmFyQ2hldnJvbk1lbnVEZXRlY3QiLG5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246QXJyb3cifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDb29sQmFyQ2hldnJvbk1vdXNlU2VsZWN0aW9uIixuZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOkFycm93IiwgfSk7Ci0gICAgICAgIAotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU2NhbGVUcm91Z2hTZWxlY3Rpb24iLAluZXcgU3RyaW5nW10geyJTZWxlY3Rpb246IiwgIk1vdXNlRG93biIsICJNb3VzZVVwIiB9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNsaWRlclRyb3VnaFNlbGVjdGlvbiIsCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246UGFnZSBEb3duIiwgIk1vdXNlVXAiIH0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU2NhbGVUaHVtYlNlbGVjdGlvbiIsCW5ldyBTdHJpbmdbXSB7IlNlbGVjdGlvbjoiLCAiTW91c2VEb3duIiwgIk1vdXNlVXAiIH0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU2xpZGVyVGh1bWJTZWxlY3Rpb24iLAluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOkRyYWciLCAiTW91c2VVcCIgfSk7Ci0KLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNoZWxsQ2xvc2UiLAkJCQluZXcgU3RyaW5nW10geyJDbG9zZSIsICJEaXNwb3NlIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU2hlbGxEaXNwb3NlIiwJCQluZXcgU3RyaW5nW10geyJEaXNwb3NlIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU2hlbGxJY29uaWZ5IiwJCQluZXcgU3RyaW5nW10geyJGb2N1c091dCIsICJJY29uaWZ5IiwgIkRlYWN0aXZhdGUiLCAiRGVpY29uaWZ5IiwgIkFjdGl2YXRlIiwgIkZvY3VzSW4iLCAiQWN0aXZhdGUifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTaGVsbE9wZW4iLAkJCQluZXcgU3RyaW5nW10geyJBY3RpdmF0ZSIsICJGb2N1c0luIiwgIlNob3cifSk7Ci0gICAgICAgIAotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFiRm9sZGVyUGdkd25TZWxlY3Rpb24iLG5ldyBTdHJpbmdbXSB7IktleURvd24iLCAiVHJhdmVyc2U6UGFnZSBOZXh0IiwgIlNlbGVjdGlvbjoiLCAiS2V5VXAiLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJGb2xkZXJQZ3VwU2VsZWN0aW9uIiwgbmV3IFN0cmluZ1tdIHsiS2V5RG93biIsICJUcmF2ZXJzZTpQYWdlIFByZXZpb3VzIiwgIlNlbGVjdGlvbjoiLCAiS2V5VXAiLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDVGFiRm9sZGVyUGdkd25TZWxlY3Rpb24iLG5ldyBTdHJpbmdbXSB7IktleURvd24iLCAiU2VsZWN0aW9uOiIsICJUcmF2ZXJzZTpOb25lIiwgIktleVVwIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ1RhYkZvbGRlclBndXBTZWxlY3Rpb24iLG5ldyBTdHJpbmdbXSB7IktleURvd24iLCAiU2VsZWN0aW9uOiIsICJUcmF2ZXJzZTpOb25lIiwgIktleVVwIiwgIktleVVwIn0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlN0eWxlZFRleHRNb2RpZnkiLAkJbmV3IFN0cmluZ1tdIHsiVmVyaWZ5IiwgIk1vZGlmeSIsICJLZXlEb3duIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGV4dE1vZGlmeSIsCQkJCW5ldyBTdHJpbmdbXSB7IktleURvd24iLCAiVmVyaWZ5IiwgIk1vZGlmeSIsICJLZXlVcCJ9KTsJCQotICAgICAgICAgICAgICAgIAotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVHJlZUtleUV4cGFuZCIsIAkJCW5ldyBTdHJpbmdbXSB7IlRyYXZlcnNlOkFycm93IE5leHQiLCAiS2V5RG93biIsICJFeHBhbmQiLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUcmVlTW91c2VFeHBhbmQiLCAJCW5ldyBTdHJpbmdbXSB7IkV4cGFuZCIsICJNb3VzZURvd24iLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYmxlVHJlZUtleUV4cGFuZCIsIAluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpBcnJvdyBOZXh0IiwgIkV4cGFuZCIsICJLZXlEb3duIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFibGVUcmVlTW91c2VFeHBhbmQiLCAJbmV3IFN0cmluZ1tdIHsiRXhwYW5kIiwgIk1vdXNlRG93biIsICJTZWxlY3Rpb246IiwgIk1vdXNlVXAifSk7Ci0gICAgICAgIAotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFibGVUcmVlVGFibGUiLCAJCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJNb3VzZVVwIiwgIk1vdXNlRG91YmxlQ2xpY2siLCAiS2V5RG93biIsICJLZXlVcCIsICJNZW51RGV0ZWN0IiwgIkRyYWdEZXRlY3QiLCAiVHJhdmVyc2UifSk7Ci0gICAgICAgIAotICAgICAgICBldmVudFR5cGVzLnB1dCgiTm9uZSIsIG5ldyBJbnRlZ2VyKFNXVC5Ob25lKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJLZXlEb3duIiwgbmV3IEludGVnZXIoU1dULktleURvd24pKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIktleVVwIiwgbmV3IEludGVnZXIoU1dULktleVVwKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJNb3VzZURvd24iLCBuZXcgSW50ZWdlcihTV1QuTW91c2VEb3duKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJNb3VzZVVwIiwgbmV3IEludGVnZXIoU1dULk1vdXNlVXApKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk1vdXNlTW92ZSIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZU1vdmUpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk1vdXNlRW50ZXIiLCBuZXcgSW50ZWdlcihTV1QuTW91c2VFbnRlcikpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiTW91c2VFeGl0IiwgbmV3IEludGVnZXIoU1dULk1vdXNlRXhpdCkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiTW91c2VEb3VibGVDbGljayIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZURvdWJsZUNsaWNrKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJQYWludCIsIG5ldyBJbnRlZ2VyKFNXVC5QYWludCkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiTW92ZSIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3ZlKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJSZXNpemUiLCBuZXcgSW50ZWdlcihTV1QuUmVzaXplKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJEaXNwb3NlIiwgbmV3IEludGVnZXIoU1dULkRpc3Bvc2UpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIlNlbGVjdGlvbiIsIG5ldyBJbnRlZ2VyKFNXVC5TZWxlY3Rpb24pKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkRlZmF1bHRTZWxlY3Rpb24iLCBuZXcgSW50ZWdlcihTV1QuRGVmYXVsdFNlbGVjdGlvbikpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiRm9jdXNJbiIsIG5ldyBJbnRlZ2VyKFNXVC5Gb2N1c0luKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJGb2N1c091dCIsIG5ldyBJbnRlZ2VyKFNXVC5Gb2N1c091dCkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiRXhwYW5kIiwgbmV3IEludGVnZXIoU1dULkV4cGFuZCkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiQ29sbGFwc2UiLCBuZXcgSW50ZWdlcihTV1QuQ29sbGFwc2UpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkljb25pZnkiLCBuZXcgSW50ZWdlcihTV1QuSWNvbmlmeSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiRGVpY29uaWZ5IiwgbmV3IEludGVnZXIoU1dULkRlaWNvbmlmeSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiQ2xvc2UiLCBuZXcgSW50ZWdlcihTV1QuQ2xvc2UpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIlNob3ciLCBuZXcgSW50ZWdlcihTV1QuU2hvdykpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiSGlkZSIsIG5ldyBJbnRlZ2VyKFNXVC5IaWRlKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJNb2RpZnkiLCBuZXcgSW50ZWdlcihTV1QuTW9kaWZ5KSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJWZXJpZnkiLCBuZXcgSW50ZWdlcihTV1QuVmVyaWZ5KSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJBY3RpdmF0ZSIsIG5ldyBJbnRlZ2VyKFNXVC5BY3RpdmF0ZSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiRGVhY3RpdmF0ZSIsIG5ldyBJbnRlZ2VyKFNXVC5EZWFjdGl2YXRlKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJIZWxwIiwgbmV3IEludGVnZXIoU1dULkhlbHApKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkRyYWdEZXRlY3QiLCBuZXcgSW50ZWdlcihTV1QuRHJhZ0RldGVjdCkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiQXJtIiwgbmV3IEludGVnZXIoU1dULkFybSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiVHJhdmVyc2UiLCBuZXcgSW50ZWdlcihTV1QuVHJhdmVyc2UpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk1vdXNlSG92ZXIiLCBuZXcgSW50ZWdlcihTV1QuTW91c2VIb3ZlcikpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiSGFyZEtleURvd24iLCBuZXcgSW50ZWdlcihTV1QuSGFyZEtleURvd24pKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkhhcmRLZXlVcCIsIG5ldyBJbnRlZ2VyKFNXVC5IYXJkS2V5VXApKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk1lbnVEZXRlY3QiLCBuZXcgSW50ZWdlcihTV1QuTWVudURldGVjdCkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiU2V0RGF0YSIsIG5ldyBJbnRlZ2VyKFNXVC5TZXREYXRhKSk7Ci0gICAgfQotIAotICAgIHN0YXRpYyBTdHJpbmdbXSBldmVudE5hbWVzID0gewotCQkiTm9uZSIsIAkJCSJLZXlEb3duIiwgCQkiS2V5VXAiLCAJCQkiTW91c2VEb3duIiwgCi0JCSJNb3VzZVVwIiwJCQkiTW91c2VNb3ZlIiwJIk1vdXNlRW50ZXIiLAkJIk1vdXNlRXhpdCIsCi0JCSJNb3VzZURvdWJsZUNsaWNrIiwJIlBhaW50IiwJCSJNb3ZlIiwJCQkJIlJlc2l6ZSIsCi0JCSJEaXNwb3NlIiwJCQkiU2VsZWN0aW9uIiwJIkRlZmF1bHRTZWxlY3Rpb24iLAkiRm9jdXNJbiIsCi0JCSJGb2N1c091dCIsCQkJIkV4cGFuZCIsCQkiQ29sbGFwc2UiLAkJCSJJY29uaWZ5IiwKLQkJIkRlaWNvbmlmeSIsCQkiQ2xvc2UiLAkJIlNob3ciLAkJCQkiSGlkZSIsCi0JCSJNb2RpZnkiLAkJCSJWZXJpZnkiLAkJIkFjdGl2YXRlIiwJCQkiRGVhY3RpdmF0ZSIsCi0JCSJIZWxwIiwJCQkJIkRyYWdEZXRlY3QiLAkiQXJtIiwJCQkJIlRyYXZlcnNlIiwKLQkJIk1vdXNlSG92ZXIiLAkJIkhhcmRLZXlEb3duIiwJIkhhcmRLZXlVcCIsCQkiTWVudURldGVjdCIsCi0JCSJTZXREYXRhIn07Ci0gICAgCi0gICAgc3RhdGljIGludFtdIGNvbnZlcnRFdmVudE5hbWVzKFN0cmluZ1tdIG9yaWdOYW1lcykgewotICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbb3JpZ05hbWVzLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZ05hbWVzLCAwLCBuYW1lcywgMCwgb3JpZ05hbWVzLmxlbmd0aCk7Ci0gICAgICAgIG5hbWVzID0gcmVtb3ZlRHVwbGljYXRlcyhuYW1lcyk7Ci0gICAgICAgIGludFtdIHR5cGVzID0gbmV3IGludFtuYW1lcy5sZW5ndGhdOwotICAgICAgICBmb3IoaW50IGk9MDsgaTxuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHlwZXNbaV0gPSAoKEludGVnZXIpZXZlbnRUeXBlcy5nZXQobmFtZXNbaV0pKS5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0eXBlczsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gcmVtb3ZlRHVwbGljYXRlcyhTdHJpbmdbXSBuYW1lcykgewotICAgICAgICBpbnQgZHVwcz0wOwotICAgICAgICBmb3IoaW50IGk9MDsgaTxuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IGluZGV4ID0gbmFtZXNbaV0uaW5kZXhPZignOicpOwotICAgICAgICAgICAgaWYoaW5kZXggIT0gLTEpCi0gICAgICAgICAgICAgICAgbmFtZXNbaV0gPSBuYW1lc1tpXS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICAgICAgZm9yKGludCBqPTA7IGo8aTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaWYobmFtZXNbaV0uZXF1YWxzKG5hbWVzW2pdKSkgewotICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGs9aSsxOyBrPG5hbWVzLmxlbmd0aDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc1trLTFdID0gbmFtZXNba107Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNbbmFtZXMubGVuZ3RoLTFdID0gImR1cGxpY2F0ZSIrIGR1cHM7Ci0gICAgICAgICAgICAgICAgICAgIGR1cHMrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nW10gdGVtcCA9IG5ldyBTdHJpbmdbbmFtZXMubGVuZ3RoLWR1cHNdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG5hbWVzLCAwLCB0ZW1wLCAwLCBuYW1lcy5sZW5ndGgtZHVwcyk7Ci0gICAgICAgIHJldHVybiB0ZW1wOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNlbGVjdGlvblR5cGVzID0gewotICAgICAgICAiRHJhZyIsIAkJIkhvbWUiLCAgCQkJIkVuZCIsIAkJCQkiQXJyb3cgRG93biIsIAotICAgICAgICAiQXJyb3cgVXAiLCAJIlBhZ2UgRG93biIsIAkJIlBhZ2UgVXAiLCAJCQkiQ2hlY2siLCAJCi0gICAgICAgICJBcnJvdyIsICAgICAKLSAgICB9OwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgaW50W10gW10gc2VsZWN0aW9uQ29udmVyc2lvbiA9IHsKLSAgICAgICAge1NXVC5EUkFHLCAwfSwKLSAgICAgICAge1NXVC5IT01FLCAxfSwKLSAgICAgICAge1NXVC5FTkQsIDJ9LAotICAgICAgICB7U1dULkFSUk9XX0RPV04sIDN9LAotICAgICAgICB7U1dULkFSUk9XX1VQLCA0fSwKLSAgICAgICAge1NXVC5QQUdFX0RPV04sIDV9LAotICAgICAgICB7U1dULlBBR0VfVVAsIDZ9LAotICAgICAgICB7U1dULkNIRUNLLCA3fSwKLSAgICAgICAge1NXVC5BUlJPVywgOH0sCi0gICAgfTsKLSAgICAKLSAgICBzdGF0aWMgU3RyaW5nIGdldFNlbGVjdGlvblR5cGUoaW50IHR5cGUpIHsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8c2VsZWN0aW9uQ29udmVyc2lvbi5sZW5ndGg7aSsrKSB7Ci0gICAgICAgICAgICBpZih0eXBlID09IHNlbGVjdGlvbkNvbnZlcnNpb25baV1bMF0pIAotICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3Rpb25UeXBlc1tzZWxlY3Rpb25Db252ZXJzaW9uW2ldWzFdXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBTdHJpbmdbXSB0cmF2ZXJzYWxUeXBlcyA9IHsKLSAgICAJICAgICJOb25lIiwgCQkiRXNjYXBlIiwgCQkJIlJldHVybiIsIAkJCSJUYWIgUHJldmlvdXMiLCAKLSAgICAJICAgICJUYWIgTmV4dCIsIAkiQXJyb3cgUHJldmlvdXMiLAkiQXJyb3cgTmV4dCIsIAkJIk1uZW1vbmljIiwgCi0gICAgCSAgICAiUGFnZSBQcmV2aW91cyIsICJQYWdlIE5leHQifTsKLQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0VHJhdmVyc2FsVHlwZShpbnQgdHlwZSkgewotICAgICAgICBpbnQgcG93ID0gMDsKLSAgICAgICAgaWYodHlwZSAhPSAwKQotICAgICAgICAgICAgcG93ID0oaW50KShNYXRoLmxvZyh0eXBlKS9NYXRoLmxvZygyKSk7Ci0gICAgICAgIHJldHVybiB0cmF2ZXJzYWxUeXBlc1twb3ddOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBTSEVMTF9JQ09OSUZZID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IEtFWV9QUkVTUyA9IDEwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRE9VQkxFX0tFWV9QUkVTUyA9IDIwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTU9VU0VfQ0xJQ0sgPSAzMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1PVVNFX0RPVUJMRUNMSUNLID0gNDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNT1VTRV9EUkFHID0gNTA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RJT04gPSA2MDsKLSAgICAKLSAgICBzdGF0aWMgZmluYWwgaW50IEVTQ0FQRV9NRU5VID0gMTsKLSAgICAKLSAgICAKLSAgICAvL3Bvc3RzIGEgY2xpY2sgYXQgZGlzcGxheSBtYXBwZWQgeCBhbmQgeSB3aXRoIGJ1dHRvbiBidXR0b24KLSAgICBzdGF0aWMgYm9vbGVhbiBwb3N0Q2xpY2soRGlzcGxheSBkaXNwbGF5LCBpbnQgeCwgaW50IHksIGludCBidXR0b24pIHsKLSAgICAgICAgRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgZXZlbnQudHlwZSA9IFNXVC5Nb3VzZU1vdmU7Ci0gICAgICAgIGV2ZW50LnggPSB4OwotICAgICAgICBldmVudC55ID0geTsKLSAgICAgICAgaWYoIWRpc3BsYXkucG9zdChldmVudCkpICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlTW92ZSBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuTW91c2VEb3duOwotICAgICAgICBldmVudC5idXR0b24gPSBidXR0b247Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlRG93biBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgZXZlbnQudHlwZSA9IFNXVC5Nb3VzZVVwOwotICAgICAgICBldmVudC5idXR0b24gPSBidXR0b247Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlVXAgbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgLy9UT0RPOiBwb3RlbnRpYWxseSBkYW5nZXJvdXMgdG8gaGF2ZSBhIG1vdXNlZG93biBhbmQgbm8gbW91c2V1cAotICAgICAgICAgICAgLy9mb3JjZSB0aGUgaXNzdWU/Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLS8vCSAgCXRyeSB7Ci0vLwkgICAgICAgIFRocmVhZC5zbGVlcCgxNjAwKTsJCi0vLwkgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkge30KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBib29sZWFuIHBvc3RDbGljayhEaXNwbGF5IGRpc3BsYXksIFBvaW50IHB0LCBpbnQgYnV0dG9uKSB7Ci0gICAgICAgIHJldHVybiBwb3N0Q2xpY2soZGlzcGxheSwgcHQueCwgcHQueSwgYnV0dG9uKTsKLSAgICB9Ci0gICAgCi0gICAgLy9kb3VibGVjbGlja3MgYXQgZGlzcGxheSBtYXBwZWQgcHQgd2l0aCBidXR0b24gYnV0dG9uCi0gICAgc3RhdGljIGJvb2xlYW4gcG9zdERvdWJsZUNsaWNrKERpc3BsYXkgZGlzcGxheSwgUG9pbnQgcHQsIGludCBidXR0b24pIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSBwb3N0Q2xpY2soZGlzcGxheSwgcHQsIGJ1dHRvbik7Ci0gICAgICAgIHJldCAmPSBwb3N0Q2xpY2soZGlzcGxheSwgcHQsIGJ1dHRvbik7Ci0vLwkgIAl0cnkgewotLy8JICAgICAgICBUaHJlYWQuc2xlZXAoMTYwMCk7CQotLy8JICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHt9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIAotICAgIC8vcG9zdCBhIGtleSBwcmVzcyAKLSAgICBzdGF0aWMgYm9vbGVhbiBwb3N0S2V5UHJlc3MoRGlzcGxheSBkaXNwbGF5LCBpbnQgY2gsIGludCBrZXljb2RlKSB7Ci0gICAgICAgIEV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuS2V5RG93bjsKLSAgICAgICAgZXZlbnQuY2hhcmFjdGVyID0gKGNoYXIpY2g7Ci0gICAgICAgIGV2ZW50LmtleUNvZGUgPSBrZXljb2RlOwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJLZXlEb3duIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULktleVVwOwotICAgICAgICBldmVudC5jaGFyYWN0ZXIgPSAoY2hhciljaDsKLSAgICAgICAgZXZlbnQua2V5Q29kZSA9IGtleWNvZGU7Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIktleVVwIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIC8vVE9ETzogcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIHRvIGhhdmUgYSBrZXlkb3duIGFuZCBubyBrZXl1cAotICAgICAgICAgICAgLy9mb3JjZSB0aGUgaXNzdWU/Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8vcG9zdCBwcmVzc2luZyBhbmQgaG9sZGluZyBjaDEva2V5Y29kZTEgYW5kIHRoZW4gcHJlc3NpbmcgY2gyL2tleWNvZGUyCi0gICAgc3RhdGljIGJvb2xlYW4gcG9zdERvdWJsZUtleVByZXNzKERpc3BsYXkgZGlzcGxheSwgaW50IGNoMSwgaW50IGtleWNvZGUxLCAKLSAgICAgICAgICAgIAkJCQkJCSAgaW50IGNoMiwgaW50IGtleWNvZGUyKSB7Ci0gICAgICAgIEV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuS2V5RG93bjsKLSAgICAgICAgZXZlbnQuY2hhcmFjdGVyID0gKGNoYXIpY2gxOwotICAgICAgICBldmVudC5rZXlDb2RlID0ga2V5Y29kZTE7Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIktleURvd24gbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHBvc3RLZXlQcmVzcyhkaXNwbGF5LCBjaDIsIGtleWNvZGUyKTsKLSAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgZXZlbnQudHlwZSA9IFNXVC5LZXlVcDsKLSAgICAgICAgZXZlbnQuY2hhcmFjdGVyID0gKGNoYXIpY2gxOwotICAgICAgICBldmVudC5rZXlDb2RlID0ga2V5Y29kZTE7Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIktleVVwIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIC8vVE9ETzogcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIHRvIGhhdmUgYSBrZXlkb3duIGFuZCBubyBrZXl1cAotICAgICAgICAgICAgLy9mb3JjZSB0aGUgaXNzdWU/Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8vcG9zdHMgYSBkcmFnIGZyb20gZGlzcGxheSBtYXBwZWQgb3JpZ2luIHRvIGRlc3RpbmF0aW9uCi0gICAgLy90aGUgYnV0dG9uIHRvIGRyYWcgd2l0aCBpcyBzeXN0ZW0gZGVwZW5kZW50Ci0gICAgc3RhdGljIGJvb2xlYW4gcG9zdERyYWcoRGlzcGxheSBkaXNwbGF5LCBQb2ludCBvcmlnaW4sIFBvaW50IGRlc3RpbmF0aW9uKSB7Ci0gICAgICAgIGludCBidXR0b24gPSBkZXRlcm1pbmVEcmFnKCk7Ci0gICAgICAgIEV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuTW91c2VNb3ZlOwotICAgICAgICBldmVudC54ID0gb3JpZ2luLng7Ci0gICAgICAgIGV2ZW50LnkgPSBvcmlnaW4ueTsKLSAgICAgICAgaWYoIWRpc3BsYXkucG9zdChldmVudCkpICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlTW92ZSBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuTW91c2VEb3duOwotICAgICAgICBldmVudC5idXR0b24gPSBidXR0b247Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlRG93biBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuTW91c2VNb3ZlOwotICAgICAgICBldmVudC54ID0gZGVzdGluYXRpb24ueDsKLSAgICAgICAgZXZlbnQueSA9IGRlc3RpbmF0aW9uLnk7Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZU1vdmUgbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgZXZlbnQudHlwZSA9IFNXVC5Nb3VzZVVwOwotICAgICAgICBldmVudC5idXR0b24gPSBidXR0b247Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlVXAgbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgLy9UT0RPOiBwb3RlbnRpYWxseSBkYW5nZXJvdXMgdG8gaGF2ZSBhIG1vdXNlZG93biBhbmQgbm8gbW91c2V1cAotICAgICAgICAgICAgLy9mb3JjZSB0aGUgaXNzdWU/Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy9kZXRlcm1pbmVzIHdoaWNoIGJ1dHRvbiB0byBkcmFnIHdpdGgKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZGV0ZXJtaW5lRHJhZygpIHsKLSAgICAgICAgaWYoU3d0SnVuaXQuaXNXaW5kb3dzIHx8IFN3dEp1bml0LmlzQ2FyYm9uIHx8IFN3dEp1bml0LmlzR1RLKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICAKLSAgICAvL3Bvc3RzIGEgc2VsZWN0aW9uIGllIGNsaWNrcyBvbiBwdDEsIHRoZW4gY2xpY2sgb24gcHQyIChmb3IgZXhhbXBsZSwgc2VsZWN0aW5nCi0gICAgLy9vbmUgb2YgdGhlIG9wdGlvbnMgaW4gYSBjb21ibyBieSBkcm9wcGluZyBkb3duIHRoZSBsaXN0KQotICAgIHN0YXRpYyBib29sZWFuIHBvc3RTZWxlY3Rpb24oZmluYWwgRGlzcGxheSBkaXNwbGF5LCBQb2ludCBwdDEsIFBvaW50IHB0MikgewotICAgICAgICBib29sZWFuIHJldCA9IHBvc3RDbGljayhkaXNwbGF5LCBwdDEsIDEpOwotICAgICAgICBkaXNwbGF5LnN5bmNFeGVjKG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgZGlzcGxheS51cGRhdGUoKTsKLSAgICAgICAgfX0pOwotICAgICAgICByZXQgJj0gcG9zdENsaWNrKGRpc3BsYXksIHB0MiwgMSk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLy9pY29uaWZpZXMgdGhlIHNoZWxsLiBwdCBpcyBhIHN5c3RlbSBkZXBlbmRlbnQgcG9pbnQgb24gdGhlIHNoZWxsLgotICAgIHN0YXRpYyBib29sZWFuIHBvc3RTaGVsbEljb25pZnkoRGlzcGxheSBkaXNwbGF5LCBQb2ludCBwdCwgaW50IGJ1dHRvbikgewotICAgICAgICBpbnQgeCA9IHB0Lng7Ci0gICAgICAgIGludCB5ID0gcHQueSAtIDEwOwotICAgICAgICBpZihTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLSAgICAgICAgICAgIHggKz0gLTM1OwotICAgICAgICB9IGVsc2UgaWYoU3d0SnVuaXQuaXNMaW51eCkgewotICAgICAgICAJeCArPSAtMTY7Ci0gICAgICAgIH0gZWxzZSBpZiAoU3d0SnVuaXQuaXNDYXJib24pIHsKLSAgICAgICAgCXggKz0gMzA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvc3RDbGljayhkaXNwbGF5LCB4LCB5LCBidXR0b24pOyAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0VtdWxhdGVkV2lkZ2V0c1Rlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0VtdWxhdGVkV2lkZ2V0c1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYmYzMjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9FbXVsYXRlZFdpZGdldHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogU3VpdGUgZm9yIHRlc3Rpbmcgd2lkZ2V0cyB0aGF0IGhhdmUgYmVlbiBlbXVsYXRlZCBvbiBNb3RpZi4KLSAqLwotcHVibGljIGNsYXNzIEVtdWxhdGVkV2lkZ2V0c1Rlc3RzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuIChzdWl0ZSgpKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0KLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29sb3JEaWFsb2cuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZvbnREaWFsb2cuc3VpdGUoKSk7CQotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uLnN1aXRlKCkpOwkKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0uc3VpdGUoKSk7Ci0JCQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvU3R5bGVkVGV4dENvbnRlbnRTcGVjLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N0eWxlZFRleHRDb250ZW50U3BlYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjQyMWUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvU3R5bGVkVGV4dENvbnRlbnRTcGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotLyoqCi0gKiBVc2UgdGhpcyB0ZXN0IGNsYXNzIHRvIHZhbGlkYXRlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHlsZWRUZXh0Q29udGVudAotICogaW50ZXJmYWNlLiAgVG8gcGVyZm9ybSB0aGUgdmFsaWRhdGlvbiwgY29weSB0aGlzIGNsYXNzIHRvIHRoZSBwYWNrYWdlIHdoZXJlIAotICogeW91ciBTdHlsZWRUZXh0Q29udGVudCBpbXBsZW1lbnRhdGlvbiBsaXZlcy4gIFRoZW4gc3BlY2lmeSB0aGUgZnVsbHkgcXVhbGlmaWVkCi0gKiBuYW1lIG9mIHlvdXIgU3R5bGVkVGV4dENvbnRlbnQgY2xhc3MgYXMgYW4gYXJndW1lbnQgdG8gdGhlIG1haW4gbWV0aG9kIG9mIHRoaXMgCi0gKiBjbGFzcy4gCi0gKiAKLSAqIE5PVEU6ICBUaGlzIHRlc3QgY2xhc3MgYXNzdW1lcyB0aGF0IHlvdXIgU3R5bGVkVGV4dENvbnRlbnQgaW1wbGVtZW50YXRpb24gCi0gKiBoYW5kbGVzIHRoZSBmb2xsb3dpbmcgZGVsaW1pdGVyczoKLSAqIAotICogCQkvcgotICogCQkvbgotICogCQkvci9uCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLXB1YmxpYyBjbGFzcyBTdHlsZWRUZXh0Q29udGVudFNwZWMgaW1wbGVtZW50cyBUZXh0Q2hhbmdlTGlzdGVuZXIgewotCXN0YXRpYyBTdHJpbmcgY29udGVudENsYXNzTmFtZTsKLQlzdGF0aWMgaW50IGZhaWxDb3VudCA9IDA7Ci0Jc3RhdGljIGludCBlcnJvckNvdW50ID0gMDsKLQlDbGFzcyBjb250ZW50Q2xhc3MgPSBudWxsOwotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnRJbnN0YW5jZSA9IG51bGw7Ci0JaW50IHZlcmlmeSA9IDA7Ci0JTWV0aG9kIGN1cnJlbnRNZXRob2QgPSBudWxsOwotCWJvb2xlYW4gZmFpbGVkID0gZmFsc2U7Ci0JU3R5bGVkVGV4dCB3aWRnZXQgPSBudWxsOwotCVNoZWxsIHNoZWxsID0gbnVsbDsKLQkKLXB1YmxpYyBTdHlsZWRUZXh0Q29udGVudFNwZWMoKSB7Ci19Ci1wdWJsaWMgdm9pZCBhc3NlcnRUcnVlKFN0cmluZyBtZXNzYWdlLCBib29sZWFuIGNvbmRpdGlvbikgewotCVN5c3RlbS5vdXQucHJpbnQoIlx0IiArIGN1cnJlbnRNZXRob2QuZ2V0TmFtZSgpICsgIiAiICsgbWVzc2FnZSk7Ci0JaWYgKCFjb25kaXRpb24pIAotCQlmYWlsKG1lc3NhZ2UpOwotCWVsc2UgCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiIHBhc3NlZCIpOwotfQotcHVibGljIHZvaWQgZmFpbChTdHJpbmcgbWVzc2FnZSkgewotCWZhaWxlZCA9IHRydWU7Ci0JU3lzdGVtLm91dC5wcmludGxuKCIgRkFJTEVEOiAiICsgbWVzc2FnZSk7Ci0JZmFpbENvdW50Kys7Ci19Ci1wdWJsaWMgU3R5bGVkVGV4dENvbnRlbnQgZ2V0Q29udGVudEluc3RhbmNlKCkgewotCWNvbnRlbnRJbnN0YW5jZS5zZXRUZXh0KCIiKTsKLQl3aWRnZXQuc2V0Q29udGVudChjb250ZW50SW5zdGFuY2UpOwotCXJldHVybiBjb250ZW50SW5zdGFuY2U7Ci19Ci1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZXN0VGV4dCgpIHsKLQlyZXR1cm4gCi0JCSJUaGlzIGlzIHRoZSBmaXJzdCBsaW5lLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIHNlY29uZCBsaW5lLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIHRoaXJkIGxpbmUuXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgZm91cnRoIGxpbmUuXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgZmlmdGggbGluZS5cclxuIiArCi0JCSJcclxuIiArCi0JCSJUaGlzIGlzIHRoZSBmaXJzdCBsaW5lIGFnYWluLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIHNlY29uZCBsaW5lIGFnYWluLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIHRoaXJkIGxpbmUgYWdhaW4uXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgZm91cnRoIGxpbmUgYWdhaW4uXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgZmlmdGggbGluZSBhZ2Fpbi5cclxuIiArCi0JCSJcclxuIiArCi0JCSJUaGlzIGlzIHRoZSBmaXJzdCBsaW5lIG9uY2UgYWdhaW4uXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgc2Vjb25kIGxpbmUgb25jZSBhZ2Fpbi5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSB0aGlyZCBsaW5lIG9uY2UgYWdhaW4uXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgZm91cnRoIGxpbmUgb25jZSBhZ2Fpbi5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSBmaWZ0aCBsaW5lIG9uY2UgYWdhaW4uIjsKLX0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlTdHlsZWRUZXh0Q29udGVudFNwZWMgc3BlYyA9IG5ldyBTdHlsZWRUZXh0Q29udGVudFNwZWMoKTsKLQlpZiAoYXJncy5sZW5ndGggPiAwKSB7Ci0JCWNvbnRlbnRDbGFzc05hbWUgPSBhcmdzWzBdOwotCX0gZWxzZSB7Ci0JCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULklDT05fRVJST1IpOwotCQlib3guc2V0TWVzc2FnZSgiQ29udGVudCBjbGFzcyBtdXN0IGJlIHNwZWNpZmllZCBhcyBhbiBleGVjdXRpb24gYXJndW1lbnQuIik7IC8vJE5PTi1OTFMtMSQKLQkJYm94Lm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLQlzcGVjLnJ1bigpOwotCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCVN5c3RlbS5vdXQucHJpbnRsbihmYWlsQ291bnQgKyAiIFRFU1QgRkFJTFVSRVMuIik7Ci0JU3lzdGVtLm91dC5wcmludGxuKGVycm9yQ291bnQgKyAiIFVORVhQRUNURUQgRVJST1JTLiIpOwotfQotcHVibGljIHZvaWQgcnVuKCkgewotCWlmIChjb250ZW50Q2xhc3NOYW1lLmVxdWFscygiIikpIHsKLQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuSUNPTl9FUlJPUik7Ci0JCWJveC5zZXRNZXNzYWdlKCJDb250ZW50IGNsYXNzIG11c3QgYmUgc3BlY2lmaWVkIGFzIGFuIGV4ZWN1dGlvbiBhcmd1bWVudC4iKTsgLy8kTk9OLU5MUy0xJAotCQlib3gub3BlbigpOwotCQlyZXR1cm47Ci0JfQotCWlmIChjb250ZW50Q2xhc3MgPT0gbnVsbCkgewotCQl0cnkgewotCQkJY29udGVudENsYXNzID0gQ2xhc3MuZm9yTmFtZShjb250ZW50Q2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5JQ09OX0VSUk9SKTsKLQkJCWJveC5zZXRNZXNzYWdlKCJDb250ZW50IGNsYXNzOlxuIiArIGNvbnRlbnRDbGFzc05hbWUgKyAiXG5ub3QgZm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJYm94Lm9wZW4oKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQl0cnkgewotCQljb250ZW50SW5zdGFuY2UgPSAoU3R5bGVkVGV4dENvbnRlbnQpY29udGVudENsYXNzLm5ld0luc3RhbmNlKCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULklDT05fRVJST1IpOwotCQlib3guc2V0TWVzc2FnZSgiVW5hYmxlIHRvIGFjY2VzcyBjb250ZW50IGNsYXNzOlxuIiArIGNvbnRlbnRDbGFzc05hbWUpOyAvLyROT04tTkxTLTEkCi0JCWJveC5vcGVuKCk7Ci0JCXJldHVybjsKLQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuSUNPTl9FUlJPUik7Ci0JCWJveC5zZXRNZXNzYWdlKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgY29udGVudCBjbGFzczpcbiIgKyBjb250ZW50Q2xhc3NOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlib3gub3BlbigpOwotCQlyZXR1cm47Ci0JfQotCUNsYXNzIGNsYXp6OwotCWNsYXp6ID0gdGhpcy5nZXRDbGFzcygpOwotCU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQlmb3IgKGludCBpPTA7IGk8bWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQlzZXRVcCgpOwotCQljdXJyZW50TWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJZmFpbGVkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAoY3VycmVudE1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aCgidGVzdF8iKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihjdXJyZW50TWV0aG9kLmdldE5hbWUoKSArICIuLi4iKTsKLQkJCQljdXJyZW50TWV0aG9kLmludm9rZSh0aGlzLCBuZXcgT2JqZWN0WzBdKTsKLQkJCQlpZiAoIWZhaWxlZCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBBU1NFRC4iKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxFRCIpOwotCQkJCX0KLQkJCX0gCi0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgY3VycmVudE1ldGhvZC5nZXROYW1lKCkgKyAiIEVSUk9SID09PiAiICsgZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxFRCIpOwotCQkJZXJyb3JDb3VudCsrOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgY3VycmVudE1ldGhvZC5nZXROYW1lKCkgKyAiIEVSUk9SID09PiAiICsgZXgudG9TdHJpbmcoKSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxFRCIpOwotCQkJZXJyb3JDb3VudCsrOwotCQl9Ci0JCWlmICh2ZXJpZnkgIT0gMCkgewotCQkJdmVyaWZ5ID0gMDsKLQkJCWNvbnRlbnRJbnN0YW5jZS5yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJdGVhckRvd24oKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXh0U2V0KFRleHRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLX0KLXB1YmxpYyB2b2lkIHRleHRDaGFuZ2VkKFRleHRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLX0KLXB1YmxpYyB2b2lkIHRleHRDaGFuZ2luZyhUZXh0Q2hhbmdpbmdFdmVudCBldmVudCkgewotCXN3aXRjaCAodmVyaWZ5KSB7Ci0JCWNhc2UgMSA6IHsKLQkJCWFzc2VydFRydWUoIjoxYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJYXNzZXJ0VHJ1ZSgiOjFiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMiA6IHsKLQkJCWFzc2VydFRydWUoIjoyYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDIpOwotCQkJYXNzZXJ0VHJ1ZSgiOjJiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAwKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMyA6IHsKLQkJCWFzc2VydFRydWUoIjozYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJYXNzZXJ0VHJ1ZSgiOjNiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAyKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgNDogewotCQkJYXNzZXJ0VHJ1ZSgiOjQ6IiwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSA1IDogewotCQkJYXNzZXJ0VHJ1ZSgiOjVhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQlhc3NlcnRUcnVlKCI6NWI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDEpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSA2IDogewotCQkJYXNzZXJ0VHJ1ZSgiOjZhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMSk7Ci0JCQlhc3NlcnRUcnVlKCI6NmI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDApOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSA4IDogewotCQkJYXNzZXJ0VHJ1ZSgiOjhhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMSk7Ci0JCQlhc3NlcnRUcnVlKCI6OGI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDApOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSA5IDogewotCQkJYXNzZXJ0VHJ1ZSgiOjlhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMSk7Ci0JCQlhc3NlcnRUcnVlKCI6OWI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDApOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxMDp7Ci0JCQlhc3NlcnRUcnVlKCI6MTA6IiwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxMTogewotCQkJYXNzZXJ0VHJ1ZSgiOjExOiIsIGZhbHNlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMTI6IHsKLQkJCWFzc2VydFRydWUoIjoxMmE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCWFzc2VydFRydWUoIjoxMmI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDEpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxMzogewotCQkJYXNzZXJ0VHJ1ZSgiOjEzYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJYXNzZXJ0VHJ1ZSgiOjEzYjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDE0OiB7Ci0JCQlhc3NlcnRUcnVlKCI6MTQ6IiwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxNTogewotCQkJYXNzZXJ0VHJ1ZSgiOjE1YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDEpOwotCQkJYXNzZXJ0VHJ1ZSgiOjE1YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMik7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDE2OnsKLQkJCWFzc2VydFRydWUoIjoxNjoiLCBmYWxzZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDE3OiB7Ci0JCQlhc3NlcnRUcnVlKCI6MTc6IiwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxODogewotCQkJYXNzZXJ0VHJ1ZSgiOjE4YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJYXNzZXJ0VHJ1ZSgiOjE4YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMik7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDE5OiB7Ci0JCQlhc3NlcnRUcnVlKCI6MTlhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQlhc3NlcnRUcnVlKCI6MTliOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAzKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMjA6IHsKLQkJCWFzc2VydFRydWUoIjoyMDoiLCBmYWxzZSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3RfSW5zZXJ0KCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQlTdHJpbmcgbmV3VGV4dDsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJ0ZXN0XG4gIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxYToiLCBuZXdUZXh0LmVxdWFscygidGVzdFxuIFRoaXNcbmlzIGEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjoxYjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDQpOwotCWFzc2VydFRydWUoIjoxYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJ0ZXN0IikpOwotCWFzc2VydFRydWUoIjoxZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIgVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6MWU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjoxZjoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDAsICIqKiogIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoyYToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuKioqIGlzIGEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjoyYjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjoyYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjoyZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIqKiogaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjoyZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIkxpbmUgMVxyXG5MaW5lIDIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxyIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjozYToiLCBuZXdUZXh0LmVxdWFscygiXHJMaW5lIDFcclxuTGluZSAyIikpOwotCWFzc2VydFRydWUoIjozYjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjozYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkxpbmUgMSIpKTsKLQlhc3NlcnRUcnVlKCI6M2U6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiTGluZSAyIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg5LCAwLCAiXHIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNmOiIsIG5ld1RleHQuZXF1YWxzKCJcckxpbmUgMVxyXG5cckxpbmUgMiIpKTsKLQlhc3NlcnRUcnVlKCI6M2c6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6M2g6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjozaToiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMaW5lIDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNqOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6M2s6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiTGluZSAyIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIG5ld1RleHQuZXF1YWxzKCJcblRoaXNcbmlzIGEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjo0YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDQpOwotCWFzc2VydFRydWUoIjo0YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6NGY6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiIikpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNywgMCwgIlxyXG5uZXdMaW5lIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo1YToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuaXNcclxubmV3TGluZSBhIHRlc3RcciIpKTsKLQlhc3NlcnRUcnVlKCI6NWI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NWM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6NWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIm5ld0xpbmUgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjo1ZjoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiVGhpc1xuaXNcclxubmV3TGluZSBhIHRlc3RcciIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NmE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbmlzXHJcbm5ld0xpbmUgYSB0ZXN0XHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjZjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImlzIikpOwotCWFzc2VydFRydWUoIjo2ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJuZXdMaW5lIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6NmY6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiIikpOwotCi0JLy8gaW5zZXJ0IGF0IGVuZAotCWNvbnRlbnQuc2V0VGV4dCgiVGhpcyIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg0LCAwLCAiXG4gIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo3YToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuICIpKTsKLQlhc3NlcnRUcnVlKCI6N2I6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6N2M6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6N2Q6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiICIpKTsKLQljb250ZW50LnNldFRleHQoIlRoaXNcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCAwLCAiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdlOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG5cbiIpKTsKLQlhc3NlcnRUcnVlKCI6N2Y6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6N2c6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6N2g6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo3aToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0KLQkvLyBpbnNlcnQgYXQgYmVnaW5uaW5nCi0JY29udGVudC5zZXRUZXh0KCJUaGlzIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6OGE6IiwgbmV3VGV4dC5lcXVhbHMoIlxuVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6OGI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6OGM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo4ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJUaGlzIikpOwotCi0JLy8gaW5zZXJ0IHRleHQKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDAsICIqKiogIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo5YToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuKioqIGlzIGEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjo5YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjo5YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjo5ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIqKiogaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjo5ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNSwgMCwgImxpbmUiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwYToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xubGluZSIpKTsKLQlhc3NlcnRUcnVlKCI6MTBiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjEwYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjoxMGQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygibGluZSIpKTsKLQlhc3NlcnRUcnVlKCI6MTBlOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDgpID09IDEpOwotCWFzc2VydFRydWUoIjoxMGY6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoOSkgPT0gMSk7Ci0KLQkvLyBpbnNlcnQgYXQgYmVnaW5uaW5nIAotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJsaW5lXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExYToiLCBuZXdUZXh0LmVxdWFscygibGluZVxuVGhpc1xuIikpOwotCWFzc2VydFRydWUoIjoxMWI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MTFjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoImxpbmUiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjoxMWU6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNSkgPT0gMSk7Ci0KLQljb250ZW50LnNldFRleHQoIkxpbmUgMVxyXG5MaW5lIDJcclxuTGluZSAzIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcciIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MTJhOiIsIG5ld1RleHQuZXF1YWxzKCJcckxpbmUgMVxyXG5MaW5lIDJcclxuTGluZSAzIikpOwotCWFzc2VydFRydWUoIjoxMmI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MTJjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6MTJkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkxpbmUgMSIpKTsKLQlhc3NlcnRUcnVlKCI6MTJlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIkxpbmUgMiIpKTsKLQlhc3NlcnRUcnVlKCI6MTJmOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIkxpbmUgMyIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiTGluZSAxXG5MaW5lIDJcbkxpbmUgMyIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg3LCAwLCAiTGluZTFhXG5MaW5lMWJcbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MTNhOiIsIG5ld1RleHQuZXF1YWxzKCJMaW5lIDFcbkxpbmUxYVxuTGluZTFiXG5MaW5lIDJcbkxpbmUgMyIpKTsKLQlhc3NlcnRUcnVlKCI6MTNiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJMaW5lIDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMaW5lMWEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJMaW5lMWIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzZjoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCJMaW5lIDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzZzoiLCBjb250ZW50LmdldExpbmUoNCkuZXF1YWxzKCJMaW5lIDMiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIkxpbmUgMVxuTGluZSAyXG5MaW5lIDMiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMTEsIDAsICJsMWEiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE0YToiLCBuZXdUZXh0LmVxdWFscygiTGluZSAxXG5MaW5lbDFhIDJcbkxpbmUgMyIpKTsKLQlhc3NlcnRUcnVlKCI6MTRiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjE0YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJMaW5lIDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE0ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMaW5lbDFhIDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE0ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJMaW5lIDMiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIkxpbmUgMVxuTGluZSAyIGlzIGEgdmVyeSBsb25nIGxpbmUgdGhhdCBzcGFucyBtYW55IHdvcmRzXG5MaW5lIDMiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMTksIDAsICJ2ZXJ5LCB2ZXJ5LCAiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE1YToiLCBuZXdUZXh0LmVxdWFscygiTGluZSAxXG5MaW5lIDIgaXMgYSB2ZXJ5LCB2ZXJ5LCB2ZXJ5IGxvbmcgbGluZSB0aGF0IHNwYW5zIG1hbnkgd29yZHNcbkxpbmUgMyIpKTsKLQlhc3NlcnRUcnVlKCI6MTViOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjE1YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJMaW5lIDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE1ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMaW5lIDIgaXMgYSB2ZXJ5LCB2ZXJ5LCB2ZXJ5IGxvbmcgbGluZSB0aGF0IHNwYW5zIG1hbnkgd29yZHMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE1ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJMaW5lIDMiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfRW1wdHkoKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IGdldENvbnRlbnRJbnN0YW5jZSgpOwotCWFzc2VydFRydWUoIjoxYToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDEpOwotCWFzc2VydFRydWUoIjoxYjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoInRlc3QiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCw0LCIiKTsKLQlhc3NlcnRUcnVlKCI6MmE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MmI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotfQotcHVibGljIHZvaWQgdGVzdF9MaW5lX0NvbnZlcnNpb24oKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IGdldENvbnRlbnRJbnN0YW5jZSgpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHJyZXBlYXRcbmVuZFxyIik7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNSk7CQotCWFzc2VydFRydWUoIjoxYjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjoxYzoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgwKSA9PSAwKTsJCi0JYXNzZXJ0VHJ1ZSgiOjFkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6MWU6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFmOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDEpID09IDUpOwkKLQlhc3NlcnRUcnVlKCI6MWc6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygicmVwZWF0IikpOwotCWFzc2VydFRydWUoIjoxaDoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgyKSA9PSAxNSk7CQotCWFzc2VydFRydWUoIjoxaToiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCJlbmQiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFqOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDMpID09IDIyKTsKLQlhc3NlcnRUcnVlKCI6MWs6IiwgY29udGVudC5nZXRMaW5lKDQpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjoxbDoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSg0KSA9PSAyNik7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXHJcbmlzIGEgdGVzdCIpOwotCWFzc2VydFRydWUoIjoyYToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDIpOwotCWFzc2VydFRydWUoIjoyYjoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJjOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDQpID09IDApOwotCWFzc2VydFRydWUoIjoyZDoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg1KSA9PSAwKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xyXG5pcyBhIHRlc3RcciIpOwotCWFzc2VydFRydWUoIjozYToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjozYjoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNjOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDE1KSA9PSAxKTsKLQkKLQljb250ZW50LnNldFRleHQoIlxyXG4iKTsKLQlhc3NlcnRUcnVlKCI6NGE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NGI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo0YzoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRkOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDApID09IDApOwotCWFzc2VydFRydWUoIjo0ZToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgxKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NGY6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMikgPT0gMSk7Ci0KLQljb250ZW50LnNldFRleHQoIlxyXG5cblxyXHJcbiIpOwotCWFzc2VydFRydWUoIjo1YToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDUpOwotCWFzc2VydFRydWUoIjo1YjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVjOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDApID09IDApOwkKLQlhc3NlcnRUcnVlKCI6NWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1ZToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgxKSA9PSAyKTsJCi0JYXNzZXJ0VHJ1ZSgiOjVmOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NWc6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMikgPT0gMyk7CQotCWFzc2VydFRydWUoIjo1aDoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVpOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDMpID09IDQpOwotCWFzc2VydFRydWUoIjo1ajoiLCBjb250ZW50LmdldExpbmUoNCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVrOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDQpID09IDYpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgidGVzdFxyXHJ0ZXN0MlxyXHIiKTsKLQlhc3NlcnRUcnVlKCI6NmE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6NmI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygidGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6NmM6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjZkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NmU6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMSkgPT0gNSk7CQotCWFzc2VydFRydWUoIjo2ZjoiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJ0ZXN0MiIpKTsKLQlhc3NlcnRUcnVlKCI6Nmc6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMikgPT0gNik7CQotCWFzc2VydFRydWUoIjo2aDoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZpOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDMpID09IDEyKTsKLQlhc3NlcnRUcnVlKCI6Nmo6IiwgY29udGVudC5nZXRMaW5lKDQpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo2azoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSg0KSA9PSAxMyk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X09mZnNldF9Ub19MaW5lKCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxycmVwZWF0XG5lbmRcciIpOwotCWFzc2VydFRydWUoIjoxYToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMykgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFjOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDQpID09IDApOwotCWFzc2VydFRydWUoIjoxZDoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgyNSkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjFlOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDI2KSA9PSA0KTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcclxuaXMgYSB0ZXN0Iik7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDUpID09IDApOwotCWFzc2VydFRydWUoIjoyYjoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg2KSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MmM6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMTApID09IDEpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiXHJcbiIpOwotCWFzc2VydFRydWUoIjozYToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6M2I6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMSkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNjOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDIpID09IDEpOwotCi0JY29udGVudC5zZXRUZXh0KCJcclxuXG5cclxyXG4iKTsKLQlhc3NlcnRUcnVlKCI6NGE6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDEpID09IDApOwotCWFzc2VydFRydWUoIjo0YzoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgyKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NGQ6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMykgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRlOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDQpID09IDMpOwotCWFzc2VydFRydWUoIjo0ZjoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg1KSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NGc6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNikgPT0gNCk7Ci0KLQljb250ZW50LnNldFRleHQoIlxyXG5cclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDApID09IDApOwotCWFzc2VydFRydWUoIjo1YjoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgxKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NWM6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMikgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVkOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDMpID09IDEpOwotCWFzc2VydFRydWUoIjo1ZToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg0KSA9PSAyKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiXHJcclxyXG5cclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDApID09IDApOwotCWFzc2VydFRydWUoIjo2YjoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgxKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NmM6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMikgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjZkOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDQpID09IDMpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjdhOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDApID09IDApOwotCQotCWNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQlhc3NlcnRUcnVlKCI6OGE6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMCkgPT0gMCk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0xpbmVfVG9fT2Zmc2V0KCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxycmVwZWF0XG5lbmRcciIpOwotCWFzc2VydFRydWUoIjoxYToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMSkgPT0gNSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFjOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDIpID09IDE1KTsKLQlhc3NlcnRUcnVlKCI6MWQ6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMykgPT0gMjIpOwotCWFzc2VydFRydWUoIjoxZToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSg0KSA9PSAyNik7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXHJcbmlzIGEgdGVzdCIpOwotCWFzc2VydFRydWUoIjoyYToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6MmI6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMSkgPT0gNik7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDApID09IDApOwotCWFzc2VydFRydWUoIjozYjoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgxKSA9PSAyKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiXHJcblxuXHJcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDApID09IDApOwotCWFzc2VydFRydWUoIjo0YjoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgxKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NGM6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMikgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjRkOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDMpID09IDQpOwotCWFzc2VydFRydWUoIjo0ZToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSg0KSA9PSA2KTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiXHJcbnRlc3RcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDApID09IDApOwotCWFzc2VydFRydWUoIjo1YjoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgxKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NWM6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMikgPT0gOCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfRGVsZXRlKCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQlTdHJpbmcgbmV3VGV4dDsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDYsIDIsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG5pYSB0ZXN0XHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFjOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImlhIHRlc3QiKSk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCA5LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoyYToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuXHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MmM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6MmQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjoyZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcbmxpbmUgM1xubGluZSA0Iik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIxLCA3LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjozYToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuaXMgYSB0ZXN0XG5saW5lIDMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjNjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6M2U6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygibGluZSAzIikpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XG5saW5lIDNcbmxpbmUgNCIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCA1LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo0YToiLCBuZXdUZXh0LmVxdWFscygiaXMgYSB0ZXN0XG5saW5lIDNcbmxpbmUgNCIpKTsKLQlhc3NlcnRUcnVlKCI6NGI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NGM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjo0ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJsaW5lIDMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoImxpbmUgNCIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMTYsIDcsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRmOiIsIG5ld1RleHQuZXF1YWxzKCJpcyBhIHRlc3RcbmxpbmUgMyIpKTsKLQlhc3NlcnRUcnVlKCI6NGc6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjo0aDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJsaW5lIDMiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDksIDcsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRpOiIsIG5ld1RleHQuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRqOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgOCwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NGs6IiwgbmV3VGV4dC5lcXVhbHMoImkiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRsOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoImkiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRtOiIsIG5ld1RleHQuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRuOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNSwgOSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcblxyIikpOwotCWFzc2VydFRydWUoIjo1YjoiLGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjVjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NWU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNCwgOCwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NmE6IiwgbmV3VGV4dC5lcXVhbHMoIkwxXHJcbkw0XHJcbiIpKTsKLQlhc3NlcnRUcnVlKCI6NmI6Iixjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjo2YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJMMSIpKTsKLQlhc3NlcnRUcnVlKCI6NmQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiTDQiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiXG5MMVxyXG5MMiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo3YToiLCBuZXdUZXh0LmVxdWFscygiTDFcclxuTDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdiOiIsY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6N2M6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiTDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkwyIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJcbkwxXHJcbkwyXHJcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg3LCAyLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo4YToiLCBuZXdUZXh0LmVxdWFscygiXG5MMVxyXG5MMiIpKTsKLQlhc3NlcnRUcnVlKCI6OGI6Iixjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjo4YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkwxIikpOwotCWFzc2VydFRydWUoIjo4ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJMMiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiXG5MaW5lIDFcbkxpbmUgMlxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDcsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjlhOiIsIG5ld1RleHQuZXF1YWxzKCJcbkxpbmUgMlxuIikpOwotCWFzc2VydFRydWUoIjo5YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjo5YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjlkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkxpbmUgMiIpKTsKLQlhc3NlcnRUcnVlKCI6OWU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJMaW5lIDFcbkxpbmUgMlxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDYsIDgsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwYToiLCBuZXdUZXh0LmVxdWFscygiTGluZSAxIikpOwotCWFzc2VydFRydWUoIjoxMGI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MTBjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIkxpbmUgMSIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiTGluZSBvbmUgaXMgc2hvcnRcclxuTGluZSAyIGlzIGEgbG9uZ2VyIGxpbmVcclxuTGluZSAzXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMTIsIDE3LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxMWE6IiwgbmV3VGV4dC5lcXVhbHMoIkxpbmUgb25lIGlzIGEgbG9uZ2VyIGxpbmVcclxuTGluZSAzXG4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExYjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjoxMWM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiTGluZSBvbmUgaXMgYSBsb25nZXIgbGluZSIpKTsKLQlhc3NlcnRUcnVlKCI6MTFkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkxpbmUgMyIpKTsKLQlhc3NlcnRUcnVlKCI6MTFlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQotfQotcHVibGljIHZvaWQgdGVzdF9SZXBsYWNlKCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQlTdHJpbmcgbmV3VGV4dDsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDQsICJhIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxYToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuYSB0ZXN0XHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MWM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6MWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjoxZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDIsICJ3YXMiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG53YXMgYSB0ZXN0XHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MmM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6MmQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygid2FzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6MmU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJUaGlzIGlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDIsICJ3YXMiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzIHdhcyBhIHRlc3RcciIpKTsKLQlhc3NlcnRUcnVlKCI6M2I6Iixjb250ZW50LmdldExpbmVDb3VudCgpID09IDIpOwotCWFzc2VydFRydWUoIjozYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIHdhcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNkOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDE1KSA9PSAwKTsKLQkKLQljb250ZW50LnNldFRleHQoIkxpbmUgMVxuTGluZSAyXG5MaW5lIDMiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgNywgIkxhXG5MYlxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo0YToiLCBuZXdUZXh0LmVxdWFscygiTGFcbkxiXG5MaW5lIDJcbkxpbmUgMyIpKTsKLQlhc3NlcnRUcnVlKCI6NGI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiTGEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkxiIikpOwotCWFzc2VydFRydWUoIjo0ZDoiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJMaW5lIDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRlOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIkxpbmUgMyIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dChnZXRUZXN0VGV4dCgpKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JaW50IHN0YXJ0ID0gY29udGVudC5nZXRPZmZzZXRBdExpbmUoNik7Ci0JaW50IGVuZCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDExKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo1YToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDEyKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgY29udGVudC5nZXRMaW5lKDUpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1YToiLCBjb250ZW50LmdldExpbmUoNikuZXF1YWxzKCIiKSk7Ci0Jc3RhcnQgPSBjb250ZW50LmdldE9mZnNldEF0TGluZSg3KTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2Uoc3RhcnQsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkgLSBzdGFydCwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA4KTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgY29udGVudC5nZXRMaW5lKDUpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1YToiLCBjb250ZW50LmdldExpbmUoNikuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIGNvbnRlbnQuZ2V0TGluZSg3KS5lcXVhbHMoIiIpKTsKLQotfQotcHVibGljIHZvaWQgdGVzdF9TcGVjaWFsX0Nhc2VzKCkgewotCVN0cmluZyBuZXdUZXh0OwotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQlhc3NlcnRUcnVlKCI6MGE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MGI6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMCkgPT0gMCk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcbiIpOwotCWFzc2VydFRydWUoIjoxYToiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDAsICJcbiIpOwotCWFzc2VydFRydWUoIjoxYjoiLGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgIlxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjFjOiIsY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAiXG4iKTsKLQlhc3NlcnRUcnVlKCI6MWQ6Iixjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDQsIDAsICJcbiIpOwotCWFzc2VydFRydWUoIjoxZToiLGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNSwgMCwgIlxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjFmOiIsY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg2LCAwLCAiXG4iKTsKLQlhc3NlcnRUcnVlKCI6MWc6Iixjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDcsIDAsICJcbiIpOwotCWFzc2VydFRydWUoIjoxaDoiLGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIG5ld1RleHQuZXF1YWxzKCJcblRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6MmM6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMCwgIlxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoyZDoiLCBuZXdUZXh0LmVxdWFscygiXG5cblRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJlOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6MmY6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjoyZzoiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCi0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJcbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6M2E6IiwgbmV3VGV4dC5lcXVhbHMoIlxuXG5cblRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6M2M6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjozZDoiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNlOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIlRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJcbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6M2Y6IiwgbmV3VGV4dC5lcXVhbHMoIlxuXG5cblxuVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQlhc3NlcnRUcnVlKCI6M2c6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjozaDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNpOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6M2o6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjozazoiLCBjb250ZW50LmdldExpbmUoNCkuZXF1YWxzKCJUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCi0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIG5ld1RleHQuZXF1YWxzKCJcblxuXG5UaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWFzc2VydFRydWUoIjo0YjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NGQ6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo0ZToiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCJUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyLCAxLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo0ZjoiLCBuZXdUZXh0LmVxdWFscygiXG5cblRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRnOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NGg6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo0aToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCi0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJhIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo1YToiLCBuZXdUZXh0LmVxdWFscygiXG5cbmFUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWFzc2VydFRydWUoIjo1YjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVjOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NWQ6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiYVRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0KLQljb250ZW50LnNldFRleHQoImFiY1xyXG5kZWYiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NmE6IiwgbmV3VGV4dC5lcXVhbHMoImFjXHJcbmRlZiIpKTsKLQlhc3NlcnRUcnVlKCI6NmI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NmM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiYWMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImRlZiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NmU6IiwgbmV3VGV4dC5lcXVhbHMoImFcclxuZGVmIikpOwotCWFzc2VydFRydWUoIjo2ZjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDIpOwotCWFzc2VydFRydWUoIjo2ZzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJhIikpOwotCWFzc2VydFRydWUoIjo2aDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJkZWYiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZpOiIsIG5ld1RleHQuZXF1YWxzKCJhZGVmIikpOwotCWFzc2VydFRydWUoIjo2ajoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDEpOwotCWFzc2VydFRydWUoIjo2azoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJhZGVmIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxLCAxLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo2bDoiLCBuZXdUZXh0LmVxdWFscygiYWVmIikpOwotCWFzc2VydFRydWUoIjo2bToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDEpOwotCWFzc2VydFRydWUoIjo2bjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJhZWYiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDEsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZvOiIsIG5ld1RleHQuZXF1YWxzKCJhZiIpKTsKLQlhc3NlcnRUcnVlKCI6NnA6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NnE6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiYWYiKSk7Ci0KLQljb250ZW50LnNldFRleHQoImFiYyIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCAiMSIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6N2E6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6N2I6IiwgbmV3VGV4dC5lcXVhbHMoIjFiYyIpKTsKLQlhc3NlcnRUcnVlKCI6N2M6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiMWJjIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdkOiIsIG5ld1RleHQuZXF1YWxzKCJcbjFiYyIpKTsKLQlhc3NlcnRUcnVlKCI6N2U6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6N2Y6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo3ZzoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIxYmMiKSk7Ci0JCi0JY29udGVudCA9IGdldENvbnRlbnRJbnN0YW5jZSgpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLDAsImEiKTsKLQkKLQljb250ZW50LnNldFRleHQoInBhY2thZ2UgdGVzdDtcbi8qIExpbmUgMVxuICogTGluZSAyXG4gKi9cbnB1YmxpYyBjbGFzcyBTaW1wbGVDbGFzcyB7XG59Iik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDE0LCAyMywgIlx0LypMaW5lIDFcblx0ICogTGluZSAyXG5cdCAqLyIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6OGE6IiwgbmV3VGV4dC5lcXVhbHMoInBhY2thZ2UgdGVzdDtcblx0LypMaW5lIDFcblx0ICogTGluZSAyXG5cdCAqL1xucHVibGljIGNsYXNzIFNpbXBsZUNsYXNzIHtcbn0iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNik7Ci0JYXNzZXJ0VHJ1ZSgiOjhjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoInBhY2thZ2UgdGVzdDsiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIlx0LypMaW5lIDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIlx0ICogTGluZSAyIikpOwotCWFzc2VydFRydWUoIjo4ZjoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCJcdCAqLyIpKTsKLQlhc3NlcnRUcnVlKCI6OGc6IiwgY29udGVudC5nZXRMaW5lKDQpLmVxdWFscygicHVibGljIGNsYXNzIFNpbXBsZUNsYXNzIHsiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhoOiIsIGNvbnRlbnQuZ2V0TGluZSg1KS5lcXVhbHMoIn0iKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X1RleHRfQ2hhbmdlZF9FdmVudCgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JY29udGVudC5hZGRUZXh0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JdmVyaWZ5ID0gMTsKLQljb250ZW50LnNldFRleHQoInRlc3RpbmciKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxuIik7Ci0KLQl2ZXJpZnkgPSAyOwotCWNvbnRlbnQuc2V0VGV4dCgiXG5cbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAyLCAiYSIpOwotCi0JdmVyaWZ5ID0gMzsKLQljb250ZW50LnNldFRleHQoImEiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMSwgIlxuXG4iKTsKLQotCXZlcmlmeSA9IDQ7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl0cnkge2NvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHthc3NlcnRUcnVlKCI6NDoiLCB0cnVlKTt9Ci0KLQl2ZXJpZnkgPSA1OwotCWNvbnRlbnQuc2V0VGV4dCgiTGluZSAxXHJcbkxpbmUgMiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXHIiKTsKLQotCXZlcmlmeSA9IDY7Ci0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcbmxpbmUgM1xubGluZSA0Iik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIxLCA3LCAiIik7Ci0KLQl2ZXJpZnkgPSA3OwotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNSwgOSwgIiIpOwotCi0JdmVyaWZ5ID0gODsKLQljb250ZW50LnNldFRleHQoIlxuTDFcclxuTDJcclxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDcsIDIsICIiKTsKLQotCXZlcmlmeSA9IDk7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMiwgInRlc3QiKTsKLQotCXZlcmlmeSA9IDEwOwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdHJ5IHtjb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgIiIpO30gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge2Fzc2VydFRydWUoIjoxMDoiLCB0cnVlKTt9Ci0KLQl2ZXJpZnkgPSAxMTsKLQljb250ZW50LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXRyeSB7Y29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICIiKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge2Fzc2VydFRydWUoIjoxMToiLCB0cnVlKTt9Ci0KLQl2ZXJpZnkgPSAxMjsKLQljb250ZW50LnNldFRleHQoIkwxXHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgIlxuIik7Ci0KLQl2ZXJpZnkgPSAxMzsKLQljb250ZW50LnNldFRleHQoIkwxXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgIlxyIik7Ci0KLQl2ZXJpZnkgPSAxNDsKLQljb250ZW50LnNldFRleHQoIkwxXHJcbiIpOwotCXRyeSB7Y29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJ0ZXN0Iik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHthc3NlcnRUcnVlKCI6MTQ6IiwgdHJ1ZSk7fQotCi0JdmVyaWZ5ID0gMTU7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMiwgInRlc3RcblxuIik7Ci0KLQl2ZXJpZnkgPSAxNjsKLQljb250ZW50LnNldFRleHQoIkwxXHJcbiIpOwotCXRyeSB7Y29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XHJcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7YXNzZXJ0VHJ1ZSgiOjE2OiIsIHRydWUpO30KLQotCXZlcmlmeSA9IDE3OwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdHJ5IHtjb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMiwgInRlc3RcblxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHthc3NlcnRUcnVlKCI6MTc6IiwgdHJ1ZSk7fQotCi0JdmVyaWZ5ID0gMTg7Ci0gCWNvbnRlbnQuc2V0VGV4dCgiTDFcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAiXG50ZXN0XHJcbiIpOwotCi0JdmVyaWZ5ID0gMTk7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJ0ZXN0XHJcclxyIik7Ci0JdmVyaWZ5ID0gMjA7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl0cnkge2NvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHthc3NlcnRUcnVlKCI6MjA6IiwgdHJ1ZSk7fQotCi0KLQl2ZXJpZnkgPSAwOwotCWNvbnRlbnQucmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyKHRoaXMpOwotfQotcHVibGljIHZvaWQgdGVzdF9EZWxpbWl0ZXJfU3BlY2lhbF9DYXNlcygpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JU3RyaW5nIG5ld1RleHQ7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJcbkwxXHJcbkwyXHJcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg3LCAyLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxOiIsIG5ld1RleHQuZXF1YWxzKCJcbkwxXHJcbkwyIikpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0XG5cbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBuZXdUZXh0LmVxdWFscygiTDF0ZXN0XG5cbiIpKTsKLQotLy8JY29udGVudC5zZXRUZXh0KCJMMVxyXG4iKTsKLS8vCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxyXG4iKTsKLS8vCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLS8vCWFzc2VydFRydWUoIjozOiIsIG5ld1RleHQuZXF1YWxzKCJMMVxydGVzdFxyXG4iKSk7Ci0KLS8vCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0vLwljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMiwgInRlc3RcblxuIik7Ci0vLwluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0vLwlhc3NlcnRUcnVlKCI6NDoiLCBuZXdUZXh0LmVxdWFscygiTHRlc3RcblxuXG5MMlxyXG5MM1xyXG5MNFxyXG4iKSk7Ci0KLQljb250ZW50LnNldFRleHQoIkwxXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgInRlc3RcclxyXHIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6IiwgbmV3VGV4dC5lcXVhbHMoIkwxdGVzdFxyXHJcclxuIikpOwotfQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSAgewotCS8vIGNyZWF0ZSBzaGVsbAotCXNoZWxsID0gbmV3IFNoZWxsICgpOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDMwMCk7Ci0Jc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JLy8gY3JlYXRlIHdpZGdldAotCXdpZGdldCA9IG5ldyBTdHlsZWRUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YSgpOwotCXNwZWMuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0Jc3BlYy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQlzcGVjLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQlzcGVjLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQl3aWRnZXQuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQlzaGVsbC5vcGVuICgpOwotfQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSAgewotCWlmIChzaGVsbCAhPSBudWxsICYmICFzaGVsbC5pc0Rpc3Bvc2VkICgpKSAKLQkJc2hlbGwuZGlzcG9zZSAoKTsKLQlzaGVsbCA9IG51bGw7Ci0KLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvU3d0SnVuaXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvU3d0SnVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFkNDg1Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N3dEp1bml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotCi0vKioKLSAqIFBsYXRmb3JtLXNwZWNpZmljIGNvbnN0YW50cyB1c2VkIGluIFNXVCB0ZXN0IGNhc2VzLgotICovCi1wdWJsaWMgY2xhc3MgU3d0SnVuaXQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGVzdEZvbnROYW1lOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc1dpbmRvd3MgPSBTV1QuZ2V0UGxhdGZvcm0oKS5zdGFydHNXaXRoKCJ3aW4zMiIpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc0NhcmJvbiA9IFNXVC5nZXRQbGF0Zm9ybSgpLnN0YXJ0c1dpdGgoImNhcmJvbiIpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc01vdGlmID0gU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc0dUSyA9IFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygiZ3RrIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzUGhvdG9uID0gU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJwaG90b24iKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNMaW51eCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmVxdWFscygiTGludXgiKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNBSVggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5lcXVhbHMoIkFJWCIpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc1NvbGFyaXMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5lcXVhbHMoIlNvbGFyaXMiKSB8fCBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5lcXVhbHMoIlN1bk9TIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzSFBVWCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmVxdWFscygiSFAtVVgiKTsKLQkKLQlzdGF0aWMgewotCQlpZiAoaXNNb3RpZikgewotCQkJdGVzdEZvbnROYW1lID0gIm1pc2MtZml4ZWQiOwotCQl9Ci0JCWVsc2UgewotCQkJdGVzdEZvbnROYW1lID0gIkhlbHZldGljYSI7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N3dFRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N3dFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NmFlN2MuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9Td3RUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuKjsKLQotcHVibGljIGNsYXNzIFN3dFRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIHVzZWQgdG8gbWFyayB0ZXN0IGNhc2VzIHRoYXQKLQkgKiBhcmUgbm90IGhhbmRsZWQgY29ycmVjdGx5IGJ5IFNXVCBhdCB0aGlzIHRpbWUsIG9yIHRlc3QKLQkgKiBjYXNlcyB0aGF0IG1heWJlIHRoZW1zZWx2ZXMgZHViaW91cyAoZWcuIHdoZW4gdGhlIGNvcnJlY3QKLQkgKiBiZWhhdmlvdXIgbWF5IG5vdCBiZSBjbGVhcikuIE1vc3Qgb2YgdGhlc2UgZmxhZ2dlZCB0ZXN0Ci0JICogY2FzZXMgaW52b2x2ZSBoYW5kbGluZyBlcnJvciBjb25kaXRpb25zLgotCSAqCi0JICogU2V0dGluZyB0aGVzZSBmbGFncyB0byB0cnVlIHdpbGwgcnVuIHRob3NlIHRlc3RzLiBBcyBhcGkKLQkgKiBpcyBpbXBsZW1lbnRlZCB0aGlzIGdpdmVzIHVzIGEgY29udmVuaWVudCB3YXkgdG8gaW5jbHVkZQotCSAqIGl0IGluIHRoZSBqdW5pdCB0ZXN0cy4KLQkgKi8KLQotCS8vIHJ1biB0ZXN0IGNhc2VzIHRoYXQgbWF5IHRoZW1zZWx2ZXMgYmUgZHViaW91cwotCS8vIHRoZXNlIHNob3VsZCBiZSBldmVudHVhbGx5IGNoZWNrZWQgdG8gc2VlIGlmIAotCS8vIHRoZXJlIGlzIGEgdmFsaWQgZmFpbHVyZSBvciB0aGUgdGVzdCBpcyBib2d1cwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmQ2hlY2tCb2d1c1Rlc3RDYXNlcyA9IGZhbHNlOwotCi0JLy8gY2hlY2sgdmlzaWJpbGl0eSBhcGkgKGVnIGluIG1lbnUpCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZDaGVja1Zpc2liaWxpdHkgPSBmYWxzZTsKLQotCS8vIHJ1biB0ZXN0IGNhc2VzIHRoYXQgY2hlY2sgU1dUIHBvbGljeSBub3QgY292ZXJlZCBieSB0aGUgZmxhZ3MgYWJvdmUKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZkNoZWNrU1dUUG9saWN5ID0gZmFsc2U7Ci0KLQkvLyBtYWtlIGRpYWxvZyBvcGVuIGNhbGxzLCBvcGVyYXRvciBtdXN0IHRoZW4gY2xvc2UgdGhlbQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmVGVzdERpYWxvZ09wZW4gPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZlRlc3RDb25zaXN0ZW5jeSA9IGZhbHNlOwotCi0JLy8gdmFyaWFibGUgdG8ga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIHVuaW1wbGVtZW50ZWQgbWV0aG9kcwotCXB1YmxpYyBzdGF0aWMgaW50IHVuaW1wbGVtZW50ZWRNZXRob2RzOwotCQotCS8vIHZhcmlhYmxlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiB1bmltcGxlbWVudGVkIEFQSSBtZXRob2RzCi0JcHVibGljIHN0YXRpYyBpbnQgdW5pbXBsZW1lbnRlZEFQSTsKLQkKLQkvLyB1c2VkIHRvIHNwZWNpZnkgdmVyYm9zZSBtb2RlLCBpZiB0cnVlIHVuaW1wbGVtZW50ZWQgd2FybmluZyBtZXNzYWdlcyB3aWxsIAotCS8vIGJlIHdyaXR0ZW4gdG8gU3lzdGVtLm91dAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JCi0JLy8gYWxsb3cgc3BlY2lmaWMgaW1hZ2UgZm9ybWF0cyB0byBiZSB0ZXN0ZWQKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGltYWdlRm9ybWF0cyA9IG5ldyBTdHJpbmdbXSB7ImJtcCIsICJqcGciLCAiZ2lmIiwgInBuZyJ9OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gaW1hZ2VGaWxlbmFtZXMgPSBuZXcgU3RyaW5nW10geyJmb2xkZXIiLCAiZm9sZGVyT3BlbiIsICJ0YXJnZXQifTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGludmFsaWRJbWFnZUZpbGVuYW1lcyA9IG5ldyBTdHJpbmdbXSB7ImNvcnJ1cHQiLCAiY29ycnVwdEJhZEJpdERlcHRoLnBuZyJ9OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdHJhbnNwYXJlbnRJbWFnZUZpbGVuYW1lcyA9IG5ldyBTdHJpbmdbXSB7InRyYW5zcGFyZW50LnBuZyJ9OwotCQotCS8vIHNwZWNpZnkgcmVwYXJlbnRhYmxlIHBsYXRmb3JtcwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gcmVwYXJlbnRhYmxlUGxhdGZvcm1zID0gbmV3IFN0cmluZ1tdIHsid2luMzIiLCAiZ3RrIn07Ci0JCi1wdWJsaWMgU3d0VGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRTYW1lKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZXhwZWN0ZWRbXSwgT2JqZWN0IGFjdHVhbFtdKSB7Ci0JaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpIHJldHVybjsKLQlib29sZWFuIHNhbWUgPSBmYWxzZTsKLQlpZiAoZXhwZWN0ZWQgIT0gbnVsbCAmJiBhY3R1YWwgIT0gbnVsbCAmJiBleHBlY3RlZC5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aCkgewotCQlpZiAoZXhwZWN0ZWQubGVuZ3RoID09IDApIHJldHVybjsKLQkJc2FtZSA9IHRydWU7Ci0JCWJvb2xlYW5bXSBtYXRjaGVkID0gbmV3IGJvb2xlYW5bZXhwZWN0ZWQubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3R1YWwubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXhwZWN0ZWQubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoIW1hdGNoZWRbal0pIHsKLQkJCQkJaWYgKChhY3R1YWxbaV0gPT0gbnVsbCAmJiBleHBlY3RlZCBbal0gPT0gbnVsbCkgfHwKLQkJCQkJICAgIChhY3R1YWxbaV0gIT0gbnVsbCAmJiBhY3R1YWxbaV0uZXF1YWxzKGV4cGVjdGVkW2pdKSkpIHsKLQkJCQkJCW1hdGNoID0gdHJ1ZTsKLQkJCQkJCW1hdGNoZWRbal0gPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW1hdGNoKSB7Ci0JCQkJc2FtZSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCWlmICghc2FtZSkgewotCQlmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRTYW1lKE9iamVjdCBleHBlY3RlZFtdLCBPYmplY3QgYWN0dWFsW10pIHsKLQlhc3NlcnRTYW1lKG51bGwsIGV4cGVjdGVkLCBhY3R1YWwpOwotfQotc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydFNhbWUoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZFtdLCBpbnQgYWN0dWFsW10pIHsKLQlpZiAoZXhwZWN0ZWQgPT0gbnVsbCAmJiBhY3R1YWwgPT0gbnVsbCkgcmV0dXJuOwotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCWlmIChleHBlY3RlZCAhPSBudWxsICYmIGFjdHVhbCAhPSBudWxsICYmIGV4cGVjdGVkLmxlbmd0aCA9PSBhY3R1YWwubGVuZ3RoKSB7Ci0JCWlmIChleHBlY3RlZC5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQlzYW1lID0gdHJ1ZTsKLQkJYm9vbGVhbltdIG1hdGNoZWQgPSBuZXcgYm9vbGVhbltleHBlY3RlZC5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdHVhbC5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZC5sZW5ndGg7IGorKykgewotCQkJCWlmICghbWF0Y2hlZFtqXSAmJiBhY3R1YWxbaV0gPT0gZXhwZWN0ZWRbal0pIHsKLQkJCQkJbWF0Y2ggPSB0cnVlOwotCQkJCQltYXRjaGVkW2pdID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFtYXRjaCkgewotCQkJCXNhbWUgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlpZiAoIXNhbWUpIHsKLQkJZmFpbE5vdEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci19Ci1zdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0U2FtZShpbnQgZXhwZWN0ZWRbXSwgaW50IGFjdHVhbFtdKSB7Ci0JYXNzZXJ0U2FtZShudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBleHBlY3RlZFtdLCBPYmplY3QgYWN0dWFsW10pIHsKLQlpZiAoZXhwZWN0ZWQgPT0gbnVsbCAmJiBhY3R1YWwgPT0gbnVsbCkKLQkJcmV0dXJuOwotCWJvb2xlYW4gZXF1YWwgPSBmYWxzZTsKLQlpZiAoZXhwZWN0ZWQgIT0gbnVsbCAmJiBhY3R1YWwgIT0gbnVsbCAmJiBleHBlY3RlZC5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aCkgewotCQlpZiAoZXhwZWN0ZWQubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCWVxdWFsID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFleHBlY3RlZFtpXS5lcXVhbHMoYWN0dWFsW2ldKSkgewotCQkJCWVxdWFsID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKCFlcXVhbCkgewotCQlmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZENvZGUsIFRocm93YWJsZSBhY3R1YWxUaHJvd2FibGUpIHsKLQlpZiAoYWN0dWFsVGhyb3dhYmxlIGluc3RhbmNlb2YgU1dURXJyb3IpIHsKLQkJU1dURXJyb3IgZXJyb3IgPSAoU1dURXJyb3IpIGFjdHVhbFRocm93YWJsZTsKLQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkQ29kZSwgZXJyb3IuY29kZSk7Ci0JfSBlbHNlIGlmIChhY3R1YWxUaHJvd2FibGUgaW5zdGFuY2VvZiBTV1RFeGNlcHRpb24pIHsKLQkJU1dURXhjZXB0aW9uIGV4Y2VwdGlvbiA9IChTV1RFeGNlcHRpb24pIGFjdHVhbFRocm93YWJsZTsKLQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkQ29kZSwgZXhjZXB0aW9uLmNvZGUpOwotCX0gZWxzZSB7Ci0JCXRyeSB7Ci0JCQlTV1QuZXJyb3IoZXhwZWN0ZWRDb2RlKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4cGVjdGVkVGhyb3dhYmxlKSB7Ci0JCQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWRUaHJvd2FibGUuZ2V0TWVzc2FnZSgpLCBhY3R1YWxUaHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoT2JqZWN0IGV4cGVjdGVkW10sIE9iamVjdCBhY3R1YWxbXSkgewotICAgIGFzc2VydEVxdWFscyhudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZFtdLCBpbnQgYWN0dWFsW10pIHsKLQlpZiAoZXhwZWN0ZWQgPT0gbnVsbCAmJiBhY3R1YWwgPT0gbnVsbCkKLQkJcmV0dXJuOwotCWJvb2xlYW4gZXF1YWwgPSBmYWxzZTsKLQlpZiAoZXhwZWN0ZWQgIT0gbnVsbCAmJiBhY3R1YWwgIT0gbnVsbCAmJiBleHBlY3RlZC5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aCkgewotCQlpZiAoZXhwZWN0ZWQubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCWVxdWFsID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGV4cGVjdGVkW2ldICE9IGFjdHVhbFtpXSkgewotCQkJCWVxdWFsID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKCFlcXVhbCkgewotCQlmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoaW50IGV4cGVjdGVkW10sIGludCBhY3R1YWxbXSkgewotICAgIGFzc2VydEVxdWFscyhudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKLX0KLS8vIGNvcGllZCBleGFjdGx5IGZyb20ganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHNvIHRoYXQgaXQgY2FuIGJlIGNhbGxlZCBmcm9tIGhlcmUgZXZlbiB0aG91Z2ggcHJpdmF0ZQotc3RhdGljIHByaXZhdGUgdm9pZCBmYWlsTm90RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhY3R1YWwpIHsKLQlTdHJpbmcgZm9ybWF0dGVkPSAiIjsKLQlpZiAobWVzc2FnZSAhPSBudWxsKQotCQlmb3JtYXR0ZWQ9IG1lc3NhZ2UrIiAiOwotCWZhaWwoZm9ybWF0dGVkKyJleHBlY3RlZDo8IitleHBlY3RlZCsiPiBidXQgd2FzOjwiK2FjdHVhbCsiPiIpOwotfQotCi1zdGF0aWMgcHJpdmF0ZSB2b2lkIGZhaWxOb3RFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdFtdIGV4cGVjdGVkLCBPYmplY3RbXSBhY3R1YWwpIHsKLQlTdHJpbmcgZm9ybWF0dGVkPSAiIjsKLQlpZiAobWVzc2FnZSAhPSBudWxsKQotCQlmb3JtYXR0ZWQ9IG1lc3NhZ2UrIiAiOwotCWZvcm1hdHRlZCArPSAiZXhwZWN0ZWQ6PCI7Ci0JaWYoZXhwZWN0ZWQgIT0gbnVsbCkgewotCSAgICBmb3IoaW50IGk9MDsgaTxNYXRoLm1pbihleHBlY3RlZC5sZW5ndGgsIDUpOyBpKyspCi0JICAgICAgICBmb3JtYXR0ZWQgKz0gZXhwZWN0ZWRbaV0gKyIsICI7Ci0JICAgIGlmKGV4cGVjdGVkLmxlbmd0aCAhPSAwKQotCSAgICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnN1YnN0cmluZygwLCBmb3JtYXR0ZWQubGVuZ3RoKCktMik7Ci0JfQotCWlmKGV4cGVjdGVkLmxlbmd0aCA+IDUpCi0JICAgIGZvcm1hdHRlZCArPSAiLi4uIjsKLQlmb3JtYXR0ZWQgKz0gIj4gYnV0IHdhczo8IjsKLQlpZihhY3R1YWwgIT0gbnVsbCkgewotCSAgICBmb3IoaW50IGk9MDsgaTxNYXRoLm1pbihhY3R1YWwubGVuZ3RoLCA1KTsgaSsrKQotCSAgICAgICAgZm9ybWF0dGVkICs9IGFjdHVhbFtpXSArIiwgIjsKLQkgICAgaWYoYWN0dWFsLmxlbmd0aCAhPSAwKQotCSAgICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnN1YnN0cmluZygwLCBmb3JtYXR0ZWQubGVuZ3RoKCktMik7Ci0JfQotCWlmKGFjdHVhbC5sZW5ndGggPiA1KQotCSAgICBmb3JtYXR0ZWQgKz0gIi4uLiI7Ci0JZmFpbChmb3JtYXR0ZWQrIj4iKTsKLX0KLQotcHJvdGVjdGVkIGJvb2xlYW4gaXNKMk1FKCkgewotCXRyeSB7Ci0JCUNvbXBhdGliaWxpdHkubmV3RmlsZUlucHV0U3RyZWFtKCIiKTsKLQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLXByb3RlY3RlZCBib29sZWFuIGlzUmVwYXJlbnRhYmxlUGxhdGZvcm0oKSB7Ci0JU3RyaW5nIHBsYXRmb3JtID0gU1dULmdldFBsYXRmb3JtKCk7Ci0JZm9yIChpbnQgaT0wOyBpPHJlcGFyZW50YWJsZVBsYXRmb3Jtcy5sZW5ndGg7IGkrKykgewotCQlpZiAocmVwYXJlbnRhYmxlUGxhdGZvcm1zW2ldLmVxdWFscyhwbGF0Zm9ybSkpIHJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHdhcm5VbmltcGwoU3RyaW5nIG1lc3NhZ2UpIHsKLQlpZiAodmVyYm9zZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRDbGFzcygpICsgIjogIiArIG1lc3NhZ2UpOwotCX0KLQl1bmltcGxlbWVudGVkTWV0aG9kcysrOwotfQotcHJvdGVjdGVkIHZvaWQgd2FyblVuaW1wbEFQSShTdHJpbmcgbWVzc2FnZSkgewotCWlmICh2ZXJib3NlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiQVBJIG5vdCBpbXBsZW1lbnRlZCAiICsgdGhpcy5nZXRDbGFzcygpICsgIiAiICsgZ2V0TmFtZSgpKTsKLQl9Ci0JdW5pbXBsZW1lbnRlZEFQSSsrOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9TV1QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOTU1YjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9TV1QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5TV1QKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5TV1QKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQkvLyBEbyBub3RoaW5nLiBDbGFzcyBTV1QgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXJyb3JJKCkgewotCS8vIFRlc3QgdGhhdCB3ZSB0aHJvdyB0aGUgZXhwZWN0ZWQga2luZHMgb2YgZXJyb3JzIGZvciB0aGUgZ2l2ZW4gZXJyb3IgdHlwZXMuCi0JYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsKLQl0cnkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlwYXNzZWQgPSB0cnVlOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7IH0KLQlhc3NlcnRUcnVlICgiZGlkIG5vdCBjb3JyZWN0bHkgdGhyb3cgZXhjZXB0aW9uIGZvciBFUlJPUl9OVUxMX0FSR1VNRU5UIiwgcGFzc2VkKTsKLQlwYXNzZWQgPSBmYWxzZTsKLQl0cnkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0ZBSUxFRF9FWEVDKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJcGFzc2VkID0gdHJ1ZTsKLQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeyB9Ci0JYXNzZXJ0VHJ1ZSAoImRpZCBub3QgY29ycmVjdGx5IHRocm93IGV4Y2VwdGlvbiBmb3IgRVJST1JfRkFJTEVEX0VYRUMiLCBwYXNzZWQpOwotCXBhc3NlZCA9IGZhbHNlOwotCXRyeSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfTk9fSEFORExFUyk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZXgpIHsKLQkJcGFzc2VkID0gdHJ1ZTsKLQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeyB9Ci0JYXNzZXJ0VHJ1ZSAoImRpZCBub3QgY29ycmVjdGx5IHRocm93IGV4Y2VwdGlvbiBmb3IgRVJST1JfTk9fSEFORExFUyIsIHBhc3NlZCk7Ci0JcGFzc2VkID0gZmFsc2U7Ci0JdHJ5IHsKLQkJU1dULmVycm9yKC0xKTsKLQl9IGNhdGNoIChTV1RFcnJvciBleCkgewotCQlwYXNzZWQgPSB0cnVlOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7IH0KLQlhc3NlcnRUcnVlICgiZGlkIG5vdCBjb3JyZWN0bHkgdGhyb3cgZXhjZXB0aW9uIGZvciBlcnJvcigtMSkiLCBwYXNzZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Vycm9ySUxqYXZhX2xhbmdfVGhyb3dhYmxlKCkgewotCS8vIFRlc3QgdGhhdCB0aGUgY2F1c2luZyB0aHJvd2FibGUgaXMgZmlsbGVkIGluLgotCVRocm93YWJsZSBjYXVzZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJKdXN0IGZvciB0ZXN0aW5nIik7Ci0JYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsKLQl0cnkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCwgY2F1c2UpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQlwYXNzZWQgPSBleC50aHJvd2FibGUgPT0gY2F1c2U7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsgfQotCWFzc2VydFRydWUgKCJkaWQgbm90IGNvcnJlY3RseSB0aHJvdyBleGNlcHRpb24gZm9yIEVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCIsIHBhc3NlZCk7Ci0JcGFzc2VkID0gZmFsc2U7Ci0JdHJ5IHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9OT1RfSU1QTEVNRU5URUQsIGNhdXNlKTsKLQl9IGNhdGNoIChTV1RFcnJvciBleCkgewotCQlwYXNzZWQgPSBleC50aHJvd2FibGUgPT0gY2F1c2U7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsgfQotCWFzc2VydFRydWUgKCJkaWQgbm90IGNvcnJlY3RseSB0aHJvdyBleGNlcHRpb24gZm9yIEVSUk9SX05PVF9JTVBMRU1FTlRFRCIsIHBhc3NlZCk7Ci0JcGFzc2VkID0gZmFsc2U7Ci0JdHJ5IHsKLQkJU1dULmVycm9yKC0xLCBjYXVzZSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZXgpIHsKLQkJcGFzc2VkID0gZXgudGhyb3dhYmxlID09IGNhdXNlOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7IH0KLQlhc3NlcnRUcnVlICgiZGlkIG5vdCBjb3JyZWN0bHkgdGhyb3cgZXhjZXB0aW9uIGZvciBlcnJvcigtMSkiLCBwYXNzZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZygpIHsKLQlib29sZWFuIHBhc3NlZCA9IGZhbHNlOwotCXRyeSB7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQlTV1QuZ2V0TWVzc2FnZShudWxsKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJcGFzc2VkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSAoImRpZCBub3QgY29ycmVjdGx5IHRocm93IGV4Y2VwdGlvbiB3aXRoIG51bGwgYXJndW1lbnQiLCBwYXNzZWQpOwotCXRyeSB7Ci0JCVNXVC5nZXRNZXNzYWdlKCJTV1RfWWVzIik7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJZmFpbCAoImV4Y2VwdGlvbiAiICsgdCArICIgZ2VuZXJhdGVkIGZvciBTV1RfWWVzIik7Ci0JfQotCWFzc2VydFRydWUgKAotCQkiaW52YWxpZCBrZXkgZGlkIG5vdCByZXR1cm4gYXMgaXRzZWxmIiwKLQkJIl9OT1RfRk9VTkRfSU5fUFJPUEVSVElFU18iLmVxdWFscyhTV1QuZ2V0TWVzc2FnZSgiX05PVF9GT1VORF9JTl9QUk9QRVJUSUVTXyIpKSk7Ci0JCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBsYXRmb3JtKCkgewotCS8vIENhbid0IHRlc3QgdGhlIGxpc3Qgb2YgcGxhdGZvcm1zLCBzaW5jZSB0aGlzIG1heSBjaGFuZ2UsCi0JLy8gc28ganVzdCB0ZXN0IHRvIHNlZSBpdCByZXR1cm5zIHNvbWV0aGluZy4KLQlhc3NlcnRUcnVlICgicmV0dXJuZWQgbnVsbCBwbGF0Zm9ybSBuYW1lIiwgU1dULmdldFBsYXRmb3JtKCkgIT0gbnVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VmVyc2lvbigpIHsKLQkvLyBUZXN0IHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIHdoaWNoIGlzIHJldHVybmVkIGlzIHJlYXNvbmFibGUuCi0JaW50IHZlciA9IFNXVC5nZXRWZXJzaW9uKCk7Ci0JYXNzZXJ0VHJ1ZSAoInVucmVhc29uYWJsZSB2YWx1ZSByZXR1cm5lZCIsIHZlciA+IDAgJiYgdmVyIDwgMTAwMDAwMCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXJyb3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcnJvcklMamF2YV9sYW5nX1Rocm93YWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQbGF0Zm9ybSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmVyc2lvbiIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcnJvckkiKSkgdGVzdF9lcnJvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Vycm9ySUxqYXZhX2xhbmdfVGhyb3dhYmxlIikpIHRlc3RfZXJyb3JJTGphdmFfbGFuZ19UaHJvd2FibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2dldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGxhdGZvcm0iKSkgdGVzdF9nZXRQbGF0Zm9ybSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VmVyc2lvbiIpKSB0ZXN0X2dldFZlcnNpb24oKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXJyb3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5ZGE3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEVycm9yIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXJyb3IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFcnJvcigpLmNvZGUgPT0gU1dULkVSUk9SX1VOU1BFQ0lGSUVEKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFcnJvcihTV1QuRVJST1JfQ0FOTk9UX0JFX1pFUk8pLmNvZGUgPT0gU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZygpIHsKLQlhc3NlcnRUcnVlICgKLQkJImRpZCBub3QgZmlsbCBpbiBjb2RlIHByb3Blcmx5IiwKLQkJbmV3IFNXVEVycm9yKFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTywgIkFuIHVuaW50ZXJlc3RpbmcgbWVzc2FnZSIpLmNvZGUgCi0JCQk9PSBTV1QuRVJST1JfQ0FOTk9UX0JFX1pFUk8pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFcnJvcigiQW4gdW5pbnRlcmVzdGluZyBtZXNzYWdlIikuY29kZSA9PSBTV1QuRVJST1JfVU5TUEVDSUZJRUQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGluY2x1ZGUgY3JlYXRpb24gc3RyaW5nIGluIHJlc3VsdCIsCi0JCW5ldyBTV1RFcnJvcihTV1QuRVJST1JfQ0FOTk9UX0JFX1pFUk8sICJBbiBpbnRlcmVzdGluZyBtZXNzYWdlIikuZ2V0TWVzc2FnZSgpIAotCQkJLmluZGV4T2YoIkFuIGludGVyZXN0aW5nIG1lc3NhZ2UiKSA+PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9wcmludFN0YWNrVHJhY2UoKSB7Ci0JCi0JLy8gV0FSTklORzogdGhpcyB0ZXN0IGlzIG5vdCBDTERDIHNhZmUsIGJlY2F1c2UgaXQgcmVxdWlyZXMgamF2YS5pby5QcmludFN0cmVhbQotCQotCXRyeSB7Ci0JCUNsYXNzLmZvck5hbWUoImphdmEuaW8uUHJpbnRTdHJlYW0iKTsKLQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJLy8gaWdub3JlIHRlc3QgaWYgcnVubmluZyBvbiBDTERDCi0JCXJldHVybjsKLQl9Ci0JCi0JLy8gdGVzdCBkZWZhdWx0IFNXVEVycm9yCi0JCi0JQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQlTeXN0ZW0uc2V0RXJyKG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQlTV1RFcnJvciBlcnJvciA9IG5ldyBTV1RFcnJvcigpOwotCWVycm9yLnByaW50U3RhY2tUcmFjZSgpOwotCWFzc2VydFRydWUob3V0LnNpemUoKSA+IDApOwotCWFzc2VydFRydWUobmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSkuaW5kZXhPZigidGVzdF9wcmludFN0YWNrVHJhY2UiKSAhPSAtMSk7Ci0JCi0JLy8gdGVzdCBTV1RFcnJvciB3aXRoIGNvZGUKLQkKLQlvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JU3lzdGVtLnNldEVycihuZXcgUHJpbnRTdHJlYW0ob3V0KSk7Ci0JZXJyb3IgPSBuZXcgU1dURXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCWVycm9yLnByaW50U3RhY2tUcmFjZSgpOwotCWFzc2VydFRydWUob3V0LnNpemUoKSA+IDApOwotCWFzc2VydFRydWUobmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSkuaW5kZXhPZigidGVzdF9wcmludFN0YWNrVHJhY2UiKSAhPSAtMSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEVycm9yKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNZXNzYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wcmludFN0YWNrVHJhY2UiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJIikpIHRlc3RfQ29uc3RydWN0b3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9ySUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWVzc2FnZSIpKSB0ZXN0X2dldE1lc3NhZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3ByaW50U3RhY2tUcmFjZSIpKSB0ZXN0X3ByaW50U3RhY2tUcmFjZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFeGNlcHRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiM2IxNWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEV4Y2VwdGlvbiBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEV4Y2VwdGlvbihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQlhc3NlcnRUcnVlICgKLQkJImRpZCBub3QgZmlsbCBpbiBjb2RlIHByb3Blcmx5IiwKLQkJbmV3IFNXVEV4Y2VwdGlvbigpLmNvZGUgPT0gU1dULkVSUk9SX1VOU1BFQ0lGSUVEKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFeGNlcHRpb24oU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPKS5jb2RlID09IFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFeGNlcHRpb24oU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPLCAiQW4gdW5pbnRlcmVzdGluZyBtZXNzYWdlIikuY29kZSAKLQkJCT09IFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQlhc3NlcnRUcnVlICgKLQkJImRpZCBub3QgZmlsbCBpbiBjb2RlIHByb3Blcmx5IiwKLQkJbmV3IFNXVEV4Y2VwdGlvbigiQW4gdW5pbnRlcmVzdGluZyBtZXNzYWdlIikuY29kZSA9PSBTV1QuRVJST1JfVU5TUEVDSUZJRUQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGluY2x1ZGUgY3JlYXRpb24gc3RyaW5nIGluIHJlc3VsdCIsCi0JCW5ldyBTV1RFeGNlcHRpb24oU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPLCAiQW4gaW50ZXJlc3RpbmcgbWVzc2FnZSIpLmdldE1lc3NhZ2UoKSAKLQkJCS5pbmRleE9mKCJBbiBpbnRlcmVzdGluZyBtZXNzYWdlIikgPj0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcHJpbnRTdGFja1RyYWNlKCkgewotCQotCS8vIFdBUk5JTkc6IHRoaXMgdGVzdCBpcyBub3QgQ0xEQyBzYWZlLCBiZWNhdXNlIGl0IHJlcXVpcmVzIGphdmEuaW8uUHJpbnRTdHJlYW0KLQkKLQl0cnkgewotCQlDbGFzcy5mb3JOYW1lKCJqYXZhLmlvLlByaW50U3RyZWFtIik7Ci0JfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCS8vIGlnbm9yZSB0ZXN0IGlmIHJ1bm5pbmcgb24gQ0xEQwotCQlyZXR1cm47Ci0JfQotCQotCS8vIHRlc3QgZGVmYXVsdCBTV1RFeGNlcHRpb24KLQkKLQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCVN5c3RlbS5zZXRFcnIobmV3IFByaW50U3RyZWFtKG91dCkpOwotCVNXVEV4Y2VwdGlvbiBlcnJvciA9IG5ldyBTV1RFeGNlcHRpb24oKTsKLQllcnJvci5wcmludFN0YWNrVHJhY2UoKTsKLQlhc3NlcnRUcnVlKG91dC5zaXplKCkgPiAwKTsKLQlhc3NlcnRUcnVlKG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCkpLmluZGV4T2YoInRlc3RfcHJpbnRTdGFja1RyYWNlIikgIT0gLTEpOwotCQotCS8vIHRlc3QgU1dURXhjZXB0aW9uIHdpdGggY29kZQotCQotCW91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQlTeXN0ZW0uc2V0RXJyKG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQllcnJvciA9IG5ldyBTV1RFeGNlcHRpb24oU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCWVycm9yLnByaW50U3RhY2tUcmFjZSgpOwotCWFzc2VydFRydWUob3V0LnNpemUoKSA+IDApOwotCWFzc2VydFRydWUobmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSkuaW5kZXhPZigidGVzdF9wcmludFN0YWNrVHJhY2UiKSAhPSAtMSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEV4Y2VwdGlvbigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWVzc2FnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcHJpbnRTdGFja1RyYWNlIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySSIpKSB0ZXN0X0NvbnN0cnVjdG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1lc3NhZ2UiKSkgdGVzdF9nZXRNZXNzYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wcmludFN0YWNrVHJhY2UiKSkgdGVzdF9wcmludFN0YWNrVHJhY2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BQ0MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BQ0MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlZDhmNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQUNDLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQUNDCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FDQyBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQUNDKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQUNDKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2YzM5Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JYWNjZXNzaWJsZSA9IHNoZWxsLmdldEFjY2Vzc2libGUoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBzaGVsbC5pc0Rpc3Bvc2VkKCkpOwotCXNoZWxsLmRpc3Bvc2UoKTsKLQlhc3NlcnRUcnVlKHNoZWxsLmlzRGlzcG9zZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKCkgewotCUFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0Q2hpbGQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0Q2hpbGRBdFBvaW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldENoaWxkQ291bnQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0Q2hpbGRyZW4oQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0RGVmYXVsdEFjdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRGb2N1cyhBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRMb2NhdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRSb2xlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldFNlbGVjdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRTdGF0ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCX07Ci0JYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKGxpc3RlbmVyKTsKLQlhY2Nlc3NpYmxlLnJlbW92ZUFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIoKSB7Ci0JQWNjZXNzaWJsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEFjY2Vzc2libGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldERlc2NyaXB0aW9uKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0SGVscChBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldEtleWJvYXJkU2hvcnRjdXQoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJfQotCX07Ci0JYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobGlzdGVuZXIpOwotCWFjY2Vzc2libGUucmVtb3ZlQWNjZXNzaWJsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIoKSB7Ci0JQWNjZXNzaWJsZVRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBY2Nlc3NpYmxlVGV4dExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBnZXRTZWxlY3Rpb25SYW5nZShBY2Nlc3NpYmxlVGV4dEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRDYXJldE9mZnNldChBY2Nlc3NpYmxlVGV4dEV2ZW50IGUpIHsKLQkJfQotCX07Ci0JYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlVGV4dExpc3RlbmVyKGxpc3RlbmVyKTsKLQlhY2Nlc3NpYmxlLnJlbW92ZUFjY2Vzc2libGVUZXh0TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRyb2woKSB7Ci0JYXNzZXJ0RXF1YWxzKHNoZWxsLCBhY2Nlc3NpYmxlLmdldENvbnRyb2woKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfV01fR0VUT0JKRUNUSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludGVybmFsX1dNX0dFVE9CSkVDVElJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9BY2Nlc3NpYmxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0FjY2Vzc2libGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9uZXdfQWNjZXNzaWJsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9uZXdfQWNjZXNzaWJsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKCkgewotCS8vIFRlc3RlZCBpbiB0ZXN0X2FkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lci4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVBY2Nlc3NpYmxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyKCkgewotCS8vIFRlc3RlZCBpbiB0ZXN0X2FkZEFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWNjZXNzaWJsZVRleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyKCkgewotCS8vIFRlc3RlZCBpbiB0ZXN0X2FkZEFjY2Vzc2libGVUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lci4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3Rpb25DaGFuZ2VkKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZWxlY3Rpb25DaGFuZ2VkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9jdXNJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb2N1c0kgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90ZXh0Q2FyZXRNb3ZlZEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3RleHRDYXJldE1vdmVkSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RleHRDaGFuZ2VkSUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF90ZXh0Q2hhbmdlZElJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RleHRTZWxlY3Rpb25DaGFuZ2VkKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF90ZXh0U2VsZWN0aW9uQ2hhbmdlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEFjY2Vzc2libGVUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfV01fR0VUT0JKRUNUSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfQWNjZXNzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfbmV3X0FjY2Vzc2libGVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVBY2Nlc3NpYmxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdGlvbkNoYW5nZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvY3VzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdGV4dENhcmV0TW92ZWRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90ZXh0Q2hhbmdlZElJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdGV4dFNlbGVjdGlvbkNoYW5nZWQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIiKSkgdGVzdF9hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIiKSkgdGVzdF9hZGRBY2Nlc3NpYmxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIiKSkgdGVzdF9hZGRBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRyb2wiKSkgdGVzdF9nZXRDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9XTV9HRVRPQkpFQ1RJSSIpKSB0ZXN0X2ludGVybmFsX1dNX0dFVE9CSkVDVElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0FjY2Vzc2libGUiKSkgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0FjY2Vzc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX25ld19BY2Nlc3NpYmxlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9pbnRlcm5hbF9uZXdfQWNjZXNzaWJsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVBY2Nlc3NpYmxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdGlvbkNoYW5nZWQiKSkgdGVzdF9zZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb2N1c0kiKSkgdGVzdF9zZXRGb2N1c0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RleHRDYXJldE1vdmVkSSIpKSB0ZXN0X3RleHRDYXJldE1vdmVkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdGV4dENoYW5nZWRJSUkiKSkgdGVzdF90ZXh0Q2hhbmdlZElJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdGV4dFNlbGVjdGlvbkNoYW5nZWQiKSkgdGVzdF90ZXh0U2VsZWN0aW9uQ2hhbmdlZCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByaXZhdGUgU2hlbGwgc2hlbGw7Ci1wcml2YXRlIEFjY2Vzc2libGUgYWNjZXNzaWJsZTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwODk4ZjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREZXNjcmlwdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0S2V5Ym9hcmRTaG9ydGN1dExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TmFtZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEtleWJvYXJkU2hvcnRjdXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpKSB0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKSkgdGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0S2V5Ym9hcmRTaG9ydGN1dExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKSkgdGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TmFtZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKSkgdGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjJkY2FkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGlsZEF0UG9pbnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZWZhdWx0QWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGlsZENvdW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3RhdGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldENoaWxkTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRDaGlsZHJlbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREZWZhdWx0QWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXREZWZhdWx0QWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRGb2N1c0xvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0U3RhdGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldFZhbHVlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjdkMzhlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCgpIHsKLQkvLyBPYmplY3Qgd2lsbCB0eXBpY2FsbHkgYmUgYSB3aWRnZXQuCi0JQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBldmVudCA9IG5ldyBBY2Nlc3NpYmxlQ29udHJvbEV2ZW50KHNoZWxsKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50KTsKLQkKLQkvLyBUZXN0IHdpdGggc29tZSBvdGhlciBvYmplY3QgYWxzby4KLQlldmVudCA9IG5ldyBBY2Nlc3NpYmxlQ29udHJvbEV2ZW50KG5ldyBJbnRlZ2VyKDUpKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGV2ZW50ID0gbmV3IEFjY2Vzc2libGVDb250cm9sRXZlbnQoc2hlbGwpOwotCWFzc2VydE5vdE51bGwoZXZlbnQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyBTaGVsbCBzaGVsbDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTI4OTg2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGlsZENvdW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGlsZExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGlsZExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RGVmYXVsdEFjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFJvbGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0YXRlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFN0YXRlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVmYXVsdEFjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb2N1c0xvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRDaGlsZEF0UG9pbnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGlsZExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0YXRlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTY0YzYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JLy8gT2JqZWN0IHdpbGwgdHlwaWNhbGx5IGJlIGEgd2lkZ2V0LgotCUFjY2Vzc2libGVFdmVudCBldmVudCA9IG5ldyBBY2Nlc3NpYmxlRXZlbnQoc2hlbGwpOwotCWFzc2VydE5vdE51bGwoZXZlbnQpOwotCQotCS8vIFRlc3Qgd2l0aCBzb21lIG90aGVyIG9iamVjdCBhbHNvLgotCWV2ZW50ID0gbmV3IEFjY2Vzc2libGVFdmVudChuZXcgSW50ZWdlcig1KSk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JQWNjZXNzaWJsZUV2ZW50IGV2ZW50ID0gbmV3IEFjY2Vzc2libGVFdmVudChzaGVsbCk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudC50b1N0cmluZygpKTsKLQlhc3NlcnRUcnVlKGV2ZW50LnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgU2hlbGwgc2hlbGw7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzcyMjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhlbHBMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEtleWJvYXJkU2hvcnRjdXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVzY3JpcHRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0S2V5Ym9hcmRTaG9ydGN1dExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE5hbWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGVzY3JpcHRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50IikpIHRlc3RfZ2V0RGVzY3JpcHRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpKSB0ZXN0X2dldEhlbHBMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpKSB0ZXN0X2dldEtleWJvYXJkU2hvcnRjdXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpKSB0ZXN0X2dldE5hbWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjNjMGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dEFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVUZXh0QWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0QWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENhcmV0T2Zmc2V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50IikpIHRlc3RfZ2V0Q2FyZXRPZmZzZXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCIpKSB0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWVmMDAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCgpIHsKLQkvLyBPYmplY3Qgd2lsbCB0eXBpY2FsbHkgYmUgYSB3aWRnZXQuCi0JQWNjZXNzaWJsZVRleHRFdmVudCBldmVudCA9IG5ldyBBY2Nlc3NpYmxlVGV4dEV2ZW50KHNoZWxsKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50KTsKLQkKLQkvLyBUZXN0IHdpdGggc29tZSBvdGhlciBvYmplY3QgYWxzby4KLQlldmVudCA9IG5ldyBBY2Nlc3NpYmxlVGV4dEV2ZW50KG5ldyBJbnRlZ2VyKDUpKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlBY2Nlc3NpYmxlVGV4dEV2ZW50IGV2ZW50ID0gbmV3IEFjY2Vzc2libGVUZXh0RXZlbnQoc2hlbGwpOwotCWFzc2VydE5vdE51bGwoZXZlbnQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyBTaGVsbCBzaGVsbDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjFhNDI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVUZXh0TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVUZXh0TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENhcmV0T2Zmc2V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50IikpIHRlc3RfZ2V0Q2FyZXRPZmZzZXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCIpKSB0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYXd0X1NXVF9BV1QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYXd0X1NXVF9BV1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmMmRmZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2F3dF9TV1RfQVdULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hd3QuU1dUX0FXVAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmF3dC5TV1RfQVdUCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hd3RfU1dUX0FXVCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2F3dF9TV1RfQVdUKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X25ld19GcmFtZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X25ld19GcmFtZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9uZXdfU2hlbGxMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2F3dF9DYW52YXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X25ld19TaGVsbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5TGphdmFfYXd0X0NhbnZhcyBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2F3dF9TV1RfQVdUKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X25ld19GcmFtZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X25ld19TaGVsbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5TGphdmFfYXd0X0NhbnZhcyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X25ld19GcmFtZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUiKSkgdGVzdF9uZXdfRnJhbWVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9uZXdfU2hlbGxMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2F3dF9DYW52YXMiKSkgdGVzdF9uZXdfU2hlbGxMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2F3dF9DYW52YXMoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Ccm93c2VyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjFiM2NmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Ccm93c2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3NlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3NlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQlicm93c2VyLmRpc3Bvc2UoKTsKLQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5CT1JERVIpOwotCWJyb3dzZXIuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihudWxsLCBTV1QuTk9ORSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyIik7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5hZGRDbG9zZVdpbmRvd0xpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlDbG9zZVdpbmRvd0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IENsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5yZW1vdmVDbG9zZVdpbmRvd0xpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIiKTsKLQl0cnkgewotCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCUxvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlTG9jYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkT3BlbldpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2FkZE9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIiKTsKLQl0cnkgewotCQlicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JT3BlbldpbmRvd0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5yZW1vdmVPcGVuV2luZG93TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2FkZFByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciIpOwotCXRyeSB7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JUHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlUHJvZ3Jlc3NMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2FkZFN0YXR1c1RleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIiKTsKLQl0cnkgewotCQlicm93c2VyLmFkZFN0YXR1c1RleHRMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JU3RhdHVzVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlU3RhdHVzVGV4dExpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRUaXRsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9hZGRUaXRsZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyIik7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlUaXRsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRpdGxlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoVGl0bGVFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLmFkZFRpdGxlTGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlVGl0bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2FkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIiKTsKLQl0cnkgewotCQlicm93c2VyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9iYWNrKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfYmFjayIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlicm93c2VyLmJhY2soKTsKLQkJcnVuTG9vcFRpbWVyKDEpOwotCX0KLQkvKiByZXR1cm5pbmcgMTAgdGltZXMgaW4gaGlzdG9yeSAtIGV4cGVjdGluZyBmYWxzZSBpcyByZXR1cm5lZCAqLwotCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5iYWNrKCk7Ci0JYXNzZXJ0RmFsc2UocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmciKTsKLQl0cnkgewotCQlicm93c2VyLmV4ZWN1dGUobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNjcmlwdCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQkvKiBSZWFsIHRlc3RpbmcgaXMgZG9uZSBpbiB0aGUgdGVzdHMgdGhhdCBydW4gdGhlIGV2ZW50IGxvb3AKLQkgKiBzaW5jZSBhIGRvY3VtZW50IG11c3QgaGF2ZSBiZWVuIGxvYWRlZCB0byBleGVjdXRlIGEgc2NyaXB0IG9uIGl0LgotCSAqLwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZvcndhcmQoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9mb3J3YXJkIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCWJyb3dzZXIuZm9yd2FyZCgpOwotCQlydW5Mb29wVGltZXIoMSk7Ci0JfQotCS8qIGdvaW5nIGZvcndhcmQgMTAgdGltZXMgaW4gaGlzdG9yeSAtIGV4cGVjdGluZyBmYWxzZSBpcyByZXR1cm5lZCAqLwotCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5mb3J3YXJkKCk7Ci0JYXNzZXJ0RmFsc2UocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRVcmwoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9nZXRVcmwiKTsKLQlTdHJpbmcgc3RyaW5nID0gYnJvd3Nlci5nZXRVcmwoKTsKLQlhc3NlcnRUcnVlKHN0cmluZyAhPSBudWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0JhY2tFbmFibGVkKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfaXNCYWNrRW5hYmxlZCIpOwotCQotCS8qIGJhY2sgc2hvdWxkIHJldHVybiB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzQmFja0VuYWJsZWQgcHJldmlvdXNseSByZXR1cm5lZCAqLwotCWFzc2VydEVxdWFscyhicm93c2VyLmlzQmFja0VuYWJsZWQoKSwgYnJvd3Nlci5iYWNrKCkpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlicm93c2VyLmJhY2soKTsKLQkJcnVuTG9vcFRpbWVyKDEpOwotCX0KLQkvKiBnb2luZyBiYWNrIDEwIHRpbWVzIGluIGhpc3RvcnkgLSBleHBlY3RpbmcgZmFsc2UgaXMgcmV0dXJuZWQgKi8KLQlib29sZWFuIHJlc3VsdCA9IGJyb3dzZXIuaXNCYWNrRW5hYmxlZCgpOwotCWFzc2VydEZhbHNlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNGb3J3YXJkRW5hYmxlZCgpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2lzRm9yd2FyZEVuYWJsZWQiKTsKLQkKLQkvKiBmb3J3YXJkIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgdGhhdCBpc0ZvcndhcmRFbmFibGVkIHByZXZpb3VzbHkgcmV0dXJuZWQgKi8KLQlhc3NlcnRFcXVhbHMoYnJvd3Nlci5pc0ZvcndhcmRFbmFibGVkKCksIGJyb3dzZXIuZm9yd2FyZCgpKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJYnJvd3Nlci5mb3J3YXJkKCk7Ci0JCXJ1bkxvb3BUaW1lcigxKTsKLQl9Ci0JLyogZ29pbmcgZm9yd2FyZCAxMCB0aW1lcyBpbiBoaXN0b3J5IC0gZXhwZWN0aW5nIGZhbHNlIGlzIHJldHVybmVkICovCi0JYm9vbGVhbiByZXN1bHQgPSBicm93c2VyLmlzRm9yd2FyZEVuYWJsZWQoKTsKLQlhc3NlcnRGYWxzZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlZnJlc2goKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9yZWZyZXNoIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCWJyb3dzZXIucmVmcmVzaCgpOwotCQlydW5Mb29wVGltZXIoMSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUNsb3NlV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQl0cnkgewotCQlicm93c2VyLnJlbW92ZUNsb3NlV2luZG93TGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCS8vIHRlc3RlZCBpbiBhZGRDbG9zZVdpbmRvd0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTG9jYXRpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlTG9jYXRpb25MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gdGVzdGVkIGluIGFkZExvY2F0aW9uTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVPcGVuV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlT3BlbldpbmRvd0xpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyB0ZXN0ZWQgaW4gYWRkT3BlbldpbmRvd0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlUHJvZ3Jlc3NMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0xpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlUHJvZ3Jlc3NMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gdGVzdGVkIGluIGFkZFByb2dyZXNzTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTdGF0dXNUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlU3RhdHVzVGV4dExpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyB0ZXN0ZWQgaW4gYWRkU3RhdHVzVGV4dExpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlVGl0bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlVGl0bGVMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gdGVzdGVkIGluIGFkZFRpdGxlTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyB0ZXN0ZWQgaW4gYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXNoZWxsLnNldFRleHQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JCi0JU3RyaW5nIGh0bWwgPSAiPEhUTUw+PEhFQUQ+PFRJVExFPkhUTUwgZXhhbXBsZSAyPC9USVRMRT48L0hFQUQ+PEJPRFk+PEgxPkhUTUwgZXhhbXBsZSAyPC9IMT4iOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7Ci0JCWh0bWwgKz0iPFA+VGhhdCBpcyBhIHRlc3QgbGluZSB3aXRoIHRoZSBudW1iZXIgIitpKyI8L1A+IjsKLQl9Ci0JaHRtbCArPSAiPC9CT0RZPjwvSFRNTD4iOwotCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLQlydW5Mb29wVGltZXIoMTApOwotCQotCXRyeSB7Ci0JCWJyb3dzZXIuc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGV4dCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRVcmxMamF2YV9sYW5nX1N0cmluZygpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X3NldFVybExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5zZXRVcmwobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHVybCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQkKLQkvKiBUSElTIFRFU1QgUkVRVUlSRVMgV0VCIEFDQ0VTUyEgSG93IGVsc2UgY2FuIHdlIHJlYWxseSB0ZXN0IHRoZSBodHRwOi8vIHBhcnQgb2YgYSBicm93c2VyIHdpZGdldD8gKi8KLQlicm93c2VyLnNldFVybCgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QiKTsKLQlydW5Mb29wVGltZXIoMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N0b3AoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9zdG9wIik7Ci0JLyogVEhJUyBURVNUIFJFUVVJUkVTIFdFQiBBQ0NFU1MhIEhvdyBlbHNlIGNhbiB3ZSByZWFsbHkgdGVzdCB0aGUgaHR0cDovLyBwYXJ0IG9mIGEgYnJvd3NlciB3aWRnZXQ/ICovCi0JYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0Iik7Ci0JcnVuTG9vcFRpbWVyKDEpOwotCWJyb3dzZXIuc3RvcCgpOwotCXJ1bkxvb3BUaW1lcigxMCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Ccm93c2VyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZE9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkVGl0bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9iYWNrIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZvcndhcmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFVybCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNCYWNrRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNGb3J3YXJkRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVmcmVzaCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZU9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVGl0bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFVybExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdG9wIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyIikpIHRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZE9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIiKSkgdGVzdF9hZGRPcGVuV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRQcm9ncmVzc0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIiKSkgdGVzdF9hZGRQcm9ncmVzc0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFN0YXR1c1RleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIiKSkgdGVzdF9hZGRTdGF0dXNUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRUaXRsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIiKSkgdGVzdF9hZGRUaXRsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIiKSkgdGVzdF9hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9iYWNrIikpIHRlc3RfYmFjaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mb3J3YXJkIikpIHRlc3RfZm9yd2FyZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VXJsIikpIHRlc3RfZ2V0VXJsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0JhY2tFbmFibGVkIikpIHRlc3RfaXNCYWNrRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNGb3J3YXJkRW5hYmxlZCIpKSB0ZXN0X2lzRm9yd2FyZEVuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZnJlc2giKSkgdGVzdF9yZWZyZXNoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVDbG9zZVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVDbG9zZVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxvY2F0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUxvY2F0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlT3BlbldpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZU9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVN0YXR1c1RleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVRpdGxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVRpdGxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VXJsTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRVcmxMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc3RvcCIpKSB0ZXN0X3N0b3AoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1Ccm93c2VyIGJyb3dzZXI7Ci0KLXZvaWQgcnVuTG9vcFRpbWVyKGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JZmluYWwgYm9vbGVhbltdIGV4aXQgPSB7ZmFsc2V9OwotCW5ldyBUaHJlYWQoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7VGhyZWFkLnNsZWVwKHNlY29uZHMgKiAxMDAwKTt9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJCWV4aXRbMF0gPSB0cnVlOwotCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0uc3RhcnQoKTsKLQlzaGVsbC5vcGVuKCk7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0Jd2hpbGUgKCFleGl0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NDkzYTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkNsb3NlV2luZG93TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkNsb3NlV2luZG93TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbG9zZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihuZXcgQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2xvc2UoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJfQotCX0pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xvc2VMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbG9zZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpKSB0ZXN0X2Nsb3NlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25BZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTU3M2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25BZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25BZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JTG9jYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgTG9jYXRpb25BZGFwdGVyKCkge307Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JTG9jYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgTG9jYXRpb25BZGFwdGVyKCkgewkKLQl9OwotCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihhZGFwdGVyKTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50IikpIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50IikpIHRlc3RfY2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZWNlMTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJfQkJCi0JfSk7Ci0Jc2hlbGwuY2xvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudAotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCIpKSB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCIpKSB0ZXN0X2NoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3NzcxYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5PcGVuV2luZG93TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLk9wZW5XaW5kb3dMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9vcGVuV2luZG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQl9Ci0JfSk7Ci0Jc2hlbGwuY2xvc2UoKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X29wZW5XaW5kb3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9vcGVuV2luZG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50IikpIHRlc3Rfb3BlbldpbmRvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDhmZGUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCVByb2dyZXNzQWRhcHRlciBhZGFwdGVyID0gbmV3IFByb2dyZXNzQWRhcHRlcigpIHt9OwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NBZGFwdGVyKCkge30pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXBsZXRlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0FkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wbGV0ZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCIpKSB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQiKSkgdGVzdF9jb21wbGV0ZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjJiMTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXBsZXRlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudAotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQiKSkgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXBsZXRlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50IikpIHRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzYjNmNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5TdGF0dXNUZXh0TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkU3RhdHVzVGV4dExpc3RlbmVyKG5ldyBTdGF0dXNUZXh0TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoU3RhdHVzVGV4dEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRFdmVudCIpKSB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViZTIyNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5UaXRsZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5UaXRsZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUV2ZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyKG5ldyBUaXRsZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFRpdGxlRXZlbnQgZXZlbnQpIHsKLQkJfQotCX0pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVFdmVudCIpKSB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjZDI3MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlZpc2liaWxpdHlXaW5kb3dBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5WaXNpYmlsaXR5V2luZG93QWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93QWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JbmV3IFZpc2liaWxpdHlXaW5kb3dBZGFwdGVyKCkge307Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93QWRhcHRlcigpe30pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9oaWRlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93QWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oaWRlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpKSB0ZXN0X2hpZGVMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKSkgdGVzdF9zaG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODQwNzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBzaG93KFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudAotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hpZGVMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKSkgdGVzdF9oaWRlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50IikpIHRlc3Rfc2hvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQW5pbWF0ZWRQcm9ncmVzcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQW5pbWF0ZWRQcm9ncmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzY3YzViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0FuaW1hdGVkUHJvZ3Jlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkFuaW1hdGVkUHJvZ3Jlc3MKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQW5pbWF0ZWRQcm9ncmVzcwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0FuaW1hdGVkUHJvZ3Jlc3MgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcyB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQW5pbWF0ZWRQcm9ncmVzcyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NsZWFyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jbGVhciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N0YXJ0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zdGFydCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N0b3AoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3N0b3Agbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0FuaW1hdGVkUHJvZ3Jlc3MoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xlYXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdGFydCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc3RvcCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbGVhciIpKSB0ZXN0X2NsZWFyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdGFydCIpKSB0ZXN0X3N0YXJ0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdG9wIikpIHRlc3Rfc3RvcCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTZmZjAwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJpZGlTZWdtZW50RXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQmlkaVNlZ21lbnRFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZGMwYzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJpZGlTZWdtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CaWRpU2VnbWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLkJpZGlVdGlsOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJpZGlTZWdtZW50TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQmlkaVNlZ21lbnRMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JU3R5bGVkVGV4dCB0ZXh0OwotCWJvb2xlYW4gbGlzdGVuZXJDYWxsZWQ7CQotCVN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQkJCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXByaXZhdGUgYm9vbGVhbiBpc0JpZGkoKSB7Ci0JcmV0dXJuIEJpZGlVdGlsLmlzQmlkaVBsYXRmb3JtKCk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotfQotcHJpdmF0ZSB2b2lkIHRlc3RMaXN0ZW5lcihmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgaW50W10gc2VnbWVudHMsIGJvb2xlYW4gZXhjZXB0aW9uRXhwZWN0ZWQpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCUJpZGlTZWdtZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQmlkaVNlZ21lbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGluZUdldFNlZ21lbnRzKEJpZGlTZWdtZW50RXZlbnQgZXZlbnQpIHsKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlICsgIiBpbmNvcnJlY3QgQmlkaVNlZ21lbnRFdmVudCIsIDAsIGV2ZW50LmxpbmVPZmZzZXQpOwotCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UgKyAiIGluY29ycmVjdCBCaWRpU2VnbWVudEV2ZW50IiwgbGluZSwgZXZlbnQubGluZVRleHQpOwotCQkJCi0JCQlldmVudC5zZWdtZW50cyA9IHNlZ21lbnRzOwotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwkKLQkJfQotCX07Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkJCi0JdHJ5IHsKLQkJdGV4dC5hZGRCaWRpU2VnbWVudExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDApOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JZmluYWxseSB7Ci0JCXRleHQucmVtb3ZlQmlkaVNlZ21lbnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCWlmIChleGNlcHRpb25FeHBlY3RlZCkgewotCQlhc3NlcnRUcnVlKG1lc3NhZ2UgKyAiIGV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9Ci0JZWxzZSB7Ci0JCWFzc2VydFRydWUobWVzc2FnZSArICIgdW5leHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duID09IGZhbHNlKTsKLQl9Ci0JaWYgKGlzQmlkaSgpKSB7Ci0JCWFzc2VydFRydWUobWVzc2FnZSArICIgbGlzdGVuZXIgbm90IGNhbGxlZCIsIGxpc3RlbmVyQ2FsbGVkKTsJCi0JfQotCWVsc2UgewotCQlhc3NlcnRUcnVlKG1lc3NhZ2UgKyAiIGxpc3RlbmVyIGNhbGxlZCB3aGVuIGl0IHNob3VsZG4ndCBiZSIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQl9Ci19Ci1wcml2YXRlIHZvaWQgdGVzdFN0eWxlUmFuZ2VTZWdtZW50aW5nKGZpbmFsIGludFtdIHNlZ21lbnRzLCBpbnRbXSBib2xkUmFuZ2VzKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlCaWRpU2VnbWVudExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEJpZGlTZWdtZW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxpbmVHZXRTZWdtZW50cyhCaWRpU2VnbWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlhc3NlcnRFcXVhbHMoIiBpbmNvcnJlY3QgQmlkaVNlZ21lbnRFdmVudCIsIDAsIGV2ZW50LmxpbmVPZmZzZXQpOwotCQkJYXNzZXJ0RXF1YWxzKCIgaW5jb3JyZWN0IEJpZGlTZWdtZW50RXZlbnQiLCBsaW5lLCBldmVudC5saW5lVGV4dCk7Ci0JCQkKLQkJCWV2ZW50LnNlZ21lbnRzID0gc2VnbWVudHM7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7CQotCQl9Ci0JfTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQkKLQl0cnkgewotCQl0ZXh0LmFkZEJpZGlTZWdtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCQl0ZXh0LnNldFN0eWxlUmFuZ2UobnVsbCk7Ci0JCWZvciAoaW50IGk9MDsgaTxib2xkUmFuZ2VzLmxlbmd0aDsgaSs9MikgewotCQkJU3R5bGVSYW5nZSBzdHlsZVJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoYm9sZFJhbmdlc1tpXSwgYm9sZFJhbmdlc1tpKzFdLCBudWxsLCBudWxsLCBTV1QuQk9MRCk7Ci0JCQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGVSYW5nZSk7Ci0JCX07Ci0JCXRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgwKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWZpbmFsbHkgewotCQl0ZXh0LnJlbW92ZUJpZGlTZWdtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQlhc3NlcnRUcnVlKCIgdW5leHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duID09IGZhbHNlKTsKLQlpZiAoaXNCaWRpKCkpIHsKLQkJYXNzZXJ0VHJ1ZSgiIGxpc3RlbmVyIG5vdCBjYWxsZWQiLCBsaXN0ZW5lckNhbGxlZCk7CQotCX0KLQllbHNlIHsKLQkJYXNzZXJ0VHJ1ZSgiIGxpc3RlbmVyIGNhbGxlZCB3aGVuIGl0IHNob3VsZG4ndCBiZSIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGluZUdldFNlZ21lbnRzTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudCgpIHsKLQlpbnQgbGluZUxlbmd0aCA9IGxpbmUubGVuZ3RoKCk7Ci0KLQl0ZXh0LnNldFRleHQobGluZSk7CQotCS8vIHNob3VsZCBub3QgY2F1c2UgYW4gZXhjZXB0aW9uCi0JdGVzdExpc3RlbmVyKCI6YToiLCBudWxsLCBmYWxzZSk7Ci0JdGVzdExpc3RlbmVyKCI6YjoiLCBuZXcgaW50W10gezAsIGxpbmVMZW5ndGggLyAyLCBsaW5lTGVuZ3RofSwgZmFsc2UpOwotCXRlc3RMaXN0ZW5lcigiOmM6IiwgbmV3IGludFtdIHswLCBsaW5lTGVuZ3RoIC8gMn0sIGZhbHNlKTsKLQkJCQotCS8vIHNob3VsZCBhbGwgY2F1c2UgYW4gZXhjZXB0aW9uIG9uIGEgYmlkaSBwbGF0Zm9ybQotCWlmIChpc0JpZGkoKSkgewotCQl0ZXN0TGlzdGVuZXIoIjpkOiIsIG5ldyBpbnRbXSB7bGluZUxlbmd0aCAvIDJ9LCB0cnVlKTsKLQkJdGVzdExpc3RlbmVyKCI6ZToiLCBuZXcgaW50W10gezAsIDEsIDEsIGxpbmVMZW5ndGggLyAyfSwgdHJ1ZSk7Ci0JCXRlc3RMaXN0ZW5lcigiOmY6IiwgbmV3IGludFtdIHswLCAxLCAyLCBsaW5lTGVuZ3RoICsgMX0sIHRydWUpOwotCQl0ZXN0TGlzdGVuZXIoIjpnOiIsIG5ldyBpbnRbXSB7MCwgMSwgbGluZUxlbmd0aCArIDEsIGxpbmVMZW5ndGggKyAxfSwgdHJ1ZSk7Ci0JCXRlc3RMaXN0ZW5lcigiOmg6IiwgbmV3IGludFtdIHswLCAyLCAxfSwgdHJ1ZSk7Ci0JCXRlc3RMaXN0ZW5lcigiOmk6IiwgbmV3IGludFtdIHswLCAtMSwgMn0sIHRydWUpOwotCQl0ZXN0TGlzdGVuZXIoIjpqOiIsIG5ldyBpbnRbXSB7MCwgLTEsIDJ9LCB0cnVlKTsKLQl9Ci0KLQkvLyB0ZXN0IGJvbGQgc2VnbWVudGluZwotCWxpbmUgPSAidGhpcyBpcyBhIGxpbmUgd2l0aCA1MCBjaGFycyAtICoqKiogKioqKiAqKioqICoqKioiOwotCXRleHQuc2V0VGV4dChsaW5lKTsKLQkvLyBzaG91bGQgc2VnbWVudCBhcyBpbnRbXSB7MCw1LDUsMiwxMiwzLDIwLDV9Ci0JdGVzdFN0eWxlUmFuZ2VTZWdtZW50aW5nKG5ldyBpbnRbXSB7MCw1LDEwLDE1LDIwLDI1fSwgbmV3IGludFtdIHswLDUsNSwyLDEyLDMsMjAsNX0pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHswLDUsNSwxLDcsMywxMCwzLDE1LDUsMjAsNX0KLQl0ZXN0U3R5bGVSYW5nZVNlZ21lbnRpbmcobmV3IGludFtdIHswLDUsMTAsMTUsMjAsMjV9LCBuZXcgaW50W10gezAsNiw3LDYsMTUsMTB9KTsKLQkvLyBzaG91bGQgc2VnbWVudCBhcyBpbnRbXSB7MCw1LDUsNSwxMCw1fQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNSwxMCwxNX0sIG5ldyBpbnRbXSB7MCwxNX0pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHswLDV9Ci0JdGVzdFN0eWxlUmFuZ2VTZWdtZW50aW5nKG5ldyBpbnRbXSB7MCw1fSwgbmV3IGludFtdIHswLDV9KTsKLQkvLyBzaG91bGQgc2VnbWVudCBhcyBpbnRbXSB7MiwzfQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNX0sIG5ldyBpbnRbXSB7MiwzfSk7Ci0JLy8gc2hvdWxkIHNlZ21lbnQgYXMgaW50W10gezAsMn0KLQl0ZXN0U3R5bGVSYW5nZVNlZ21lbnRpbmcobmV3IGludFtdIHswLDV9LCBuZXcgaW50W10gezAsMn0pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHsxMCw1fQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNSwxMCwxNX0sIG5ldyBpbnRbXSB7MTAsNX0pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHsxMiwzfQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNSwxMCwxNX0sIG5ldyBpbnRbXSB7MTIsM30pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHszLDIsNSw1LDEwLDMsMjEsNCwyNSwzfQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNSwxMCwxNSwyMCwyNSwzMH0sIG5ldyBpbnRbXSB7MywxMCwyMSw3fSk7Ci0JLy8gc2hvdWxkIHNlZ21lbnQgYXMgaW50W10gezEwLDJ9Ci0JbGluZSA9ICJ0ZXN0MXRlc3QyL3IvbiI7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNX0sIG5ldyBpbnRbXSB7MTAsMn0pOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9saW5lR2V0U2VnbWVudHNMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xpbmVHZXRTZWdtZW50c0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQiKSkgdGVzdF9saW5lR2V0U2VnbWVudHNMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CdXN5SW5kaWNhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CdXN5SW5kaWNhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYzVhMzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQnVzeUluZGljYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQnVzeUluZGljYXRvciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CdXN5SW5kaWNhdG9yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dXaGlsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5TGphdmFfbGFuZ19SdW5uYWJsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hvd1doaWxlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlMamF2YV9sYW5nX1J1bm5hYmxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CdXN5SW5kaWNhdG9yKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93V2hpbGVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2xhbmdfUnVubmFibGUiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd1doaWxlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlMamF2YV9sYW5nX1J1bm5hYmxlIikpIHRlc3Rfc2hvd1doaWxlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlMamF2YV9sYW5nX1J1bm5hYmxlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTcwZWM5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm8KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0NvbWJvIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21ibyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JY2NvbWJvID0gbmV3IENDb21ibyhzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KGNjb21ibyk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbGVhclNlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY2xlYXJTZWxlY3Rpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdEFsbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGVzZWxlY3RBbGwgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rlc2VsZWN0SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkcmVuKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGlsZHJlbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVkaXRhYmxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRFZGl0YWJsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUNvdW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUhlaWdodCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUhlaWdodCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNlbGVjdGlvbkluZGV4IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3R5bGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFN0eWxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VGV4dCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRIZWlnaHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRleHRIZWlnaHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0TGltaXQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRleHRMaW1pdCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRm9jdXNDb250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pc0ZvY3VzQ29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlZHJhdygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVkcmF3IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVkcmF3SUlJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlZHJhd0lJSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWxsKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVBbGwgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZWxlY3RJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWRpdGFibGVaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRFZGl0YWJsZVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFbmFibGVkWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RW5hYmxlZFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb2N1cygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9jdXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGltaXRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUZXh0TGltaXRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmlzaWJsZVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFZpc2libGVaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbGVhclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0QWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkcmVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFZGl0YWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0eWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0SGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0TGltaXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNGb2N1c0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlZHJhdyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVkcmF3SUlJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RWRpdGFibGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9jdXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExpbWl0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xlYXJTZWxlY3Rpb24iKSkgdGVzdF9jbGVhclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RBbGwiKSkgdGVzdF9kZXNlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RJIikpIHRlc3RfZGVzZWxlY3RJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGlsZHJlbiIpKSB0ZXN0X2dldENoaWxkcmVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFZGl0YWJsZSIpKSB0ZXN0X2dldEVkaXRhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKSkgdGVzdF9nZXRJdGVtSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSSIpKSB0ZXN0X2dldEl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4IikpIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlIikpIHRlc3RfZ2V0U3R5bGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0SGVpZ2h0IikpIHRlc3RfZ2V0VGV4dEhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dExpbWl0IikpIHRlc3RfZ2V0VGV4dExpbWl0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0ZvY3VzQ29udHJvbCIpKSB0ZXN0X2lzRm9jdXNDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWRyYXciKSkgdGVzdF9yZWRyYXcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZHJhd0lJSUlaIikpIHRlc3RfcmVkcmF3SUlJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFsbCIpKSB0ZXN0X3JlbW92ZUFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSSIpKSB0ZXN0X3JlbW92ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUlJIikpIHRlc3RfcmVtb3ZlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0SSIpKSB0ZXN0X3NlbGVjdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVkaXRhYmxlWiIpKSB0ZXN0X3NldEVkaXRhYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RW5hYmxlZFoiKSkgdGVzdF9zZXRFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9jdXMiKSkgdGVzdF9zZXRGb2N1cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExpbWl0SSIpKSB0ZXN0X3NldFRleHRMaW1pdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFZpc2libGVaIikpIHRlc3Rfc2V0VmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIEN1c3RvbSAqLwotQ0NvbWJvIGNjb21ibzsKLQotcHJpdmF0ZSB2b2lkIGFkZCgpIHsKLSAgICBjY29tYm8uYWRkKCJ0aGlzIik7Ci0gICAgY2NvbWJvLmFkZCgiaXMiKTsKLSAgICBjY29tYm8uYWRkKCJTV1QiKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KGNjb21iby5nZXRTaXplKCkueC0xMCwgNSwgMzAsIGNjb21iby5nZXRJdGVtSGVpZ2h0KCkqMiwgCi0gICAgICAgICAgICAJCSBDb25zaXN0ZW5jeVV0aWxpdHkuU0VMRUNUSU9OKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24gKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX0RPV04sIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMywgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICAvL29uIGFycm93Ci0gICAgY29uc2lzdGVuY3lFdmVudChjY29tYm8uZ2V0U2l6ZSgpLngtMTAsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgLy9vbiB0ZXh0Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMywgQ29uc2lzdGVuY3lVdGlsaXR5LkVTQ0FQRV9NRU5VLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDIwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DTGFiZWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDg0ODMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DTGFiZWwoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWxhYmVsID0gbmV3IENMYWJlbChzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KGxhYmVsKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxpZ25tZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRBbGlnbm1lbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUZXh0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9vbFRpcFRleHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRvb2xUaXBUZXh0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxpZ25tZW50SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QWxpZ25tZW50SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IkSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0xhYmVsKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBbGlnbm1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb29sVGlwVGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QWxpZ25tZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxpZ25tZW50IikpIHRlc3RfZ2V0QWxpZ25tZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZSIpKSB0ZXN0X2dldEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9vbFRpcFRleHQiKSkgdGVzdF9nZXRUb29sVGlwVGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWxpZ25tZW50SSIpKSB0ZXN0X3NldEFsaWdubWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJIikpIHRlc3Rfc2V0QmFja2dyb3VuZCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yJEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLUNMYWJlbCBsYWJlbDsKLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDIwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTcyMTM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZENUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlVHJpbUlJSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVUcmltSUlJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENsaWVudEFyZWEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Db3VudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNlbGVjdGlvbkluZGV4IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGFiSGVpZ2h0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUYWJIZWlnaHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb3BSaWdodCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VG9wUmlnaHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlQ1RhYkZvbGRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvcmRlclZpc2libGVaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCb3JkZXJWaXNpYmxlWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbnNlcnRNYXJrSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEluc2VydE1hcmtJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IkSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yJEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uRm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTZWxlY3Rpb25JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGFiSGVpZ2h0SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGFiSGVpZ2h0SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd1NlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hvd1NlbGVjdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZENUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUYWJIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvcFJpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJvcmRlclZpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbnNlcnRNYXJrSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uRm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUYWJIZWlnaHRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9QZ3VwU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9QZ2R3blNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIiKSkgdGVzdF9hZGRDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlVHJpbUlJSUkiKSkgdGVzdF9jb21wdXRlVHJpbUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgiKSkgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGFiSGVpZ2h0IikpIHRlc3RfZ2V0VGFiSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BSaWdodCIpKSB0ZXN0X2dldFRvcFJpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJvcmRlclZpc2libGVaIikpIHRlc3Rfc2V0Qm9yZGVyVmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbnNlcnRNYXJrSVoiKSkgdGVzdF9zZXRJbnNlcnRNYXJrSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbVoiKSkgdGVzdF9zZXRJbnNlcnRNYXJrTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW1aKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IkSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldFNlbGVjdGlvbkZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JIikpIHRlc3Rfc2V0U2VsZWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0iKSkgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGFiSGVpZ2h0SSIpKSB0ZXN0X3NldFRhYkhlaWdodEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIikpIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd1NlbGVjdGlvbiIpKSB0ZXN0X3Nob3dTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfUGdkd25TZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9QZ2R3blNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfUGd1cFNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1BndXBTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBDVGFiRm9sZGVyIGN0YWJGb2xkZXI7Ci0KLXByaXZhdGUgdm9pZCBtYWtlQ2xlYW5FbnZpcm9ubWVudCgpIHsKLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLQljdGFiRm9sZGVyID0gbmV3IENUYWJGb2xkZXIoc2hlbGwsIDApOwotCXNldFdpZGdldChjdGFiRm9sZGVyKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYkZvbGRlcihWZWN0b3IgZXZlbnRzKSB7Ci0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQlDVGFiSXRlbSBpdGVtID0gbmV3IENUYWJJdGVtKGN0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJDVGFiSXRlbSAmIiArIGkpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJDVGFiSXRlbSBUb29sVGlwIiArIGkpOwotCQlUZXh0IGl0ZW1UZXh0ID0gbmV3IFRleHQoY3RhYkZvbGRlciwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCWl0ZW1UZXh0LnNldFRleHQoIlxuVGV4dCBmb3IgQ1RhYkl0ZW0gIiArIGkgKyAiXG5cblxuIik7Ci0JCWl0ZW0uc2V0Q29udHJvbChpdGVtVGV4dCk7Ci0JCWhvb2tFeHBlY3RlZEV2ZW50cyhpdGVtLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCQlob29rRXhwZWN0ZWRFdmVudHMoaXRlbVRleHQsIGdldFRlc3ROYW1lKCksIGV2ZW50cyk7Ci0JfQotCWN0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKGN0YWJGb2xkZXIuZ2V0SXRlbSgwKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfUklHSFQsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cywgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KGN0YWJGb2xkZXIuZ2V0U2l6ZSgpLngvMiwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1BnZHduU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkNUUkwsIDAsIFNXVC5QQUdFX0RPV04sIENvbnNpc3RlbmN5VXRpbGl0eS5ET1VCTEVfS0VZX1BSRVNTLCBldmVudHMsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9QZ3VwU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIGN0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDIpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkNUUkwsIDAsIFNXVC5QQUdFX1VQLCBDb25zaXN0ZW5jeVV0aWxpdHkuRE9VQkxFX0tFWV9QUkVTUywgZXZlbnRzLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJGb2xkZXIoZXZlbnRzKTsKLSAgICBjdGFiRm9sZGVyLnNldFNlbGVjdGlvbigxKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJGb2xkZXIoZXZlbnRzKTsKLSAgICBjdGFiRm9sZGVyLnNldFNlbGVjdGlvbigxKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCA1LCA3MCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHLCBldmVudHMpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5Y2RlMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50IikpIHRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ3OTI4Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXJFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0Jc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0MmVjZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2l0ZW1DbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCIpKSB0ZXN0X2l0ZW1DbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGFkNmI5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0gewotCi0JQ1RhYkZvbGRlciBjVGFiRm9sZGVyOwotCUNUYWJJdGVtIGNUYWJJdGVtOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljVGFiRm9sZGVyID0gbmV3IENUYWJGb2xkZXIoc2hlbGwsIFNXVC5OT05FKTsKLQljVGFiSXRlbSA9IG5ldyBDVGFiSXRlbShjVGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0Jc2V0V2lkZ2V0KGNUYWJJdGVtKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlcklJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Qm91bmRzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERpc2FibGVkSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERpc2FibGVkSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFBhcmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvb2xUaXBUZXh0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUb29sVGlwVGV4dCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RGlzYWJsZWRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldERpc2FibGVkSW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGlzYWJsZWRJbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb29sVGlwVGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREaXNhYmxlZEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udHJvbCIpKSB0ZXN0X2dldENvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERpc2FibGVkSW1hZ2UiKSkgdGVzdF9nZXREaXNhYmxlZEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvb2xUaXBUZXh0IikpIHRlc3RfZ2V0VG9vbFRpcFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RGlzYWJsZWRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXREaXNhYmxlZEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4N2JmNzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ29udHJvbEVkaXRvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5Db250cm9sRWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVkaXRvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RWRpdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9sYXlvdXQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFZGl0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xheW91dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RWRpdG9yIikpIHRlc3RfZ2V0RWRpdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXlvdXQiKSkgdGVzdF9sYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwMDUwNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5FeHRlbmRlZE1vZGlmeUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkV4dGVuZGVkTW9kaWZ5RXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50KCkgewotCS8vIHRoaXMgbWV0aG9kIHRlc3RlZCBieSBvdGhlciB0ZXN0IGNsYXNzZXMKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNTIzZTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCWludCB2ZXJpZnkgPSAtMTsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0Jc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2hlbGwub3BlbigpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlFdmVudCgpIHsKLQlFeHRlbmRlZE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoRXh0ZW5kZWRNb2RpZnlFdmVudCBldmVudCkgewotCQkJc3dpdGNoKHZlcmlmeSkgewotCQkJCWNhc2UgMSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjFhOiIsIGV2ZW50LnN0YXJ0ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6MWI6IiwgZXZlbnQubGVuZ3RoID09IDEpOwotCQkJCQlhc3NlcnRUcnVlKCI6MWM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAyIDogewotCQkJCQlhc3NlcnRUcnVlKCI6MmE6IiwgZXZlbnQuc3RhcnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjoyYjoiLCBldmVudC5sZW5ndGggPT0gMSk7Ci0JCQkJCWFzc2VydFRydWUoIjoyYzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCJcblxuIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAzIDogewotCQkJCQlhc3NlcnRUcnVlKCI6M2E6IiwgZXZlbnQuc3RhcnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjozYjoiLCBldmVudC5sZW5ndGggPT0gMik7Ci0JCQkJCWFzc2VydFRydWUoIjozYzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCJhIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA0OiB7Ci0JCQkJCWFzc2VydFRydWUoIjo0OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjVhOiIsIGV2ZW50LnN0YXJ0ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6NWI6IiwgZXZlbnQubGVuZ3RoID09IDEpOwotCQkJCQlhc3NlcnRUcnVlKCI6NWM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA2IDogewotCQkJCQlhc3NlcnRUcnVlKCI6NmE6IiwgZXZlbnQuc3RhcnQgPT0gMjEpOwotCQkJCQlhc3NlcnRUcnVlKCI6NmI6IiwgZXZlbnQubGVuZ3RoID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6NmM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiXG5saW5lIDQiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDcgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo3YToiLCBldmVudC5zdGFydCA9PSA1KTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjdiOiIsIGV2ZW50Lmxlbmd0aCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjdjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgOCA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjhhOiIsIGV2ZW50LnN0YXJ0ID09IDcpOwotCQkJCQlhc3NlcnRUcnVlKCI6OGI6IiwgZXZlbnQubGVuZ3RoID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6OGM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiXHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgOSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjlhOiIsIGV2ZW50LnN0YXJ0ID09IDIpOwotCQkJCQlhc3NlcnRUcnVlKCI6OWI6IiwgZXZlbnQubGVuZ3RoID09IDQpOwotCQkJCQlhc3NlcnRUcnVlKCI6OWM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiXHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTA6ewotCQkJCQlhc3NlcnRUcnVlKCI6MTA6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMTogewotCQkJCQlhc3NlcnRUcnVlKCI6MTE6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMjogewotCQkJCQlhc3NlcnRUcnVlKCI6MTJhOiIsIGV2ZW50LnN0YXJ0ID09IDMpOwotCQkJCQlhc3NlcnRUcnVlKCI6MTJiOiIsIGV2ZW50Lmxlbmd0aCA9PSAxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEyYzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDEzOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxM2E6IiwgZXZlbnQuc3RhcnQgPT0gMik7Ci0JCQkJCWFzc2VydFRydWUoIjoxM2I6IiwgZXZlbnQubGVuZ3RoID09IDEpOwotCQkJCQlhc3NlcnRUcnVlKCI6MTNjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTQ6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE0OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTU6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE1YToiLCBldmVudC5zdGFydCA9PSAyKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE1YjoiLCBldmVudC5sZW5ndGggPT0gNik7Ci0JCQkJCWFzc2VydFRydWUoIjoxNWM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiXHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTY6ewotCQkJCQlhc3NlcnRUcnVlKCI6MTY6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNzogewotCQkJCQlhc3NlcnRUcnVlKCI6MTc6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxODogewotCQkJCQlhc3NlcnRUcnVlKCI6MThhOiIsIGV2ZW50LnN0YXJ0ID09IDMpOwotCQkJCQlhc3NlcnRUcnVlKCI6MThiOiIsIGV2ZW50Lmxlbmd0aCA9PSA3KTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE4YzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE5OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxOWE6IiwgZXZlbnQuc3RhcnQgPT0gMik7Ci0JCQkJCWFzc2VydFRydWUoIjoxOWI6IiwgZXZlbnQubGVuZ3RoID09IDcpOwotCQkJCQlhc3NlcnRUcnVlKCI6MTljOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMjA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjIwOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMjE6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjIxYToiLCBldmVudC5zdGFydCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjIxYjoiLCBldmVudC5sZW5ndGggPT0gMTYpOwotCQkJCQlhc3NlcnRUcnVlKCI6MjFjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQlzdHlsZWRUZXh0LmFkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCQotCWJvb2xlYW4gZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJ0ZXN0aW5nIik7Ci0JdmVyaWZ5ID0gMTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiXG5cbiIpOwotCXZlcmlmeSA9IDI7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDIsICJhIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiYSIpOwotCXZlcmlmeSA9IDM7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsICJcblxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdmVyaWZ5ID0gNDsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjo0OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMaW5lIDFcclxuTGluZSAyIik7Ci0JdmVyaWZ5ID0gNTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxyIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XG5saW5lIDNcbmxpbmUgNCIpOwotCXZlcmlmeSA9IDY7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIxLCA3LCAiIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQl2ZXJpZnkgPSA3OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSg1LCA5LCAiIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiXG5MMVxyXG5MMlxyXG4iKTsKLQl2ZXJpZnkgPSA4OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSg3LCAyLCAiIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gOTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMiwgInRlc3QiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl2ZXJpZnkgPSAxMDsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAiIik7fSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTA6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXZlcmlmeSA9IDExOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICIiKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjExOiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyIik7Ci0JdmVyaWZ5ID0gMTI7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJcbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXG4iKTsKLQl2ZXJpZnkgPSAxMzsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgIlxyIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gMTQ7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgInRlc3QiKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjE0OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl2ZXJpZnkgPSAxNTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMiwgInRlc3RcblxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gMTY7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcclxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNjogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdmVyaWZ5ID0gMTc7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMiwgInRlc3RcblxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNzogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotIAlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHIiKTsKLQl2ZXJpZnkgPSAxODsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgIlxudGVzdFxyXG4iKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxuIik7Ci0JdmVyaWZ5ID0gMTk7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJ0ZXN0XHJcclxyIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdmVyaWZ5ID0gMjA7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MjA6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMjE7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQlzdHlsZWRUZXh0LnJlbW92ZUV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlFdmVudCIpKSB0ZXN0X21vZGlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTc2NTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uTGluZUJhY2tncm91bmRFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5MaW5lQmFja2dyb3VuZEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCgpIHsKLQkvLyB0aGlzIG1ldGhvZCB0ZXN0ZWQgYnkgb3RoZXIgdGVzdCBjbGFzc2VzCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0RXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGY5NzdkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVCYWNrZ3JvdW5kTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uTGluZUJhY2tncm91bmRMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0Jc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2hlbGwub3BlbigpOwotfQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGluZUdldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50KCkgewotCUxpbmVCYWNrZ3JvdW5kTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGluZUJhY2tncm91bmRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGluZUdldEJhY2tncm91bmQoTGluZUJhY2tncm91bmRFdmVudCBldmVudCkgewotCQkJYXNzZXJ0VHJ1ZSgiOjE6IiwgZXZlbnQubGluZU9mZnNldD09MCk7Ci0JCQlhc3NlcnRUcnVlKCI6MjoiLGV2ZW50LmxpbmVUZXh0LmVxdWFscygiMDEyMzQ1Njc4OSIpKTsKLQkJfQotCX07Ci0Jc3R5bGVkVGV4dC5hZGRMaW5lQmFja2dyb3VuZExpc3RlbmVyKGxpc3RlbmVyKTsKLQlzdHlsZWRUZXh0LnNldFRleHQoIjAxMjM0NTY3ODkiKTsKLQkvLyBmb3JjZSBnZXQgbGluZSBiZyBjYWxsYmFjawotCXN0eWxlZFRleHQuc2VsZWN0QWxsKCk7Ci0Jc3R5bGVkVGV4dC5jb3B5KCk7Ci0Jc3R5bGVkVGV4dC5yZW1vdmVMaW5lQmFja2dyb3VuZExpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGluZUdldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xpbmVHZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudCIpKSB0ZXN0X2xpbmVHZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NDU1OGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50KCkgewotCS8vIHRoaXMgbWV0aG9kIHRlc3RlZCBieSBvdGhlciB0ZXN0IGNsYXNzZXMKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0RXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YzdmMzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNoZWxsLm9wZW4oKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGluZUdldFN0eWxlTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQoKSB7Ci0JTGluZVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGluZVN0eWxlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxpbmVHZXRTdHlsZShMaW5lU3R5bGVFdmVudCBldmVudCkgewotCQkJYXNzZXJ0VHJ1ZSgiOjE6IiwgZXZlbnQubGluZU9mZnNldD09MCk7Ci0JCQlhc3NlcnRUcnVlKCI6MjoiLGV2ZW50LmxpbmVUZXh0LmVxdWFscygiMDEyMzQ1Njc4OSIpKTsKLQkJfQotCX07Ci0Jc3R5bGVkVGV4dC5hZGRMaW5lU3R5bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5Iik7Ci0JLy8gZm9yY2UgZ2V0IGxpbmUgc3R5bGVzIGNhbGxiYWNrCi0Jc3R5bGVkVGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDUpOwotCXN0eWxlZFRleHQucmVtb3ZlTGluZVN0eWxlTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGluZUdldFN0eWxlTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbGluZUdldFN0eWxlTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQiKSkgdGVzdF9saW5lR2V0U3R5bGVMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fUG9wdXBMaXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Qb3B1cExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5MjAyNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Qb3B1cExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5Qb3B1cExpc3QKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uUG9wdXBMaXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fUG9wdXBMaXN0IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1BvcHVwTGlzdChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNaW5pbXVtV2lkdGgoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1pbmltdW1XaWR0aCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfb3BlbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NlbGVjdExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1XaWR0aEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE1pbmltdW1XaWR0aEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1BvcHVwTGlzdCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWluaW11bVdpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9vcGVuTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluaW11bVdpZHRoSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnQiKSkgdGVzdF9nZXRGb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNaW5pbXVtV2lkdGgiKSkgdGVzdF9nZXRNaW5pbXVtV2lkdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X29wZW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZWxlY3RMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbmltdW1XaWR0aEkiKSkgdGVzdF9zZXRNaW5pbXVtV2lkdGhJKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzZDIzOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU1QKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU1QKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQkvLyBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gdGVzdCB0aGlzLCBTVCBpcyBjb25zdGFudHMgY2xhc3MKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1NUKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Nhc2hGb3JtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTcxNTUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Nhc2hGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1heGltaXplZENvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1heGltaXplZENvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRPcmllbnRhdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0T3JpZW50YXRpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRXZWlnaHRzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRXZWlnaHRzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0WigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbGF5b3V0WiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNYXhpbWl6ZWRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE1heGltaXplZENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE9yaWVudGF0aW9uSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0T3JpZW50YXRpb25JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0V2VpZ2h0cyRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRXZWlnaHRzJEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Nhc2hGb3JtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1heGltaXplZENvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE9yaWVudGF0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXZWlnaHRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sYXlvdXRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1heGltaXplZENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0T3JpZW50YXRpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRXZWlnaHRzJEkiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNYXhpbWl6ZWRDb250cm9sIikpIHRlc3RfZ2V0TWF4aW1pemVkQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0T3JpZW50YXRpb24iKSkgdGVzdF9nZXRPcmllbnRhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0V2VpZ2h0cyIpKSB0ZXN0X2dldFdlaWdodHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xheW91dFoiKSkgdGVzdF9sYXlvdXRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IikpIHRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWF4aW1pemVkQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3Rfc2V0TWF4aW1pemVkQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRPcmllbnRhdGlvbkkiKSkgdGVzdF9zZXRPcmllbnRhdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFdlaWdodHMkSSIpKSB0ZXN0X3NldFdlaWdodHMkSSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2Nyb2xsZWRDb21wb3NpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MzY0YmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2Nyb2xsZWRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWx3YXlzU2hvd1Njcm9sbEJhcnMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEFsd2F5c1Nob3dTY3JvbGxCYXJzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udGVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29udGVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE9yaWdpbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0T3JpZ2luIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0WigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbGF5b3V0WiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFsd2F5c1Nob3dTY3JvbGxCYXJzWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QWx3YXlzU2hvd1Njcm9sbEJhcnNaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFeHBhbmRIb3Jpem9udGFsWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RXhwYW5kSG9yaXpvbnRhbFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFeHBhbmRWZXJ0aWNhbFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEV4cGFuZFZlcnRpY2FsWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5IZWlnaHRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRNaW5IZWlnaHRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluU2l6ZUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRNaW5TaXplSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5TaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TWluU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5XaWR0aEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE1pbldpZHRoSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE9yaWdpbklJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRPcmlnaW5JSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE9yaWdpbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE9yaWdpbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2Nyb2xsZWRDb21wb3NpdGUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFsd2F5c1Nob3dTY3JvbGxCYXJzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRPcmlnaW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xheW91dFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFsd2F5c1Nob3dTY3JvbGxCYXJzWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFeHBhbmRIb3Jpem9udGFsWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RXhwYW5kVmVydGljYWxaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5IZWlnaHRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5TaXplSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pblNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5XaWR0aEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE9yaWdpbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRPcmlnaW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFsd2F5c1Nob3dTY3JvbGxCYXJzIikpIHRlc3RfZ2V0QWx3YXlzU2hvd1Njcm9sbEJhcnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRlbnQiKSkgdGVzdF9nZXRDb250ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRPcmlnaW4iKSkgdGVzdF9nZXRPcmlnaW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xheW91dFoiKSkgdGVzdF9sYXlvdXRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRBbHdheXNTaG93U2Nyb2xsQmFyc1oiKSkgdGVzdF9zZXRBbHdheXNTaG93U2Nyb2xsQmFyc1ooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RXhwYW5kSG9yaXpvbnRhbFoiKSkgdGVzdF9zZXRFeHBhbmRIb3Jpem9udGFsWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RXhwYW5kVmVydGljYWxaIikpIHRlc3Rfc2V0RXhwYW5kVmVydGljYWxaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IikpIHRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluSGVpZ2h0SSIpKSB0ZXN0X3NldE1pbkhlaWdodEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pblNpemVJSSIpKSB0ZXN0X3NldE1pblNpemVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRNaW5TaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluV2lkdGhJIikpIHRlc3Rfc2V0TWluV2lkdGhJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRPcmlnaW5JSSIpKSB0ZXN0X3NldE9yaWdpbklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRPcmlnaW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0T3JpZ2luTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3RhY2tMYXlvdXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZjBkNGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3RhY2tMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3RhY2tMYXlvdXQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3RhY2tMYXlvdXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3RhY2tMYXlvdXQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNDFlOTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2UKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JZmluYWwgc3RhdGljIFJHQiBSRUQgPSBuZXcgUkdCKDI1NSwwLDApOwotCWZpbmFsIHN0YXRpYyBSR0IgQkxVRSA9IG5ldyBSR0IoMCwwLDI1NSk7Ci0JZmluYWwgc3RhdGljIFJHQiBHUkVFTiA9IG5ldyBSR0IoMCwyNTUsMCk7Ci0JSGFzaHRhYmxlIGNvbG9ycyA9IG5ldyBIYXNodGFibGUoKTsKLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci1wcml2YXRlIENvbG9yIGdldENvbG9yKFJHQiByZ2IpIHsKLQlyZXR1cm4gKENvbG9yKWNvbG9ycy5nZXQocmdiKTsKLX0KLXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb2xvcnMoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JY29sb3JzLnB1dChSRUQsIG5ldyBDb2xvciAoZGlzcGxheSwgUkVEKSk7Ci0JY29sb3JzLnB1dChHUkVFTiwgbmV3IENvbG9yIChkaXNwbGF5LCBHUkVFTikpOwotCWNvbG9ycy5wdXQoQkxVRSwgbmV3IENvbG9yIChkaXNwbGF5LCBCTFVFKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWluaXRpYWxpemVDb2xvcnMoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JRW51bWVyYXRpb24gZWxlbWVudHMgPSBjb2xvcnMua2V5cygpOwotCXdoaWxlIChlbGVtZW50cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlDb2xvciBjb2xvciA9IChDb2xvciljb2xvcnMuZ2V0KChSR0IpZWxlbWVudHMubmV4dEVsZW1lbnQoKSk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzdHlsZVJhbmdlLnN0YXJ0ID09IDApOwotCWFzc2VydFRydWUoIjphOiIsIHN0eWxlUmFuZ2UubGVuZ3RoID09IDApOwotCWFzc2VydFRydWUoIjphOiIsIHN0eWxlUmFuZ2UuZm9yZWdyb3VuZCA9PSBudWxsKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzdHlsZVJhbmdlLmJhY2tncm91bmQgPT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc3R5bGVSYW5nZS5mb250U3R5bGUgPT0gU1dULk5PUk1BTCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSA9IG5ldyBTdHlsZVJhbmdlKDUsIDEwLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihCTFVFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc3R5bGVSYW5nZS5zdGFydCA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzdHlsZVJhbmdlLmxlbmd0aCA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc3R5bGVSYW5nZS5mb3JlZ3JvdW5kID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjpiOiIsIHN0eWxlUmFuZ2UuYmFja2dyb3VuZCA9PSBnZXRDb2xvcihCTFVFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc3R5bGVSYW5nZS5mb250U3R5bGUgPT0gU1dULk5PUk1BTCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9ySSgpIHsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5CT0xEKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzdHlsZVJhbmdlLnN0YXJ0ID09IDUpOwotCWFzc2VydFRydWUoIjpjOiIsIHN0eWxlUmFuZ2UubGVuZ3RoID09IDEwKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzdHlsZVJhbmdlLmZvcmVncm91bmQgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc3R5bGVSYW5nZS5iYWNrZ3JvdW5kID09IGdldENvbG9yKEJMVUUpKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzdHlsZVJhbmdlLmZvbnRTdHlsZSA9PSBTV1QuQk9MRCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2xvbmUoKSB7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQSA9IG5ldyBTdHlsZVJhbmdlKDYsIDEwLCBudWxsLCBnZXRDb2xvcihCTFVFKSwgU1dULk5PUk1BTCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQiA9IChTdHlsZVJhbmdlKXN0eWxlUmFuZ2VBLmNsb25lKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6Iiwgc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VCKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQSA9IG5ldyBTdHlsZVJhbmdlKDUsIDEwLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihCTFVFKSwgU1dULkJPTEQpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUIgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5CT0xEKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VDID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTAsIGdldENvbG9yKEJMVUUpLCBnZXRDb2xvcihCTFVFKSwgU1dULkJPTEQpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUQgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5CT0xEKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VFID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTEsIGdldENvbG9yKFJFRCksIGdldENvbG9yKEJMVUUpLCBTV1QuQk9MRCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlRiA9IG5ldyBTdHlsZVJhbmdlKDUsIDExLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihSRUQpLCBTV1QuQk9MRCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlRyA9IG5ldyBTdHlsZVJhbmdlKDUsIDExLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihCTFVFKSwgU1dULk5PUk1BTCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VCKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwhc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VDKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwhc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwhc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwhc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VGKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwhc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VHKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JQ29sb3IgdGVzdENvbG9yID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCAwLCAwLCAwKTsKLQkKLQkvL3JlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDMwOTI0Ci0Jc2V0LmFkZChuZXcgU3R5bGVSYW5nZSgpKTsKLQlzZXQuYWRkKG5ldyBTdHlsZVJhbmdlKDAsIDEsIHRlc3RDb2xvciwgbnVsbCkpOwotCXNldC5hZGQobmV3IFN0eWxlUmFuZ2UoMCwgMSwgdGVzdENvbG9yLCB0ZXN0Q29sb3IpKTsKLQlzZXQuYWRkKG5ldyBTdHlsZVJhbmdlKDAsIDEsIHRlc3RDb2xvciwgdGVzdENvbG9yLCBTV1QuQk9MRCkpOwotCXRlc3RDb2xvci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNVbnN0eWxlZCgpIHsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VBID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTAsIG51bGwsIG51bGwsIFNXVC5OT1JNQUwpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUIgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMCwgZ2V0Q29sb3IoUkVEKSwgbnVsbCwgU1dULk5PUk1BTCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQyA9IG5ldyBTdHlsZVJhbmdlKDUsIDEwLCBudWxsLCBudWxsLCBTV1QuQk9MRCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlRCA9IG5ldyBTdHlsZVJhbmdlKDYsIDEwLCBudWxsLCBnZXRDb2xvcihCTFVFKSwgU1dULk5PUk1BTCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlRSA9IG5ldyBTdHlsZVJhbmdlKDUsIDEwLCBudWxsLCBudWxsKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBzdHlsZVJhbmdlQS5pc1Vuc3R5bGVkKCkpOwotCWFzc2VydFRydWUoIjplOiIsIXN0eWxlUmFuZ2VCLmlzVW5zdHlsZWQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6Iiwhc3R5bGVSYW5nZUMuaXNVbnN0eWxlZCgpKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCFzdHlsZVJhbmdlRC5pc1Vuc3R5bGVkKCkpOwotCWFzc2VydFRydWUoIjplOiIsIHN0eWxlUmFuZ2VFLmlzVW5zdHlsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2ltaWxhclRvTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSgpIHsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VBID0gbmV3IFN0eWxlUmFuZ2UoNiwgMTAsIGdldENvbG9yKFJFRCksIGdldENvbG9yKEJMVUUpLCBTV1QuTk9STUFMKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VCID0gbmV3IFN0eWxlUmFuZ2UoNSwgNSwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5OT1JNQUwpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUMgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5OT1JNQUwpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUQgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgZ2V0Q29sb3IoQkxVRSksIGdldENvbG9yKEJMVUUpLCBTV1QuTk9STUFMKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VFID0gbmV3IFN0eWxlUmFuZ2UoNiwgMTAsIGdldENvbG9yKFJFRCksIGdldENvbG9yKFJFRCksIFNXVC5OT1JNQUwpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUYgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5CT0xEKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBzdHlsZVJhbmdlQS5zaW1pbGFyVG8oc3R5bGVSYW5nZUIpKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBzdHlsZVJhbmdlQS5zaW1pbGFyVG8oc3R5bGVSYW5nZUMpKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCAhc3R5bGVSYW5nZUEuc2ltaWxhclRvKHN0eWxlUmFuZ2VEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgIXN0eWxlUmFuZ2VBLnNpbWlsYXJUbyhzdHlsZVJhbmdlRSkpOwotCWFzc2VydFRydWUoIjpmOiIsICFzdHlsZVJhbmdlQS5zaW1pbGFyVG8oc3R5bGVSYW5nZUYpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgbnVsbCwgZ2V0Q29sb3IoQkxVRSksIFNXVC5OT1JNQUwpOwotCXN0eWxlUmFuZ2UudG9TdHJpbmcoKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xvbmUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNVbnN0eWxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2ltaWxhclRvTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JJIikpIHRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xvbmUiKSkgdGVzdF9jbG9uZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNVbnN0eWxlZCIpKSB0ZXN0X2lzVW5zdHlsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NpbWlsYXJUb0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UiKSkgdGVzdF9zaW1pbGFyVG9Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NmJlODMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLkJpZGlVdGlsOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcyB7Ci0KLVN0eWxlZFRleHQgdGV4dDsKLWZpbmFsIHN0YXRpYyBSR0IgUkVEID0gbmV3IFJHQigyNTUsMCwwKTsKLWZpbmFsIHN0YXRpYyBSR0IgQkxVRSA9IG5ldyBSR0IoMCwwLDI1NSk7Ci1maW5hbCBzdGF0aWMgUkdCIEdSRUVOID0gbmV3IFJHQigwLDI1NSwwKTsKLWZpbmFsIHN0YXRpYyBSR0IgWUVMTE9XID0gbmV3IFJHQigyNTUsMjU1LDApOwotZmluYWwgc3RhdGljIFJHQiBDWUFOID0gbmV3IFJHQigwLDI1NSwyNTUpOwotZmluYWwgc3RhdGljIFJHQiBQVVJQTEUgPSBuZXcgUkdCKDI1NSwwLDI1NSk7Ci1maW5hbCBzdGF0aWMgU3RyaW5nIFBMQVRGT1JNX0xJTkVfREVMSU1JVEVSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotSGFzaHRhYmxlIGNvbG9ycyA9IG5ldyBIYXNodGFibGUoKTsKLXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5lckNhbGxlZDsJCi1wcml2YXRlIGJvb2xlYW4gbGlzdGVuZXIyQ2FsbGVkOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWluaXRpYWxpemVDb2xvcnMoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCUVudW1lcmF0aW9uIGVsZW1lbnRzID0gY29sb3JzLmtleXMoKTsKLQl3aGlsZSAoZWxlbWVudHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJQ29sb3IgY29sb3IgPSAoQ29sb3IpY29sb3JzLmdldCgoUkdCKWVsZW1lbnRzLm5leHRFbGVtZW50KCkpOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JfQotCXN1cGVyLnRlYXJEb3duKCk7Ci0JCi19Ci0KLS8vIHRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHB1YmxpYyBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIFN0eWxlUmFuZ2VbXSBkZWZhdWx0U3R5bGVzKCkgewotCXJldHVybiBuZXcgU3R5bGVSYW5nZVtdIHsKLQkJZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSwgCi0JCWdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTiksIAotCQlnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHB1YmxpYyBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcm90ZWN0ZWQgdm9pZCBnZXRMaW5lQmFja2dyb3VuZHMoKSB7Ci0JZm9yIChpbnQgaT0wOyBpPHRleHQuZ2V0TGluZUNvdW50KCk7IGkrKykgewotCQl0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKGkpOwotCX0KLX0KLS8vIHRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHB1YmxpYyBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIFN0cmluZyB0ZXh0U3RyaW5nKCkgewotCXJldHVybiAiVGhpcyBpcyB0aGUgdGV4dCBjb21wb25lbnQgaW4gdGVzdGluZ1xuTmV3IExpbmUxXG5OZXcgTGluZTJcbk5ldyBMaW5lM1xuTmV3IExpbmU0LiI7Ci19Ci1wcml2YXRlIGJvb2xlYW4gaXNCaWRpKCkgewotCXJldHVybiBCaWRpVXRpbC5pc0JpZGlQbGF0Zm9ybSgpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBub3QgYmUgcHVibGljIHNvIHRoYXQgdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgU3R5bGVSYW5nZSBnZXRTdHlsZShpbnQgc3RhcnQsIGludCBsZW5ndGgsIFJHQiBmZywgUkdCIGJnKSB7Ci0JU3R5bGVSYW5nZSBzdHlsZSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUuc3RhcnQgPSBzdGFydDsKLQlzdHlsZS5sZW5ndGggPSBsZW5ndGg7Ci0JaWYgKGZnICE9IG51bGwpIHN0eWxlLmZvcmVncm91bmQgPSBnZXRDb2xvcihmZyk7Ci0JZWxzZSBzdHlsZS5mb3JlZ3JvdW5kID0gbnVsbDsKLQlpZiAoYmcgIT0gbnVsbCkgc3R5bGUuYmFja2dyb3VuZCA9IGdldENvbG9yKGJnKTsKLQllbHNlIHN0eWxlLmJhY2tncm91bmQgPSBudWxsOwotCXJldHVybiBzdHlsZTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHB1YmxpYyBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIENvbG9yIGdldENvbG9yKFJHQiByZ2IpIHsKLQlyZXR1cm4gKENvbG9yKWNvbG9ycy5nZXQocmdiKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHB1YmxpYyBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29sb3JzKCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCWNvbG9ycy5wdXQoUkVELCBuZXcgQ29sb3IgKGRpc3BsYXksIFJFRCkpOwotCWNvbG9ycy5wdXQoQkxVRSwgbmV3IENvbG9yIChkaXNwbGF5LCBCTFVFKSk7Ci0JY29sb3JzLnB1dChHUkVFTiwgbmV3IENvbG9yIChkaXNwbGF5LCBHUkVFTikpOwotCWNvbG9ycy5wdXQoWUVMTE9XLCBuZXcgQ29sb3IgKGRpc3BsYXksIFlFTExPVykpOwotCWNvbG9ycy5wdXQoQ1lBTiwgbmV3IENvbG9yIChkaXNwbGF5LCBDWUFOKSk7Ci0JY29sb3JzLnB1dChQVVJQTEUsIG5ldyBDb2xvciAoZGlzcGxheSwgUFVSUExFKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpewotCVN0eWxlZFRleHQgdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuUkVBRF9PTkxZKTsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gZmFsc2UpOwotCXRleHQuZGlzcG9zZSgpOwotCi0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuU0lOR0xFKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFZlcnRpY2FsQmFyKCkgPT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRIb3Jpem9udGFsQmFyKCkgPT0gbnVsbCk7Ci0JdGV4dC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JZmluYWwgU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KEV4dGVuZGVkTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMCwgZXZlbnQuc3RhcnQpOwotCQkJYXNzZXJ0RXF1YWxzKCJFeHRlbmRlZE1vZGlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLmxlbmd0aCgpLCBldmVudC5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJFeHRlbmRlZE1vZGlmeSBldmVudCBkYXRhIGludmFsaWQiLCAiIiwgZXZlbnQucmVwbGFjZWRUZXh0KTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJdGV4dC5hZGRFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCQkKLQkvLyB0ZXN0IHdoZXRoZXIgYWxsIGNvbnRlbnQgbW9kaWZ5aW5nIEFQSSBtZXRob2RzIHNlbmQgYW4gRXh0ZW5kZWRNb2RpZnkgZXZlbnQKLQl0ZXh0LmFkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LmFwcGVuZChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiYXBwZW5kIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuaW5zZXJ0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJyZXBsYWNlVGV4dFJhbmdlIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQucmVtb3ZlRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdGVuZXIgPSBuZXcgRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChFeHRlbmRlZE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIkV4dGVuZGVkTW9kaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZS5sZW5ndGgoKSwgZXZlbnQubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZS5zdWJzdHJpbmcoMCwgMSksIGV2ZW50LnJlcGxhY2VkVGV4dCk7Ci0JCX0KLQl9OwotCXRleHQuYWRkRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsIGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJyZXBsYWNlVGV4dFJhbmdlIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQucmVtb3ZlRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdGVuZXIgPSBuZXcgRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChFeHRlbmRlZE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIkV4dGVuZGVkTW9kaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZS5sZW5ndGgoKSwgZXZlbnQubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZSArIGxpbmUuc3Vic3RyaW5nKDEsIGxpbmUubGVuZ3RoKCkpICsgbGluZSwgZXZlbnQucmVwbGFjZWRUZXh0KTsKLQkJfQotCX07Ci0JdGV4dC5hZGRFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCWFzc2VydFRydWUoInNldFRleHQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRLZXlCaW5kaW5nSUkoKXsKLQl0ZXh0LnNldEtleUJpbmRpbmcoU1dULkRFTCwgU1dULk5VTEwpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMKSA9PSBTV1QuTlVMTCk7Ci0JdGV4dC5zZXRLZXlCaW5kaW5nKFNXVC5ERUwsIFNULkxJTkVfVVApOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMKSA9PSBTVC5MSU5FX1VQKTsKLQl0ZXh0LnNldEtleUJpbmRpbmcoU1dULkRFTCB8IFNXVC5NT0QyLCBTVC5TRUxFQ1RfUEFHRV9VUCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRLZXlCaW5kaW5nKFNXVC5ERUwgfCBTV1QuTU9EMikgPT0gU1QuU0VMRUNUX1BBR0VfVVApOwotCXRleHQuc2V0S2V5QmluZGluZyhTV1QuREVMIHwgU1dULk1PRDIsIFNULlBBR0VfVVApOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMIHwgU1dULk1PRDIpID09IFNULlBBR0VfVVApOwotCXRleHQuc2V0S2V5QmluZGluZygtMSwgU1QuUEFHRV9VUCk7Ci0JdGV4dC5zZXRLZXlCaW5kaW5nKC0xLCAtMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQmlkaVNlZ21lbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIoKSB7Ci0JU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JQmlkaVNlZ21lbnRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBCaWRpU2VnbWVudExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaW5lR2V0U2VnbWVudHMoQmlkaVNlZ21lbnRFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQl0ZXh0LmFkZEJpZGlTZWdtZW50TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JCQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQl0ZXh0LmFkZEJpZGlTZWdtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgQmlkaVNlZ21lbnRMaXN0ZW5lci4gCi0JdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDApOwotCWlmIChpc0JpZGkoKSB8fCBTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoImd0ayIpKSB7Ci0JCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCBjYWxsZWQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JfQotCWVsc2UgewotCQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBjYWxsZWQgd2hlbiBpdCBzaG91bGRuJ3QgYmUiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0JfQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlQmlkaVNlZ21lbnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBCaWRpU2VnbWVudExpc3RlbmVyLiAKLQl0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMCk7Ci0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGluZUJhY2tncm91bmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoKSB7Ci0JU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JTGluZUJhY2tncm91bmRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaW5lQmFja2dyb3VuZExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaW5lR2V0QmFja2dyb3VuZChMaW5lQmFja2dyb3VuZEV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCXRleHQuYWRkTGluZUJhY2tncm91bmRMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkJCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCXRleHQuYWRkTGluZUJhY2tncm91bmRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRTZWxlY3Rpb24oMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5jb3B5KCk7Ci0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IGNhbGxlZCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlTGluZUJhY2tncm91bmRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQl0ZXh0LnNldFNlbGVjdGlvbigwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LmNvcHkoKTsKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMaW5lU3R5bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyKCkgewotCVN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCUxpbmVTdHlsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpbmVTdHlsZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaW5lR2V0U3R5bGUoTGluZVN0eWxlRXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJdGV4dC5hZGRMaW5lU3R5bGVMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkJCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCXRleHQuYWRkTGluZVN0eWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQuc2V0U2VsZWN0aW9uKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuY29weSgpOwotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCBjYWxsZWQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQl0ZXh0LnJlbW92ZUxpbmVTdHlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSBTdHlsZWRUZXh0IHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCXRleHQuc2V0U2VsZWN0aW9uKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuY29weSgpOwotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCByZW1vdmVkIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkKLQkvLyB0ZXN0IHdoZXRoZXIgYWxsIGNvbnRlbnQgbW9kaWZ5aW5nIEFQSSBtZXRob2RzIHNlbmQgYSBNb2RpZnkgZXZlbnQJCi0JdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuYXBwZW5kKGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJhcHBlbmQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5pbnNlcnQobGluZSk7CQotCWFzc2VydFRydWUoInJlcGxhY2VUZXh0UmFuZ2UgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsIGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJyZXBsYWNlVGV4dFJhbmdlIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgic2V0VGV4dCBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JdGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCVN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJbGlzdGVuZXIyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJdGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkJCi0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCWxpc3RlbmVyMkNhbGxlZCA9IGZhbHNlOwkKLQl0ZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSBTdHlsZWRUZXh0IHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfTElORV9FTkQpOwotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCBjYWxsZWQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgY2FsbGVkIHVuZXhwZWN0ZWRseSIsIGxpc3RlbmVyMkNhbGxlZCA9PSBmYWxzZSk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQlsaXN0ZW5lcjJDYWxsZWQgPSBmYWxzZTsJCi0JdGV4dC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRU5EKTsKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBjYWxsZWQgdW5leHBlY3RlZGx5IiwgbGlzdGVuZXIyQ2FsbGVkID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRWZXJpZnlLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JVmVyaWZ5S2V5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVmVyaWZ5S2V5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHZlcmlmeUtleShWZXJpZnlFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQl0ZXh0LmFkZFZlcmlmeUtleUxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCi0JLy8gb25seSB0ZXN0IHdoZXRoZXIgbGlzdGVuZXIgY2FuIGJlIGFkZGVkIGFuZCByZW1vdmVkLgotCS8vIGNhbid0IHRlc3QgbGlzdGVuZXIgYmVjYXVzZSBWZXJpZnlLZXkgaXMgdXNlciBkcml2ZW4uCi0JdGV4dC5hZGRWZXJpZnlLZXlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdGV4dC5yZW1vdmVWZXJpZnlLZXlMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigpIHsKLQlmaW5hbCBTdHJpbmcgbGluZSA9ICJMaW5lMSI7Ci0JZmluYWwgU3RyaW5nIG5ld0xpbmUgPSAiTmV3TGluZTEiOwotCWZpbmFsIGludCB0ZXh0TGVuZ3RoOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JVmVyaWZ5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LmVuZCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLCBldmVudC50ZXh0KTsKLQkJCWV2ZW50LnN0YXJ0ID0gMjsKLQkJCWV2ZW50LmVuZCA9IDU7Ci0JCQlldmVudC50ZXh0ID0gbmV3TGluZTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQotCS8vIHRlc3Qgd2hldGhlciBhbGwgY29udGVudCBtb2RpZnlpbmcgQVBJIHNlbmRzIGEgVmVyaWZ5IGV2ZW50Ci0JdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuYXBwZW5kKGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJhcHBlbmQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQlhc3NlcnRFcXVhbHMoIkxpc3RlbmVyIGZhaWxlZCIsIG5ld0xpbmUsIHRleHQuZ2V0VGV4dCgpKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5pbnNlcnQobGluZSk7CQotCWFzc2VydFRydWUoInJlcGxhY2VUZXh0UmFuZ2UgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQlhc3NlcnRFcXVhbHMoIkxpc3RlbmVyIGZhaWxlZCIsIG5ld0xpbmUgKyBuZXdMaW5lLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCAwLCBldmVudC5zdGFydCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCAxLCBldmVudC5lbmQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZSwgZXZlbnQudGV4dCk7Ci0JCQlldmVudC5zdGFydCA9IDI7Ci0JCQlldmVudC5lbmQgPSA1OwotCQkJZXZlbnQudGV4dCA9IG5ld0xpbmU7Ci0JCX0KLQl9OwotCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCXRleHRMZW5ndGggPSB0ZXh0LmdldENoYXJDb3VudCgpIC0gMSArIG5ld0xpbmUubGVuZ3RoKCk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsIGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJyZXBsYWNlVGV4dFJhbmdlIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaXN0ZW5lciBmYWlsZWQiLCBuZXdMaW5lICsgbmV3TGluZS5zdWJzdHJpbmcoMSwgbmV3TGluZS5sZW5ndGgoKSkgKyBuZXdMaW5lLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCAwLCBldmVudC5zdGFydCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCB0ZXh0TGVuZ3RoLCBldmVudC5lbmQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZSwgZXZlbnQudGV4dCk7Ci0JCQlldmVudC5zdGFydCA9IDI7Ci0JCQlldmVudC5lbmQgPSA1OwotCQkJZXZlbnQudGV4dCA9IG5ld0xpbmU7Ci0JCX0KLQl9OwotCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgic2V0VGV4dCBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCWFzc2VydEVxdWFscygiTGlzdGVuZXIgZmFpbGVkIiwgbmV3TGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQlsaXN0ZW5lciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMiwgZXZlbnQuc3RhcnQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbmV3TGluZS5sZW5ndGgoKSwgZXZlbnQuZW5kKTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIGxpbmUsIGV2ZW50LnRleHQpOwotCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQl9Ci0JfTsKLQl0ZXh0LmFkZFZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSBTdHlsZWRUZXh0IHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgdGV4dC5nZXRDaGFyQ291bnQoKSAtIDIsIGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgY2FsbGVkIiwgbGlzdGVuZXJDYWxsZWQpOwotCWFzc2VydEVxdWFscygiTGlzdGVuZXIgZmFpbGVkIiwgbmV3TGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hcHBlbmRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93bjsJCi0JU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCQotCXRleHQuYXBwZW5kKGxpbmUpOwotCWFzc2VydEVxdWFscygiYXBwZW5kIHRvIGVtcHR5IHRleHQiLCBsaW5lLCB0ZXh0LmdldFRleHQoKSk7Ci0JCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5hcHBlbmQobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoImFwcGVuZCBudWxsIHN0cmluZyIsIGV4Y2VwdGlvblRocm93bik7Ci0KLQl0ZXh0LmFwcGVuZCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCJhcHBlbmQgZW1wdHkgc3RyaW5nIiwgbGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCQotCXRleHQuYXBwZW5kKGxpbmUpOwotCWFzc2VydEVxdWFscygiYXBwZW5kIG5vbi1lbXB0eSBzdHJpbmciLCBsaW5lICsgbGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCQotCXRleHQuc2V0VGV4dCgiIik7Ci0JU3RyaW5nIHRleHQyID0gImxpbmVcciI7Ci0JdGV4dC5hcHBlbmQodGV4dDIpOwotCWFzc2VydEVxdWFscygiYXBwZW5kIHN0cmluZyBlbmRpbmcgd2l0aCBsaW5lIGRlbGltaXRlciIsIHRleHQyLCB0ZXh0LmdldFRleHQoKSk7Ci0JCi0JU3RyaW5nIHRleHQzID0gImxpbmVcclxubGluZTMiOwotCXRleHQuYXBwZW5kKHRleHQzKTsKLQlhc3NlcnRFcXVhbHMoImFwcGVuZCBtdWx0aSBsaW5lIHN0cmluZyIsIHRleHQyICsgdGV4dDMsIHRleHQuZ2V0VGV4dCgpKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0JLy8gaW5oZXJpdGVkIHRlc3QgaXMgc3VmZmljaWVudAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvcHkoKSB7Ci0JQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQodGV4dC5nZXREaXNwbGF5KCkpOwotCVRleHRUcmFuc2ZlciB0cmFuc2ZlciA9IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCVN0cmluZyBjbGlwYm9hcmRUZXh0OwotCVN0cmluZyBjb252ZXJ0ZWRUZXh0OwotCi0JU3RyaW5nIGJlZm9yZSA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTsKLQl0ZXh0LmNvcHkoKTsJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgYmVmb3JlID09IG51bGwgPyBjbGlwYm9hcmRUZXh0ID09IG51bGwgOiBiZWZvcmUuZXF1YWxzKGNsaXBib2FyZFRleHQpKTsKLQkKLQliZWZvcmUgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7Ci0JdGV4dC5jb3B5KCk7CQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWFzc2VydFRydWUoIjpjOiIsIGJlZm9yZSA9PSBudWxsID8gY2xpcGJvYXJkVGV4dCA9PSBudWxsIDogYmVmb3JlLmVxdWFscyhjbGlwYm9hcmRUZXh0KSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDEpOwotCXRleHQuY29weSgpOwkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBjbGlwYm9hcmRUZXh0ICE9IG51bGwgJiYgY2xpcGJvYXJkVGV4dC5lcXVhbHMoIjAiKSk7Ci0JCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgxLCAyKTsJCi0JdGV4dC5jb3B5KCk7CQkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBjbGlwYm9hcmRUZXh0ICE9IG51bGwgJiYgY2xpcGJvYXJkVGV4dC5lcXVhbHMoIjEyIikpOwotCQotCS8vIHRlc3QgbGluZSBkZWxpbWl0ZXIgY29udmVyc2lvbgotCXRleHQuc2V0VGV4dCgiXHJMaW5lMVxuTGluZTJcclxuTGluZTNcblxyTGluZTRcbiIpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5jb3B5KCk7CQkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiXHJcbkxpbmUxXHJcbkxpbmUyXHJcbkxpbmUzXHJcblxyXG5MaW5lNFxyXG4iOwotCX0KLQllbHNlIHsKLQkJY29udmVydGVkVGV4dCA9ICJcbkxpbmUxXG5MaW5lMlxuTGluZTNcblxuTGluZTRcbiI7Ci0JfQotCWFzc2VydFRydWUoIjpmOiIsIGNsaXBib2FyZFRleHQgIT0gbnVsbCAmJiBjbGlwYm9hcmRUZXh0LmVxdWFscyhjb252ZXJ0ZWRUZXh0KSk7Ci0JCi0JLy8gdGVzdCBsaW5lIGRlbGltaXRlciBjb252ZXJzaW9uCi0JdGV4dC5zZXRUZXh0KCJMaW5lMVxyXG5MaW5lMiIpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5jb3B5KCk7CQkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCX0KLQllbHNlIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxuTGluZTIiOwotCX0KLQlhc3NlcnRUcnVlKCI6ZzoiLCBjbGlwYm9hcmRUZXh0ICE9IG51bGwgJiYgY2xpcGJvYXJkVGV4dC5lcXVhbHMoY29udmVydGVkVGV4dCkpOwotCi0JdGVzdFJ0ZkNvcHkoKTsKLQljbGlwYm9hcmQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2N1dCgpIHsKLQlDbGlwYm9hcmQgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZCh0ZXh0LmdldERpc3BsYXkoKSk7Ci0JVGV4dFRyYW5zZmVyIHRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JU3RyaW5nIGNsaXBib2FyZFRleHQ7Ci0JU3RyaW5nIGNvbnZlcnRlZFRleHQ7Ci0KLQlTdHJpbmcgYmVmb3JlID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwotCXRleHQuY3V0KCk7CQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWFzc2VydFRydWUoIjphOiIsIGJlZm9yZSA9PSBudWxsID8gY2xpcGJvYXJkVGV4dCA9PSBudWxsIDogYmVmb3JlLmVxdWFscyhjbGlwYm9hcmRUZXh0KSk7Ci0JCi0JYmVmb3JlID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwotCXRleHQuY3V0KCk7CQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWFzc2VydFRydWUoIjpjOiIsIGJlZm9yZSA9PSBudWxsID8gY2xpcGJvYXJkVGV4dCA9PSBudWxsIDogYmVmb3JlLmVxdWFscyhjbGlwYm9hcmRUZXh0KSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDEpOwotCXRleHQuY3V0KCk7CQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWFzc2VydFRydWUoIjpkOiIsIGNsaXBib2FyZFRleHQgIT0gbnVsbCAmJiBjbGlwYm9hcmRUZXh0LmVxdWFscygiMCIpKTsKLQkKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDEsIDIpOwkKLQl0ZXh0LmN1dCgpOwkJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgY2xpcGJvYXJkVGV4dCAhPSBudWxsICYmIGNsaXBib2FyZFRleHQuZXF1YWxzKCIyMyIpKTsKLQkKLQkvLyB0ZXN0IGxpbmUgZGVsaW1pdGVyIGNvbnZlcnNpb24KLQl0ZXh0LnNldFRleHQoIlxyTGluZTFcbkxpbmUyXHJcbkxpbmUzXG5cckxpbmU0XG4iKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuY3V0KCk7CQkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiXHJcbkxpbmUxXHJcbkxpbmUyXHJcbkxpbmUzXHJcblxyXG5MaW5lNFxyXG4iOwotCX0KLQllbHNlIHsKLQkJY29udmVydGVkVGV4dCA9ICJcbkxpbmUxXG5MaW5lMlxuTGluZTNcblxuTGluZTRcbiI7Ci0JfQotCWFzc2VydFRydWUoIjpmOiIsIGNsaXBib2FyZFRleHQgIT0gbnVsbCAmJiBjbGlwYm9hcmRUZXh0LmVxdWFscyhjb252ZXJ0ZWRUZXh0KSk7Ci0JCi0JLy8gdGVzdCBsaW5lIGRlbGltaXRlciBjb252ZXJzaW9uCi0JdGV4dC5zZXRUZXh0KCJMaW5lMVxyXG5MaW5lMiIpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5jdXQoKTsJCQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JfQotCWVsc2UgewotCQljb252ZXJ0ZWRUZXh0ID0gIkxpbmUxXG5MaW5lMiI7Ci0JfQotCWFzc2VydFRydWUoIjpnOiIsIGNsaXBib2FyZFRleHQgIT0gbnVsbCAmJiBjbGlwYm9hcmRUZXh0LmVxdWFscyhjb252ZXJ0ZWRUZXh0KSk7Ci0KLQljbGlwYm9hcmQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJpZGlDb2xvcmluZygpIHsKLQkvLy8gZ2V0QmlkaUNvbG9yaW5nIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZC4KLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0QmlkaUNvbG9yaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2FyZXRPZmZzZXQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHRleHQuZ2V0Q2hhckNvdW50KCksIDAsICJMaW5lMSIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQlTdHJpbmcgbmV3VGV4dCA9ICJMaW5lLTFcclxuIjsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCi0JdGV4dC5zZXRDYXJldE9mZnNldCgxKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAxKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IG5ld1RleHQubGVuZ3RoKCkgKyAxKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250ZW50KCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSB0ZXh0LmdldENvbnRlbnQoKTsKLQkKLQlhc3NlcnRUcnVlKGNvbnRlbnQgIT0gbnVsbCk7Ci0JY29udGVudCA9IG5ldyBTdHlsZWRUZXh0Q29udGVudCgpIHsKLQkJcHVibGljIHZvaWQgYWRkVGV4dENoYW5nZUxpc3RlbmVyKFRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0Q2hhckNvdW50KCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRMaW5lKGludCBsaW5lSW5kZXgpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlwdWJsaWMgaW50IGdldExpbmVBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgaW50IGdldExpbmVDb3VudCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlwdWJsaWMgaW50IGdldE9mZnNldEF0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dFJhbmdlKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcihUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCByZXBsYWNlVGV4dFJhbmdlKGludCBzdGFydCwgaW50IHJlcGxhY2VMZW5ndGgsIFN0cmluZyB0ZXh0KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl9Ci0JfTsKLQl0ZXh0LnNldENvbnRlbnQoY29udGVudCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbnRlbnQsIHRleHQuZ2V0Q29udGVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREb3VibGVDbGlja0VuYWJsZWQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSB0cnVlKTsKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpID09IHRydWUpOwotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpID09IGZhbHNlKTsKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSB0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFZGl0YWJsZSgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gdHJ1ZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gdHJ1ZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IGZhbHNlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhvcml6b250YWxJbmRleCgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCQotCXRleHQuc2V0VGV4dCgiTGluZTAiKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KC0xKTsJCi0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAxKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCg1MDApOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPiAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAxKTsKLQkvLyBtYWtlIHN1cmUgdGhlIHdpZGdldCBjYW4gYmUgc2Nyb2xsZWQKLQlzaGVsbC5vcGVuKCk7Ci0JdGV4dC5zZXRTaXplKDEwLCA1MCk7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMCIpOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6ajoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDEpOwkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SG9yaXpvbnRhbFBpeGVsKCkgewkKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCQotCXRleHQuc2V0VGV4dCgiTGluZTAiKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KC0xKTsJCi0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA+IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID4gMCk7Ci0JLy8gbWFrZSBzdXJlIHRoZSB3aWRnZXQgY2FuIGJlIHNjcm9sbGVkCi0Jc2hlbGwub3BlbigpOwotCXRleHQuc2V0U2l6ZSgxMCwgNTApOwotCXRleHQuc2V0VGV4dCgiTGluZTAiKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEtleUJpbmRpbmdJKCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMKSA9PSBTVC5ERUxFVEVfTkVYVCk7Ci0JdGV4dC5zZXRLZXlCaW5kaW5nKFNXVC5ERUwsIFNULkxJTkVfVVApOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMKSA9PSBTVC5MSU5FX1VQKTsKLQl0ZXh0LnNldEtleUJpbmRpbmcoU1dULkRFTCB8IFNXVC5NT0QyLCBTVC5TRUxFQ1RfUEFHRV9VUCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRLZXlCaW5kaW5nKFNXVC5ERUwgfCBTV1QuTU9EMikgPT0gU1QuU0VMRUNUX1BBR0VfVVApOwotCXRleHQuc2V0S2V5QmluZGluZyhTV1QuREVMIHwgU1dULk1PRDIsIFNULlBBR0VfVVApOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMIHwgU1dULk1PRDIpID09IFNULlBBR0VfVVApOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0S2V5QmluZGluZygtMSkgPT0gU1dULk5VTEwpOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuRjIpID09IFNXVC5OVUxMKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGFyQ291bnQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSAwKTsKLQl0ZXh0LnNldFRleHQoIkxpbmUwIik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSA1KTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gMCk7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMFxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSA2KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lQmFja2dyb3VuZEkoKSB7Ci0JU3RyaW5nIHRleHRTdHJpbmcgPSAiTDFcbkwyXG5MM1xuTDQiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQlhc3NlcnRUcnVlKCI6MToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IG51bGwpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKEJMVUUpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKFlFTExPVykpOwotCWFzc2VydFRydWUoIjoxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMikgPT0gZ2V0Q29sb3IoQkxVRSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVDb3VudCgpIHsKLQlTdHJpbmcgZGVsaW1pdGVyU3RyaW5nID0gIlxyXG4iOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0TGluZUNvdW50KCk9PTEpOwotCXRleHQuYXBwZW5kKCJkZGRhc2QiICsgZGVsaW1pdGVyU3RyaW5nKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldExpbmVDb3VudCgpPT0yKTsKLQl0ZXh0LmFwcGVuZCgiZGRhc2Rhc2Rhc2Rhc2QiICsgZGVsaW1pdGVyU3RyaW5nKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldExpbmVDb3VudCgpPT0zKTsKLQotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDQpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0TGluZUNvdW50KCk9PTEpOwotCXRleHQuaW5zZXJ0KGRlbGltaXRlclN0cmluZyk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRMaW5lQ291bnQoKT09Mik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZUF0T2Zmc2V0SSgpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0TGluZUF0T2Zmc2V0KDApID09IDApOwotCXRyeSB7Ci0JCXRleHQuZ2V0TGluZUF0T2Zmc2V0KC0xKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpiOiIsIGV4Y2VwdGlvblRocm93biA9PSB0cnVlKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQl0cnkgewotCQl0ZXh0LmdldExpbmVBdE9mZnNldCgxMDApOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgZXhjZXB0aW9uVGhyb3duID09IHRydWUpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuIik7CQotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0TGluZUF0T2Zmc2V0KDQpID09IDApOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0TGluZUF0T2Zmc2V0KDUpID09IDApOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0TGluZUF0T2Zmc2V0KDYpID09IDApOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0TGluZUF0T2Zmc2V0KDcpID09IDEpOwotCXRyeSB7Ci0JCXRleHQuZ2V0TGluZUF0T2Zmc2V0KDgpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgZXhjZXB0aW9uVGhyb3duID09IHRydWUpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVEZWxpbWl0ZXIoKSB7Ci0JZmluYWwgU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSAiXG4iOwotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSB0ZXh0LmdldENvbnRlbnQoKTsKLQkKLQlhc3NlcnRFcXVhbHMoY29udGVudC5nZXRMaW5lRGVsaW1pdGVyKCksIHRleHQuZ2V0TGluZURlbGltaXRlcigpKTsKLQotCWNvbnRlbnQgPSBuZXcgU3R5bGVkVGV4dENvbnRlbnQoKSB7Ci0JCXB1YmxpYyB2b2lkIGFkZFRleHRDaGFuZ2VMaXN0ZW5lcihUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCQlwdWJsaWMgaW50IGdldENoYXJDb3VudCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMaW5lQXRPZmZzZXQoaW50IG9mZnNldCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMaW5lQ291bnQoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoKSB7Ci0JCQlyZXR1cm4gbGluZURlbGltaXRlcjsKLQkJfQotCQlwdWJsaWMgaW50IGdldE9mZnNldEF0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dFJhbmdlKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcihUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCByZXBsYWNlVGV4dFJhbmdlKGludCBzdGFydCwgaW50IHJlcGxhY2VMZW5ndGgsIFN0cmluZyB0ZXh0KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl9Ci0JfTsKLQl0ZXh0LnNldENvbnRlbnQoY29udGVudCk7Ci0JYXNzZXJ0RXF1YWxzKGxpbmVEZWxpbWl0ZXIsIHRleHQuZ2V0TGluZURlbGltaXRlcigpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lSGVpZ2h0KCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0TGluZUhlaWdodCgpID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYXRpb25BdE9mZnNldEkoKXsKLQkvLyBjb3B5IGZyb20gU3R5bGVkVGV4dCwgaGFzIHRvIG1hdGNoIHZhbHVlIHVzZWQgYnkgU3R5bGVkVGV4dAotCWZpbmFsIGludCBYSU5TRVQgPSBpc0JpZGkoKSA/IDIgOiAwOwotCQotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgwKS5lcXVhbHMobmV3IFBvaW50KFhJTlNFVCwgMCkpKTsKLQl0cnkgewotCQl0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBvZmZzZXQgPT0gLTEiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgxMDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIG9mZnNldCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG5MaW5lMSIpOwkKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNCkueCA+IDAgJiYgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDQpLnkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDYpLnggPiAwICYmIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg2KS55ID09IDApOwotCS8vIHggbG9jYXRpb24gd2lsbCA9PSBTdHlsZWRUZXh0IHggaW5zZXQgb24gYmlkaSBwbGF0Zm9ybXMKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNykueCA9PSBYSU5TRVQgJiYgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDcpLnkgPiAwKTsKLQl0cnkgewotCQl0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMTMpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIG9mZnNldCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg0KS54ID4gMCAmJiB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNCkueSA8IDApOwotCS8vIHggbG9jYXRpb24gd2lsbCA9PSBTdHlsZWRUZXh0IHggaW5zZXQgb24gYmlkaSBwbGF0Zm9ybXMJCi0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDcpLnggPT0gWElOU0VUICYmIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg3KS55ID09IDApOwotCQotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpqOiIsIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgwKS54IDwgMCAmJiB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMCkueSA8IDApOwotCWFzc2VydFRydWUoIjprOiIsIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg3KS54IDwgMCAmJiB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNykueSA9PSAwKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0T2Zmc2V0QXRMaW5lSSgpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCWFzc2VydEVxdWFscygiOmE6IiwgMCwgdGV4dC5nZXRPZmZzZXRBdExpbmUoMCkpOwotCXRyeSB7Ci0JCXRleHQuZ2V0T2Zmc2V0QXRMaW5lKC0xKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpiOiIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JdHJ5IHsKLQkJdGV4dC5nZXRPZmZzZXRBdExpbmUoMTAwKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpjOiIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG4iKTsJCi0JYXNzZXJ0RXF1YWxzKCI6ZDoiLCAwLCB0ZXh0LmdldE9mZnNldEF0TGluZSgwKSk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZToiLCA3LCB0ZXh0LmdldE9mZnNldEF0TGluZSgxKSk7Ci0KLQl0cnkgewotCQl0ZXh0LmdldE9mZnNldEF0TGluZSgyKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpmOiIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0KLQl0ZXh0LnNldFRleHQoIiIpOwkKLQlhc3NlcnRFcXVhbHMoIjpnOiIsIDAsIHRleHQuZ2V0T2Zmc2V0QXRMaW5lKDApKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0T2Zmc2V0QXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlQb2ludCBsb2NhdGlvbjsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KDAsIDApKSA9PSAwKTsKLQl0cnkgewotCQl0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KC0xLCAwKSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6YjoiLCBleGNlcHRpb25UaHJvd24gPT0gdHJ1ZSk7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JdHJ5IHsKLQkJdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludCgwLCAtMSkpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgZXhjZXB0aW9uVGhyb3duID09IHRydWUpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuTGluZTEiKTsJCi0JbG9jYXRpb24gPSB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludCgxMCwgMCkpID4gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludChsb2NhdGlvbi54IC0gMSwgMCkpID09IDQpOwotCWxvY2F0aW9uID0gdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDcpOwkKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obG9jYXRpb24pID09IDcpOwotCXRyeSB7Ci0JCXRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoMTAwLCAwKSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6ZzoiLCBleGNlcHRpb25UaHJvd24gPT0gdHJ1ZSk7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0KLQl0cnkgewotCQl0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KDEwMCwgNTApKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpoOiIsIGV4Y2VwdGlvblRocm93biA9PSB0cnVlKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludCgwLCAtNSkpID09IDApOwotCWFzc2VydFRydWUoIjpqOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoMCwgMCkpID09IDcpOwotCQotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwotCWFzc2VydFRydWUoIjprOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoLTUsIC01KSkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmw6IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludCgtNSwgMCkpID09IDcpOwotCi0JLy8gMUdMNFpWRQotCWFzc2VydFRydWUoIjptOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbih0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMikpID09IDIpOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDApOwotCWFzc2VydFRydWUoIjpuOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbih0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMikpID09IDIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE9yaWVudGF0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRPcmllbnRhdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMiwgMikpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgyLCAyKSkpOwotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgyLCAzKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDIsIDMpKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDMsIDExKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDMsIDExKSkpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbig0KTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoNCwgNCkpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigxMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDExLCAxMSkpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMywgMikpOwkKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMiwgMykpKTsJCi19Ci1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkJhY2tncm91bmQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgdGV4dC5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCkgIT0gbnVsbCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKGdldENvbG9yKFlFTExPVykpOwotCWFzc2VydFRydWUoIjoxOiIsIHRleHQuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpID09ICBnZXRDb2xvcihZRUxMT1cpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCgpIHsKLQlhc3NlcnRUcnVlKCI6MToiLCB0ZXh0LmdldFNlbGVjdGlvbkZvcmVncm91bmQoKSAhPSBudWxsKTsKLQl0ZXh0LnNldFNlbGVjdGlvbkZvcmVncm91bmQoZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgdGV4dC5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCkgPT0gIGdldENvbG9yKFJFRCkpOwotfQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25SYW5nZSgpIHsKLQlTdHJpbmcgdGVzdFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCWludCBpbnZhbGlkUmFuZ2VzIFtdW10gPSB7ey0xLCAwfSwgey0xLCAtMX0sIHsxMDAsIDF9LCB7MTAwLCAtMX0sIHsxMiwgMX0sIHsxMSwgMn0sIHsyLCAtM30sIHs1MCwgLTF9fTsKLQlpbnQgc2VsZWN0aW9uUmFuZ2VzIFtdW10gPSB7ezAsIDF9LCB7MCwgMH0sIHsyLCAzfSwgezEyLCAwfSwgezIsIC0yfSwgezUsIC0xfX07Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBsZW5ndGggPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQl0cnkgewotCQkJdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIGZvciBvdXQgb2YgcmFuZ2UiKTsKLQkJfQotCX0JCi0JCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSAwICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IDApOwotCXRleHQuc2V0VGV4dCh0ZXN0VGV4dCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb25SYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gc2VsZWN0aW9uUmFuZ2VzW2ldWzBdOwotCQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uUmFuZ2VzW2ldWzFdOwotCQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBsZW5ndGgpOwotCQlpZiAobGVuZ3RoIDwgMCkgewotCQkJc3RhcnQgKz0gbGVuZ3RoOwotCQkJbGVuZ3RoICo9IC0xOwotCQkJYXNzZXJ0RXF1YWxzKCI6YzphOiIgKyBpLCBzdGFydCwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsJCQkKLQkJfQotCQllbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmM6YToiICsgaSwgc3RhcnQgKyBsZW5ndGgsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7CQkJCi0JCX0KLQkJYXNzZXJ0VHJ1ZSgiOmM6IiArIGksIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IHN0YXJ0ICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IGxlbmd0aCk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBsZW5ndGggPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQl0cnkgewotCQkJdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIGZvciBvdXQgb2YgcmFuZ2UiKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25Db3VudCgpewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTApOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09Mik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgMTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09OSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzXG40NTY3ODkwIik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT0wKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCA0KTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDEyKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTEwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25UZXh0KCkgewotCVN0cmluZyB0ZXN0VGV4dCA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JaW50IHNlbGVjdGlvblJhbmdlcyBbXVtdID0ge3swLCAxfSwgezAsIDB9LCB7MiwgM30sIHsxMiwgMH19OwotCQotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCAiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuc2V0VGV4dCh0ZXN0VGV4dCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb25SYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gc2VsZWN0aW9uUmFuZ2VzW2ldWzBdOwotCQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uUmFuZ2VzW2ldWzFdOwotCQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBsZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIjpjOiIgKyBpLCB0ZXN0VGV4dC5zdWJzdHJpbmcoc3RhcnQsIHN0YXJ0ICsgbGVuZ3RoKSwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZVJhbmdlQXRPZmZzZXRJKCkgewotCVN0cmluZyBsaW5lID0gIkxpbmUxXHJcbkxpbmUyIjsKLQlpbnQgc3R5bGVTdGFydCA9IDA7Ci0JaW50IHN0eWxlTGVuZ3RoID0gNTsKLQlpbnQgaTsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVN0eWxlUmFuZ2Ugc3R5bGUgPSBuZXcgU3R5bGVSYW5nZShzdHlsZVN0YXJ0LCBzdHlsZUxlbmd0aCwgZ2V0Q29sb3IoQkxVRSksIGdldENvbG9yKFJFRCksIFNXVC5CT0xEKTsKLQotCXRyeSB7Ci0JCXRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDApOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgib2Zmc2V0IG91dCBvZiByYW5nZSBubyB0ZXh0IiwgZXhjZXB0aW9uVGhyb3duKTsKLQotCXRleHQuc2V0VGV4dChsaW5lKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldCgtMSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJvZmZzZXQgb3V0IG9mIHJhbmdlIG5lZ2F0aXZlIiwgZXhjZXB0aW9uVGhyb3duKTsKLQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGxpbmUubGVuZ3RoKCkpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgib2Zmc2V0IG91dCBvZiByYW5nZSBwb3NpdGl2ZSIsIGV4Y2VwdGlvblRocm93bik7Ci0JCQotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0Jc3R5bGUubGVuZ3RoID0gMTsKLQlmb3IgKGkgPSBzdHlsZVN0YXJ0OyBpIDwgc3R5bGVTdGFydCArIHN0eWxlTGVuZ3RoOyBpKyspIHsKLQkJc3R5bGUuc3RhcnQgPSBpOwotCQlhc3NlcnRFcXVhbHMoc3R5bGUsIHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGkpKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKG51bGwsIHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGkpKTsKLQkJCQotCS8vIHRlc3Qgb2Zmc2V0IGF0IGxpbmUgZGVsaW1pdGVyCi0Jc3R5bGUgPSBuZXcgU3R5bGVSYW5nZSg1LCAyLCBudWxsLCBnZXRDb2xvcihCTFVFKSwgU1dULk5PUk1BTCk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQlzdHlsZS5sZW5ndGggPSAxOwotCWFzc2VydEVxdWFscyhzdHlsZSwgdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoNSkpOwotCXN0eWxlLnN0YXJ0ID0gNjsKLQlhc3NlcnRFcXVhbHMoc3R5bGUsIHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDYpKTsJCi0JYXNzZXJ0RXF1YWxzKG51bGwsIHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDEwKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3R5bGVSYW5nZXMoKSB7Ci0JdGV4dC5zZXRUZXh0KCJwYWNrYWdlIHRlc3Q7XG4vKiBMaW5lIDFcbiAqIExpbmUgMlxuICovXG5wdWJsaWMgY2xhc3MgU2ltcGxlQ2xhc3Mge1xufSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDcsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE0LDIzLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDM4LDYsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQ1LDUsQkxVRSxudWxsKSk7Ci0gCXRleHQucmVwbGFjZVRleHRSYW5nZSgxNCwgMjMsICJcdC8qTGluZSAxXG5cdCAqIExpbmUgMlxuXHQgKi8iKTsKLSAJU3RyaW5nIG5ld1RleHQgPSB0ZXh0LmdldFRleHRSYW5nZSgwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBuZXdUZXh0LmVxdWFscygicGFja2FnZSB0ZXN0O1xuXHQvKkxpbmUgMVxuXHQgKiBMaW5lIDJcblx0ICovXG5wdWJsaWMgY2xhc3MgU2ltcGxlQ2xhc3Mge1xufSIpKTsKLQlTdHlsZVJhbmdlW10gc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDcsQkxVRSxudWxsKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNDAsNixCTFVFLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg0Nyw1LEJMVUUsbnVsbCkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZVJhbmdlc0lJKCkgewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSIpOwotLy8JMAotLy8JIDEyMzQKLS8vCSA1NgotLy8JIDc4Ci0vLwk5Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEsNCxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwyLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDcsMixZRUxMT1csbnVsbCkpOwotCi0JU3R5bGVSYW5nZVtdIHN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoMCwxKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoMCw1KTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMSw0LEJMVUUsbnVsbCkpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDcsMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDcsMixZRUxMT1csbnVsbCkpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDAsMTApOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgxLDQsQkxVRSxudWxsKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNywyLFlFTExPVyxudWxsKSkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoMCw0KTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMSwzLEJMVUUsbnVsbCkpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDIsNik7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDIsMyxCTFVFLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDIsUkVELG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg3LDEsWUVMTE9XLG51bGwpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODlcclxuQUJDREVGR0hJSktMIik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQsMyxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNyw1LFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE1LDEsWUVMTE9XLG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDE1LDEpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDE1LDEsWUVMTE9XLG51bGwpKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygxNSwwKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDAsMjApOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDQsMyxCTFVFLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNyw1LFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDE1LDEsWUVMTE9XLG51bGwpKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcyg4LDIpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDgsMixSRUQsbnVsbCkpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRhYnMoKSB7Ci0JdGV4dC5zZXRUYWJzKDEpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VGFicygpID09IDEpOwotCXRleHQuc2V0VGFicyg4KTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRhYnMoKSA9PSA4KTsKLQl0ZXh0LnNldFRleHQoIkxpbmVcdDFcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUYWJzKCkgPT0gOCk7Ci0JdGV4dC5zZXRUYWJzKDcpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGFicygpID09IDcpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0JU3RyaW5nIHRlc3RUZXh0ID0gIkxpbmUxXHJcbkxpbmUyIjsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKTsKLQl0ZXh0LnNldFRleHQodGVzdFRleHQpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VGV4dCgpLmVxdWFscyh0ZXN0VGV4dCkpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCk7Ci0JCi0JdGV4dC5zZXRUZXh0KHRlc3RUZXh0KTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHModGVzdFRleHQpKTsKLQl0ZXh0LnNldFRleHQodGVzdFRleHQgKyAiXHJcbiIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VGV4dCgpLmVxdWFscyh0ZXN0VGV4dCArICJcclxuIikpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dElJKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duOwotCVN0cmluZyB0ZXN0VGV4dCA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JaW50IGludmFsaWRSYW5nZXNbXVtdID0ge3stMSwgMH0sIHswLCAtMX0sIHstMSwgLTF9LCB7MTAwLCAxfSwgezEwMCwgLTF9LCB7MiwgdGVzdFRleHQubGVuZ3RoKCl9LCB7NSwgMn19OwotCWludCByYW5nZXNbXVtdID0ge3swLCAxfSwgezAsIDB9LCB7MiwgNX0sIHs3LCAxMX19OwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSBpbnZhbGlkUmFuZ2VzW2ldWzBdOwotCQlpbnQgZW5kID0gaW52YWxpZFJhbmdlc1tpXVsxXTsKLQkKLQkJZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXh0LmdldFRleHQoc3RhcnQsIGVuZCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIjphOiIsIGV4Y2VwdGlvblRocm93bik7Ci0JfQkKLQl0ZXh0LnNldFRleHQodGVzdFRleHQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IHJhbmdlc1tpXVswXTsKLQkJaW50IGVuZCA9IHJhbmdlc1tpXVsxXTsKLQkJYXNzZXJ0RXF1YWxzKCI6YjoiICsgaSwgdGVzdFRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQgKyAxKSwgdGV4dC5nZXRUZXh0KHN0YXJ0LCBlbmQpKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBlbmQgPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRleHQuZ2V0VGV4dChzdGFydCwgZW5kKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9CQotCXRleHQuc2V0VGV4dCgidGVzdGluZyIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dCgwLDApLmVxdWFscygidCIpKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRleHQoMCwxKS5lcXVhbHMoInRlIikpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dCgxLDUpLmVxdWFscygiZXN0aW4iKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dFJhbmdlSUkoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd247Ci0JU3RyaW5nIHRlc3RUZXh0ID0gIkxpbmUxXHJcbkxpbmUyIjsKLQlpbnQgaW52YWxpZFJhbmdlc1tdW10gPSB7ey0xLCAwfSwgezAsIC0xfSwgey0xLCAtMX0sIHsxMDAsIDF9LCB7MTAwLCAtMX0sIHsxLCB0ZXN0VGV4dC5sZW5ndGgoKX0sIHs1LCAtMX19OwotCWludCByYW5nZXNbXVtdID0ge3swLCAxfSwgezAsIDB9LCB7NSwgMX0sIHs3LCA1fSwgezEyLCAwfX07Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBsZW5ndGggPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRleHQuZ2V0VGV4dFJhbmdlKHN0YXJ0LCBsZW5ndGgpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCI6YToiLCBleGNlcHRpb25UaHJvd24pOwotCX0JCi0JdGV4dC5zZXRUZXh0KHRlc3RUZXh0KTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSByYW5nZXNbaV1bMF07Ci0JCWludCBsZW5ndGggPSByYW5nZXNbaV1bMV07Ci0JCWFzc2VydEVxdWFscygiOmI6IiArIGksIHRlc3RUZXh0LnN1YnN0cmluZyhzdGFydCwgc3RhcnQgKyBsZW5ndGgpLCB0ZXh0LmdldFRleHRSYW5nZShzdGFydCwgbGVuZ3RoKSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSBpbnZhbGlkUmFuZ2VzW2ldWzBdOwotCQlpbnQgbGVuZ3RoID0gaW52YWxpZFJhbmdlc1tpXVsxXTsKLQkKLQkJZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXh0LmdldFRleHRSYW5nZShzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9CQotCXRleHQuc2V0VGV4dCgidGVzdGluZyIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dFJhbmdlKDAsMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUZXh0UmFuZ2UoMCwxKS5lcXVhbHMoInQiKSk7CQotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dFJhbmdlKDAsMikuZXF1YWxzKCJ0ZSIpKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRleHRSYW5nZSgxLDUpLmVxdWFscygiZXN0aW4iKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dExpbWl0KCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VGV4dExpbWl0KCkgPCAwKTsKLQl0ZXh0LnNldFRleHRMaW1pdCgxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUZXh0TGltaXQoKSA9PSAxMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wSW5kZXgoKSB7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG5MaW5lMGFcclxuIik7Ci0KLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgtMik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoLTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAxKTsKLQl0ZXh0LnNldFRvcEluZGV4KDIpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAyKTsKLQl0ZXh0LnNldFRvcEluZGV4KDApOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDMpOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAyKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UodGV4dC5nZXRDaGFyQ291bnQoKSwgMCwgIkxpbmUxIik7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDIpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvcFBpeGVsKCkgewotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuTGluZTBhXHJcbiIpOwotCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoLTIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkpOwotCXRleHQuc2V0VG9wSW5kZXgoMik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IHRleHQuZ2V0TGluZUhlaWdodCgpICogMik7Ci0JdGV4dC5zZXRUb3BJbmRleCgwKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgzKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiAyKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UodGV4dC5nZXRDaGFyQ291bnQoKSwgMCwgIkxpbmUxIik7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IHRleHQuZ2V0TGluZUhlaWdodCgpICogMik7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2dldFdvcmRXcmFwKCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0V29yZFdyYXAoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRXb3JkV3JhcCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFdvcmRXcmFwKCkpOwotCXRleHQuc2V0V29yZFdyYXAoZmFsc2UpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0V29yZFdyYXAoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRXb3JkV3JhcChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRXb3JkV3JhcCgpID09IGZhbHNlKTsKLQl0ZXh0LnNldFdvcmRXcmFwKHRydWUpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0V29yZFdyYXAoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2luc2VydExqYXZhX2xhbmdfU3RyaW5nKCl7Ci0JU3RyaW5nIGRlbGltaXRlclN0cmluZyA9ICJcbiI7Ci0JdHJ5IHsKLQkJdGV4dC5pbnNlcnQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpKTsKLQl0ZXh0Lmluc2VydCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKSk7Ci0JdGV4dC5pbnNlcnQoImZyZWQiKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHMoImZyZWQiKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMik7Ci0JdGV4dC5pbnNlcnQoImhlbG11dCIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dCgpLmVxdWFscygiZnJoZWxtdXRlZCIpKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRMaW5lQ291bnQoKT09MSk7Ci0JdGV4dC5pbnNlcnQoZGVsaW1pdGVyU3RyaW5nKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldExpbmVDb3VudCgpPT0yKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnZva2VBY3Rpb25JKCkgewotCS8vIGludm9raW5nIGFjdGlvbnMgb24gYW4gZW1wdHkgdGV4dCBzaG91bGQgbm90IGNyYXNoCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9ET1dOKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX1VQKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX0VORCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9TVEFSVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuQ09MVU1OX05FWFQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlBBR0VfRE9XTik7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuUEFHRV9VUCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV09SRF9ORVhUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5XT1JEX1BSRVZJT1VTKTsJCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuVEVYVF9FTkQpOwkKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5URVhUX1NUQVJUKTsJCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV0lORE9XX0VORCk7CQotCXRleHQuaW52b2tlQWN0aW9uKFNULldJTkRPV19TVEFSVCk7CQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX0RPV04pOwkKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfTElORV9VUCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfU1RBUlQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX0VORCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0NPTFVNTl9QUkVWSU9VUyk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0NPTFVNTl9ORVhUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfUEFHRV9VUCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1BBR0VfRE9XTik7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1dPUkRfUFJFVklPVVMpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XT1JEX05FWFQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9URVhUX0VORCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1RFWFRfU1RBUlQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XSU5ET1dfU1RBUlQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XSU5ET1dfRU5EKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5DVVQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkNPUFkpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlBBU1RFKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5ERUxFVEVfUFJFVklPVVMpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkRFTEVURV9ORVhUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5UT0dHTEVfT1ZFUldSSVRFKTsKLQotCS8vU29tZSBwbGF0Zm9ybXMgY29uc2lkZXIgbnVtYmVyIGEgd29yZCBzdGFydCwgb3RoZXIgZG9uJ3QgIAotLy8JdGV4dC5zZXRUZXh0KCJMaW5lMVxyXG5MaW5lMiIpOwkJCi0JdGV4dC5zZXRUZXh0KCJMaW5lTFxyXG5MaW5lVyIpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfRE9XTik7Ci0JYXNzZXJ0RXF1YWxzKDcsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0JCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9VUCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0JCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9FTkQpOwotCWFzc2VydEVxdWFscyg1LCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCQotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfU1RBUlQpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuQ09MVU1OX05FWFQpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuUEFHRV9ET1dOKTsKLQlhc3NlcnRFcXVhbHMoOCwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlBBR0VfVVApOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuVEVYVF9TVEFSVCk7CQotCXRleHQuaW52b2tlQWN0aW9uKFNULldPUkRfTkVYVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV09SRF9ORVhUKTsJCi0JYXNzZXJ0RXF1YWxzKDcsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5XT1JEX1BSRVZJT1VTKTsJCi0JYXNzZXJ0RXF1YWxzKDUsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5URVhUX0VORCk7CQotCWFzc2VydEVxdWFscyh0ZXh0LmdldENoYXJDb3VudCgpLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuVEVYVF9TVEFSVCk7CQotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV0lORE9XX0VORCk7CQotCWFzc2VydEVxdWFscyg1LCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV0lORE9XX1NUQVJUKTsJCi0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0JCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRE9XTik7CQotCWFzc2VydEVxdWFscygiTGluZUxcclxuIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9FTkQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX1VQKTsKLQlhc3NlcnRFcXVhbHMoIlxyXG5MaW5lVyIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX1NUQVJUKTsKLQlhc3NlcnRFcXVhbHMoIkxpbmVMXHJcbkxpbmVXIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9TVEFSVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRU5EKTsKLQlhc3NlcnRFcXVhbHMoIkxpbmVMIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9FTkQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9DT0xVTU5fUFJFVklPVVMpOwotCWFzc2VydEVxdWFscygiTCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9DT0xVTU5fTkVYVCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfUEFHRV9VUCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfUEFHRV9ET1dOKTsKLQlhc3NlcnRFcXVhbHMoIlxyXG5MaW5lVyIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfRU5EKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfV09SRF9QUkVWSU9VUyk7Ci0JYXNzZXJ0RXF1YWxzKCJMaW5lVyIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfU1RBUlQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XT1JEX05FWFQpOwotCWFzc2VydEVxdWFscygiTGluZVciLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX1NUQVJUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfVEVYVF9FTkQpOwotCWFzc2VydEVxdWFscygiTGluZVciLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfVEVYVF9TVEFSVCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaW5lTFxyXG4iLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX1NUQVJUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfV0lORE9XX1NUQVJUKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XSU5ET1dfRU5EKTsKLQlhc3NlcnRFcXVhbHMoIkxpbmVMIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRU5EKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5DVVQpOwotCWFzc2VydEVxdWFscygiXHJcbkxpbmVXIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRE9XTik7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuQ09QWSk7Ci0JYXNzZXJ0RXF1YWxzKCJcclxuTGluZVciLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX0VORCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuUEFTVEUpOwotCWFzc2VydEVxdWFscygiXHJcbkxpbmVXIiArIFBMQVRGT1JNX0xJTkVfREVMSU1JVEVSLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5ERUxFVEVfUFJFVklPVVMpOwotCWFzc2VydEVxdWFscygiXHJcbkxpbmVXIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuVEVYVF9TVEFSVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuREVMRVRFX05FWFQpOwotCWFzc2VydEVxdWFscygiTGluZVciLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5UT0dHTEVfT1ZFUldSSVRFKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9wYXN0ZSgpewotCUNsaXBib2FyZCBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKHRleHQuZ2V0RGlzcGxheSgpKTsKLQlUZXh0VHJhbnNmZXIgdHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQlTdHJpbmcgY29udmVydGVkVGV4dDsKLQotCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgU3RyaW5nW117IngifSwgbmV3IFRyYW5zZmVyW117dHJhbnNmZXJ9KTsKLQkKLQl0ZXh0LmNvcHkoKTsJCi0JdGV4dC5wYXN0ZSgpOwkKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IDEpOwotCQotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7Ci0JdGV4dC5jb3B5KCk7CQotCXRleHQucGFzdGUoKTsJCi0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSAyKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMSk7Ci0JdGV4dC5jb3B5KCk7CQotCXRleHQuc2V0Q2FyZXRPZmZzZXQoMCk7Ci0JdGV4dC5wYXN0ZSgpOwkKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHMoIjAwMTIzNDU2Nzg5IikpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMSwgMik7CQotCXRleHQuY29weSgpOwkKLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQucGFzdGUoKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHMoIjAxIikpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0KLQkvLyB0ZXN0IGxpbmUgZGVsaW1pdGVyIGNvbnZlcnNpb24KLQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IFN0cmluZ1tdeyJcckxpbmUxXG5MaW5lMlxyXG5MaW5lM1xuXHJMaW5lNFxuIn0sIG5ldyBUcmFuc2Zlcltde3RyYW5zZmVyfSk7Ci0JdGV4dC5wYXN0ZSgpOwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJY29udmVydGVkVGV4dCA9ICJcclxuTGluZTFcclxuTGluZTJcclxuTGluZTNcclxuXHJcbkxpbmU0XHJcbiI7Ci0JfQotCWVsc2UgewotCQljb252ZXJ0ZWRUZXh0ID0gIlxuTGluZTFcbkxpbmUyXG5MaW5lM1xuXG5MaW5lNFxuIjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRUZXh0KCkgIT0gbnVsbCAmJiB0ZXh0LmdldFRleHQoKS5lcXVhbHMoY29udmVydGVkVGV4dCkpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0KLQkvLyB0ZXN0IGxpbmUgZGVsaW1pdGVyIGNvbnZlcnNpb24KLQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IFN0cmluZ1tdeyJMaW5lMVxyXG5MaW5lMiJ9LCBuZXcgVHJhbnNmZXJbXXt0cmFuc2Zlcn0pOwotCXRleHQucGFzdGUoKTsKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCX0KLQllbHNlIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxuTGluZTIiOwotCX0KLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldFRleHQoKSAhPSBudWxsICYmIHRleHQuZ2V0VGV4dCgpLmVxdWFscyhjb252ZXJ0ZWRUZXh0KSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQotCS8vIHRlc3QgbGluZSBkZWxpbWl0ZXIgY29udmVyc2lvbgotCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgU3RyaW5nW117IkxpbmUxXHJMaW5lMiJ9LCBuZXcgVHJhbnNmZXJbXXt0cmFuc2Zlcn0pOwotCXRleHQucGFzdGUoKTsKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCX0KLQllbHNlIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxuTGluZTIiOwotCX0KLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldFRleHQoKSAhPSBudWxsICYmIHRleHQuZ2V0VGV4dCgpLmVxdWFscyhjb252ZXJ0ZWRUZXh0KSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQotCi0JLy8gdGVzdCBsaW5lIGRlbGltaXRlciBjb252ZXJzaW9uCi0JY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBTdHJpbmdbXXsiTGluZTFcbkxpbmUyIn0sIG5ldyBUcmFuc2Zlcltde3RyYW5zZmVyfSk7Ci0JdGV4dC5wYXN0ZSgpOwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JfQotCWVsc2UgewotCQljb252ZXJ0ZWRUZXh0ID0gIkxpbmUxXG5MaW5lMiI7Ci0JfQotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0VGV4dCgpICE9IG51bGwgJiYgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKGNvbnZlcnRlZFRleHQpKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCi0KLQljbGlwYm9hcmQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3ByaW50KCkgewotCS8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIGRvbid0IGRvIHRoaXMgdGVzdAotCWlmIChQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpID09IG51bGwpIHJldHVybjsKLQkKLQkvKiBXZSBkb24ndCByZWFsbHkgd2FudCB0byBydW4gdGhpcyB0ZXN0LCBiZWNhdXNlIGl0IHdhc3RlcyBwYXBlci4KLQkgKiBBbG1vc3QgYWxsIG9mIHRoZSBwcmludCgpIG1ldGhvZCBpcyB0ZXN0ZWQgaW4gcHJpbnQoUHJpbnRlciksIGJlbG93LgotCSAqLwotLy8JdGV4dC5wcmludCgpOwotLy8JdGV4dC5zZXRUZXh0KCJMaW5lMSIpOwotLy8JdGV4dC5wcmludCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3ByaW50TG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyKCkgewotCS8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIGRvbid0IGRvIHRoaXMgdGVzdAotCWlmIChQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpID09IG51bGwpIHJldHVybjsKLQotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5wcmludChudWxsKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9CQotCWFzc2VydFRydWUoIm5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHByaW50KG51bGwpIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkKLQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcigpOwotCXRleHQucHJpbnQocHJpbnRlcik7IC8vIGRvbid0IHJ1biB0aGUgcnVubmFibGUsIHRvIHNhdmUgcGFwZXIKLQl0ZXh0LnNldFRleHQoIkxpbmUxIik7Ci0JdGV4dC5wcmludChwcmludGVyKTsgLy8gZG9uJ3QgcnVuIHRoZSBydW5uYWJsZSwgdG8gc2F2ZSBwYXBlcgotCXByaW50ZXIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3ByaW50TG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dFByaW50T3B0aW9ucygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0UHJpbnRPcHRpb25zIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVkcmF3KCkgewotCS8vIGluaGVyaXRlZCB0ZXN0IGlzIHN1ZmZpY2llbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZWRyYXdJSUlJWigpIHsKLQkvLyBpbmhlcml0ZWQgdGVzdCBpcyBzdWZmaWNpZW50Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVkcmF3UmFuZ2VJSVooKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQotCXRleHQucmVkcmF3UmFuZ2UoMCwgMCwgdHJ1ZSk7Ci0JdGV4dC5yZWRyYXdSYW5nZSgwLCAwLCBmYWxzZSk7Ci0JCi0JdHJ5IHsKLQkJdGV4dC5yZWRyYXdSYW5nZSgwLCAxLCB0cnVlKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIkluZGV4IG91dCBvZiBib3VuZHMiKSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCX0KLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0KLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnJlZHJhd1JhbmdlKDAsIDEsIGZhbHNlKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIkluZGV4IG91dCBvZiBib3VuZHMiKSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCX0KLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0JCQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQucmVkcmF3UmFuZ2UoLTEsIDIsIHRydWUpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiSW5kZXggb3V0IG9mIGJvdW5kcyIpKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JfQotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQucmVkcmF3UmFuZ2UoLTEsIDIsIGZhbHNlKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIkluZGV4IG91dCBvZiBib3VuZHMiKSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCX0KLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkiKTsKLQl0ZXh0LnJlZHJhd1JhbmdlKDAsIDAsIHRydWUpOwotCXRleHQucmVkcmF3UmFuZ2UoMCwgMCwgZmFsc2UpOwkKLQl0ZXh0LnJlZHJhd1JhbmdlKDAsIDEsIHRydWUpOwotCXRleHQucmVkcmF3UmFuZ2UoMCwgMSwgZmFsc2UpOwkKLQl0ZXh0LnJlZHJhd1JhbmdlKDgsIDIsIHRydWUpOwotCXRleHQucmVkcmF3UmFuZ2UoOCwgMiwgZmFsc2UpOwkKLQl0ZXh0LnJlZHJhd1JhbmdlKDEwLCAwLCB0cnVlKTsJCi0JdGV4dC5yZWRyYXdSYW5nZSgxMCwgMCwgZmFsc2UpOwkKLQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQucmVkcmF3UmFuZ2UoMTAsIDEsIHRydWUpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiSW5kZXggb3V0IG9mIGJvdW5kcyIpKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JfQotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQkKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnJlZHJhd1JhbmdlKDEwLCAxLCBmYWxzZSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlpZiAoZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJJbmRleCBvdXQgb2YgYm91bmRzIikpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZEJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMaW5lQmFja2dyb3VuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRMaW5lQmFja2dyb3VuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUxpbmVTdHlsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkTGluZVN0eWxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVZlcmlmeUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkVmVyaWZ5S2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lcgotfQotcHVibGljIHZvaWQgdGVzdF9yZXBsYWNlU3R5bGVSYW5nZXNJSSRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlKCkgewotCVN0eWxlUmFuZ2VbXSBzdHlsZXM7Ci0JU3RyaW5nIHRleHRTdHJpbmcgPSB0ZXh0U3RyaW5nKCk7Ci0KLQkvKiAKLQkJZGVmYXVsdFN0eWxlcwotCQkKLQkJCSgwLDQ4LFJFRCxZRUxMT1cpLCAKLQkJCSg1OCwxMCxCTFVFLENZQU4pLCAKLQkJCSg2OCwxMCxHUkVFTixQVVJQTEUpCi0JKi8KLQotCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCQotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCksIGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgNzgsIG5ldyBTdHlsZVJhbmdlW10ge30pOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MDoiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjA6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCA3OCwgbmV3IFN0eWxlUmFuZ2VbXSB7fSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjowOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSwgZGVmYXVsdFN0eWxlcygpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjA6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MDoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQkKLQkvLyBObyBvdmVybGFwIHdpdGggZXhpc3Rpbmcgc3R5bGVzCi0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSwgZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg0OCwgNSwgbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoNDgsNSxZRUxMT1csUkVEKX0pOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNDgsNSxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0JLy8gT3ZlcmxhcCBtaWRkbGUgb2Ygb25lIHN0eWxlIC0gcGFydGlhbAotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCksIGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMTAsIDEwLCBuZXcgU3R5bGVSYW5nZVtdIHtnZXRTdHlsZSgxMCwxMCxZRUxMT1csUkVEKX0pOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDUpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMTAsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDIwLDI4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzRdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSwgbmV3IFN0eWxlUmFuZ2VbXSB7fSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JCi0JLy8gT3ZlcmxhcCBtaWRkbGUgb2Ygb25lIHN0eWxlIC0gZnVsbAotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCksIGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNTgsIDEwLCBuZXcgU3R5bGVSYW5nZVtdIHtnZXRTdHlsZSg1OCwxMCxZRUxMT1csUkVEKX0pOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQkKLQkvLyBPdmVybGFwIGVuZCBvZiBvbmUgc3R5bGUKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCB0ZXh0LmdldENoYXJDb3VudCgpLCBkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDM4LCAxNSwgbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoMzgsMTUsWUVMTE9XLFJFRCl9KTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMzgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDM4LDE1LFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JCi0JLy8gT3ZlcmxhcCBiZWdpbm5pbmcgb2Ygb25lIHN0eWxlCi0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSwgZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg1MCwgMTAsIG5ldyBTdHlsZVJhbmdlW10ge2dldFN0eWxlKDUwLDEwLFlFTExPVyxSRUQpfSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1MCwxMCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjAsOCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQkvLyBPdmVybGFwIGNvbXBsZXRlIHN0eWxlCi0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSwgZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg0OCwgMjAsIG5ldyBTdHlsZVJhbmdlW10ge2dldFN0eWxlKDQ4LDIwLFlFTExPVyxSRUQpfSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg0OCwyMCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCVN0eWxlUmFuZ2UgcmFuZ2VzW10gPSBuZXcgU3R5bGVSYW5nZVszXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDQ4LDIwLEJMVUUsQ1lBTik7Ci0JcmFuZ2VzWzJdID0gZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCA3OCwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjc6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDQ4LDIwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDEwLDUsQkxVRSxDWUFOKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxNSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjg6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6ODoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo4OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMTAsNSxCTFVFLENZQU4pKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJyZWRncmVlbmJsdWV5ZWxsb3djeWFucHVycGxlIik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbNF07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCwzLFJFRCxudWxsKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgzLDUsR1JFRU4sbnVsbCk7Ci0JcmFuZ2VzWzJdID0gZ2V0U3R5bGUoOCw0LEJMVUUsbnVsbCk7Ci0JcmFuZ2VzWzNdID0gZ2V0U3R5bGUoMTIsNixZRUxMT1csbnVsbCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMTgsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDMsUkVELG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgzLDUsR1JFRU4sbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDgsNCxCTFVFLCBudWxsKSkpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoMTIsNixZRUxMT1csbnVsbCkpKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgxOCw0LENZQU4sbnVsbCk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMjIsNixQVVJQTEUsbnVsbCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMTgsIDEwLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXMubGVuZ3RoID09IDYpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1s0XS5lcXVhbHMoZ2V0U3R5bGUoMTgsNCxDWUFOLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzVdLmVxdWFscyhnZXRTdHlsZSgyMiw2LFBVUlBMRSxudWxsKSkpOwotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JdGV4dFN0cmluZyA9IHRleHRTdHJpbmcoKTsKLQkJCQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDI1LDEwLEdSRUVOLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMzUsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNSwxNSxCTFVFLENZQU4pOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDIwLDEwLEdSRUVOLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNSwgMjUsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxMDoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoxMDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxMDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMTUsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxMDoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDIwLDE1LEdSRUVOLFBVUlBMRSkpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDEwLDEwLEJMVUUsQ1lBTik7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMjAsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNSwzLFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDEyLDUsQkxVRSxDWUFOKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg1LCAxMiwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjExOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjExOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMTIsOCxCTFVFLENZQU4pKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbM107Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDUsNSxCTFVFLENZQU4pOwotCXJhbmdlc1syXSA9IGdldFN0eWxlKDEwLDUsR1JFRU4sUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxNSwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1LDUsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMTAsNSxSRUQsWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg1LCAxMCwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxNSxSRUQsWUVMTE9XKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDEwLDUsR1JFRU4sUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxNSwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDUsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoNSw1LEJMVUUsQ1lBTik7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMTAsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxMzoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoxMzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxMzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsNSxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMTAsNSxHUkVFTixQVVJQTEUpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNCIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxMCw1LEJMVUUsQ1lBTik7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMTUsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNSw3LEJMVUUsQ1lBTik7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNSwgNywgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE0OiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjE0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE0OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwxMCxCTFVFLENZQU4pKSk7Ci0KLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCXRleHRTdHJpbmcgPSB0ZXh0U3RyaW5nKCk7Ci0KLQotCS8qIAotCQlkZWZhdWx0U3R5bGVzCi0JCQotCQkJKDAsNDgsUkVELFlFTExPVyksIAotCQkJKDU4LDEwLEJMVUUsQ1lBTiksIAotCQkJKDY4LDEwLEdSRUVOLFBVUlBMRSkKLQkqLwotCi0KLQkvLyBFbmQvQmVnaW5uaW5nIG92ZXJsYXAKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDM4LDI1LFlFTExPVyxSRUQpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDM4LCAyNSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwzOCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDM4LDI1LFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjMsNSxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg2MywxMCxZRUxMT1csUkVEKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg2MywgMTAsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1OCw1LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2MywxMCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDczLDUsR1JFRU4sUFVSUExFKSkpOwotCi0JLy8gQ29tcGxldGUgb3ZlcmxhcAotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDc4LFlFTExPVyxSRUQpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDc4LCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw3OCxZRUxMT1csUkVEKSkpOwotCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsNjgsWUVMTE9XLFJFRCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgNjgsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNjgsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDU4LDIwLFlFTExPVyxSRUQpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDU4LCAyMCwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDU4LDIwLFlFTExPVyxSRUQpKSk7Ci0KLQkvLyAxLU4gY29tcGxldGUsIGJlZ2lubmluZwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyggCi0JCW5ldyBTdHlsZVJhbmdlW10ge2dldFN0eWxlKDAsNSxSRUQsUkVEKSwgZ2V0U3R5bGUoNSw1LFlFTExPVyxZRUxMT1cpLAotCQkJZ2V0U3R5bGUoMTAsNSxDWUFOLENZQU4pLCBnZXRTdHlsZSgxNSw1LEJMVUUsQkxVRSksCi0JCQlnZXRTdHlsZSgyMCw1LEdSRUVOLEdSRUVOKSwgZ2V0U3R5bGUoMjUsNSxQVVJQTEUsUFVSUExFKX0KLQkpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDUsMjMsWUVMTE9XLFJFRCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNSwgMjMsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsUkVEKSkpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMjMsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyOCwyLFBVUlBMRSxQVVJQTEUpKSk7Ci0JCi0JLy8gZW5kLCAxLU4gY29tcGxldGUsIGJlZ2lubmluZwotCXRleHQuc2V0U3R5bGVSYW5nZXMoIAotCQluZXcgU3R5bGVSYW5nZVtdIHtnZXRTdHlsZSgwLDUsUkVELFJFRCksIGdldFN0eWxlKDUsNSxZRUxMT1csWUVMTE9XKSwKLQkJCWdldFN0eWxlKDEwLDUsQ1lBTixDWUFOKSwgZ2V0U3R5bGUoMTUsNSxCTFVFLEJMVUUpLAotCQkJZ2V0U3R5bGUoMjAsNSxHUkVFTixHUkVFTiksIGdldFN0eWxlKDI1LDUsUFVSUExFLFBVUlBMRSl9Ci0JKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgxMywxMixZRUxMT1csUkVEKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygxMywgMTIsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXMubGVuZ3RoID09IDUpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsUkVEKSkpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsNSxZRUxMT1csWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDEwLDMsQ1lBTixDWUFOKSkpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDEzLDEyLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1s0XS5lcXVhbHMoZ2V0U3R5bGUoMjUsNSxQVVJQTEUsUFVSUExFKSkpOwotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JLy8gaW5zZXJ0IHdpdGggbm8gc3R5bGVzCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxMCwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4YToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxeGE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQotCS8vIGluc2VydCBiZWZvcmUgMSBzdHlsZQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1LDMsUkVELFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMTAsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCwzLFBVUlBMRSxQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDMsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxeGI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MXhiOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwzLFBVUlBMRSxQVVJQTEUpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4YjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMyxSRUQsWUVMTE9XKSkpOwotCi0JLy8gaW5zZXJ0IGFmdGVyIDEgc3R5bGUKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNSwzLFJFRCxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDEwLCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDgsMSxQVVJQTEUsUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg4LCAxLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MXhjOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjF4YzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsMyxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxeGM6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg4LDEsUFVSUExFLFBVUlBMRSkpKTsKLQotCS8vIGluc2VydCBiZWZvcmUgMiBzdHlsZXMKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNSwyLFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDEwLDIsUkVELFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMjAsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMiwxLFBVUlBMRSxQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDIsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxeGU6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MXhlOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMiwxLFBVUlBMRSxQVVJQTEUpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMixSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxeGU6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgxMCwyLFJFRCxZRUxMT1cpKSk7Ci0KLQkvLyBpbnNlcnQgYWZ0ZXIgMiBzdHlsZXMKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNSwyLFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDEwLDIsUkVELFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMjAsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMTIsMSxQVVJQTEUsUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygxMiwgMSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZjoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoxeGY6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDIsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MXhmOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMixSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxeGY6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgxMiwxLFBVUlBMRSxQVVJQTEUpKSk7Ci0KLQkvLyBpbnNlcnQgbWlkZGxlIDIgc3R5bGVzCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDEsMixSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxMiwyLFJFRCxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDIwLCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDUsMyxQVVJQTEUsUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg1LCAzLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MXhnOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDEsMixSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxeGc6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDMsUFVSUExFLFBVUlBMRSkpKTsKLQlhc3NlcnRUcnVlKCI6MXhnOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMTIsMixSRUQsWUVMTE9XKSkpOwotCQotCS8vIGluc2VydCBtaWRkbGUgMyBzdHlsZXMKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbM107Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMSwzLFJFRCxQVVJQTEUpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDYsMyxQVVJQTEUsWUVMTE9XKTsKLQlyYW5nZXNbMl0gPSBnZXRTdHlsZSgxMiwzLFJFRCxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDIwLCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDQsMixQVVJQTEUsUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg0LCAyLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MXhoOiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4aDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDEsMyxSRUQsUFVSUExFKSkpOwotCWFzc2VydFRydWUoIjoxeGg6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg0LDIsUFVSUExFLFBVUlBMRSkpKTsKLQlhc3NlcnRUcnVlKCI6MXhoOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNiwzLFBVUlBMRSxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4aDoiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDEyLDMsUkVELFlFTExPVykpKTsJCi0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0KLQl0ZXh0LnNldFRleHQoIjAiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDEsUFVSUExFLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4YToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCi0JdGV4dC5zZXRUZXh0KCIwMSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsMSxQVVJQTEUsUFVSUExFKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxLDEsUkVELFJFRCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMiwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDEsWUVMTE9XLFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4YjoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoyeGI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDEsWUVMTE9XLFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MnhiOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMSwxLFJFRCxSRUQpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxIik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCwxLFBVUlBMRSxQVVJQTEUpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDEsMSxSRUQsUkVEKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAyLCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDEsMSxZRUxMT1csWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygxLCAxLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MnhjOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4YzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMSxQVVJQTEUsUFVSUExFKSkpOwotCWFzc2VydFRydWUoIjoyeGM6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxLDEsWUVMTE9XLFlFTExPVykpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyIik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCwxLFBVUlBMRSxQVVJQTEUpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDEsMSxSRUQsUkVEKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAyLCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDIsMSxZRUxMT1csWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygyLCAxLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MnhkOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4ZDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMSxQVVJQTEUsUFVSUExFKSkpOwotCWFzc2VydFRydWUoIjoyeGQ6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxLDEsUkVELFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MnhkOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMiwxLFlFTExPVyxZRUxMT1cpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbM107Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMSwxLFBVUlBMRSxQVVJQTEUpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDIsMSxSRUQsUkVEKTsKLQlyYW5nZXNbMl0gPSBnZXRTdHlsZSgzLDEsUFVSUExFLFBVUlBMRSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyhyYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDQsMSxZRUxMT1csWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg0LCAxLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MnhlOiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4ZToiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDQsMSxZRUxMT1csWUVMTE9XKSkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNCIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDQsMSxZRUxMT1csWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg0LCAxLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MnhmOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4ZjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDQsMSxZRUxMT1csWUVMTE9XKSkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNCIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDQsMSxZRUxMT1csWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg0LCAxLCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzBdOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDQsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyeGc6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlcGxhY2VUZXh0UmFuZ2VJSUxqYXZhX2xhbmdfU3RyaW5nKCl7Ci0JU3RyaW5nIGRlZmF1bHRUZXh0ID0gImxpbmUwXG5ccmxpbmUxXG5ccmxpbmUyXG5cciI7Ci0JaW50IGRlZmF1bHRUZXh0TGVuZ3RoID0gZGVmYXVsdFRleHQubGVuZ3RoKCk7Ci0JaW50IHNlbGVjdGlvblN0YXJ0ID0gNzsKLQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gNzsKLQlpbnQgcmVwbGFjZVN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQgKyBzZWxlY3Rpb25MZW5ndGggKyAxOwotCWludCByZXBsYWNlTGVuZ3RoID0gNTsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVN0cmluZyBuZXdUZXh0ID0gIm5ld2xpbmUwXG5ccm5ld2xpbmUxIjsKLQlpbnQgbmV3VGV4dExlbmd0aCA9IG5ld1RleHQubGVuZ3RoKCk7Ci0JCQkKLQkvLyBpbnNlcnQgdGV4dAotCS8vIHdpdGhpbiByYW5nZQotCS8vIGFmdGVyIHNlbGVjdGlvbgotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JLy8gc2VsZWN0IDJuZCBsaW5lIGluY2x1ZGluZyBsaW5lIGJyZWFrCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uTGVuZ3RoKTsJCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHJlcGxhY2VTdGFydCwgMCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSBkZWZhdWx0VGV4dExlbmd0aCArIG5ld1RleHRMZW5ndGgpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IHNlbGVjdGlvblN0YXJ0ICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQotCS8vIGJlZm9yZSBzZWxlY3Rpb24KLQl0ZXh0LnNldFRleHQoZGVmYXVsdFRleHQpOwotCS8vIHNlbGVjdCAybmQgbGluZSBpbmNsdWRpbmcgbGluZSBicmVhawotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkxlbmd0aCk7CQotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCBuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IGRlZmF1bHRUZXh0TGVuZ3RoICsgbmV3VGV4dExlbmd0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gc2VsZWN0aW9uU3RhcnQgKyBuZXdUZXh0TGVuZ3RoICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQotCS8vIGludGVyc2VjdGluZyBzZWxlY3Rpb24KLQl0ZXh0LnNldFRleHQoZGVmYXVsdFRleHQpOwotCS8vIHNlbGVjdCAybmQgbGluZSBpbmNsdWRpbmcgbGluZSBicmVhawotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkxlbmd0aCk7CQotCXRleHQucmVwbGFjZVRleHRSYW5nZShzZWxlY3Rpb25TdGFydCArIDEsIDAsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gZGVmYXVsdFRleHRMZW5ndGggKyBuZXdUZXh0TGVuZ3RoKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzZWxlY3Rpb25TdGFydCArIDEgKyBuZXdUZXh0TGVuZ3RoICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IDApOwotCQkJCQotCS8vIG91dCBvZiByYW5nZQotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JLy8gc2VsZWN0IDJuZCBsaW5lIGluY2x1ZGluZyBsaW5lIGJyZWFrCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uTGVuZ3RoKTsJCi0JdHJ5IHsKLQkJdGV4dC5yZXBsYWNlVGV4dFJhbmdlKC0xLCAwLCBuZXdUZXh0KTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpnOiIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHRleHQuZ2V0Q2hhckNvdW50KCkgKyAxLCAwLCBuZXdUZXh0KTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsIG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9CQotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQotCWFzc2VydFRydWUoIjpoOiIsIGV4Y2VwdGlvblRocm93bik7Ci0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gc2VsZWN0aW9uU3RhcnQgJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gc2VsZWN0aW9uTGVuZ3RoKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJCi0JLy8gYXBwZW5kIHRleHQKLQkvLyBhcHBlbmQgaW4gZW1wdHkgd2lkZ2V0Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UodGV4dC5nZXRDaGFyQ291bnQoKSwgMCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOmo6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSBuZXdUZXh0TGVuZ3RoKTsKLQlhc3NlcnRUcnVlKCI6azoiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSAwICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IDApOwotCQkJCi0JLy8gYXBwZW5kIGluIG5vbi1lbXB0eSB3aWRnZXQgKHNlbGVjdGlvbiBzaG91bGQgYWx3YXlzIGJlIHByZXNlcnZlZCkKLQl0ZXh0LnNldFRleHQoZGVmYXVsdFRleHQpOwotCS8vIHNlbGVjdCAybmQgbGluZSBpbmNsdWRpbmcgbGluZSBicmVhawotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkxlbmd0aCk7CQotCXRleHQucmVwbGFjZVRleHRSYW5nZSh0ZXh0LmdldENoYXJDb3VudCgpLCAwLCBuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6bDoiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IGRlZmF1bHRUZXh0TGVuZ3RoICsgbmV3VGV4dExlbmd0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOm06IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gc2VsZWN0aW9uU3RhcnQgJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8vIHBsYWNlIGNhcmV0IGF0IGVuZCBvZiB0ZXh0Ci0JdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHRleHQuZ2V0Q2hhckNvdW50KCksIDApOwkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UodGV4dC5nZXRDaGFyQ291bnQoKSwgMCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOm46IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSBkZWZhdWx0VGV4dExlbmd0aCArIG5ld1RleHRMZW5ndGgpOwotCWFzc2VydFRydWUoIjpvOiIsIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IHRleHQuZ2V0Q2hhckNvdW50KCkgLSBuZXdUZXh0TGVuZ3RoICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IDApOwotCi0JLy8gcmVwbGFjZSB0ZXh0Ci0JLy8gd2l0aGluIHJhbmdlCi0JLy8gYWZ0ZXIgc2VsZWN0aW9uCi0JdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkvLyBzZWxlY3QgMm5kIGxpbmUgaW5jbHVkaW5nIGxpbmUgYnJlYWsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25MZW5ndGgpOwkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UocmVwbGFjZVN0YXJ0LCByZXBsYWNlTGVuZ3RoLCBuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6cDoiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IGRlZmF1bHRUZXh0TGVuZ3RoICsgbmV3VGV4dExlbmd0aCAtIHJlcGxhY2VMZW5ndGgpOwotCWFzc2VydFRydWUoIjpxOiIsIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IHNlbGVjdGlvblN0YXJ0ICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQotCS8vIGJlZm9yZSBzZWxlY3Rpb24KLQl0ZXh0LnNldFRleHQoZGVmYXVsdFRleHQpOwotCS8vIHNlbGVjdCAybmQgbGluZSBpbmNsdWRpbmcgbGluZSBicmVhawotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkxlbmd0aCk7CQotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLCByZXBsYWNlTGVuZ3RoLCBuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6cjoiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IGRlZmF1bHRUZXh0TGVuZ3RoICsgbmV3VGV4dExlbmd0aCAtIHJlcGxhY2VMZW5ndGgpOwotCWFzc2VydFRydWUoIjpzOiIsIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IHNlbGVjdGlvblN0YXJ0ICsgbmV3VGV4dExlbmd0aCAtIHJlcGxhY2VMZW5ndGggJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gc2VsZWN0aW9uTGVuZ3RoKTsKLQkKLQkvLyBpbnRlcnNlY3Rpbmcgc2VsZWN0aW9uCi0JdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkvLyBzZWxlY3QgMm5kIGxpbmUgaW5jbHVkaW5nIGxpbmUgYnJlYWsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25MZW5ndGgpOwkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2Uoc2VsZWN0aW9uU3RhcnQgKyAxLCByZXBsYWNlTGVuZ3RoLCBuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6dDoiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IGRlZmF1bHRUZXh0TGVuZ3RoICsgbmV3VGV4dExlbmd0aCAtIHJlcGxhY2VMZW5ndGgpOwotCWFzc2VydFRydWUoIjp1OiIsIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IHNlbGVjdGlvblN0YXJ0ICsgMSArIG5ld1RleHRMZW5ndGggJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gMCk7Ci0JCQkKLQkvLyBvdXQgb2YgcmFuZ2UKLQl0ZXh0LnNldFRleHQoZGVmYXVsdFRleHQpOwotCS8vIHNlbGVjdCAybmQgbGluZSBpbmNsdWRpbmcgbGluZSBicmVhawotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkxlbmd0aCk7CQotCXRyeSB7Ci0JCXRleHQucmVwbGFjZVRleHRSYW5nZSgtMSwgcmVwbGFjZUxlbmd0aCwgbmV3VGV4dCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6djoiLCBleGNlcHRpb25UaHJvd24pOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQucmVwbGFjZVRleHRSYW5nZSh0ZXh0LmdldENoYXJDb3VudCgpICsgMSwgcmVwbGFjZUxlbmd0aCwgbmV3VGV4dCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6dzoiLCBleGNlcHRpb25UaHJvd24pOwotCWFzc2VydFRydWUoIjp4OiIsIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IHNlbGVjdGlvblN0YXJ0ICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IHNlbGVjdGlvbkxlbmd0aCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0QWxsKCkgewotCVN0cmluZyBsaW5lID0gIkxpbmUxXHJMaW5lMiI7Ci0JCi0JdGV4dC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQkKLQl0ZXh0LnNldFRleHQobGluZSk7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMobGluZSwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCQotCXRleHQuc2V0VGV4dCgiIik7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDYXJldExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldCgpIHsKLQlDYXJldCBjYXJldCA9IG5ldyBDYXJldCh0ZXh0LCBTV1QuTk9ORSk7Ci0JZmluYWwgaW50IFhJTlNFVCA9IGlzQmlkaSgpID8gMiA6IDA7Ci0JCi0JdGV4dC5zZXRDYXJldChjYXJldCk7Ci0JYXNzZXJ0RXF1YWxzKFhJTlNFVCwgdGV4dC5nZXRDYXJldCgpLmdldExvY2F0aW9uKCkueCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2FyZXQoKS5nZXRMb2NhdGlvbigpLnkpOwotCi0JdGV4dC5zZXRDYXJldChudWxsKTsJCQotCXRleHQuc2V0VGV4dCgiXHJMaW5lMiIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIpOwotCi0JdGV4dC5zZXRUb3BJbmRleCgwKTsKLQl0ZXh0LnNldENhcmV0KGNhcmV0KTsKLQlhc3NlcnRUcnVlKHRleHQuZ2V0Q2FyZXQoKS5nZXRMb2NhdGlvbigpLnggPiAwKTsKLQlhc3NlcnRFcXVhbHModGV4dC5nZXRMaW5lSGVpZ2h0KCksIHRleHQuZ2V0Q2FyZXQoKS5nZXRMb2NhdGlvbigpLnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJpZGlDb2xvcmluZ1ooKSB7Ci0JLy8vIHNldEJpZGlDb2xvcmluZyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQuCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJpZGlDb2xvcmluZ1ogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDYXJldE9mZnNldEkoKXsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KC0yKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCgxKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCgwKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0KLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbiIpOwotCXRleHQuc2V0Q2FyZXRPZmZzZXQoLTIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KDEpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAxKTsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KDApOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQotCXRleHQuc2V0Q2FyZXRPZmZzZXQodGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuc2V0Q2FyZXRPZmZzZXQodGV4dC5nZXRDaGFyQ291bnQoKSArIDEpOwotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KDUpOwotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSA1KTsKLQotCXRleHQuc2V0VGV4dCgiIik7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCgtMik7Ci0JYXNzZXJ0VHJ1ZSgiOmo6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCXRleHQuc2V0Q2FyZXRPZmZzZXQoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOms6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCXRleHQuc2V0Q2FyZXRPZmZzZXQoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmw6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCgpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93bjsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gbmV3IFN0eWxlZFRleHRDb250ZW50KCkgewotCQlwdWJsaWMgdm9pZCBhZGRUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQkJcHVibGljIGludCBnZXRDaGFyQ291bnQoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldExpbmUoaW50IGxpbmVJbmRleCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZUNvdW50KCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0QXRMaW5lKGludCBsaW5lSW5kZXgpIHsKLQkJCXJldHVybiAwOwotCQl9CQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyKFRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlcGxhY2VUZXh0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgcmVwbGFjZUxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCX0KLQl9OwotCXRleHQuc2V0Q29udGVudChjb250ZW50KTsKLQlhc3NlcnRFcXVhbHMoY29udGVudCwgdGV4dC5nZXRDb250ZW50KCkpOwotCQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQuc2V0Q29udGVudChudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREb3VibGVDbGlja0VuYWJsZWRaKCl7Ci0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSB0cnVlKTsKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgPT0gdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWRpdGFibGVaKCl7Ci0JdGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gdHJ1ZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IGZhbHNlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKXsKLQlGb250RGF0YSBmb250RGF0YSA9IHRleHQuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JaW50IGxpbmVIZWlnaHQ7Ci0JRm9udCBmb250OwotCQotCWZvbnQgPSBuZXcgRm9udCh0ZXh0LmdldERpc3BsYXkoKSwgZm9udERhdGEuZ2V0TmFtZSgpLCAyMCwgZm9udERhdGEuZ2V0U3R5bGUoKSk7Ci0JdGV4dC5zZXRGb250KGZvbnQpOwotCWxpbmVIZWlnaHQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKTsKLQl0ZXh0LnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JZm9udCA9IG5ldyBGb250KHRleHQuZ2V0RGlzcGxheSgpLCBmb250RGF0YS5nZXROYW1lKCksIDI1LCBmb250RGF0YS5nZXRTdHlsZSgpKTsKLQl0ZXh0LnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRMaW5lSGVpZ2h0KCkgPiBsaW5lSGVpZ2h0ICYmIGZvbnQuZXF1YWxzKHRleHQuZ2V0Rm9udCgpKSk7Ci0JdGV4dC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEhvcml6b250YWxJbmRleEkoKXsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQkKLQl0ZXh0LnNldFRleHQoIkxpbmUwIik7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoLTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMSk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoNTAwKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID4gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoLTEpOwkKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDEpOwkKLQotCXRleHQuc2V0VGV4dCgiIik7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMik7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQotCS8vIG1ha2Ugc3VyZSB0aGUgd2lkZ2V0IGNhbiBiZSBzY3JvbGxlZAotCXNoZWxsLm9wZW4oKTsKLQl0ZXh0LnNldFNpemUoMTAsIDUwKTsJCi0JdGV4dC5zZXRUZXh0KCJMaW5lMCIpOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEhvcml6b250YWxQaXhlbEkoKXsKLQl0ZXh0LnNldEhvcml6b250YWxQaXhlbCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxQaXhlbCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQkKLQl0ZXh0LnNldFRleHQoIkxpbmUwIik7Ci0JdGV4dC5zZXRIb3Jpem9udGFsUGl4ZWwoLTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsUGl4ZWwoMSk7CQotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMSk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsUGl4ZWwoNTAwKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID4gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsUGl4ZWwoLTEpOwkKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbFBpeGVsKDI1KTsJCi0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAyNSk7CQotCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnNldEhvcml6b250YWxQaXhlbCgyKTsKLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCi0JLy8gbWFrZSBzdXJlIHRoZSB3aWRnZXQgY2FuIGJlIHNjcm9sbGVkCi0Jc2hlbGwub3BlbigpOwotCXRleHQuc2V0U2l6ZSgxMCwgNTApOwkKLQl0ZXh0LnNldFRleHQoIkxpbmUwIik7Ci0JdGV4dC5zZXRIb3Jpem9udGFsUGl4ZWwoNSk7CQotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gNSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TGluZUJhY2tncm91bmRJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKXsKLQlTdHJpbmcgdGV4dFN0cmluZzsKLQotCXRleHRTdHJpbmcgPSAiTDFcbkwyXG5MM1xuTDQiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihCTFVFKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgzLDEsZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSw1LCIiKTsKLQlhc3NlcnRUcnVlKCI6MGE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MGE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihHUkVFTikpOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihCTFVFKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgzLDEsZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCw0LCIiKTsKLQlhc3NlcnRUcnVlKCI6MGI6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihZRUxMT1cpKTsKLQlhc3NlcnRUcnVlKCI6MGI6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihCTFVFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBiOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMikgPT0gZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDEsZ2V0Q29sb3IoQkxVRSkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMywxLGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsMSwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBjOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBjOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBjOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMikgPT0gZ2V0Q29sb3IoQkxVRSkpOwotCWFzc2VydFRydWUoIjowYzoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDMpID09IGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKEJMVUUpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDMsMSxnZXRDb2xvcihHUkVFTikpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDYsIiIpOwotCWFzc2VydFRydWUoIjowZDoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKEJMVUUpKTsKLQlhc3NlcnRUcnVlKCI6MGQ6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihHUkVFTikpOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihCTFVFKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgzLDEsZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSwzLCIiKTsKLQlhc3NlcnRUcnVlKCI6MGU6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MGU6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihCTFVFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBlOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMikgPT0gZ2V0Q29sb3IoR1JFRU4pKTsKLQotCXRleHRTdHJpbmcgPSAiTDFcbkwyIjsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsNCwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBhMToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCw0LCIiKTsKLQlhc3NlcnRUcnVlKCI6MGIxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxLDEsIiIpOwotCWFzc2VydFRydWUoIjowYzE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MGMxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDUsIiIpOwotCWFzc2VydFRydWUoIjowZDE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsMywiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBlMToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjowZTE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBudWxsKTsKLQl0ZXh0U3RyaW5nID0gIkwxXG5MMiI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxLDQsIiIpOwotCWFzc2VydFRydWUoIjowZjE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZysiXG4iKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCw2LCIiKTsKLQlhc3NlcnRUcnVlKCI6MGcxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gbnVsbCk7Ci0JCQkJCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwwLGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjoxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gbnVsbCk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihSRUQpKTsKLQkKLQl0ZXh0U3RyaW5nID0gIk5ldyBMaW5lMVxuTmV3IExpbmUyXG5OZXcgTGluZTNcbk5ldyBMaW5lNCI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwyLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwyLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDAsIlxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjoyOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMikgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgzKSA9PSBnZXRDb2xvcihZRUxMT1cpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDQpID09IGdldENvbG9yKFlFTExPVykpOwotCQotCXRleHRTdHJpbmcgPSAiTmV3IExpbmUxXG5OZXcgTGluZTJcbk5ldyBMaW5lM1xuTmV3IExpbmU0IjsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDIsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDIsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsMjAsIiIpOwotCWFzc2VydFRydWUoIjozOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihZRUxMT1cpKTsKLQotCXRleHRTdHJpbmcgPSAiTGluZTFcbkxpbmUyXG5MaW5lM1xuTGluZTQiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwxOCwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQotCXRleHRTdHJpbmcgPSAiTGluZTFcbkxpbmUyXG5MaW5lM1xuTGluZTQiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwxOCwiTDFcbkwyXG5MM1xuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjU6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQlhc3NlcnRUcnVlKCI6NToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IG51bGwpOwotCWFzc2VydFRydWUoIjo1OiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMikgPT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgzKSA9PSBudWxsKTsKLQotCXRleHRTdHJpbmcgPSAiTGluZTFcbkxpbmUyXG5MaW5lM1xuTGluZTQiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihCTFVFKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgzLDEsZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMyw5LCJMMVxuTDJcbiIpOwotCWFzc2VydFRydWUoIjo2YToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjo2YToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IG51bGwpOwotCXRleHRTdHJpbmcgPSAiTGluZTFcbkxpbmUyXG5MaW5lM1xuTGluZTQiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihCTFVFKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgzLDEsZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMTEsMTEsIkwzXG5MNCIpOwotCWFzc2VydFRydWUoIjo2YjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDIpID09IG51bGwpOwotCWFzc2VydFRydWUoIjo2YjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDMpID09IG51bGwpOwotCQkKLQl0ZXh0U3RyaW5nID0gIkxpbmUxXG5MaW5lMlxuTGluZTNcbkxpbmU0IjsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDEsZ2V0Q29sb3IoQkxVRSkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMywxLGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsMTgsIkwxXG4iKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IG51bGwpOwotCWFzc2VydFRydWUoIjo3OiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gZ2V0Q29sb3IoR1JFRU4pKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRPcmllbnRhdGlvbkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE9yaWVudGF0aW9uSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkkoKSB7Ci0JaW50W10gaW52YWxpZCA9IHstMSwgMTAwLCAxMn07Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWQubGVuZ3RoOyBpKyspIHsKLQkJdHJ5IHsKLQkJCXRleHQuc2V0U2VsZWN0aW9uKGludmFsaWRbaV0pOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgic2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24gZm9yIG91dCBvZiByYW5nZSIpOwotCQl9Ci0JfQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMTEpOwotCWFzc2VydEVxdWFscygxMSwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZC5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJdGV4dC5zZXRTZWxlY3Rpb24oaW52YWxpZFtpXSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiBmb3Igb3V0IG9mIHJhbmdlIik7Ci0JCX0KLQl9CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JUG9pbnRbXSBpbnZhbGlkUmFuZ2VzID0ge25ldyBQb2ludCgtMSwgMCksIG5ldyBQb2ludCgtMSwgLTEpLCBuZXcgUG9pbnQoMTAwLCAxKSwgCi0JCW5ldyBQb2ludCgxMDAsIC0xKSwgbmV3IFBvaW50KDExLCAxMiksIG5ldyBQb2ludCgxMCwgMTIpfTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFJhbmdlcy5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJdGV4dC5zZXRTZWxlY3Rpb24oaW52YWxpZFJhbmdlc1tpXSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiBmb3Igb3V0IG9mIHJhbmdlIik7Ci0JCX0KLQl9CQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigzLCA3KTsKLQlhc3NlcnRFcXVhbHMoIjM0NTYiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJdHJ5IHsKLQkJCXRleHQuc2V0U2VsZWN0aW9uKGludmFsaWRSYW5nZXNbaV0pOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgic2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24gZm9yIG91dCBvZiByYW5nZSIpOwotCQl9Ci0JfQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JSSgpewotCWludFtdW10gaW52YWxpZFJhbmdlcyA9IHt7LTEsIDB9LCB7LTEsIC0xfSwgezEwMCwgMX0sIHsxMDAsIC0xfSwgezExLCAxMn0sIHsxMCwgMTJ9LCB7MiwgLTN9LCB7NTAsIC0xfX07Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gaW52YWxpZFJhbmdlc1tpXVswXTsKLQkJaW50IGVuZCA9IGludmFsaWRSYW5nZXNbaV1bMV07Ci0JCi0JCXRyeSB7Ci0JCQl0ZXh0LnNldFNlbGVjdGlvbihzdGFydCwgZW5kKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIGZvciBvdXQgb2YgcmFuZ2UiKTsKLQkJfQotCX0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDMsIDcpOwotCWFzc2VydEVxdWFscygiMzQ1NiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigzLCAwKTsKLQlhc3NlcnRFcXVhbHMoIjAxMiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsJCi0KLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gaW52YWxpZFJhbmdlc1tpXVswXTsKLQkJaW50IGVuZCA9IGludmFsaWRSYW5nZXNbaV1bMV07Ci0JCi0JCXRyeSB7Ci0JCQl0ZXh0LnNldFNlbGVjdGlvbihzdGFydCwgZW5kKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIGZvciBvdXQgb2YgcmFuZ2UiKTsKLQkJfQotCX0JCi19Ci1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCl7Ci0JdGV4dC5zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKGdldENvbG9yKFlFTExPVykpOwotCWFzc2VydFRydWUoIjoxYToiLCB0ZXh0LmdldFNlbGVjdGlvbkJhY2tncm91bmQoKSA9PSAgZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKG51bGwpOwotCWFzc2VydFRydWUoIjoxYjoiLCB0ZXh0LmdldFNlbGVjdGlvbkJhY2tncm91bmQoKS5lcXVhbHModGV4dC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OKSkpOwotfQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpewotCXRleHQuc2V0U2VsZWN0aW9uRm9yZWdyb3VuZChnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgdGV4dC5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCkgPT0gIGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0U2VsZWN0aW9uRm9yZWdyb3VuZChudWxsKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgdGV4dC5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCkuZXF1YWxzKHRleHQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTl9URVhUKSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvblJhbmdlSUkoKXsKLQkvLyBzZXRTZWxlY3Rpb25SYW5nZSBhbHJlYWR5IHRlc3RlZCBpbiB0ZXN0X2dldFNlbGVjdGlvblJhbmdlCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U3R5bGVSYW5nZUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoKXsKLQlTdHlsZVJhbmdlW10gc3R5bGVzOwotCVN0cmluZyB0ZXh0U3RyaW5nID0gdGV4dFN0cmluZygpOwotCi0JLyogCi0JCWRlZmF1bHRTdHlsZXMKLQkJCi0JCQkoMCw0OCxSRUQsWUVMTE9XKSwgCi0JCQkoNTgsMTAsQkxVRSxDWUFOKSwgCi0JCQkoNjgsMTAsR1JFRU4sUFVSUExFKQotCSovCi0KLQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQkKLQkvLyBObyBvdmVybGFwIHdpdGggZXhpc3Rpbmcgc3R5bGVzCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0OCw1LFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDQ4LDUsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCS8vIE92ZXJsYXAgbWlkZGxlIG9mIG9uZSBzdHlsZSAtIHBhcnRpYWwKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDEwLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEwLDEwLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyMCwyOCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1s0XS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShudWxsKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQkKLQkvLyBPdmVybGFwIG1pZGRsZSBvZiBvbmUgc3R5bGUgLSBmdWxsCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1OCwxMCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCQotCS8vIE92ZXJsYXAgZW5kIG9mIG9uZSBzdHlsZQotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMzgsMTUsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwzOCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMzgsMTUsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQkKLQkvLyBPdmVybGFwIGJlZ2lubmluZyBvZiBvbmUgc3R5bGUKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUwLDEwLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUwLDEwLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2MCw4LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCS8vIE92ZXJsYXAgY29tcGxldGUgc3R5bGUKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQ4LDIwLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDQ4LDIwLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0JCQkKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0OCwyMCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSk7Ci0JLy8gc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHN0eWxlIGJlZm9yZSBpdAotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0OCwxMCxSRUQsWUVMTE9XKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDU4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxNSwxMCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMjUsMTAsR1JFRU4sUFVSUExFKSk7Ci0JLy8gc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHN0eWxlIGFmdGVyIGl0Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDExLDQsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxMSwxNCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyNSwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTUsMTAsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDI1LDEwLEdSRUVOLFBVUlBMRSkpOwotCS8vIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBzdHlsZSBhZnRlciBpdAotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDE1LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDIwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDI1LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDEwLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDMsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMiw1LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMTAsQkxVRSxDWUFOKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDUsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDUsR1JFRU4sUFVSUExFKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNSxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDUsUkVELFlFTExPVykpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxNSxSRUQsWUVMTE9XKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDUsQkxVRSxDWUFOKSk7Ci0JLy8gc2hvdWxkIGJlIG1lcmdlZAotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDcsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMTAsQkxVRSxDWUFOKSkpOwotCi0JdGV4dC5zZXRUZXh0KCIxMjMgNDU2IDc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0LDMsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDgsMyxSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDIsQkxVRSxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo3OiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjc6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg0LDMsQkxVRSxudWxsKSkpOwotCWFzc2VydFRydWUoIjo3OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoOCwzLFJFRCxudWxsKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMTIzIDQ1NiA3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNCwzLEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg4LDMsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNyw0LEJMVUUsbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6ODoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo4OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNCw3LEJMVUUsbnVsbCkpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjEyMyA0NTYgNzg5IEFCQyBERUYiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw0LEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0LDQsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoOCw0LEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMiw0LFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE2LDMsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMTQsUkVELG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNCxCTFVFLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg0LDE1LFJFRCxudWxsKSkpOwotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNDgsMjAsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzOCwyMCxudWxsLG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMzgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQlpbnQgbGVuZ3RoID0gdGV4dFN0cmluZy5sZW5ndGgoKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQ4LDIwLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCxsZW5ndGgsbnVsbCxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDMsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDMsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDksOCxHUkVFTixQVVJQTEUpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwxMCxHUkVFTixQVVJQTEUpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMTcsR1JFRU4sUFVSUExFKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDUsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDUsR1JFRU4sUFVSUExFKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDcsOSxSRUQsWUVMTE9XKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMixCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg3LDksUkVELFlFTExPVykpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw1LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzLDEwLEdSRUVOLFBVUlBMRSkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwzLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgzLDEwLEdSRUVOLFBVUlBMRSkpKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDEzLDIsQkxVRSxDWUFOKSkpOwotCQotCXRleHQuc2V0VGV4dCgicmVkZ3JlZW5ibHVleWVsbG93Y3lhbnB1cnBsZSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDMsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMyw1LEdSRUVOLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoOCw0LEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMiw2LFlFTExPVyxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE4LDQsQ1lBTixudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDIyLDYsUFVSUExFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoOCwxNCxudWxsLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwzLFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMyw1LEdSRUVOLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg4LDE0LG51bGwsUkVEKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoMjIsNixQVVJQTEUsbnVsbCkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KCJyZWRncmVlbmJsdWV5ZWxsb3djeWFucHVycGxlIik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMyxSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzLDUsR1JFRU4sbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg4LDQsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEyLDYsWUVMTE9XLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTgsNCxDWUFOLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMjIsNixQVVJQTEUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDI4LG51bGwsbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCi0KLS8qCi0JdGV4dC5zZXRUZXh0KCJUaGlzXHJcbmFcdEFub3RoZXIgbGluZS4iKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMywzLEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg3LDgsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDYsMSxCTFVFLG51bGwpKTsKLQlTdHlsZWRUZXh0RXZlbnQgZXZlbnQgPSBuZXcgU3R5bGVkVGV4dEV2ZW50KCk7Ci0JZXZlbnQuZGV0YWlsID0gNjsKLQlldmVudC50ZXh0ID0gImFcdEFub3RoZXIgbGluZS4iOwotCXRleHQubm90aWZ5TGlzdGVuZXIoU1QuTGluZUdldFN0eWxlLCBldmVudCk7Ci0JYXNzZXJ0VHJ1ZSgiOjg6IiwgZXZlbnQuc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgzLDQsQkxVRSxudWxsKSkpOwotKi8KLQotCi0JdGV4dC5zZXRUZXh0KCIxMjMgNDU2IDc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0LDMsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDgsMyxSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDUsQkxVRSxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg0LDYsQkxVRSxudWxsKSkpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMSxSRUQsbnVsbCkpKTsKLQotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JdGV4dFN0cmluZyA9IHRleHRTdHJpbmcoKTsKLQkJCQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQ4LDIwLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKTsKLQkvLyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggc3R5bGUgYmVmb3JlIGl0Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQ4LDEwLFJFRCxZRUxMT1cpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNTgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTUsMTAsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDI1LDEwLEdSRUVOLFBVUlBMRSkpOwotCS8vIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBzdHlsZSBhZnRlciBpdAotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMSw0LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMTEsMTQsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMjUsMTAsR1JFRU4sUFVSUExFKSkpOwotCQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE1LDEwLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyNSwxMCxHUkVFTixQVVJQTEUpKTsKLQkvLyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggc3R5bGUgYWZ0ZXIgaXQKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwxNSxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwyMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyNSwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsMTAsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMyxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEyLDUsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxMCwxMCxCTFVFLENZQU4pKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNSxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNSxHUkVFTixQVVJQTEUpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw1LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNSxSRUQsWUVMTE9XKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDE1LFJFRCxZRUxMT1cpKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNSxCTFVFLENZQU4pKTsKLQkvLyBzaG91bGQgYmUgbWVyZ2VkCi0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNyxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwxMCxCTFVFLENZQU4pKSk7Ci0KLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCXRleHRTdHJpbmcgPSB0ZXh0U3RyaW5nKCk7Ci0KLQotCS8qIAotCQlkZWZhdWx0U3R5bGVzCi0JCQotCQkJKDAsNDgsUkVELFlFTExPVyksIAotCQkJKDU4LDEwLEJMVUUsQ1lBTiksIAotCQkJKDY4LDEwLEdSRUVOLFBVUlBMRSkKLQkqLwotCi0KLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JCi0JLy8gRW5kL0JlZ2lubmluZyBvdmVybGFwCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzOCwyNSxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDM4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgzOCwyNSxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjMsNSxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg2MywxMCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1OCw1LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDYzLDEwLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg3Myw1LEdSRUVOLFBVUlBMRSkpKTsKLQotCi0JLy8gQ29tcGxldGUgb3ZlcmxhcAotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw3OCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDc4LFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDY4LFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNjgsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDU4LDIwLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDU4LDIwLFlFTExPVyxSRUQpKSk7Ci0KLQotCS8vIDEtTiBjb21wbGV0ZSwgYmVnaW5uaW5nCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKCAKLQkJbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoMCw1LFJFRCxSRUQpLCBnZXRTdHlsZSg1LDUsWUVMTE9XLFlFTExPVyksCi0JCQlnZXRTdHlsZSgxMCw1LENZQU4sQ1lBTiksIGdldFN0eWxlKDE1LDUsQkxVRSxCTFVFKSwKLQkJCWdldFN0eWxlKDIwLDUsR1JFRU4sR1JFRU4pLCBnZXRTdHlsZSgyNSw1LFBVUlBMRSxQVVJQTEUpfQotCSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMjMsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDIzLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyOCwyLFBVUlBMRSxQVVJQTEUpKSk7Ci0JCi0JLy8gZW5kLCAxLU4gY29tcGxldGUsIGJlZ2lubmluZwotCXRleHQuc2V0U3R5bGVSYW5nZXMoIAotCQluZXcgU3R5bGVSYW5nZVtdIHtnZXRTdHlsZSgwLDUsUkVELFJFRCksIGdldFN0eWxlKDUsNSxZRUxMT1csWUVMTE9XKSwKLQkJCWdldFN0eWxlKDEwLDUsQ1lBTixDWUFOKSwgZ2V0U3R5bGUoMTUsNSxCTFVFLEJMVUUpLAotCQkJZ2V0U3R5bGUoMjAsNSxHUkVFTixHUkVFTiksIGdldFN0eWxlKDI1LDUsUFVSUExFLFBVUlBMRSl9Ci0JKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTMsMTIsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXMubGVuZ3RoID09IDUpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDUsWUVMTE9XLFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDEwLDMsQ1lBTixDWUFOKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoMTMsMTIsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbNF0uZXF1YWxzKGdldFN0eWxlKDI1LDUsUFVSUExFLFBVUlBMRSkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KCJ4LyIpOwkKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwyLFlFTExPVyxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDIsWUVMTE9XLG51bGwpKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsMCwiLyIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwyLFlFTExPVyxudWxsKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDEsWUVMTE9XLG51bGwpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwyLFlFTExPVyxudWxsKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxLDIsUkVELG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMSxZRUxMT1csbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEsMixSRUQsbnVsbCkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KCJ4eHgvIik7CQotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDIsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMiwyLFlFTExPVyxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMixSRUQsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgyLDIsWUVMTE9XLG51bGwpKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDQsMCwiLyIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDIsUkVELG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMiwyLFlFTExPVyxudWxsKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyLDEsWUVMTE9XLG51bGwpKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDIsUkVELG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMiwyLFlFTExPVyxudWxsKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzLDIsUkVELG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwyLFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDIsMSxZRUxMT1csbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgzLDIsUkVELG51bGwpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCgieHh4LyIpOwkKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwyLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDIsMixZRUxMT1csbnVsbCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg0LDAsIi8iKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDIsMSxZRUxMT1csbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyLDMsUkVELG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxudWxsKSkpOwotCi0KLQl0ZXh0LnNldFRleHQoInh4eC8iKTsJCi0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMixSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyLDIsWUVMTE9XLG51bGwpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNCwwLCIvIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyLDEsWUVMTE9XLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMSw0LFlFTExPVyxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0YzoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo0YzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMSxSRUQsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NGM6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxLDQsWUVMTE9XLG51bGwpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCgiTmV3XHJcbiIpOwotCVN0eWxlUmFuZ2Ugc3R5bGUgPSBnZXRTdHlsZSgwLDUsbnVsbCxudWxsKTsKLQlzdHlsZS5mb250U3R5bGUgPSBTV1QuQk9MRDsJCi0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQkvLyBzdHlsZXMgKDAsNSxCT0xEKQotCXRleHQucmVwbGFjZVRleHRSYW5nZSgzLDAsImEiKTsgLy8gIk5ld2FcclxuIgotCS8vIHN0eWxlcyAoMCwzLEJPTEQpLCAoNCwyLEJPTEQpCi0Jc3R5bGUgPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldCg0KTsKLQlzdHlsZS5zdGFydCA9IDM7Ci0Jc3R5bGUubGVuZ3RoID0gMTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCS8vIHN0eWxlcyAoMCw2LEJPTEQpCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsMCwiYSIpOyAvLyAiYU5ld2FcclxuIgotCS8vIHN0eWxlcyAoMSw2LEJPTEQpCi0Jc3R5bGUgPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldCgxKTsKLQlzdHlsZS5zdGFydCA9IDA7Ci0Jc3R5bGUubGVuZ3RoID0gMTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCS8vIHN0eWxlcyAoMCw3LEJPTEQpCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsMSwiIik7IC8vICJOZXdhXHJcbiIKLQkvLyBzdHlsZXMgKDAsNixCT0xEKQotCWZvciAoaW50IGk9MDsgaTw2OyBpKyspIHsKLQkJc3R5bGUgPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChpKTsKLQkJYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGUuZm9udFN0eWxlID09IFNXVC5CT0xEKTsKLQl9Ci0KLQotCXRleHQuc2V0VGV4dCgiTmV3IEwgMVxyXG5OZXcgTCAyXHJcbiIpOwotCXN0eWxlID0gZ2V0U3R5bGUoMCw5LG51bGwsbnVsbCk7Ci0Jc3R5bGUuZm9udFN0eWxlID0gU1dULkJPTEQ7CQotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JLy8gc3R5bGVzICgwLDksQk9MRCkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNywwLCJhIik7Ci0JLy8gc3R5bGVzICgwLDcsQk9MRCksICg4LDIsQk9MRCkKLQlzdHlsZSA9IHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDgpOwotCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCXN0eWxlLnN0YXJ0ID0gNzsKLQkJc3R5bGUubGVuZ3RoID0gMTsKLQkJdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQl9Ci0JLy8gc3R5bGVzICgwLDEwLEJPTEQpCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDQsMCwiYSIpOwotCS8vIHN0eWxlcyAoMCw0LEJPTEQpLCAoNSw2LEJPTEQpCi0Jc3R5bGUgPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldCg1KTsKLQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQlzdHlsZS5zdGFydCA9IDQ7Ci0JCXN0eWxlLmxlbmd0aCA9IDE7Ci0JCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JfQotCS8vIHN0eWxlcyAoMCwxMSxCT0xEKQotCXRleHQucmVwbGFjZVRleHRSYW5nZSgyLDMsIiIpOwotCS8vIHN0eWxlcyAoMCw4LEJPTEQpCi0JZm9yIChpbnQgaT0wOyBpPDg7IGkrKykgewotCQlzdHlsZSA9IHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGkpOwotCQlhc3NlcnRUcnVlKCI6NWE6Iiwgc3R5bGUuZm9udFN0eWxlID09IFNXVC5CT0xEKTsKLQl9Ci0KLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCQotCS8vCQkJCQkiMDEyMzQ1Njc4OTAxMjMiCi0JdGV4dFN0cmluZyA9IAkJIjEyMzQgMTIzNCAxMjM0IjsKLQotCi0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDIsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDcsMixZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNiwyLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzLDQsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgzLDYsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDcsNCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo1YToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo1YToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsNixZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzLDEwLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjdhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMywxMCxZRUxMT1csUkVEKSkpOwotCi0KLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMixCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MWI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg3LDIsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDcsMixCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNywyLEJMVUUsQ1lBTikpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDYsMixCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwxLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNiwyLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6M2I6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg4LDEsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDMsNCxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMyw0LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6NGI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg3LDIsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDcsNCxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjViOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjViOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjViOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNyw0LEJMVUUsQ1lBTikpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjZiOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZiOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDMsMTAsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo3YjoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo3YjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDMsMTAsQkxVRSxDWUFOKSkpOwotCi0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0KLQkvLwkJCSAJCSIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjMiCi0JU3RyaW5nIHRlc3RTdHJpbmc9CSIxMjM0IDEyMzQgMTIzNCAxMjM0IDEyMzQiOwotCQotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEyLDIsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMixZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEwLDIsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMixZRUxMT1csUkVEKSkpOwotCi0KLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxMiw0LCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDEwLDIsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg4LDQsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoOCwyLFlFTExPVyxSRUQpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDgsNiwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMTAsNiwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoOCwxMiwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo3OiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JCi0JLy8JCQkgCQkJIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMyIKLQkvLwlTdHJpbmcgdGVzdFN0cmluZz0JIjEyMzQgMTIzNCAxMjM0IDEyMzQgMTIzNCI7Ci0JCi0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg1LDcsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6ODoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo4OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg3LDcsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLEJMVUUsQ1lBTikpKTsKLQotCi0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgyLDEwLCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMiwyLFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg3LDksIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MTE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MTE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDIsQkxVRSxDWUFOKSkpOwotCi0KLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDUsOSwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxMjoiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywxMywiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxMToiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCi0KLQkvLwkJCSAJCQkiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzIgotCS8vCVN0cmluZyB0ZXN0U3RyaW5nPQkiMTIzNCAxMjM0IDEyMzQgMTIzNCAxMjM0IjsKLQkKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE1LDQsR1JFRU4sUFVSUExFKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDcsMTIsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MTQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MTQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDIsQkxVRSxDWUFOKSkpOwotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTUsNCxHUkVFTixQVVJQTEUpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNSwxMiwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxNToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxNToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsMixHUkVFTixQVVJQTEUpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTUsNCxHUkVFTixQVVJQTEUpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoOSwxMCwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxNjoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxNjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKSk7Ci0KLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCVN0eWxlUmFuZ2Ugc3R5bGUxID0gZ2V0U3R5bGUoMCwwLG51bGwsbnVsbCk7Ci0KLQotCVN0eWxlUmFuZ2Ugc3R5bGUyID0gZ2V0U3R5bGUoMCwwLFJFRCxZRUxMT1cpOwotCi0KLQlhc3NlcnRUcnVlKCI6MToiLCAhc3R5bGUxLmVxdWFscyhzdHlsZTIpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCAhc3R5bGUxLnNpbWlsYXJUbyhzdHlsZTIpKTsKLQotCi0JYXNzZXJ0VHJ1ZSgiOjE6IiwgIXN0eWxlMi5lcXVhbHMoc3R5bGUxKSk7Ci0KLQotCWFzc2VydFRydWUoIjoxOiIsICFzdHlsZTIuc2ltaWxhclRvKHN0eWxlMSkpOwotCi0KLQotCXN0eWxlMSA9IGdldFN0eWxlKDAsMTAsUkVELFlFTExPVyk7Ci0Jc3R5bGUyID0gZ2V0U3R5bGUoMTEsNSxSRUQsWUVMTE9XKTsKLQotCi0JYXNzZXJ0VHJ1ZSgiOjI6IiwgIXN0eWxlMS5lcXVhbHMoc3R5bGUyKSk7Ci0KLQotCWFzc2VydFRydWUoIjoyOiIsICFzdHlsZTIuZXF1YWxzKHN0eWxlMSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlMS5zaW1pbGFyVG8oc3R5bGUyKSk7Ci0KLQotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlMi5zaW1pbGFyVG8oc3R5bGUxKSk7Ci0KLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFN0eWxlUmFuZ2VzJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlTdHlsZVJhbmdlW10gcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbXSB7Ci0JCW5ldyBTdHlsZVJhbmdlKDAsIDEsIGdldENvbG9yKFJFRCksIG51bGwpLCAKLQkJbmV3IFN0eWxlUmFuZ2UoMiwgMSwgZ2V0Q29sb3IoUkVEKSwgbnVsbCl9OwotCQotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuIik7Ci0JdHJ5IHsKLQkJdGV4dC5zZXRTdHlsZVJhbmdlcyhudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQotCXRleHQuc2V0U3R5bGVSYW5nZXMocmFuZ2VzKTsKLQlTdHlsZVJhbmdlW10gY3VycmVudFJhbmdlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRFcXVhbHMocmFuZ2VzLmxlbmd0aCwgY3VycmVudFJhbmdlcy5sZW5ndGgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudFJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlhc3NlcnRFcXVhbHMocmFuZ2VzW2ldLCBjdXJyZW50UmFuZ2VzW2ldKTsKLQl9Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyhuZXcgU3R5bGVSYW5nZVtdIHt9KTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRTdHlsZVJhbmdlcygpLmxlbmd0aCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGFic0koKXsKLQl0ZXh0LnNldFRhYnMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUYWJzKCkgPT0gMSk7Ci0JCi0JdGV4dC5zZXRUYWJzKDgpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VGFicygpID09IDgpOwotCXRleHQuc2V0VGV4dCgiTGluZVx0MVxyXG4iKTsKLQl0ZXh0LnNldFRhYnMoNyk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUYWJzKCkgPT0gNyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCl7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCQotCXRyeSB7Ci0JCXRleHQuc2V0VGV4dChudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQkKLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0KLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExpbWl0SSgpewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JdGV4dC5zZXRUZXh0TGltaXQoMTApOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VGV4dExpbWl0KCkgPT0gMTApOwotCi0JdGV4dC5zZXRUZXh0TGltaXQoLTEpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VGV4dExpbWl0KCkgPT0gLTEpOwotCi0JdHJ5IHsKLQkJdGV4dC5zZXRUZXh0TGltaXQoMCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6YzoiLCBleGNlcHRpb25UaHJvd24gPT0gdHJ1ZSk7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9wSW5kZXhJKCl7Ci0JdGV4dC5zZXRUb3BJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotCi0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG5MaW5lMGFcclxuIik7Ci0KLQl0ZXh0LnNldFRvcEluZGV4KC0yKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDEpOwotCXRleHQuc2V0VG9wSW5kZXgoMik7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDIpOwotCXRleHQuc2V0VG9wSW5kZXgoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoMyk7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDIpOwotCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnNldFRvcEluZGV4KDIpOwotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAwKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9wUGl4ZWxJKCl7Ci0JaW50IGxpbmVIZWlnaHQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKTsKLQkKLQl0ZXh0LnNldFRvcFBpeGVsKC0xKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BQaXhlbCgxKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0KLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbiIpOwotCQotCXRleHQuc2V0VG9wUGl4ZWwoLTIpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcFBpeGVsKC0xKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BQaXhlbCgxKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMSk7Ci0JdGV4dC5zZXRUb3BQaXhlbCgyICogbGluZUhlaWdodCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDIgKiBsaW5lSGVpZ2h0KTsKLQl0ZXh0LnNldFRvcFBpeGVsKDApOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcFBpeGVsKDMgKiBsaW5lSGVpZ2h0KTsKLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMiAqIGxpbmVIZWlnaHQpOwotCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnNldFRvcFBpeGVsKDIgKiBsaW5lSGVpZ2h0KTsKLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X3NldFdvcmRXcmFwWigpewotCVN0cmluZyB0ZXN0U3RyaW5nID0gIkxpbmUxXG5MaW5lMiI7Ci0JCi0JdGV4dC5zZXRXb3JkV3JhcCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFdvcmRXcmFwKCkpOwotCXRleHQuc2V0V29yZFdyYXAoZmFsc2UpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0V29yZFdyYXAoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRXb3JkV3JhcChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRXb3JkV3JhcCgpID09IGZhbHNlKTsKLQl0ZXh0LnNldFdvcmRXcmFwKHRydWUpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0V29yZFdyYXAoKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCWFzc2VydEVxdWFscygiOmU6IiwgdGVzdFN0cmluZywgdGV4dC5nZXRUZXh0KCkpOwotCWFzc2VydEVxdWFscygiOmY6IiwgMiwgdGV4dC5nZXRMaW5lQ291bnQoKSk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dTZWxlY3Rpb24oKSB7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbiIpOwotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoNSwgMik7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRFeHRlbmRlZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGluZUJhY2tncm91bmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExpbmVTdHlsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFZlcmlmeUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FwcGVuZExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29weSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY3V0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCYWNrZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCaWRpQ29sb3JpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENhcmV0T2Zmc2V0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGFyQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERvdWJsZUNsaWNrRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RWRpdGFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhvcml6b250YWxJbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SG9yaXpvbnRhbFBpeGVsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRLZXlCaW5kaW5nSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZUF0T2Zmc2V0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZUJhY2tncm91bmRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVEZWxpbWl0ZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExvY2F0aW9uQXRPZmZzZXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRPZmZzZXRBdExpbmVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRPZmZzZXRBdExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0T3JpZW50YXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvblJhbmdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25UZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdHlsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGVSYW5nZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0eWxlUmFuZ2VzSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRhYnMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dExpbWl0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0UmFuZ2VJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvcFBpeGVsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXb3JkV3JhcCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5zZXJ0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludm9rZUFjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Bhc3RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wcmludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3ByaW50TG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dFByaW50T3B0aW9ucyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVkcmF3Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZWRyYXdJSUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVkcmF3UmFuZ2VJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVFeHRlbmRlZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTGluZUJhY2tncm91bmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUxpbmVTdHlsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVZlcmlmeUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlcGxhY2VTdHlsZVJhbmdlc0lJJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlcGxhY2VUZXh0UmFuZ2VJSUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCaWRpQ29sb3JpbmdaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDYXJldExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2FyZXRPZmZzZXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREb3VibGVDbGlja0VuYWJsZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFZGl0YWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRIb3Jpem9udGFsSW5kZXhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRIb3Jpem9udGFsUGl4ZWxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRLZXlCaW5kaW5nSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExpbmVCYWNrZ3JvdW5kSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRPcmllbnRhdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvblJhbmdlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFN0eWxlUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTdHlsZVJhbmdlcyRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUYWJzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExpbWl0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BJbmRleEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvcFBpeGVsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0V29yZFdyYXBaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRCaWRpU2VnbWVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lciIpKSB0ZXN0X2FkZEJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRFeHRlbmRlZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciIpKSB0ZXN0X2FkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMaW5lQmFja2dyb3VuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lciIpKSB0ZXN0X2FkZExpbmVCYWNrZ3JvdW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMaW5lU3R5bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyIikpIHRlc3RfYWRkTGluZVN0eWxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpKSB0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRWZXJpZnlLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyIikpIHRlc3RfYWRkVmVyaWZ5S2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lciIpKSB0ZXN0X2FkZFZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FwcGVuZExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvcHkiKSkgdGVzdF9jb3B5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jdXQiKSkgdGVzdF9jdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmQiKSkgdGVzdF9nZXRCYWNrZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCaWRpQ29sb3JpbmciKSkgdGVzdF9nZXRCaWRpQ29sb3JpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENhcmV0T2Zmc2V0IikpIHRlc3RfZ2V0Q2FyZXRPZmZzZXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoYXJDb3VudCIpKSB0ZXN0X2dldENoYXJDb3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udGVudCIpKSB0ZXN0X2dldENvbnRlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERvdWJsZUNsaWNrRW5hYmxlZCIpKSB0ZXN0X2dldERvdWJsZUNsaWNrRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RWRpdGFibGUiKSkgdGVzdF9nZXRFZGl0YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpKSB0ZXN0X2dldEZvcmVncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhvcml6b250YWxJbmRleCIpKSB0ZXN0X2dldEhvcml6b250YWxJbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SG9yaXpvbnRhbFBpeGVsIikpIHRlc3RfZ2V0SG9yaXpvbnRhbFBpeGVsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRLZXlCaW5kaW5nSSIpKSB0ZXN0X2dldEtleUJpbmRpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lQXRPZmZzZXRJIikpIHRlc3RfZ2V0TGluZUF0T2Zmc2V0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZUJhY2tncm91bmRJIikpIHRlc3RfZ2V0TGluZUJhY2tncm91bmRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lQ291bnQiKSkgdGVzdF9nZXRMaW5lQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVEZWxpbWl0ZXIiKSkgdGVzdF9nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lSGVpZ2h0IikpIHRlc3RfZ2V0TGluZUhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9jYXRpb25BdE9mZnNldEkiKSkgdGVzdF9nZXRMb2NhdGlvbkF0T2Zmc2V0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0T2Zmc2V0QXRMaW5lSSIpKSB0ZXN0X2dldE9mZnNldEF0TGluZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE9mZnNldEF0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfZ2V0T2Zmc2V0QXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE9yaWVudGF0aW9uIikpIHRlc3RfZ2V0T3JpZW50YXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCIpKSB0ZXN0X2dldFNlbGVjdGlvbkJhY2tncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50IikpIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkZvcmVncm91bmQiKSkgdGVzdF9nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25SYW5nZSIpKSB0ZXN0X2dldFNlbGVjdGlvblJhbmdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25UZXh0IikpIHRlc3RfZ2V0U2VsZWN0aW9uVGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3R5bGUiKSkgdGVzdF9nZXRTdHlsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0SSIpKSB0ZXN0X2dldFN0eWxlUmFuZ2VBdE9mZnNldEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlUmFuZ2VzIikpIHRlc3RfZ2V0U3R5bGVSYW5nZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlUmFuZ2VzSUkiKSkgdGVzdF9nZXRTdHlsZVJhbmdlc0lJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUYWJzIikpIHRlc3RfZ2V0VGFicygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dCIpKSB0ZXN0X2dldFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRJSSIpKSB0ZXN0X2dldFRleHRJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dExpbWl0IikpIHRlc3RfZ2V0VGV4dExpbWl0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0UmFuZ2VJSSIpKSB0ZXN0X2dldFRleHRSYW5nZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BJbmRleCIpKSB0ZXN0X2dldFRvcEluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BQaXhlbCIpKSB0ZXN0X2dldFRvcFBpeGVsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRXb3JkV3JhcCIpKSB0ZXN0X2dldFdvcmRXcmFwKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnNlcnRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2luc2VydExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnZva2VBY3Rpb25JIikpIHRlc3RfaW52b2tlQWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcGFzdGUiKSkgdGVzdF9wYXN0ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcHJpbnQiKSkgdGVzdF9wcmludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIiKSkgdGVzdF9wcmludExvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0UHJpbnRPcHRpb25zIikpIHRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0UHJpbnRPcHRpb25zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWRyYXciKSkgdGVzdF9yZWRyYXcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZHJhd0lJSUlaIikpIHRlc3RfcmVkcmF3SUlJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZHJhd1JhbmdlSUlaIikpIHRlc3RfcmVkcmF3UmFuZ2VJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlQmlkaVNlZ21lbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxpbmVCYWNrZ3JvdW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTGluZUJhY2tncm91bmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxpbmVTdHlsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVMaW5lU3R5bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVZlcmlmeUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVWZXJpZnlLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVwbGFjZVN0eWxlUmFuZ2VzSUkkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSIpKSB0ZXN0X3JlcGxhY2VTdHlsZVJhbmdlc0lJJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlcGxhY2VUZXh0UmFuZ2VJSUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfcmVwbGFjZVRleHRSYW5nZUlJTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEFsbCIpKSB0ZXN0X3NlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmlkaUNvbG9yaW5nWiIpKSB0ZXN0X3NldEJpZGlDb2xvcmluZ1ooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENhcmV0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0IikpIHRlc3Rfc2V0Q2FyZXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENhcmV0T2Zmc2V0SSIpKSB0ZXN0X3NldENhcmV0T2Zmc2V0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50IikpIHRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvciIpKSB0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXREb3VibGVDbGlja0VuYWJsZWRaIikpIHRlc3Rfc2V0RG91YmxlQ2xpY2tFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RWRpdGFibGVaIikpIHRlc3Rfc2V0RWRpdGFibGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SG9yaXpvbnRhbEluZGV4SSIpKSB0ZXN0X3NldEhvcml6b250YWxJbmRleEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEhvcml6b250YWxQaXhlbEkiKSkgdGVzdF9zZXRIb3Jpem9udGFsUGl4ZWxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRLZXlCaW5kaW5nSUkiKSkgdGVzdF9zZXRLZXlCaW5kaW5nSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExpbmVCYWNrZ3JvdW5kSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0TGluZUJhY2tncm91bmRJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE9yaWVudGF0aW9uSSIpKSB0ZXN0X3NldE9yaWVudGF0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uRm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbklJIikpIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25SYW5nZUlJIikpIHRlc3Rfc2V0U2VsZWN0aW9uUmFuZ2VJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U3R5bGVSYW5nZUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UiKSkgdGVzdF9zZXRTdHlsZVJhbmdlTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U3R5bGVSYW5nZXMkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSIpKSB0ZXN0X3NldFN0eWxlUmFuZ2VzJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRhYnNJIikpIHRlc3Rfc2V0VGFic0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMaW1pdEkiKSkgdGVzdF9zZXRUZXh0TGltaXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcEluZGV4SSIpKSB0ZXN0X3NldFRvcEluZGV4SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9wUGl4ZWxJIikpIHRlc3Rfc2V0VG9wUGl4ZWxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRXb3JkV3JhcFoiKSkgdGVzdF9zZXRXb3JkV3JhcFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKSkgdGVzdF9zaG93U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkiKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotLyoqCi0gKiBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAxOTk4NQotICovCi1wcm90ZWN0ZWQgdm9pZCB0ZXN0UnRmQ29weSgpIHsKLQlTdHJpbmcgbGluZXMgPSAiTGluZTBcbkxpbmUxXG5MaW5lMlxuTGluZTNcbkxpbmU0XG5MaW5lNSI7Ci0JZmluYWwgaW50W10gbGluZXNDYWxsZWQgPSBuZXcgaW50W10gezB9OwotCUxpbmVTdHlsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpbmVTdHlsZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaW5lR2V0U3R5bGUoTGluZVN0eWxlRXZlbnQgZXZlbnQpIHsKLQkJCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQkJCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9IChTdHlsZWRUZXh0KSBldmVudC53aWRnZXQ7Ci0JCQlpbnQgbGluZUluZGV4ID0gc3R5bGVkVGV4dC5nZXRMaW5lQXRPZmZzZXQoZXZlbnQubGluZU9mZnNldCk7Ci0JCQlpbnQgbGluZVN0YXJ0ID0gZXZlbnQubGluZU9mZnNldDsKLQkJCWludCBsaW5lRW5kID0gbGluZVN0YXJ0ICsgZXZlbnQubGluZVRleHQubGVuZ3RoKCk7Ci0JCQlTdHlsZVJhbmdlIGdvb2RSYW5nZSA9IG5ldyBTdHlsZVJhbmdlKDAsIDEsIHJlZCwgcmVkKTsKLQkJCQotCQkJZXZlbnQuc3R5bGVzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JCQlzd2l0Y2ggKGxpbmVJbmRleCAlIDYpIHsKLQkJCQljYXNlIDA6Ci0JCQkJCWV2ZW50LnN0eWxlc1swXSA9IGdvb2RSYW5nZTsKLQkJCQkJZXZlbnQuc3R5bGVzWzFdID0gbmV3IFN0eWxlUmFuZ2UobGluZUVuZCwgMSwgcmVkLCByZWQpOwotCQkJCQlsaW5lc0NhbGxlZFswXSsrOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCWV2ZW50LnN0eWxlc1swXSA9IGdvb2RSYW5nZTsKLQkJCQkJZXZlbnQuc3R5bGVzWzFdID0gbmV3IFN0eWxlUmFuZ2UobGluZUVuZCwgLTEsIHJlZCwgcmVkKTsKLQkJCQkJbGluZXNDYWxsZWRbMF0rKzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQlldmVudC5zdHlsZXNbMF0gPSBnb29kUmFuZ2U7Ci0JCQkJCWV2ZW50LnN0eWxlc1sxXSA9IG5ldyBTdHlsZVJhbmdlKGxpbmVFbmQgLSAxLCAtMSwgcmVkLCByZWQpOwotCQkJCQlsaW5lc0NhbGxlZFswXSsrOwkKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOgotCQkJCQlldmVudC5zdHlsZXNbMF0gPSBnb29kUmFuZ2U7Ci0JCQkJCWV2ZW50LnN0eWxlc1sxXSA9IG5ldyBTdHlsZVJhbmdlKGxpbmVTdGFydCwgLTEsIHJlZCwgcmVkKTsKLQkJCQkJbGluZXNDYWxsZWRbMF0rKzsJCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDoKLQkJCQkJZXZlbnQuc3R5bGVzWzBdID0gbmV3IFN0eWxlUmFuZ2UobGluZVN0YXJ0LCAxLCByZWQsIHJlZCk7Ci0JCQkJCWV2ZW50LnN0eWxlc1sxXSA9IG5ldyBTdHlsZVJhbmdlKGxpbmVTdGFydCwgLTEsIHJlZCwgcmVkKTsKLQkJCQkJbGluZXNDYWxsZWRbMF0rKzsJCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNToKLQkJCQkJZXZlbnQuc3R5bGVzWzBdID0gbmV3IFN0eWxlUmFuZ2UobGluZUVuZCAvIDIsIDEsIHJlZCwgcmVkKTsKLQkJCQkJZXZlbnQuc3R5bGVzWzFdID0gbmV3IFN0eWxlUmFuZ2UobGluZUVuZCAvIDIsIC0xLCByZWQsIHJlZCk7Ci0JCQkJCWxpbmVzQ2FsbGVkWzBdKys7CQotCQkJCQlicmVhazsKLQkJCX0JCQkKLQkJfQotCX07Ci0JdGV4dC5zZXRUZXh0KGxpbmVzKTsJCi0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRTZWxlY3Rpb24oMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5hZGRMaW5lU3R5bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdGV4dC5jb3B5KCk7Ci0JYXNzZXJ0VHJ1ZSgibm90IGFsbCBsaW5lcyB0ZXN0ZWQgZm9yIFJURiBjb3B5IiwgbGluZXNDYWxsZWRbMF0gPT0gdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci0JCi0JQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQodGV4dC5nZXREaXNwbGF5KCkpOwotCVJURlRyYW5zZmVyIHJ0ZlRyYW5mZXIgPSBSVEZUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCVN0cmluZyBjbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHJ0ZlRyYW5mZXIpOwotCWFzc2VydFRydWUoIlJURiBjb3B5IGZhaWxlZCIsIGNsaXBib2FyZFRleHQubGVuZ3RoKCkgPiAwKTsKLQotCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci0JdGV4dC5yZW1vdmVMaW5lU3R5bGVMaXN0ZW5lcihsaXN0ZW5lcik7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vZGlmeSgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCdhJywgMCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTAsIDMsIENvbnNpc3RlbmN5VXRpbGl0eS5FU0NBUEVfTUVOVSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDMwLCAxMCwgNTAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4OGU5Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuQmlkaVV0aWw7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dENvbnRlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dENvbnRlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQlpbnQgWElOU0VUID0gMDsKLQotCWNsYXNzIENvbnRlbnRJbXBsZW1lbnRhdGlvbiBpbXBsZW1lbnRzIFN0eWxlZFRleHRDb250ZW50IHsKLQkJU3RyaW5nIHRleHRDb250ZW50ID0gIiI7Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKXsKLQkJfQotCQlwdWJsaWMgaW50IGdldENoYXJDb3VudCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JCQlyZXR1cm4gImdldExpbmUiOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZUNvdW50KCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCkgewotCQkJcmV0dXJuICJnZXRMaW5lRGVsaW1pdGVyIjsKLQkJfQotCQlwdWJsaWMgaW50IGdldE9mZnNldEF0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHRSYW5nZShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJCXJldHVybiB0ZXh0Q29udGVudDsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVwbGFjZVRleHRSYW5nZShpbnQgc3RhcnQsIGludCByZXBsYWNlTGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQkJdGV4dENvbnRlbnQgPSB0ZXh0OwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJCXRleHRDb250ZW50ID0gdGV4dDsKLQkJfQotCX0KLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gbmV3IENvbnRlbnRJbXBsZW1lbnRhdGlvbigpOwotCVNoZWxsIHNoZWxsOwotCVN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQkKLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcml2YXRlIGJvb2xlYW4gaXNCaWRpKCkgewotCXJldHVybiBCaWRpVXRpbC5pc0JpZGlQbGF0Zm9ybSgpOwotfQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JaWYgKGlzQmlkaSgpKSBYSU5TRVQgPSAyOwotCWVsc2UgWElOU0VUID0gMDsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXN0eWxlZFRleHQuc2V0Q29udGVudChjb250ZW50KTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkVGV4dENoYW5nZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyKCkgewotCS8vIGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gdGVzdCwgbm90IGNhbGxlZCBieSBTdHlsZWRUZXh0Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hhckNvdW50KCkgewotCWFzc2VydFRydWUoIjphOiIsIHN0eWxlZFRleHQuZ2V0Q2hhckNvdW50KCkgPT0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZUF0T2Zmc2V0SSgpIHsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzdHlsZWRUZXh0LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lQ291bnQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc3R5bGVkVGV4dC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lRGVsaW1pdGVyKCkgewotCWFzc2VydFRydWUoIjplOiIsIHN0eWxlZFRleHQuZ2V0TGluZURlbGltaXRlcigpLmVxdWFscygiZ2V0TGluZURlbGltaXRlciIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lSSgpIHsKLQkvLyB3aWxsIGluZGlyZWN0bHkgY2F1c2UgZ2V0TGluZSB0byBiZSBjYWxsZWQKLQlhc3NlcnRUcnVlKCI6YjoiLCBzdHlsZWRUZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMCkuZXF1YWxzKG5ldyBQb2ludChYSU5TRVQsMCkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRPZmZzZXRBdExpbmVJKCkgewotCS8vIHdpbGwgaW5kaXJlY3RseSBjYXVzZSBnZXRPZmZzZXRBdExpbmUgdG8gYmUgY2FsbGVkCi0JYXNzZXJ0VHJ1ZSgiOmY6Iiwgc3R5bGVkVGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDApLmVxdWFscyhuZXcgUG9pbnQoWElOU0VULDApKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dFJhbmdlSUkoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmc6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0UmFuZ2UoMCwwKS5lcXVhbHMoIiIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JLy8gZG9lcyBub3QgbWFrZSBzZW5zZSB0byB0ZXN0LCBub3QgY2FsbGVkIGJ5IFN0eWxlZFRleHQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZXBsYWNlVGV4dFJhbmdlSUlMamF2YV9sYW5nX1N0cmluZygpIHsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwwLCJ0ZXN0MSIpOwotCWFzc2VydFRydWUoIjpoOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygidGVzdDEiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLDAsInRlc3QyIik7Ci0JYXNzZXJ0VHJ1ZSgiOmk6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJ0ZXN0MiIpKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkVGV4dENoYW5nZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGFyQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVBdE9mZnNldEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVDb3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZURlbGltaXRlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE9mZnNldEF0TGluZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRSYW5nZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlcGxhY2VUZXh0UmFuZ2VJSUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIiKSkgdGVzdF9hZGRUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoYXJDb3VudCIpKSB0ZXN0X2dldENoYXJDb3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZUF0T2Zmc2V0SSIpKSB0ZXN0X2dldExpbmVBdE9mZnNldEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVDb3VudCIpKSB0ZXN0X2dldExpbmVDb3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZURlbGltaXRlciIpKSB0ZXN0X2dldExpbmVEZWxpbWl0ZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVJIikpIHRlc3RfZ2V0TGluZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE9mZnNldEF0TGluZUkiKSkgdGVzdF9nZXRPZmZzZXRBdExpbmVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0UmFuZ2VJSSIpKSB0ZXN0X2dldFRleHRSYW5nZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlcGxhY2VUZXh0UmFuZ2VJSUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfcmVwbGFjZVRleHRSYW5nZUlJTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVDdXJzb3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlQ3Vyc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ODU3OTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVDdXJzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUN1cnNvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUN1cnNvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlQ3Vyc29yIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlQ3Vyc29yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbHVtbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJvdygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Um93IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbklJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW1JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUN1cnNvcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSb3ciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1uIikpIHRlc3RfZ2V0Q29sdW1uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSb3ciKSkgdGVzdF9nZXRSb3coKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbklJIikpIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW1JIikpIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDcyZmVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUVkaXRvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kaXNwb3NlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb2x1bW4gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29sdW1uSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q29sdW1uSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb2x1bW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbHVtbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbiIpKSB0ZXN0X2dldENvbHVtbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbSIpKSB0ZXN0X2dldEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbHVtbkkiKSkgdGVzdF9zZXRDb2x1bW5JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW1JIikpIHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0iKSkgdGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlhMDc5NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0YWJsZVRyZWUgPSBuZXcgVGFibGVUcmVlKHNoZWxsLCBzdHlsZSA9IFNXVC5NVUxUSSk7Ci0Jc2V0V2lkZ2V0KHRhYmxlVHJlZSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0QWxsKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kZXNlbGVjdEFsbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUNvdW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUhlaWdodCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUhlaWdodCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQlpbnQgbnVtYmVyID0gODsKLQlUYWJsZVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVUcmVlSXRlbSh0YWJsZVRyZWUsIFNXVC5OT05FKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogQWZ0ZXIgYWRkaW5nIGl0ZW1zLCBidXQgYmVmb3JlIHNlbGVjdGluZyBhbnkiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9LCB0YWJsZVRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JLy8gZ2V0U2VsZWN0aW9uKCkgaXMgZnVydGhlciB0ZXN0ZWQgaW4gdGVzdF9zZWxlY3RBbGwgYW5kIHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25Db3VudCgpIHsKLQlpbnQgbnVtYmVyID0gODsKLQlUYWJsZVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVUcmVlSXRlbSh0YWJsZVRyZWUsIFNXVC5OT05FKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogQWZ0ZXIgYWRkaW5nIGl0ZW1zLCBidXQgYmVmb3JlIHNlbGVjdGluZyBhbnkiLCAwLCB0YWJsZVRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JLy8gZ2V0U2VsZWN0aW9uQ291bnQoKSBpcyBmdXJ0aGVyIHRlc3RlZCBpbiB0ZXN0X3NlbGVjdEFsbCBhbmQgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRhYmxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUYWJsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUFsbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlQWxsIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRyZW4oKSB7Ci0JLyogT3ZlcnJpZGluZyB0ZXN0X2dldENoaWxkcmVuIGZyb20gVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUKLQkgKiB0byBkbyBub3RoaW5nLCBiZWNhdXNlIHRoZSBjaGlsZCBvZiBhIFRhYmxlVHJlZSBpcyBhbHdheXMgYSBUYWJsZS4KLQkgKi8KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RBbGwoKSB7Ci0JLyogRlVUVVJFOiBTaG91bGQgYWxzbyBhZGQgc3ViLW5vZGVzLCBhbmQgdGVzdCBib3RoIHNpbmdsZSBhbmQgbXVsdGkgd2l0aCB0aG9zZS4KLQkgKiBpLmUuIHN1Yml0ZW1zW2ldID0gbmV3IFRhYmxlVHJlZUl0ZW0oaXRlbXNbaV0sIFNXVC5OT05FKTsgKi8KLQotCXNlbGVjdEFsbF9oZWxwZXIoIkVtcHR5IHRhYmxlIHRyZWUiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQotCWludCBudW1iZXIgPSA4OwotCVRhYmxlVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZVRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZVRyZWVJdGVtKHRhYmxlVHJlZSwgU1dULk5PTkUpOwotCX0KLQlzZWxlY3RBbGxfaGVscGVyKCJzZWxlY3RBbGwoKSIsIGl0ZW1zKTsKLQotCQotCS8qIE5vdyBydW4gdGhlIHNhbWUgdGVzdHMgb24gYSBzaW5nbGUtc2VsZWN0IFRhYmxlVHJlZS4gKi8KLQlzaW5nbGVTZWxlY3QoKTsKLQlzZWxlY3RBbGxfaGVscGVyKCJFbXB0eSB0YWJsZSB0cmVlIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0KLQlpdGVtcyA9IG5ldyBUYWJsZVRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZVRyZWVJdGVtKHRhYmxlVHJlZSwgU1dULk5PTkUpOwotCX0KLQlzZWxlY3RBbGxfaGVscGVyKCJzZWxlY3RBbGwoKSIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCkgewotCS8qIEZVVFVSRTogU2hvdWxkIGFsc28gYWRkIHN1Yi1ub2RlcywgYW5kIHRlc3QgYm90aCBzaW5nbGUgYW5kIG11bHRpIHdpdGggdGhvc2UuCi0JICogaS5lLiBzdWJpdGVtc1tpXSA9IG5ldyBUYWJsZVRyZWVJdGVtKGl0ZW1zW2ldLCBTV1QuTk9ORSk7ICovCi0KLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3Qgbm8gaXRlbXMgaW4gZW1wdHkgdGFibGUgdHJlZSIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXRyeSB7Ci0JCXRhYmxlVHJlZS5zZXRTZWxlY3Rpb24oKFRhYmxlVHJlZUl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIk1VTFRJOiBObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3RpbmcgbnVsbCBpbiBlbXB0eSB0YWJsZSB0cmVlIik7Ci0JfSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JaW50IG51bWJlciA9IDg7Ci0JVGFibGVUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlVHJlZUl0ZW0odGFibGVUcmVlLCAwKTsKLQl9Ci0JCi0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IG5vIGl0ZW1zIGluIHRhYmxlIHRyZWUgd2l0aCBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXRyeSB7Ci0JCXRhYmxlVHJlZS5zZXRTZWxlY3Rpb24oKFRhYmxlVHJlZUl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIk1VTFRJOiBObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3RpbmcgbnVsbCBpbiB0YWJsZSB0cmVlIHdpdGggaXRlbXMiKTsKLQl9IAotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IGl0ZW0gIiArIGksIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zW2ldfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbaV19KTsKLQl9Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IGl0ZW1zIiwgaXRlbXMsIGl0ZW1zKTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgdGFibGVUcmVlLmdldEl0ZW1zKCkiLCB0YWJsZVRyZWUuZ2V0SXRlbXMoKSwgdGFibGVUcmVlLmdldEl0ZW1zKCkpOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAyIGNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1swXSwgaXRlbXNbMV19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1swXSwgaXRlbXNbMV19KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMiBub24tY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzNdLCBpdGVtc1s2XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzNdLCBpdGVtc1s2XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIGNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIG5vbi1jb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzVdLCBpdGVtc1s3XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1s1XSwgaXRlbXNbN119KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyB1bm9yZGVyZWQgY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1syXSwgaXRlbXNbM119LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgdW5vcmRlcmVkIG5vbi1jb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbNV0sIGl0ZW1zWzJdLCBpdGVtc1s3XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1s1XSwgaXRlbXNbN119KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyByZXZlcnNlLW9yZGVyIGNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s0XSwgaXRlbXNbM10sIGl0ZW1zWzJdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIHJldmVyc2Utb3JkZXIgbm9uLWNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s3XSwgaXRlbXNbNV0sIGl0ZW1zWzJdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzVdLCBpdGVtc1s3XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBzYW1lIGl0ZW0gdHdpY2UiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1swXSwgaXRlbXNbNF0sIGl0ZW1zWzBdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMF0sIGl0ZW1zWzRdfSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IHNhbWUgaXRlbSBtdWx0aXBsZSB0aW1lcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s0XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBtdWx0aXBsZSBpdGVtcyBtdWx0aXBsZSB0aW1lcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1swXSwgaXRlbXNbMl0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1syXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzBdLCBpdGVtc1syXSwgaXRlbXNbNF19KTsKLQotCQotCS8qIE5vdyBydW4gdGhlIHNhbWUgdGVzdHMgb24gYSBzaW5nbGUtc2VsZWN0IFRhYmxlVHJlZS4gKi8KLQlzaW5nbGVTZWxlY3QoKTsKLQkKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3Qgbm8gaXRlbXMgaW4gZW1wdHkgdGFibGUgdHJlZSIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXRyeSB7Ci0JCXRhYmxlVHJlZS5zZXRTZWxlY3Rpb24oKFRhYmxlVHJlZUl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIlNJTkdMRTogTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW5nIG51bGwgaW4gZW1wdHkgdGFibGUgdHJlZSIpOwotCX0gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWl0ZW1zID0gbmV3IFRhYmxlVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlVHJlZUl0ZW0odGFibGVUcmVlLCAwKTsKLQl9Ci0JCi0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IG5vIGl0ZW1zIGluIHRhYmxlIHRyZWUgd2l0aCBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXRyeSB7Ci0JCXRhYmxlVHJlZS5zZXRTZWxlY3Rpb24oKFRhYmxlVHJlZUl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIlNJTkdMRTogTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW5nIG51bGwgaW4gdGFibGUgdHJlZSB3aXRoIGl0ZW1zIik7Ci0JfSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBpdGVtICIgKyBpLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1tpXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zW2ldfSk7Ci0JfQotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBpdGVtcyIsIGl0ZW1zLCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgdGFibGVUcmVlLmdldEl0ZW1zKCkiLCB0YWJsZVRyZWUuZ2V0SXRlbXMoKSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDIgY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzBdLCBpdGVtc1sxXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAyIG5vbi1jb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbM10sIGl0ZW1zWzZdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyBub24tY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1s1XSwgaXRlbXNbN119LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyB1bm9yZGVyZWQgY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1syXSwgaXRlbXNbM119LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyB1bm9yZGVyZWQgbm9uLWNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s1XSwgaXRlbXNbMl0sIGl0ZW1zWzddfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgcmV2ZXJzZS1vcmRlciBjb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbNF0sIGl0ZW1zWzNdLCBpdGVtc1syXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIHJldmVyc2Utb3JkZXIgbm9uLWNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s3XSwgaXRlbXNbNV0sIGl0ZW1zWzJdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IHNhbWUgaXRlbSB0d2ljZSIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzBdLCBpdGVtc1s0XSwgaXRlbXNbMF19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3Qgc2FtZSBpdGVtIG11bHRpcGxlIHRpbWVzIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBtdWx0aXBsZSBpdGVtcyBtdWx0aXBsZSB0aW1lcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1swXSwgaXRlbXNbMl0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1syXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd1NlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hvd1NlbGVjdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUYWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VFeHBhbmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleUV4cGFuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2siKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciIpKSB0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RBbGwiKSkgdGVzdF9kZXNlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSGVpZ2h0IikpIHRlc3RfZ2V0SXRlbUhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpKSB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUYWJsZSIpKSB0ZXN0X2dldFRhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSIpKSB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBbGwiKSkgdGVzdF9yZW1vdmVBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEFsbCIpKSB0ZXN0X3NlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKSkgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIikpIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93U2VsZWN0aW9uIikpIHRlc3Rfc2hvd1NlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZUV4cGFuZCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlRXhwYW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlFeHBhbmQiKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlFeHBhbmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrIikpIHRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2soKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByaXZhdGUgVGFibGVUcmVlIHRhYmxlVHJlZTsKLXByaXZhdGUgaW50IHN0eWxlOwotCi0vKgotICogU2V0cyBhIHNpbmdsZS1zZWxlY3QgVGFibGVUcmVlIGFzIHRoZSB0ZXN0IHdpZGdldC4KLSAqIE5vdGU6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhhdCB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdC4KLSAqLwotcHJpdmF0ZSB2b2lkIHNpbmdsZVNlbGVjdCgpIHsKLQl0YWJsZVRyZWUuZGlzcG9zZSgpOwotCXRhYmxlVHJlZSA9IG5ldyBUYWJsZVRyZWUoc2hlbGwsIHN0eWxlID0gU1dULlNJTkdMRSk7Ci0Jc2V0V2lkZ2V0KHRhYmxlVHJlZSk7Ci19Ci0KLS8qCi0gKiBVc2VkIGluIHRlc3Rfc2VsZWN0QWxsLgotICogTm90ZTogVGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0LgotICovCi1wcml2YXRlIHZvaWQgc2VsZWN0QWxsX2hlbHBlcihTdHJpbmcgbWVzc2FnZSwgVGFibGVUcmVlSXRlbVtdIGV4cGVjdGVkU2VsZWN0aW9uKSB7Ci0JdGFibGVUcmVlLnNlbGVjdEFsbCgpOwotCW1lc3NhZ2UgPSAoc3R5bGUgPT0gU1dULk1VTFRJID8gIk1VTFRJIiA6ICJTSU5HTEUiKSArICI6ICIgKyBtZXNzYWdlOwotCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZFNlbGVjdGlvbi5sZW5ndGgsIHRhYmxlVHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQlhc3NlcnRTYW1lKG1lc3NhZ2UsIGV4cGVjdGVkU2VsZWN0aW9uLCB0YWJsZVRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotfQotCi0vKgotICogVXNlZCBpbiB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtLgotICogTm90ZTogVGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0LgotICovCi1wcml2YXRlIHZvaWQgc2V0U2VsZWN0aW9uX2hlbHBlcihTdHJpbmcgbWVzc2FnZSwgVGFibGVUcmVlSXRlbVtdIGl0ZW1zVG9TZWxlY3QsIFRhYmxlVHJlZUl0ZW1bXSBleHBlY3RlZFNlbGVjdGlvbikgewotCXRhYmxlVHJlZS5zZXRTZWxlY3Rpb24oaXRlbXNUb1NlbGVjdCk7Ci0JbWVzc2FnZSA9IChzdHlsZSA9PSBTV1QuTVVMVEkgPyAiTVVMVEkiIDogIlNJTkdMRSIpICsgIjogIiArIG1lc3NhZ2U7Ci0JYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkU2VsZWN0aW9uLmxlbmd0aCwgdGFibGVUcmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCWFzc2VydFNhbWUobWVzc2FnZSwgZXhwZWN0ZWRTZWxlY3Rpb24sIHRhYmxlVHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlVGFibGVUcmVlKFZlY3RvciBldmVudHMsIGJvb2xlYW4gdHJhdmVyc2UpIHsKLSAgICBTdHJpbmcgdGVzdCA9IGdldFRlc3ROYW1lKCk7Ci0gICAgdGFibGVUcmVlID0gbmV3IFRhYmxlVHJlZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotCWZvciAoaW50IGNvbCA9IDA7IGNvbCA8IDM7IGNvbCsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZVRyZWUuZ2V0VGFibGUoKSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sICIgKyBjb2wpOwotCQljb2x1bW4uc2V0V2lkdGgoNzApOwotCQlob29rRXhwZWN0ZWRFdmVudHMoY29sdW1uLCB0ZXN0LCBldmVudHMpOwotCX0KLQlmb3IgKGludCBub2RlID0gMDsgbm9kZSA8IDQ7IG5vZGUrKykgewotCQlUYWJsZVRyZWVJdGVtIGl0ZW0gPSBuZXcgVGFibGVUcmVlSXRlbSh0YWJsZVRyZWUsIFNXVC5OT05FKTsKLQkJZm9yIChpbnQgY29sID0gMDsgY29sIDwgMzsgY29sKyspIHsKLQkJCWl0ZW0uc2V0VGV4dChjb2wsICJUVEl0ZW0iICsgbm9kZSArIGNvbCk7Ci0JCX0KLQkJaG9va0V4cGVjdGVkRXZlbnRzKGl0ZW0sIHRlc3QsIGV2ZW50cyk7Ci0JCVRhYmxlVHJlZUl0ZW0gc3ViaXRlbSA9IG5ldyBUYWJsZVRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJZm9yIChpbnQgY29sID0gMDsgY29sIDwgMzsgY29sKyspIHsKLQkJCXN1Yml0ZW0uc2V0VGV4dChjb2wsICJUVFN1YiIgKyBub2RlICsgY29sKTsKLQkJfQotCQlob29rRXhwZWN0ZWRFdmVudHMoc3ViaXRlbSwgdGVzdCwgZXZlbnRzKTsKLQl9Ci0JU3RyaW5nW10gdHlwZXMgPSAoU3RyaW5nW10pQ29uc2lzdGVuY3lVdGlsaXR5LmV2ZW50T3JkZXJpbmcuZ2V0KCJUYWJsZVRyZWVUYWJsZSIpOwotCWlmKCF0cmF2ZXJzZSkgewotCSAgICBTdHJpbmdbXSB0ZW1wID0gbmV3IFN0cmluZ1t0eXBlcy5sZW5ndGggLTFdOwotCSAgICBTeXN0ZW0uYXJyYXljb3B5KHR5cGVzLCAwLCB0ZW1wLCAwLCB0eXBlcy5sZW5ndGgtMSk7Ci0JICAgIHR5cGVzID0gdGVtcDsKLQl9Ci0JaG9va0V4cGVjdGVkRXZlbnRzKHRhYmxlVHJlZS5nZXRUYWJsZSgpLCB0eXBlcywgZXZlbnRzKTsKLQlzZXRXaWRnZXQodGFibGVUcmVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZVRyZWUoZXZlbnRzLCB0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIFNXVC5BUlJPV19ET1dOLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGVUcmVlKGV2ZW50cywgdHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMzAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZUV4cGFuZCgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlVHJlZShldmVudHMsIHRydWUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTEsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5RXhwYW5kKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGVUcmVlKGV2ZW50cywgdHJ1ZSk7Ci0gICAgdGFibGVUcmVlLnNldFNlbGVjdGlvbihuZXcgVGFibGVUcmVlSXRlbVtdIHsgdGFibGVUcmVlLmdldEl0ZW1zKClbMF19KTsKLSAgICBpbnQgY29kZT1TV1QuQVJST1dfUklHSFQ7Ci0gICAgaWYoU3d0SnVuaXQuaXNHVEspCi0gICAgICAgIGNvZGUgPSBTV1QuS0VZUEFEX0FERDsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIGNvZGUsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2sgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGVUcmVlKGV2ZW50cywgdHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDIwLCB0YWJsZVRyZWUuZ2V0SXRlbUhlaWdodCgpKjIsIDEsIDAsIAotICAgICAgICAgICAgCSAgICAgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RPVUJMRUNMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlVHJlZShldmVudHMsIGZhbHNlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEzLCAxMCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZVRyZWUoZXZlbnRzLCB0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZVRyZWUoZXZlbnRzLCB0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCAyNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGVUcmVlKGV2ZW50cywgdHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMjAsIDUwLCAzMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcsIGV2ZW50cyk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUVkaXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZjdlY2MuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlRWRpdG9yCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUVkaXRvciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVFZGl0b3IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rpc3Bvc2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbHVtbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb2x1bW5JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRDb2x1bW5JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVFZGl0b3IoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbHVtbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29sdW1uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1uIikpIHRlc3RfZ2V0Q29sdW1uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtIikpIHRlc3RfZ2V0SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q29sdW1uSSIpKSB0ZXN0X3NldENvbHVtbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUkiKSkgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSIpKSB0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MmM3ZjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWVJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotCVRhYmxlVHJlZSB0YWJsZVRyZWU7Ci0JVGFibGVUcmVlSXRlbSB0YWJsZVRyZWVJdGVtOwotCQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0YWJsZVRyZWUgPSBuZXcgVGFibGVUcmVlKHNoZWxsLCAwKTsKLQl0YWJsZVRyZWVJdGVtID0gbmV3IFRhYmxlVHJlZUl0ZW0odGFibGVUcmVlLCAwKTsKLQlzZXRXaWRnZXQodGFibGVUcmVlSXRlbSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJhY2tncm91bmQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHNJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCb3VuZHNJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hlY2tlZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2hlY2tlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEV4cGFuZGVkKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRFeHBhbmRlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvcmVncm91bmQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZvcmVncm91bmQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRHcmF5ZWQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEdyYXllZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW1hZ2VJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtQ291bnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFBhcmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudEl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFBhcmVudEl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUZXh0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRleHRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2hlY2tlZFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldENoZWNrZWRaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RXhwYW5kZWRaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRFeHBhbmRlZFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRHcmF5ZWRaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRHcmF5ZWRaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kc0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoZWNrZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEV4cGFuZGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb3JlZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRHcmF5ZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2hlY2tlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEV4cGFuZGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEdyYXllZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kIikpIHRlc3RfZ2V0QmFja2dyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzSSIpKSB0ZXN0X2dldEJvdW5kc0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoZWNrZWQiKSkgdGVzdF9nZXRDaGVja2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFeHBhbmRlZCIpKSB0ZXN0X2dldEV4cGFuZGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb3JlZ3JvdW5kIikpIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0R3JheWVkIikpIHRlc3RfZ2V0R3JheWVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZSIpKSB0ZXN0X2dldEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZUkiKSkgdGVzdF9nZXRJbWFnZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnRJdGVtIikpIHRlc3RfZ2V0UGFyZW50SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dCIpKSB0ZXN0X2dldFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRJIikpIHRlc3RfZ2V0VGV4dEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIikpIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENoZWNrZWRaIikpIHRlc3Rfc2V0Q2hlY2tlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEV4cGFuZGVkWiIpKSB0ZXN0X3NldEV4cGFuZGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0R3JheWVkWiIpKSB0ZXN0X3NldEdyYXllZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZGIwMGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGV4dENoYW5nZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRleHRDaGFuZ2VMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQlTaGVsbCBzaGVsbDsKLQlTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0JaW50IHZlcmlmeSA9IC0xOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQlzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLX0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RleHRDaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudCgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gc3R5bGVkVGV4dC5nZXRDb250ZW50KCk7Ci0JVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRleHRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgdGV4dENoYW5nZWQoVGV4dENoYW5nZWRFdmVudCBldmVudCkgewotCQkJc3dpdGNoICh2ZXJpZnkpIHsKLQkJCQljYXNlIDEgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiXG50ZXN0aW5nIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAyIDogewotCQkJCQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoImEiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDMgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjozOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiXG5cbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNDogewotCQkJCQlhc3NlcnRUcnVlKCI6NDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDUgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiXHJMaW5lIDFcclxuTGluZSAyIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA2IDogewotCQkJCQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIlRoaXNcbmlzIGEgdGVzdFxubGluZSAzIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA3IDogewotCQkJCQlhc3NlcnRUcnVlKCI6NzoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIlRoaXNcblxyIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA4IDogewotCQkJCQlhc3NlcnRUcnVlKCI6ODoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIlxuTDFcclxuTDIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDkgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiTDF0ZXN0IikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMDp7Ci0JCQkJCWFzc2VydFRydWUoIjoxMDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDExOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxMToiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDEyOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxMjoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIkwxXHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTM6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEzOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiTDFcclxuIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNDogewotCQkJCQlhc3NlcnRUcnVlKCI6MTQ6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNTogewotCQkJCQlhc3NlcnRUcnVlKCI6MTU6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJMMXRlc3RcblxuIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNjp7Ci0JCQkJCWFzc2VydFRydWUoIjoxNjoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE3OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxNzoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE4OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxODoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIkwxXHJcbnRlc3RcclxuIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxOTogewotCQkJCQlhc3NlcnRUcnVlKCI6MTk6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJMMXRlc3RcclxyXHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMjA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjIwOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIHRleHRDaGFuZ2luZyhUZXh0Q2hhbmdpbmdFdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHRleHRTZXQoVGV4dENoYW5nZWRFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQljb250ZW50LmFkZFRleHRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCi0JYm9vbGVhbiBleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoInRlc3RpbmciKTsKLQl2ZXJpZnkgPSAxOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXG4iKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJcblxuIik7Ci0JdmVyaWZ5ID0gMjsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMiwgImEiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJhIik7Ci0JdmVyaWZ5ID0gMzsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMSwgIlxuXG4iKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl2ZXJpZnkgPSA0OwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjQ6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkxpbmUgMVxyXG5MaW5lIDIiKTsKLQl2ZXJpZnkgPSA1OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXHIiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcbmxpbmUgM1xubGluZSA0Iik7Ci0JdmVyaWZ5ID0gNjsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMjEsIDcsICIiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCXZlcmlmeSA9IDc7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDUsIDksICIiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJcbkwxXHJcbkwyXHJcbiIpOwotCXZlcmlmeSA9IDg7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDcsIDIsICIiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl2ZXJpZnkgPSA5OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAyLCAidGVzdCIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXZlcmlmeSA9IDEwOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICIiKTt9IAotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxMDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdmVyaWZ5ID0gMTE7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMiwgIiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTE6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHIiKTsKLQl2ZXJpZnkgPSAxMjsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgIlxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcbiIpOwotCXZlcmlmeSA9IDEzOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAiXHIiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl2ZXJpZnkgPSAxNDsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAidGVzdCIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTQ6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXZlcmlmeSA9IDE1OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAyLCAidGVzdFxuXG4iKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl2ZXJpZnkgPSAxNjsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxyXG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjE2OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl2ZXJpZnkgPSAxNzsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgxLCAyLCAidGVzdFxuXG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjE3OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0gCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcciIpOwotCXZlcmlmeSA9IDE4OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAiXG50ZXN0XHJcbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXG4iKTsKLQl2ZXJpZnkgPSAxOTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgInRlc3RcclxyXHIiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl2ZXJpZnkgPSAyMDsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoyMDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0JY29udGVudC5yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RleHRDaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50KCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBzdHlsZWRUZXh0LmdldENvbnRlbnQoKTsKLQlUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGV4dENoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB0ZXh0Q2hhbmdpbmcoVGV4dENoYW5naW5nRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCh2ZXJpZnkpIHsKLQkJCQljYXNlIDEgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6MWI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDEpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAyIDogewotCQkJCQlhc3NlcnRUcnVlKCI6MmE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAyKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjJiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMyA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjNhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjozYjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDQ6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjQ6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA1IDogewotCQkJCQlhc3NlcnRUcnVlKCI6NWE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjViOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNiA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjZhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMSk7Ci0JCQkJCWFzc2VydFRydWUoIjo2YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDcgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo3YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6N2I6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDApOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA4IDogewotCQkJCQlhc3NlcnRUcnVlKCI6OGE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjhiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgOSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjlhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMSk7Ci0JCQkJCWFzc2VydFRydWUoIjo5YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDEwOnsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEwOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTE6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjExOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTI6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEyYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6MTJiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTM6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEzYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6MTNiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTQ6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE0OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTU6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE1YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDEpOwotCQkJCQlhc3NlcnRUcnVlKCI6MTViOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAyKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTY6ewotCQkJCQlhc3NlcnRUcnVlKCI6MTY6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNzogewotCQkJCQlhc3NlcnRUcnVlKCI6MTc6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxODogewotCQkJCQlhc3NlcnRUcnVlKCI6MThhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjoxOGI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxOTogewotCQkJCQlhc3NlcnRUcnVlKCI6MTlhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjoxOWI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDMpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAyMDogewotCQkJCQlhc3NlcnRUcnVlKCI6MjA6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgdGV4dENoYW5nZWQoVGV4dENoYW5nZWRFdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHRleHRTZXQoVGV4dENoYW5nZWRFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQljb250ZW50LmFkZFRleHRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQlib29sZWFuIGV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsJCi0JdmVyaWZ5ID0gMTsKLQlzdHlsZWRUZXh0LnNldFRleHQoInRlc3RpbmciKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxuIik7Ci0KLQl2ZXJpZnkgPSAyOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiXG5cbiIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAyLCAiYSIpOwotCi0JdmVyaWZ5ID0gMzsKLQlzdHlsZWRUZXh0LnNldFRleHQoImEiKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMSwgIlxuXG4iKTsKLQotCXZlcmlmeSA9IDQ7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjo0OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDU7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMaW5lIDFcclxuTGluZSAyIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcciIpOwotCi0JdmVyaWZ5ID0gNjsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxubGluZSAzXG5saW5lIDQiKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMjEsIDcsICIiKTsKLQotCXZlcmlmeSA9IDc7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSg1LCA5LCAiIik7Ci0KLQl2ZXJpZnkgPSA4OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiXG5MMVxyXG5MMlxyXG4iKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNywgMiwgIiIpOwotCi0JdmVyaWZ5ID0gOTsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAyLCAidGVzdCIpOwotCi0JdmVyaWZ5ID0gMTA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAiIik7fSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTA6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMTE7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgxLCAyLCAiIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxMTogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAxMjsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHIiKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgIlxuIik7Ci0KLQl2ZXJpZnkgPSAxMzsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXG4iKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgIlxyIik7Ci0KLQl2ZXJpZnkgPSAxNDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJ0ZXN0Iik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAxNTsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAyLCAidGVzdFxuXG4iKTsKLQotCXZlcmlmeSA9IDE2OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcclxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNjogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAxNzsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICJ0ZXN0XG5cbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTc6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMTg7Ci0gCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcciIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAiXG50ZXN0XHJcbiIpOwotCi0JdmVyaWZ5ID0gMTk7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxuIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJ0ZXN0XHJcclxyIik7Ci0JdmVyaWZ5ID0gMjA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoyMDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0JY29udGVudC5yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RleHRTZXRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50KCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBzdHlsZWRUZXh0LmdldENvbnRlbnQoKTsKLQlUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGV4dENoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB0ZXh0Q2hhbmdpbmcoVGV4dENoYW5naW5nRXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCB0ZXh0Q2hhbmdlZChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgdGV4dFNldChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKHZlcmlmeSkgewotCQkJCWNhc2UgMSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJ0ZXN0aW5nIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAyIDogewotCQkJCQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIlxuXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDMgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjozOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiYSIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNCA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0JY29udGVudC5hZGRUZXh0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQotCXZlcmlmeSA9IDE7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJ0ZXN0aW5nIik7Ci0KLQl2ZXJpZnkgPSAyOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiXG5cbiIpOwotCi0JdmVyaWZ5ID0gMzsKLQlzdHlsZWRUZXh0LnNldFRleHQoImEiKTsKLQkKLQl2ZXJpZnkgPSA0OwotCXRyeSB7c3R5bGVkVGV4dC5zZXRUZXh0KG51bGwpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7YXNzZXJ0VHJ1ZSgiOjQ6IiwgdHJ1ZSk7fQkKLQljb250ZW50LnJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90ZXh0Q2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RleHRDaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90ZXh0U2V0TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90ZXh0Q2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQiKSkgdGVzdF90ZXh0Q2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RleHRDaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50IikpIHRlc3RfdGV4dENoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RleHRTZXRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50IikpIHRlc3RfdGV4dFNldExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzZTViMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdlZEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRleHRDaGFuZ2VkRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQoKSB7Ci0JLy8gdGhpcyBtZXRob2QgdGVzdGVkIGJ5IG90aGVyIHRlc3QgY2xhc3NlcwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdpbmdFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTlhMzRhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdpbmdFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdpbmdFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50KCkgewotCS8vIHRoaXMgbWV0aG9kIHRlc3RlZCBieSBvdGhlciB0ZXN0IGNsYXNzZXMKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVHJlZUVkaXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVHJlZUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTA3Njc5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RyZWVFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRyZWVFZGl0b3IKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVHJlZUVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RyZWVFZGl0b3IgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvciB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVHJlZUVkaXRvcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rpc3Bvc2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVHJlZUVkaXRvcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvci5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbSIpKSB0ZXN0X2dldEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIikpIHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0iKSkgdGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmZWEyYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZlcmlmeUtleUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZlcmlmeUtleUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCWludCB2ZXJpZnkgPSAtMTsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQlzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzaGVsbC5vcGVuKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3ZlcmlmeUtleUxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50KCkgewotCVZlcmlmeUtleUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFZlcmlmeUtleUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlLZXkoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWlmICh2ZXJpZnkgIT0gMSkge2V2ZW50LmRvaXQgPSBmYWxzZTt9Ci0JCX0KLQl9OwotCXN0eWxlZFRleHQuYWRkVmVyaWZ5S2V5TGlzdGVuZXIobGlzdGVuZXIpOwotCXZlcmlmeSA9IDE7Ci0JRXZlbnQgZSA9IG5ldyBFdmVudCgpOwotCWUuY2hhcmFjdGVyID0gJ2EnOwotCXN0eWxlZFRleHQubm90aWZ5TGlzdGVuZXJzKFNXVC5LZXlEb3duLCBlKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoImEiKSk7Ci0KLQl2ZXJpZnkgPSAyOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiIik7Ci0JZSA9IG5ldyBFdmVudCgpOwotCWUuY2hhcmFjdGVyID0gJ2EnOwotCXN0eWxlZFRleHQubm90aWZ5TGlzdGVuZXJzKFNXVC5LZXlEb3duLCBlKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpKTsKLQlzdHlsZWRUZXh0LnJlbW92ZVZlcmlmeUtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3ZlcmlmeUtleUxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3ZlcmlmeUtleUxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50IikpIHRlc3RfdmVyaWZ5S2V5TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZpZXdGb3JtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTQ0ZTExLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZpZXdGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmlld0Zvcm0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmlld0Zvcm0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENsaWVudEFyZWEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb250ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wQ2VudGVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUb3BDZW50ZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb3BMZWZ0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUb3BMZWZ0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wUmlnaHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRvcFJpZ2h0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0WigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbGF5b3V0WiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvcmRlclZpc2libGVaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCb3JkZXJWaXNpYmxlWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BDZW50ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9wQ2VudGVyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BDZW50ZXJTZXBhcmF0ZVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvcENlbnRlclNlcGFyYXRlWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvcExlZnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9wTGVmdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9wUmlnaHRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9wUmlnaHRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udGVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wQ2VudGVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BMZWZ0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BSaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGF5b3V0WiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Qm9yZGVyVmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wQ2VudGVyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvcENlbnRlclNlcGFyYXRlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wTGVmdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250ZW50IikpIHRlc3RfZ2V0Q29udGVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wQ2VudGVyIikpIHRlc3RfZ2V0VG9wQ2VudGVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BMZWZ0IikpIHRlc3RfZ2V0VG9wTGVmdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wUmlnaHQiKSkgdGVzdF9nZXRUb3BSaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbGF5b3V0WiIpKSB0ZXN0X2xheW91dFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJvcmRlclZpc2libGVaIikpIHRlc3Rfc2V0Qm9yZGVyVmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQiKSkgdGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb3BDZW50ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldFRvcENlbnRlckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb3BDZW50ZXJTZXBhcmF0ZVoiKSkgdGVzdF9zZXRUb3BDZW50ZXJTZXBhcmF0ZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcExlZnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldFRvcExlZnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9wUmlnaHRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGRhMjM1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuQnl0ZUFycmF5VHJhbnNmZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuQnl0ZUFycmF5VHJhbnNmZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2ZlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN1cHBvcnRlZFR5cGVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTdXBwb3J0ZWRUeXBlcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzU3VwcG9ydGVkVHlwZUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN1cHBvcnRlZFR5cGVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1N1cHBvcnRlZFR5cGVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3VwcG9ydGVkVHlwZXMiKSkgdGVzdF9nZXRTdXBwb3J0ZWRUeXBlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIikpIHRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9DbGlwYm9hcmQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0NsaXBib2FyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWE1MDg0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0NsaXBib2FyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0NsaXBib2FyZCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9DbGlwYm9hcmQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rpc3Bvc2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBdmFpbGFibGVUeXBlTmFtZXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEF2YWlsYWJsZVR5cGVOYW1lcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEF2YWlsYWJsZVR5cGVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRBdmFpbGFibGVUeXBlcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRlbnRzTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRlbnRzTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pc0Rpc3Bvc2VkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29udGVudHMkTGphdmFfbGFuZ19PYmplY3QkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldENvbnRlbnRzJExqYXZhX2xhbmdfT2JqZWN0JExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0NsaXBib2FyZCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBdmFpbGFibGVUeXBlTmFtZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEF2YWlsYWJsZVR5cGVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250ZW50c0xvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0Rpc3Bvc2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250ZW50cyRMamF2YV9sYW5nX09iamVjdCRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEF2YWlsYWJsZVR5cGVOYW1lcyIpKSB0ZXN0X2dldEF2YWlsYWJsZVR5cGVOYW1lcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QXZhaWxhYmxlVHlwZXMiKSkgdGVzdF9nZXRBdmFpbGFibGVUeXBlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udGVudHNMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciIpKSB0ZXN0X2dldENvbnRlbnRzTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRGlzcG9zZWQiKSkgdGVzdF9pc0Rpc3Bvc2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb250ZW50cyRMamF2YV9sYW5nX09iamVjdCRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciIpKSB0ZXN0X3NldENvbnRlbnRzJExqYXZhX2xhbmdfT2JqZWN0JExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RORC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODkwNWUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RORC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5ECi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RORCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXJyb3JJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9lcnJvckkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcnJvcklJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9lcnJvcklJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Vycm9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXJyb3JJSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcnJvckkiKSkgdGVzdF9lcnJvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Vycm9ySUkiKSkgdGVzdF9lcnJvcklJKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MDZiYzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGREcmFnTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZERyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUcmFuc2ZlcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VHJhbnNmZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVEcmFnTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZURyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRyYW5zZmVyJExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUcmFuc2ZlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZERyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lciIpKSB0ZXN0X2FkZERyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udHJvbCIpKSB0ZXN0X2dldENvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRyYW5zZmVyIikpIHRlc3RfZ2V0VHJhbnNmZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZURyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZURyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VHJhbnNmZXIkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIiKSkgdGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlcigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNDBlODUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnRmluaXNoZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ1NldERhdGFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnU3RhcnRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdTdGFydExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdGaW5pc2hlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpKSB0ZXN0X2RyYWdGaW5pc2hlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ1NldERhdGFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKSkgdGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IikpIHRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTIzNzhkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZG5kX0ROREV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkRFdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkM2U1Y2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnRmluaXNoZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ1NldERhdGFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnU3RhcnRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdTdGFydExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnRmluaXNoZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdTZXREYXRhTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnU3RhcnRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IikpIHRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpKSB0ZXN0X2RyYWdTZXREYXRhTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnU3RhcnRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKSkgdGVzdF9kcmFnU3RhcnRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYyYjZlYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZERyb3BMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkRHJvcExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRyYW5zZmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUcmFuc2ZlciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X25vdGlmeUxpc3RlbmVyc0lMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X25vdGlmeUxpc3RlbmVyc0lMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVEcm9wTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZURyb3BMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRyYW5zZmVyJExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRHJvcExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUcmFuc2ZlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfbm90aWZ5TGlzdGVuZXJzSUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlRHJvcExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZERyb3BMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lciIpKSB0ZXN0X2FkZERyb3BMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udHJvbCIpKSB0ZXN0X2dldENvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRyYW5zZmVyIikpIHRlc3RfZ2V0VHJhbnNmZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X25vdGlmeUxpc3RlbmVyc0lMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9ub3RpZnlMaXN0ZW5lcnNJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVEcm9wTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVEcm9wTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRyYW5zZmVyJExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIikpIHRlc3Rfc2V0VHJhbnNmZXIkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjA5NmI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0QWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0QWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdFbnRlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ0xlYXZlTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ09wZXJhdGlvbkNoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnT3ZlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ092ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcm9wQWNjZXB0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcm9wQWNjZXB0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJvcExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJvcExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0QWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdPcGVyYXRpb25DaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnT3ZlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJvcEFjY2VwdExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJvcExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcmFnRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdMZWF2ZUxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2RyYWdMZWF2ZUxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ09wZXJhdGlvbkNoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ092ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcmFnT3ZlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJvcEFjY2VwdExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Ryb3BMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTliM2E5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZG5kX0ROREV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkRFdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTA3NmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdMZWF2ZUxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdPcGVyYXRpb25DaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdPdmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnT3ZlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdFbnRlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ0xlYXZlTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ092ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Ryb3BMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdPcGVyYXRpb25DaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJhZ09wZXJhdGlvbkNoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdPdmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJhZ092ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcm9wQWNjZXB0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJvcExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRmlsZVRyYW5zZmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9GaWxlVHJhbnNmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkODJjNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9GaWxlVHJhbnNmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5GaWxlVHJhbnNmZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9GaWxlVHJhbnNmZXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0ZpbGVUcmFuc2ZlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEluc3RhbmNlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRmlsZVRyYW5zZmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEluc3RhbmNlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2Zlci5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEluc3RhbmNlIikpIHRlc3RfZ2V0SW5zdGFuY2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIikpIHRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpKSB0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfUlRGVHJhbnNmZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1JURlRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNjY0ZTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfUlRGVHJhbnNmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLlJURlRyYW5zZmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLlJURlRyYW5zZmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfUlRGVHJhbnNmZXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1JURlRyYW5zZmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW5zdGFuY2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfUlRGVHJhbnNmZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW5zdGFuY2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbnN0YW5jZSIpKSB0ZXN0X2dldEluc3RhbmNlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpKSB0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKSkgdGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RleHRUcmFuc2Zlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVGV4dFRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZGFiYjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVGV4dFRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVGV4dFRyYW5zZmVyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UZXh0VHJhbnNmZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJbnN0YW5jZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UZXh0VHJhbnNmZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW5zdGFuY2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW5zdGFuY2UiKSkgdGVzdF9nZXRJbnN0YW5jZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKSkgdGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIikpIHRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2Zlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjNDBmMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3VwcG9ydGVkVHlwZXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFN1cHBvcnRlZFR5cGVzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pc1N1cHBvcnRlZFR5cGVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZWdpc3RlclR5cGVMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVnaXN0ZXJUeXBlTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3VwcG9ydGVkVHlwZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzU3VwcG9ydGVkVHlwZUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVnaXN0ZXJUeXBlTGphdmFfbGFuZ19TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3VwcG9ydGVkVHlwZXMiKSkgdGVzdF9nZXRTdXBwb3J0ZWRUeXBlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIikpIHRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWdpc3RlclR5cGVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3JlZ2lzdGVyVHlwZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDcxYmVhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNzNlNmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkFybUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkFybUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgQXJtRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NGJlZTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Bcm1MaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Bcm1MaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpZGdldEFybWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3dpZGdldEFybWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aWRnZXRBcm1lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpZGdldEFybWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQiKSkgdGVzdF93aWRnZXRBcm1lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxMzAyOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29udHJvbE1vdmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb250cm9sUmVzaXplZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29udHJvbFJlc2l6ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udHJvbE1vdmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb250cm9sUmVzaXplZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQiKSkgdGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnRyb2xSZXNpemVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50IikpIHRlc3RfY29udHJvbFJlc2l6ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMzk5MDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgQ29udHJvbEV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MTQ1ZmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29udHJvbE1vdmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb250cm9sUmVzaXplZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29udHJvbFJlc2l6ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udHJvbE1vdmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb250cm9sUmVzaXplZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQiKSkgdGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnRyb2xSZXNpemVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50IikpIHRlc3RfY29udHJvbFJlc2l6ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZDIwNTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgRGlzcG9zZUV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OGQ4YjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2lkZ2V0RGlzcG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3dpZGdldERpc3Bvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpZGdldERpc3Bvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpZGdldERpc3Bvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50IikpIHRlc3Rfd2lkZ2V0RGlzcG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNmJhMWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0FkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9mb2N1c0dhaW5lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9mb2N1c0dhaW5lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZvY3VzTG9zdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50IikpIHRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50IikpIHRlc3RfZm9jdXNMb3N0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDI2NjA1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IEZvY3VzRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzZiZTY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9mb2N1c0dhaW5lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9mb2N1c0dhaW5lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZvY3VzTG9zdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50IikpIHRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50IikpIHRlc3RfZm9jdXNMb3N0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExNzc4ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBIZWxwRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzOTE4MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oZWxwUmVxdWVzdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9oZWxwUmVxdWVzdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hlbHBSZXF1ZXN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGVscFJlcXVlc3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudCIpKSB0ZXN0X2hlbHBSZXF1ZXN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNhM2Q2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5QWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2tleVByZXNzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfa2V5UHJlc3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfa2V5UmVsZWFzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfa2V5UmVsZWFzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2tleVByZXNzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfa2V5UmVsZWFzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9rZXlQcmVzc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQiKSkgdGVzdF9rZXlQcmVzc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQiKSkgdGVzdF9rZXlSZWxlYXNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjMGYwYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBLZXlFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNmM2I1OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfa2V5UHJlc3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9rZXlQcmVzc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9rZXlSZWxlYXNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9rZXlSZWxlYXNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfa2V5UHJlc3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9rZXlSZWxlYXNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2tleVByZXNzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCIpKSB0ZXN0X2tleVByZXNzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfa2V5UmVsZWFzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCIpKSB0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzY4NzdiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51QWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51QWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbWVudVNob3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbWVudUhpZGRlbkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbWVudVNob3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21lbnVIaWRkZW5Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQiKSkgdGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQiKSkgdGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNmMxZjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51RXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgTWVudUV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNDJiZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbWVudUhpZGRlbkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbWVudUhpZGRlbkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21lbnVTaG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbWVudVNob3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21lbnVIaWRkZW5Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21lbnVTaG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50IikpIHRlc3RfbWVudUhpZGRlbkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbWVudVNob3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50IikpIHRlc3RfbWVudVNob3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRhOTMyMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBNb2RpZnlFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMxNWQ1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW9kaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW9kaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUV2ZW50IikpIHRlc3RfbW9kaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGFlOTk2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZURvdWJsZUNsaWNrTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VVcExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZURvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZURvdWJsZUNsaWNrTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZURvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VEb3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VVcExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2YwMzU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IE1vdXNlRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjkzYTE2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VEb3VibGVDbGlja0xvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VEb3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VEb3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlVXBMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VEb3VibGVDbGlja0xvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlVXBMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VEb3VibGVDbGlja0xvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZURvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlVXBMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg0NzU5Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTW92ZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTW92ZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VNb3ZlTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VNb3ZlTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlTW92ZUxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VNb3ZlTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlTW92ZUxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmM0ZjNmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVRyYWNrQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVRyYWNrQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZUhvdmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VFbnRlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlSG92ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NTQ5ZWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0xpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VFbnRlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlSG92ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZUhvdmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VFbnRlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlSG92ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjZTk4OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBQYWludEV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxM2FkNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3BhaW50Q29udHJvbExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3BhaW50Q29udHJvbExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3BhaW50Q29udHJvbExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcGFpbnRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudCIpKSB0ZXN0X3BhaW50Q29udHJvbExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1NzQwNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25BZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpZGdldERlZmF1bHRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF93aWRnZXREZWZhdWx0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2lkZ2V0RGVmYXVsdFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2lkZ2V0RGVmYXVsdFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQiKSkgdGVzdF93aWRnZXREZWZhdWx0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2lkZ2V0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCIpKSB0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODY2Yzk0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IFNlbGVjdGlvbkV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2U0NGMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aWRnZXREZWZhdWx0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfd2lkZ2V0RGVmYXVsdFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aWRnZXRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF93aWRnZXRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpZGdldERlZmF1bHRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aWRnZXRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpZGdldERlZmF1bHRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50IikpIHRlc3Rfd2lkZ2V0RGVmYXVsdFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQiKSkgdGVzdF93aWRnZXRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2MyZWMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbERlYWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxEZWFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxEZWljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NoZWxsSWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hlbGxJY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IikpIHRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbERlYWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsRGVpY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKSkgdGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg5OTk1Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBTaGVsbEV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc5MzhiZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbERlYWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxEZWFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxEZWljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NoZWxsSWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hlbGxJY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IikpIHRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbERlYWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsRGVpY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKSkgdGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwMWExNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IFRyYXZlcnNlRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGVkMWRjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfa2V5VHJhdmVyc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfa2V5VHJhdmVyc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfa2V5VHJhdmVyc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9rZXlUcmF2ZXJzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50IikpIHRlc3Rfa2V5VHJhdmVyc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYTczODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmVlQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmVlQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90cmVlRXhwYW5kZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90cmVlQ29sbGFwc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90cmVlRXhwYW5kZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdHJlZUNvbGxhcHNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCIpKSB0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCIpKSB0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBkMWMxNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyZWVFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmVlRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IFRyZWVFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzk5MzcxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyZWVMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmVlTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90cmVlRXhwYW5kZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90cmVlQ29sbGFwc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90cmVlRXhwYW5kZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdHJlZUNvbGxhcHNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCIpKSB0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCIpKSB0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWJlY2NmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHlwZWRFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UeXBlZEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3Qgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCWV2ZW50LndpZGdldCA9IHNoZWxsOwotCVR5cGVkRXZlbnQgdHlwZWRFdmVudCA9IG5ld1R5cGVkRXZlbnQoZXZlbnQpOwotCWFzc2VydE5vdE51bGwodHlwZWRFdmVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQlldmVudC53aWRnZXQgPSBzaGVsbDsKLQlUeXBlZEV2ZW50IHR5cGVkRXZlbnQgPSBuZXdUeXBlZEV2ZW50KGV2ZW50KTsKLQlhc3NlcnROb3ROdWxsKHR5cGVkRXZlbnQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZSh0eXBlZEV2ZW50LnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIFNoZWxsIHNoZWxsOwotCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBUeXBlZEV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzcyNDZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgVmVyaWZ5RXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YzUzMWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3ZlcmlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfdmVyaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdmVyaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3ZlcmlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudCIpKSB0ZXN0X3ZlcmlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNThjYTY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSUkoKSB7Ci0JLy8gVGVzdCBuZXcgQ29sb3IoRGV2aWNlIGRldmljZSwgaW50IHJlZCwgaW50IGdyZWVuLCBpbnQgYmx1ZSkKLQkvLyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHJlZCwgZ3JlZW4gb3IgYmx1ZSBhcmd1bWVudCBpcyBub3QgYmV0d2VlbiAwIGFuZCAyNTUKLQotCS8vIHZhbGlkIGNvbG9yIChibGFjaykKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAwKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JCi0JLy8gdmFsaWQgY29sb3IgKHdoaXRlKQotCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMjU1LCAyNTUpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQkKLQkvLyB2YWxpZCBjb2xvciAocmFuZG9tIGdyZXkpCi0JY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjAsIDIwLCAyMCk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgY29sb3IgKHJhbmRvbSkKLQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAxMDIsIDI1NSwgMCk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCQotCS8vIGRldmljZSA9PSBudWxsICh2YWxpZCkKLQljb2xvciA9IG5ldyBDb2xvcihudWxsLCAwLCAwLCAwKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgcmdiIDwgMAotCXRyeSB7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIC0xMCwgLTEwLCAtMTApOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJnYiA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIHJnYiA+IDI1NQotCXRyeSB7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDEwMDAsIDIwMDAsIDMwMDApOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJnYiA+IDI1NSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIGJsdWUgPiAyNTUKLQl0cnkgewotCQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAxMCwgMTAsIDI1Nik7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYmx1ZSA+IDI1NSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpIHsKLQkvLyBUZXN0IG5ldyBDb2xvcihEZXZpY2UgZGV2aWNlLCBSR0IgcmdiKQotCS8vIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcmVkLCBncmVlbiBvciBibHVlIGFyZ3VtZW50IGlzIG5vdCBiZXR3ZWVuIDAgYW5kIDI1NTsgb3IgcmdiIGlzIG51bGwKLQkKLQkvLyB2YWxpZCBjb2xvciAoYmxhY2spCi0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigwLCAwLCAwKSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCQotCS8vIHZhbGlkIGNvbG9yICh3aGl0ZSkKLQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JCi0JLy8gdmFsaWQgY29sb3IgKHJhbmRvbSBncmV5KQotCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMTAsIDEwLCAxMCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQkKLQkvLyB2YWxpZCBjb2xvciAocmFuZG9tKQotCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMTAyLCAyNTUsIDApKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JCi0JLy8gZGV2aWNlID09IG51bGwgKHZhbGlkKQotCWNvbG9yID0gbmV3IENvbG9yKG51bGwsIG5ldyBSR0IoMCwgMCwgMCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQkKLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCByZ2IgPCAwCi0JdHJ5IHsKLQkJY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigtMTAsIC0xMCwgLTEwKSk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmdiIDwgMCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gaWxsZWdhbCBhcmd1bWVudCwgcmdiID4gMjU1Ci0JdHJ5IHsKLQkJY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigxMDAwLCAyMDAwLCAzMDAwKSk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmdiID4gMjU1Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBibHVlID4gMjU1Ci0JdHJ5IHsKLQkJY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigxMCwgMTAsIDI1NikpOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGJsdWUgPiAyNTUiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgcmdiID09IG51bGwKLQl0cnkgewotCQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCBudWxsKTsKLQkJY29sb3IuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZ2IgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9pc0Rpc3Bvc2VkCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMSwgMiwgMyk7Ci0JQ29sb3Igc2FtZUNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDEsIDIsIDMpOwotCUNvbG9yIHNhbWVDb2xvcjIgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigxLCAyLCAzKSk7Ci0JQ29sb3Igb3RoZXJDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCA1LCA2LCA3KTsKLQl0cnkgewotCQkvLyBUZXN0IENvbG9yLmVxdWFscyhPYmplY3QpCi0JCWFzc2VydFRydWUoIiFjb2xvci5lcXVhbHMoKE9iamVjdCludWxsKSIsICFjb2xvci5lcXVhbHMoKE9iamVjdCludWxsKSk7Ci0KLQkJLy8gVGVzdCBDb2xvci5lcXVhbHMoQ29sb3IpCi0JCWFzc2VydFRydWUoIiFjb2xvci5lcXVhbHMoKENvbG9yKW51bGwpIiwgIWNvbG9yLmVxdWFscygoQ29sb3IpbnVsbCkpOwotCQlhc3NlcnRUcnVlKCJjb2xvci5lcXVhbHMoY29sb3IpIiwgY29sb3IuZXF1YWxzKGNvbG9yKSk7Ci0JCWFzc2VydFRydWUoImNvbG9yLmVxdWFscyhzYW1lQ29sb3IpIiwgY29sb3IuZXF1YWxzKHNhbWVDb2xvcikpOwotCQlhc3NlcnRUcnVlKCJjb2xvci5lcXVhbHMoc2FtZUNvbG9yMikiLCBjb2xvci5lcXVhbHMoc2FtZUNvbG9yMikpOwotCQlhc3NlcnRUcnVlKCIhY29sb3IuZXF1YWxzKG90aGVyQ29sb3IpIiwgIWNvbG9yLmVxdWFscyhvdGhlckNvbG9yKSk7Ci0JfSBmaW5hbGx5IHsKLQkJY29sb3IuZGlzcG9zZSgpOwotCQlzYW1lQ29sb3IuZGlzcG9zZSgpOwotCQlzYW1lQ29sb3IyLmRpc3Bvc2UoKTsKLQkJb3RoZXJDb2xvci5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJsdWUoKSB7Ci0JLy8gVGVzdCBDb2xvci5nZXRCbHVlKCkKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAyNTUpOwotCXRyeSB7Ci0JCWFzc2VydEVxdWFscygiY29sb3IuZ2V0Qmx1ZSgpIiwgY29sb3IuZ2V0Qmx1ZSgpLCAyNTUpOwotCX0gZmluYWxseSB7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQl9Ci0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0R3JlZW4oKSB7Ci0JLy8gVGVzdCBDb2xvci5nZXRHcmVlbigpCi0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMjU1LCAwKTsKLQl0cnkgewotCQlhc3NlcnRFcXVhbHMoImNvbG9yLmdldEdyZWVuKCkiLCBjb2xvci5nZXRHcmVlbigpLCAyNTUpOwotCX0gZmluYWxseSB7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UkdCKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMjU1LCAyNTUpOwotCWFzc2VydE5vdE51bGwoY29sb3IuZ2V0UkdCKCkpOwotCWFzc2VydEVxdWFscyhuZXcgUkdCKDI1NSwgMjU1LCAyNTUpLCBjb2xvci5nZXRSR0IoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVkKCkgewotCS8vIFRlc3QgQ29sb3IuZ2V0UmVkKCkKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDAsIDApOwotCXRyeSB7Ci0JCWFzc2VydEVxdWFscygiY29sb3IuZ2V0UmVkKCkiLCBjb2xvci5nZXRSZWQoKSwgMjU1KTsKLQl9IGZpbmFsbHkgewotCQljb2xvci5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDEyLCAzNCwgNTYpOwotCUNvbG9yIG90aGVyQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMTIsIDM0LCA1Nik7Ci0JaWYgKGNvbG9yLmVxdWFscyhvdGhlckNvbG9yKSkgewotCQlhc3NlcnRFcXVhbHMoIkhhc2ggY29kZXMgb2YgZXF1YWwgb2JqZWN0cyBzaG91bGQgYmUgZXF1YWwiLCBjb2xvci5oYXNoQ29kZSgpLCBvdGhlckNvbG9yLmhhc2hDb2RlKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCS8vIFRlc3QgQ29sb3IuaXNEaXNwb3NlZCgpIGZhbHNlCi0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMzQsIDY3LCA5OCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0VHJ1ZSgiQ29sb3Igc2hvdWxkIG5vdCBiZSBkaXNwb3NlZCIsICFjb2xvci5pc0Rpc3Bvc2VkKCkpOwotCX0gZmluYWxseSB7Ci0JCS8vIFRlc3QgQ29sb3IuaXNEaXNwb3NlZCgpIHRydWUKLQkJY29sb3IuZGlzcG9zZSgpOwotCQlhc3NlcnRUcnVlKCJDb2xvciBzaG91bGQgYmUgZGlzcG9zZWQiLCBjb2xvci5pc0Rpc3Bvc2VkKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAyNTUpOwotCXRyeSB7Ci0JCWFzc2VydE5vdE51bGwoY29sb3IudG9TdHJpbmcoKSk7Ci0JCWFzc2VydFRydWUoY29sb3IudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotCQlhc3NlcnRFcXVhbHMoIkNvbG9yIHswLCAwLCAyNTV9IiwgY29sb3IudG9TdHJpbmcoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJY29sb3IuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkoKSB7Ci0JLy8gZG8gbm90IHRlc3QgLSBXaW5kb3dzIHBsYXRmb3JtIG9ubHkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qmx1ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0R3JlZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJHQiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UmVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNEaXNwb3NlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qmx1ZSIpKSB0ZXN0X2dldEJsdWUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEdyZWVuIikpIHRlc3RfZ2V0R3JlZW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJHQiIpKSB0ZXN0X2dldFJHQigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UmVkIikpIHRlc3RfZ2V0UmVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0Rpc3Bvc2VkIikpIHRlc3RfaXNEaXNwb3NlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIikpIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotRGlzcGxheSBkaXNwbGF5OwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YWVmYWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSgpIHsKLQkvLyBUZXN0IG5ldyBDdXJzb3IoRGV2aWNlIGRldmljZSwgaW50IHN0eWxlKQotCS8vIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIGFuIHVua25vd24gc3R5bGUgaXMgc3BlY2lmaWVkCi0KLQlDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX0FSUk9XKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfQ1JPU1MpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfQVBQU1RBUlRJTkcpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfSEVMUCk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFQUxMKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVORVNXKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVOUyk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFTldTRSk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFV0UpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRU4pOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRVMpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRUUpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRVcpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRU5FKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVTRSk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFU1cpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRU5XKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1VQQVJST1cpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfSUJFQU0pOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfTk8pOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfSEFORCk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCS8vIGRldmljZSA9PSBudWxsICh2YWxpZCkKLQljdXJzb3IgPSBuZXcgQ3Vyc29yKG51bGwsIFNXVC5DVVJTT1JfQVJST1cpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBzdHlsZSA+IFNXVC5DVVJTT1JfSEFORCAoMjEpCi0JdHJ5IHsKLQkJY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCAxMDApOwotCQljdXJzb3IuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHlsZSA+IFNXVC5DVVJTT1JfSEFORCAoMjEpIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBzdHlsZSA8IDAKLQl0cnkgewotCQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIC0xMDApOwotCQljdXJzb3IuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHlsZSA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlJKCkgewotCS8vIFRlc3QgbmV3IEN1cnNvcihEZXZpY2UgZGV2aWNlLCBJbWFnZURhdGEgc291cmNlLCBJbWFnZURhdGEgbWFzaywgaW50IGhvdHNwb3RYLCBpbnQgaG90c3BvdFkpCi0JaW50IG51bUZvcm1hdHMgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHMubGVuZ3RoOwotCVN0cmluZyBmaWxlTmFtZSA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzWzBdOwotCWZvciAoaW50IGk9MDsgaTxudW1Gb3JtYXRzOyBpKyspIHsKLQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkJSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCUlucHV0U3RyZWFtIHN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUgKyAiLiIgKyBmb3JtYXQpOwotCQlJbWFnZURhdGEgc291cmNlID0gbG9hZGVyLmxvYWQoc3RyZWFtKVswXTsKLQkJSW1hZ2VEYXRhIG1hc2sgPSBzb3VyY2UuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQlpZiAobWFzayAhPSBudWxsICYmIChzb3VyY2UuZGVwdGggPT0gMSkpIHsKLQkJCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIHNvdXJjZSwgbWFzaywgMCwgMCk7Ci0JCQljdXJzb3IuZGlzcG9zZSgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gY29udGludWU7Ci0JCX0KLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfaXNEaXNwb3NlZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCS8qIE5vdGU6IFR3byBjdXJzb3JzIGFyZSBvbmx5IGNvbnNpZGVyZWQgZXF1YWwgaWYgdGhlaXIgaGFuZGxlcyBhcmUgZXF1YWwuCi0JICogU28gc2luY2UgV2luZG93cyByZXVzZXMgY3Vyc29yIGhhbmRsZXMsIGFuZCBvdGhlciBwbGF0Zm9ybXMgZG8gbm90LAotCSAqIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gdGVzdCB3aGV0aGVyIGN1cnNvci5lcXVhbHMoc2FtZUN1cnNvcikuCi0JICovCi0JQ3Vyc29yIGN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQlDdXJzb3Igb3RoZXJDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfQ1JPU1MpOwotCXRyeSB7Ci0JCS8vIFRlc3QgQ3Vyc29yLmVxdWFscyhPYmplY3QpCi0JCWFzc2VydFRydWUoIiFjdXJzb3IuZXF1YWxzKChPYmplY3QpbnVsbCkiLCAhY3Vyc29yLmVxdWFscygoT2JqZWN0KW51bGwpKTsKLQotCQkvLyBUZXN0IEN1cnNvci5lcXVhbHMoQ3Vyc29yKQotCQlhc3NlcnRUcnVlKCIhY3Vyc29yLmVxdWFscygoQ3Vyc29yKW51bGwpIiwgIWN1cnNvci5lcXVhbHMoKEN1cnNvciludWxsKSk7Ci0JCWFzc2VydFRydWUoImN1cnNvci5lcXVhbHMoY3Vyc29yKSIsIGN1cnNvci5lcXVhbHMoY3Vyc29yKSk7Ci0JCWFzc2VydFRydWUoIiFjdXJzb3IuZXF1YWxzKG90aGVyQ3Vyc29yKSIsICFjdXJzb3IuZXF1YWxzKG90aGVyQ3Vyc29yKSk7Ci0JfSBmaW5hbGx5IHsKLQkJY3Vyc29yLmRpc3Bvc2UoKTsKLQkJb3RoZXJDdXJzb3IuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaGFzaENvZGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCS8vIFRlc3QgQ3Vyc29yLmlzRGlzcG9zZWQoKSBmYWxzZQotCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0VHJ1ZSgiQ3Vyc29yIHNob3VsZCBub3QgYmUgZGlzcG9zZWQiLCAhY3Vyc29yLmlzRGlzcG9zZWQoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gVGVzdCBDdXJzb3IuaXNEaXNwb3NlZCgpIHRydWUKLQkJY3Vyc29yLmRpc3Bvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiQ3Vyc29yIHNob3VsZCBiZSBkaXNwb3NlZCIsIGN1cnNvci5pc0Rpc3Bvc2VkKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCWFzc2VydE5vdE51bGwoY3Vyc29yLnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUoY3Vyc29yLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkoKSB7Ci0JLy8gZG8gbm90IHRlc3QgLSBXaW5kb3dzIG9ubHkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0Rpc3Bvc2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNEaXNwb3NlZCIpKSB0ZXN0X2lzRGlzcG9zZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSIpKSB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSgpOwotfQotCi0vKiBjdXN0b20gKi8KLURpc3BsYXkgZGlzcGxheTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDcxZDgzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Qm91bmRzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xpZW50QXJlYSgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2xpZW50QXJlYSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERQSSgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RFBJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVwdGgoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERlcHRoIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGV2aWNlRGF0YSgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RGV2aWNlRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnRMaXN0TGphdmFfbGFuZ19TdHJpbmdaKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRGb250TGlzdExqYXZhX2xhbmdfU3RyaW5nWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN5c3RlbUNvbG9ySSgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U3lzdGVtQ29sb3JJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3lzdGVtRm9udCgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U3lzdGVtRm9udCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFdhcm5pbmdzKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRXYXJuaW5ncyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pc0Rpc3Bvc2VkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0V2FybmluZ3NaKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRXYXJuaW5nc1ogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RFBJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREZXB0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGV2aWNlRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udExpc3RMamF2YV9sYW5nX1N0cmluZ1oiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN5c3RlbUNvbG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3lzdGVtRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0V2FybmluZ3MiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0Rpc3Bvc2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRXYXJuaW5nc1oiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpZW50QXJlYSIpKSB0ZXN0X2dldENsaWVudEFyZWEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERQSSIpKSB0ZXN0X2dldERQSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGVwdGgiKSkgdGVzdF9nZXREZXB0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGV2aWNlRGF0YSIpKSB0ZXN0X2dldERldmljZURhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnRMaXN0TGphdmFfbGFuZ19TdHJpbmdaIikpIHRlc3RfZ2V0Rm9udExpc3RMamF2YV9sYW5nX1N0cmluZ1ooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN5c3RlbUNvbG9ySSIpKSB0ZXN0X2dldFN5c3RlbUNvbG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3lzdGVtRm9udCIpKSB0ZXN0X2dldFN5c3RlbUZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFdhcm5pbmdzIikpIHRlc3RfZ2V0V2FybmluZ3MoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0Rpc3Bvc2VkIikpIHRlc3RfaXNEaXNwb3NlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0V2FybmluZ3NaIikpIHRlc3Rfc2V0V2FybmluZ3NaKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTA4NDZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2VEYXRhCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlRGF0YQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JRGV2aWNlRGF0YSBkYXRhID0gbmV3IERldmljZURhdGEoKTsKLQlkYXRhLmRlYnVnID0gdHJ1ZTsKLQlkYXRhLnRyYWNraW5nID0gdHJ1ZTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNTlmZmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRHJhd2FibGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EcmF3YWJsZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGUgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0Mzg2MDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1EaXNwbGF5IGRpc3BsYXk7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEoKSB7Ci0JCi0JLy8gbnVsbCAgZGV2aWNlIGFyZ3VtZW50Ci0JCi0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQlGb250RGF0YVtdIGRhdGEgPSBuZXcgRm9udERhdGFbMV07Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KG51bGwsZGF0YSk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfSAKLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0JCi0JLy8gbnVsbCBkYXRhIGFyZ3VtZW50Ci0JCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJRm9udERhdGFbXSBkYXRhID0gbnVsbDsKLQkJRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSxkYXRhKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9IAotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQotCS8vIHplcm8gbGVuZ3RoIGRhdGEgYXJyYXkKLQkKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQlGb250RGF0YVtdIGRhdGEgPSBuZXcgRm9udERhdGFbMF07Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksZGF0YSk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfSAKLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0JCi0JLy8gbnVsbCBkYXRhIGVsZW1lbnQKLQkKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQlGb250RGF0YVtdIGRhdGEgPSB7Ci0JCQludWxsLAotCQkJbmV3IEZvbnREYXRhKCkKLQkJfTsKLQkJRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSxkYXRhKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9IAotCWFzc2VydFRydWUoIm51bGwgZGF0YSBlbGVtZW50IDAiLGV4Y2VwdGlvblRocm93bik7Ci0KLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQlGb250RGF0YVtdIGRhdGEgPSB7Ci0JCQluZXcgRm9udERhdGEoKSwKLQkJCW51bGwKLQkJfTsKLQkJRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSxkYXRhKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9IAotCWFzc2VydFRydWUoIm51bGwgZGF0YSBlbGVtZW50IDEiLGV4Y2VwdGlvblRocm93bik7Ci0JCi0JLy8gdGVzdCB0aGF0IEZvbnREYXRhIGlzIHNldCBjb3JyZWN0bHkKLQkKLQlGb250RGF0YSBkYXRhID0gbmV3IEZvbnREYXRhKCk7Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSxkYXRhKTsKLQlGb250RGF0YVtdIHJldHVybmVkRGF0YSA9IGZvbnQuZ2V0Rm9udERhdGEoKTsKLQlhc3NlcnRFcXVhbHMoZGF0YSxyZXR1cm5lZERhdGFbMF0pOwotCWZvbnQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKCkgewotCS8vIFRlc3QgbmV3IEZvbnQoRGV2aWNlIGRldmljZSwgRm9udERhdGEgZmQpCi0JLy8gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmZCBhcmd1bWVudCBpcyBudWxsCi0JLy8gU1dURXJyb3I6IEVSUk9SX05PX0hBTkRMRVMsIGlmIGEgZm9udCBjb3VsZCBub3QgYmUgY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiBmb250IGRhdGEKLQotCS8vIHZhbGlkIGZvbnQgd2l0aCBubyBuYW1lIChzdHJhbmdlLCBidXQgYXBwYXJlbnRseSB2YWxpZCkKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEoIiIsIDEwLCBTV1QuTk9STUFMKSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBmb250IHdpdGggdW5rbm93biBuYW1lIChzdHJhbmdlLCBidXQgYXBwYXJlbnRseSB2YWxpZCkKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmV3IEZvbnREYXRhKCJiYWQtZm9udCIsIDEwLCBTV1QuTk9STUFMKSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBmb250IHdpdGggMCBoZWlnaHQgKHN0cmFuZ2UsIGJ1dCBhcHBhcmVudGx5IHZhbGlkKQotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAwLCBTV1QuTk9STUFMKSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBub3JtYWwgMTAwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAwLCBTV1QuTk9STUFMKSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBub3JtYWwgMTAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCkpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgYm9sZCAxMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuQk9MRCkpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgaXRhbGljIDEwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5JVEFMSUMpKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGJvbGQgaXRhbGljIDEwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEIHwgU1dULklUQUxJQykpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgZm9udERhdGEgPT0gbnVsbAotCXRyeSB7Ci0JCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAoRm9udERhdGEpbnVsbCk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBmb250RGF0YSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBuYW1lID09IG51bGwKLQl0cnkgewotCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmV3IEZvbnREYXRhKG51bGwsIDEwLCBTV1QuTk9STUFMKSk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBuYW1lID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIGhlaWdodCA8IDAKLQl0cnkgewotCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgLTEwLCBTV1QuTk9STUFMKSk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2xhbmdfU3RyaW5nSUkoKSB7Ci0JLy8gVGVzdCBuZXcgRm9udChEZXZpY2UgZGV2aWNlLCBTdHJpbmcgbmFtZSwgaW50IGhlaWdodCwgaW50IHN0eWxlKQotCS8vIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBhcmd1bWVudCBpcyBudWxsIG9yIHRoZSBoZWlnaHQgaXMgbmVnYXRpdmUKLQkvLyBTV1RFcnJvcjogRVJST1JfTk9fSEFORExFUywgaWYgYSBmb250IGNvdWxkIG5vdCBiZSBjcmVhdGVkIGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50cwotCi0JLy8gdmFsaWQgZm9udCB3aXRoIG5vIG5hbWUgKHN0cmFuZ2UsIGJ1dCBhcHBhcmVudGx5IHZhbGlkKQotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksICIiLCAxMCwgU1dULk5PUk1BTCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBmb250IHdpdGggdW5rbm93biBuYW1lIChzdHJhbmdlLCBidXQgYXBwYXJlbnRseSB2YWxpZCkKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgImJhZC1mb250IiwgMTAsIFNXVC5OT1JNQUwpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgZm9udCB3aXRoIDAgaGVpZ2h0IChzdHJhbmdlLCBidXQgYXBwYXJlbnRseSB2YWxpZCkKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAwLCBTV1QuTk9STUFMKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIG5vcm1hbCAxMDAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwMCwgU1dULk5PUk1BTCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBub3JtYWwgMTAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGJvbGQgMTAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuQk9MRCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBpdGFsaWMgMTAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuSVRBTElDKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGJvbGQgaXRhbGljIDEwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIGRldmljZSA9PSBudWxsICh2YWxpZCkKLQlmb250ID0gbmV3IEZvbnQobnVsbCwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBuYW1lID09IG51bGwKLQl0cnkgewotCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbnVsbCwgMTAsIFNXVC5OT1JNQUwpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbmFtZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBoZWlnaHQgPCAwCi0JdHJ5IHsKLQkJZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgLTEwLCBTV1QuTk9STUFMKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWFzc2VydEZhbHNlKGZvbnQuaXNEaXNwb3NlZCgpKTsKLQlmb250LmRpc3Bvc2UoKTsKLQlhc3NlcnRUcnVlKGZvbnQuaXNEaXNwb3NlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQkvLyBGb250cyBhcmUgb25seSBlcXVhbCBpZiB0aGVpciBoYW5kbGVzIGFyZSB0aGUgc2FtZSAoPyEpCi0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JRm9udCBvdGhlckZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDIwLCBTV1QuTk9STUFMKTsKLQl0cnkgewotCQkvLyBUZXN0IEZvbnQuZXF1YWxzKE9iamVjdCkKLQkJYXNzZXJ0VHJ1ZSgiIWZvbnQuZXF1YWxzKChPYmplY3QpbnVsbCkiLCAhZm9udC5lcXVhbHMoKE9iamVjdCludWxsKSk7Ci0KLQkJLy8gVGVzdCBGb250LmVxdWFscyhGb250KQotCQlhc3NlcnRUcnVlKCIhZm9udC5lcXVhbHMoKEZvbnQpbnVsbCkiLCAhZm9udC5lcXVhbHMoKEZvbnQpbnVsbCkpOwotCQlhc3NlcnRUcnVlKCJmb250LmVxdWFscyhmb250KSIsIGZvbnQuZXF1YWxzKGZvbnQpKTsKLQkJYXNzZXJ0VHJ1ZSgiIWZvbnQuZXF1YWxzKG90aGVyRm9udCkiLCAhZm9udC5lcXVhbHMob3RoZXJGb250KSk7Ci0JfSBmaW5hbGx5IHsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCW90aGVyRm9udC5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnREYXRhKCkgewotCS8vIFRlc3QgRm9udC5nZXRGb250RGF0YSgpCi0JLy8gdmFsaWQgbm9ybWFsIDEwLXBvaW50IGZvbnQKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQl0cnkgewotCQlGb250RGF0YSBmb250RGF0YVtdID0gZm9udC5nZXRGb250RGF0YSgpOwotCQlhc3NlcnRUcnVlKCJObyBmb250IGRhdGEiLCBmb250RGF0YSAhPSBudWxsICYmIGZvbnREYXRhLmxlbmd0aCA+IDApOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgbmFtZSIsIFN3dEp1bml0LnRlc3RGb250TmFtZSwgZm9udERhdGFbMF0uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IGhlaWdodCIsIDEwLCBmb250RGF0YVswXS5nZXRIZWlnaHQoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBzdHlsZSIsIFNXVC5OT1JNQUwsIGZvbnREYXRhWzBdLmdldFN0eWxlKCkpOwotCX0gZmluYWxseSB7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCX0KLQotCS8vIHZhbGlkIGJvbGQgMjAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDIwLCBTV1QuQk9MRCk7Ci0JdHJ5IHsKLQkJRm9udERhdGEgZm9udERhdGFbXSA9IGZvbnQuZ2V0Rm9udERhdGEoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm8gZm9udCBkYXRhIiwgZm9udERhdGEgIT0gbnVsbCAmJiBmb250RGF0YS5sZW5ndGggPiAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IG5hbWUiLCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIGZvbnREYXRhWzBdLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBoZWlnaHQiLCAyMCwgZm9udERhdGFbMF0uZ2V0SGVpZ2h0KCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgc3R5bGUiLCBTV1QuQk9MRCwgZm9udERhdGFbMF0uZ2V0U3R5bGUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfQotCi0JLy8gdmFsaWQgaXRhbGljIDMwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAzMCwgU1dULklUQUxJQyk7Ci0JdHJ5IHsKLQkJRm9udERhdGEgZm9udERhdGFbXSA9IGZvbnQuZ2V0Rm9udERhdGEoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm8gZm9udCBkYXRhIiwgZm9udERhdGEgIT0gbnVsbCAmJiBmb250RGF0YS5sZW5ndGggPiAwKTsKLS8vCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgbmFtZSIsIFN3dEp1bml0LnRlc3RGb250TmFtZSwgZm9udERhdGFbMF0uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IGhlaWdodCIsIDMwLCBmb250RGF0YVswXS5nZXRIZWlnaHQoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBzdHlsZSIsIFNXVC5JVEFMSUMsIGZvbnREYXRhWzBdLmdldFN0eWxlKCkpOwotCX0gZmluYWxseSB7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCX0KLQotCS8vIHZhbGlkIGJvbGQgaXRhbGljIDQwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCA0MCwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQl0cnkgewotCQlGb250RGF0YSBmb250RGF0YVtdID0gZm9udC5nZXRGb250RGF0YSgpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm8gZm9udCBkYXRhIiwgZm9udERhdGEgIT0gbnVsbCAmJiBmb250RGF0YS5sZW5ndGggPiAwKTsKLS8vCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgbmFtZSIsIFN3dEp1bml0LnRlc3RGb250TmFtZSwgZm9udERhdGFbMF0uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IGhlaWdodCIsIDQwLCBmb250RGF0YVswXS5nZXRIZWlnaHQoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBzdHlsZSIsIFNXVC5CT0xEIHwgU1dULklUQUxJQywgZm9udERhdGFbMF0uZ2V0U3R5bGUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfQotCi0JLy8gdmFsaWQgMTAtcG9pbnQgZm9udCB3aXRoIHVua25vd24gbmFtZQotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiYmFkLWZvbnQiLCAxMCwgU1dULk5PUk1BTCk7Ci0JdHJ5IHsKLQkJRm9udERhdGEgZm9udERhdGFbXSA9IGZvbnQuZ2V0Rm9udERhdGEoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm8gZm9udCBkYXRhIiwgZm9udERhdGEgIT0gbnVsbCAmJiBmb250RGF0YS5sZW5ndGggPiAwKTsKLS8vCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgbmFtZSIsICJiYWQtZm9udCIsIGZvbnREYXRhWzBdLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBoZWlnaHQiLCAxMCwgZm9udERhdGFbMF0uZ2V0SGVpZ2h0KCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgc3R5bGUiLCBTV1QuTk9STUFMLCBmb250RGF0YVswXS5nZXRTdHlsZSgpKTsKLQl9IGZpbmFsbHkgewotCQlmb250LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JYXNzZXJ0RXF1YWxzKGZvbnQsZm9udCk7Ci0JYXNzZXJ0RXF1YWxzKGZvbnQuaGFzaENvZGUoKSxmb250Lmhhc2hDb2RlKCkpOwotCUZvbnQgYm9sZEZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuQk9MRCk7Ci0JYXNzZXJ0RmFsc2UoZm9udC5oYXNoQ29kZSgpID09IGJvbGRGb250Lmhhc2hDb2RlKCkpOwotCWJvbGRGb250LmRpc3Bvc2UoKTsKLQlmb250LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCS8vIFRlc3QgRm9udC5pc0Rpc3Bvc2VkKCkgZmFsc2UKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQl0cnkgewotCQlhc3NlcnRUcnVlKCJGb250IHNob3VsZCBub3QgYmUgZGlzcG9zZWQiLCAhZm9udC5pc0Rpc3Bvc2VkKCkpOwotCX0gZmluYWxseSB7Ci0JCS8vIFRlc3QgRm9udC5pc0Rpc3Bvc2VkKCkgdHJ1ZQotCQlmb250LmRpc3Bvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiRm9udCBzaG91bGQgYmUgZGlzcG9zZWQiLCBmb250LmlzRGlzcG9zZWQoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWFzc2VydE5vdE51bGwoZm9udC50b1N0cmluZygpKTsKLQkKLQlmb250LmRpc3Bvc2UoKTsKLQlhc3NlcnROb3ROdWxsKGZvbnQudG9TdHJpbmcoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJKCkgewotCS8vIGRvIG5vdCB0ZXN0IC0gV2luZG93cyBvbmx5Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2xhbmdfU3RyaW5nSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250RGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRGlzcG9zZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTGphdmFfbGFuZ19TdHJpbmdJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9sYW5nX1N0cmluZ0lJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udERhdGEiKSkgdGVzdF9nZXRGb250RGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNEaXNwb3NlZCIpKSB0ZXN0X2lzRGlzcG9zZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSIpKSB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTYzMzY0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCS8vIFRlc3QgbmV3IEZvbnREYXRhKCkKLQlGb250RGF0YSBmZCA9IG5ldyBGb250RGF0YSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JLy8gVGVzdCBuZXcgRm9udERhdGEoU3RyaW5nIHN0cmluZykKLQlGb250RGF0YSBmZCA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlGb250RGF0YSByZWNvbnN0cnVjdGVkRm9udERhdGEgPSBuZXcgRm9udERhdGEoZmQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0RXF1YWxzKGZkLCByZWNvbnN0cnVjdGVkRm9udERhdGEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdJSSgpIHsKLQkvLyBUZXN0IG5ldyBGb250RGF0YShTdHJpbmcgbmFtZSwgaW50IGhlaWdodCwgaW50IHN0eWxlKQotCS8vIHZhbGlkIGZvbnQgZGF0YSB3aXRoIG5vIG5hbWUgKHN0cmFuZ2UsIGJ1dCBhcHBhcmVudGx5IHZhbGlkKQotCUZvbnREYXRhIGZkID0gbmV3IEZvbnREYXRhKCIiLCAxMCwgU1dULk5PUk1BTCk7Ci0KLQkvLyB2YWxpZCBmb250IGRhdGEgd2l0aCB1bmtub3duIG5hbWUgKHN0cmFuZ2UsIGJ1dCBhcHBhcmVudGx5IHZhbGlkKQotCWZkID0gbmV3IEZvbnREYXRhKCJiYWQtZm9udCIsIDEwLCBTV1QuTk9STUFMKTsKLQotCS8vIHZhbGlkIGZvbnQgZGF0YSB3aXRoIDAgaGVpZ2h0IChzdHJhbmdlLCBidXQgYXBwYXJlbnRseSB2YWxpZCkKLQlmZCA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDAsIFNXVC5OT1JNQUwpOwotCi0JLy8gdmFsaWQgZm9udCBkYXRhIHdpdGggMTAwMCBoZWlnaHQgKHByZXR0eSBiaWcsIGJ1dCBhcHBhcmVudGx5IHZhbGlkKQotCWZkID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAwMCwgU1dULk5PUk1BTCk7Ci0KLQkvLyB2YWxpZCBub3JtYWwgMTAtcG9pbnQgZm9udCBkYXRhCi0JZmQgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0KLQkvLyB2YWxpZCBib2xkIDEwLXBvaW50IGZvbnQgZGF0YQotCWZkID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEKTsKLQotCS8vIHZhbGlkIGl0YWxpYyAxMC1wb2ludCBmb250IGRhdGEKLQlmZCA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuSVRBTElDKTsKLQotCS8vIHZhbGlkIGJvbGQgaXRhbGljIDEwLXBvaW50IGZvbnQgZGF0YQotCWZkID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEIHwgU1dULklUQUxJQyk7Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBuYW1lID09IG51bGwKLQl0cnkgewotCQlmZCA9IG5ldyBGb250RGF0YShudWxsLCAxMCwgU1dULk5PUk1BTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG5hbWUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgaGVpZ2h0IDwgMAotCXRyeSB7Ci0JCWZkID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgLTEwLCBTV1QuTk9STUFMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCUZvbnREYXRhIGZkMSA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlGb250RGF0YSBmZDIgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JYXNzZXJ0RXF1YWxzKGZkMSxmZDEpOwotCWFzc2VydEVxdWFscyhmZDEsZmQyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWlnaHQoKSB7Ci0JLy8gRm9udC5nZXRIZWlnaHQoKSB0ZXN0ZWQgaW4gdGVzdF9zZXRIZWlnaHRJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYWxlKCkgewotCS8vIEZvbnREYXRhLmdldExvY2FsZSgpIHRlc3RlZCBpbiB0ZXN0X3NldExvY2FsZUxqYXZhX2xhbmdfU3RyaW5nCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHsKLQkvLyBGb250LmdldE5hbWUoKSB0ZXN0ZWQgaW4gdGVzdF9zZXROYW1lTGphdmFfbGFuZ19TdHJpbmcKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZSgpIHsKLQkvLyBGb250LmdldFN0eWxlKCkgdGVzdGVkIGluIHRlc3Rfc2V0U3R5bGVJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JRm9udERhdGEgZmQxID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCUZvbnREYXRhIGZkMiA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlhc3NlcnRFcXVhbHMoZmQxLGZkMik7Ci0JYXNzZXJ0RXF1YWxzKGZkMS5oYXNoQ29kZSgpLGZkMi5oYXNoQ29kZSgpKTsKLQlGb250RGF0YSBmZDMgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULkJPTEQpOwotCWFzc2VydEZhbHNlKGZkMS5oYXNoQ29kZSgpID09IGZkMy5oYXNoQ29kZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRIZWlnaHRJKCkgewotCS8vIFRlc3QgRm9udC5zZXRIZWlnaHQoaW50ICBoZWlnaHQpCi0JLy8gdmFsaWQgbm9ybWFsIGZvbnQgZGF0YSBmb3IgdmFyaW91cyBoZWlnaHRzCi0JRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7CQotCWZvciAoaW50IGhlaWdodCA9IDA7IGhlaWdodCA8IDEwMDA7IGhlaWdodCsrKSB7Ci0JCWZvbnREYXRhLnNldEhlaWdodChoZWlnaHQpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGhlaWdodCIsIGZvbnREYXRhLmdldEhlaWdodCgpLCBoZWlnaHQpOwotCX0KLQotCS8vIHZhbGlkIGJvbGQgZm9udCBkYXRhIGZvciB2YXJpb3VzIGhlaWdodHMKLQlmb250RGF0YSA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuQk9MRCk7CQotCWZvciAoaW50IGhlaWdodCA9IDA7IGhlaWdodCA8IDEwMDA7IGhlaWdodCsrKSB7Ci0JCWZvbnREYXRhLnNldEhlaWdodChoZWlnaHQpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGhlaWdodCIsIGZvbnREYXRhLmdldEhlaWdodCgpLCBoZWlnaHQpOwotCX0KLQotCS8vIHZhbGlkIGl0YWxpYyBmb250IGRhdGEgZm9yIHZhcmlvdXMgaGVpZ2h0cwotCWZvbnREYXRhID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5JVEFMSUMpOwkKLQlmb3IgKGludCBoZWlnaHQgPSAwOyBoZWlnaHQgPCAxMDAwOyBoZWlnaHQrKykgewotCQlmb250RGF0YS5zZXRIZWlnaHQoaGVpZ2h0KTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBoZWlnaHQiLCBmb250RGF0YS5nZXRIZWlnaHQoKSwgaGVpZ2h0KTsKLQl9Ci0KLQkvLyB2YWxpZCBib2xkIGl0YWxpYyBmb250IGRhdGEgZm9yIHZhcmlvdXMgaGVpZ2h0cwotCWZvbnREYXRhID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEIHwgU1dULklUQUxJQyk7CQotCWZvciAoaW50IGhlaWdodCA9IDA7IGhlaWdodCA8IDEwMDA7IGhlaWdodCsrKSB7Ci0JCWZvbnREYXRhLnNldEhlaWdodChoZWlnaHQpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGhlaWdodCIsIGZvbnREYXRhLmdldEhlaWdodCgpLCBoZWlnaHQpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMb2NhbGVMamF2YV9sYW5nX1N0cmluZygpIHsKLQlGb250RGF0YSBmZCA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlMb2NhbGUgbG9jYWxlID0gTG9jYWxlLkVOR0xJU0g7Ci0JZmQuc2V0TG9jYWxlKGxvY2FsZS50b1N0cmluZygpKTsKLQlhc3NlcnRFcXVhbHMoTG9jYWxlLkVOR0xJU0gudG9TdHJpbmcoKSxmZC5nZXRMb2NhbGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TmFtZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCS8vIFRlc3QgRm9udC5zZXROYW1lKFN0cmluZyBuYW1lKQotCS8vIHZhbGlkIG5hbWUKLQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCBmb250RGF0YS5nZXROYW1lKCksIFN3dEp1bml0LnRlc3RGb250TmFtZSk7Ci0KLQkvLyB2YWxpZCBuYW1lICh1bmtub3duIG5hbWUsIGJ1dCB2YWxpZCkKLQlmb250RGF0YS5zZXROYW1lKCJiYWQtZm9udCIpOwotCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsIGZvbnREYXRhLmdldE5hbWUoKSwgImJhZC1mb250Iik7Ci0KLQkvLyB2YWxpZCBuYW1lIChlbXB0eSBzdHJpbmcsIGJ1dCB2YWxpZCkKLQkvLyBvbmx5IG9uIHdpbmRvd3Mgc2luY2UgbW90aWYgc3VwcG9ydHMgc2VwYXJhdGUgZm9udCBmb3VuZHJpZXMKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWZvbnREYXRhLnNldE5hbWUoIiIpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCBmb250RGF0YS5nZXROYW1lKCksICIiKTsKLQl9Ci0KLQkvLyB2YWxpZCBuYW1lCi0JZm9udERhdGEuc2V0TmFtZShTd3RKdW5pdC50ZXN0Rm9udE5hbWUpOwkKLQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCBmb250RGF0YS5nZXROYW1lKCksIFN3dEp1bml0LnRlc3RGb250TmFtZSk7Ci0JLy8gaWxsZWdhbCBhcmd1bWVudCwgbmFtZSA9PSBudWxsCi0JdHJ5IHsKLQkJZm9udERhdGEuc2V0TmFtZShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbmFtZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U3R5bGVJKCkgewotCS8vIFRlc3QgRm9udC5zZXRTdHlsZShpbnQgIHN0eWxlKQotCWZvciAoaW50IGhlaWdodCA9IDA7IGhlaWdodCA8IDEwMDA7IGhlaWdodCsrKSB7Ci0JCS8vIHZhbGlkIG5vcm1hbCBmb250IGRhdGEKLQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCBoZWlnaHQsIFNXVC5OT1JNQUwpOwkKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdHlsZSIsIGZvbnREYXRhLmdldFN0eWxlKCksIFNXVC5OT1JNQUwpOwotCi0JCS8vIHZhbGlkIGJvbGQgZm9udCBkYXRhCi0JCWZvbnREYXRhLnNldFN0eWxlKFNXVC5CT0xEKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdHlsZSIsIGZvbnREYXRhLmdldFN0eWxlKCksIFNXVC5CT0xEKTsKLQotCQkvLyB2YWxpZCBpdGFsaWMgZm9udCBkYXRhCi0JCWZvbnREYXRhLnNldFN0eWxlKFNXVC5JVEFMSUMpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0eWxlIiwgZm9udERhdGEuZ2V0U3R5bGUoKSwgU1dULklUQUxJQyk7Ci0JCQotCQkvLyB2YWxpZCBib2xkIGl0YWxpYyBmb250IGRhdGEKLQkJZm9udERhdGEuc2V0U3R5bGUoU1dULklUQUxJQyB8IFNXVC5CT0xEKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdHlsZSIsIGZvbnREYXRhLmdldFN0eWxlKCksIFNXVC5CT0xEIHwgU1dULklUQUxJQyk7Ci0KLQkJLy8gdmFsaWQgbm9ybWFsIGZvbnQgZGF0YQotCQlmb250RGF0YS5zZXRTdHlsZShTV1QuTk9STUFMKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdHlsZSIsIGZvbnREYXRhLmdldFN0eWxlKCksIFNXVC5OT1JNQUwpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlGb250RGF0YSBkYXRhID0gbmV3IEZvbnREYXRhKCk7Ci0JYXNzZXJ0Tm90TnVsbChkYXRhLnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUoZGF0YS50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05USSgpIHsKLQkvLyBkbyBub3QgdGVzdCAtIFdpbmRvd3Mgb25seQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0lJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMb2NhbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE5hbWUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0eWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SGVpZ2h0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TG9jYWxlTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE5hbWVMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U3R5bGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05USSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0lJIikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0lJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWlnaHQiKSkgdGVzdF9nZXRIZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExvY2FsZSIpKSB0ZXN0X2dldExvY2FsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TmFtZSIpKSB0ZXN0X2dldE5hbWUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlIikpIHRlc3RfZ2V0U3R5bGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEhlaWdodEkiKSkgdGVzdF9zZXRIZWlnaHRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMb2NhbGVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldExvY2FsZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXROYW1lTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXROYW1lTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFN0eWxlSSIpKSB0ZXN0X3NldFN0eWxlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05USSIpKSB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEkoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU2MDYwOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnRNZXRyaWNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3MKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnRNZXRyaWNzIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3MoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZ2MgPSBuZXcgR0Moc2hlbGwpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlnYy5kaXNwb3NlKCk7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCUZvbnRNZXRyaWNzIGZtMSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JRm9udE1ldHJpY3MgZm0yID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlhc3NlcnRUcnVlKGZtMS5lcXVhbHMoZm0yKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QXNjZW50KCkgewotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmbS5nZXRBc2NlbnQoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBdmVyYWdlQ2hhcldpZHRoKCkgewotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmbS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY2VudCgpIHsKLQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JZm0uZ2V0RGVzY2VudCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhlaWdodCgpIHsKLQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JZm0uZ2V0SGVpZ2h0KCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGVhZGluZygpIHsKLQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JZm0uZ2V0TGVhZGluZygpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCUZvbnRNZXRyaWNzIGZtMSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JRm9udE1ldHJpY3MgZm0yID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlpZiAoZm0xLmVxdWFscyhmbTIpKSB7Ci0JCWFzc2VydEVxdWFscyhmbTEuaGFzaENvZGUoKSwgZm0yLmhhc2hDb2RlKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUMoKSB7Ci0JLy8gZG8gbm90IHRlc3QgLSBXaW5kb3dzIG9ubHkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3MoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFzY2VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QXZlcmFnZUNoYXJXaWR0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVzY2VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMZWFkaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9URVhUTUVUUklDIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFzY2VudCIpKSB0ZXN0X2dldEFzY2VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QXZlcmFnZUNoYXJXaWR0aCIpKSB0ZXN0X2dldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlc2NlbnQiKSkgdGVzdF9nZXREZXNjZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWlnaHQiKSkgdGVzdF9nZXRIZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExlYWRpbmciKSkgdGVzdF9nZXRMZWFkaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUMiKSkgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUMoKTsKLX0KLQotLyogY3VzdG9tICovCi0JRGlzcGxheSBkaXNwbGF5OwotCVNoZWxsIHNoZWxsOwotCUdDIGdjOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2IxODdhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0MgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMCwzMCwyNDAsMjkwKTsKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAyMDAsIDIwMCk7Ci0JZ2MgPSBuZXcgR0MoaW1hZ2UpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlnYy5kaXNwb3NlKCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCXNoZWxsLmRpc3Bvc2UoKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlKCkgewotCXRyeSB7Ci0JCUdDIGdjID0gbmV3IEdDKG51bGwpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRyYXdhYmxlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBkcmF3YWJsZSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQotCXRyeSB7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JCUdDIGdjMSA9IG5ldyBHQyhpbWFnZSk7Ci0JCUdDIGdjMiA9IG5ldyBHQyhpbWFnZSk7Ci0JCWdjMS5kaXNwb3NlKCk7Ci0JCWdjMi5kaXNwb3NlKCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbW9yZSB0aGFuIG9uZSBHQyBvbiBvbmUgaW1hZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtb3JlIHRoYW4gb25lIEdDIG9uIG9uZSBpbWFnZSIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlpZiAoUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKSA9PSBudWxsKSB7Ci0JCS8vIE5vIHByaW50ZXIgaW5zdGFsbGVkLiBTa2lwIHRlc3QuCi0JCXJldHVybjsKLQl9Ci0JQ2xhc3MgcHJpbnRlckNsYXNzID0gbnVsbDsKLQl0cnkgewotCQlwcmludGVyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnRlciIpOwotCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkvLyBQcmludGVyIGNsYXNzIG5vdCBwcmVzZW50IChlU1dUKS4gU2tpcCB0ZXN0LgotCQlyZXR1cm47Ci0JfQotCXRyeSB7Ci0JCS8vIERpcmVjdCBpbnN0YW50aWF0aW9uIHJlc3VsdHMgaW4gYSBOb0NsYXNzRGVmRm91bmRFcnJvciBkdXJpbmcgY2xhc3MgCi0JCS8vIGxvYWRpbmcvaW5pdGlhbGl6YXRpb24uIENhc3Rpbmcgc2VlbXMgdG8gYmUgb2suCi0JCU9iamVjdCBwcmludGVyID0gcHJpbnRlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCUdDIGdjMSA9IG5ldyBHQygoUHJpbnRlcikgcHJpbnRlcik7Ci0JCUdDIGdjMiA9IG5ldyBHQygoUHJpbnRlcikgcHJpbnRlcik7Ci0JCWdjMS5kaXNwb3NlKCk7Ci0JCWdjMi5kaXNwb3NlKCk7Ci0JCSgoUHJpbnRlcikgcHJpbnRlcikuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtb3JlIHRoYW4gb25lIEdDIG9uIG9uZSBwcmludGVyIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbW9yZSB0aGFuIG9uZSBHQyBvbiBvbmUgcHJpbnRlciIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlSSgpIHsKLQl0cnkgewotCQlHQyBnYyA9IG5ldyBHQyhudWxsLCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZHJhd2FibGUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRyYXdhYmxlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JdHJ5IHsKLQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQkJR0MgZ2MxID0gbmV3IEdDKGltYWdlLCBTV1QuUklHSFRfVE9fTEVGVCk7Ci0JCUdDIGdjMiA9IG5ldyBHQyhpbWFnZSwgU1dULkxFRlRfVE9fUklHSFQpOwotCQlnYzEuZGlzcG9zZSgpOwotCQlnYzIuZGlzcG9zZSgpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1vcmUgdGhhbiBvbmUgR0Mgb24gb25lIGltYWdlIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbW9yZSB0aGFuIG9uZSBHQyBvbiBvbmUgaW1hZ2UiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5OVUxMKTsKLQlHQyB0ZXN0R0MgPSBuZXcgR0MoY2FudmFzLCBTV1QuUklHSFRfVE9fTEVGVCk7Ci0JdGVzdEdDLmRpc3Bvc2UoKTsKLQl0ZXN0R0MgPSBuZXcgR0MoY2FudmFzLCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JdGVzdEdDLmRpc3Bvc2UoKTsKLQljYW52YXMuZGlzcG9zZSgpOwotCi0JaWYgKFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCkgPT0gbnVsbCkgewotCQkvLyBObyBwcmludGVyIGluc3RhbGxlZC4gU2tpcCB0ZXN0LgotCQlyZXR1cm47Ci0JfQotCUNsYXNzIHByaW50ZXJDbGFzcyA9IG51bGw7Ci0JdHJ5IHsKLQkJcHJpbnRlckNsYXNzID0gQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50ZXIiKTsKLQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJLy8gUHJpbnRlciBjbGFzcyBub3QgcHJlc2VudCAoZVNXVCkuIFNraXAgdGVzdC4KLQkJcmV0dXJuOwotCX0KLQl0cnkgewotCQkvLyBEaXJlY3QgaW5zdGFudGlhdGlvbiByZXN1bHRzIGluIGEgTm9DbGFzc0RlZkZvdW5kRXJyb3IgZHVyaW5nIGNsYXNzIAotCQkvLyBsb2FkaW5nL2luaXRpYWxpemF0aW9uLiBDYXN0aW5nIHNlZW1zIHRvIGJlIG9rLgotCQlPYmplY3QgcHJpbnRlciA9IHByaW50ZXJDbGFzcy5uZXdJbnN0YW5jZSgpOwotCQlHQyBnYzEgPSBuZXcgR0MoKFByaW50ZXIpcHJpbnRlciwgU1dULlJJR0hUX1RPX0xFRlQpOwotCQlHQyBnYzIgPSBuZXcgR0MoKFByaW50ZXIpcHJpbnRlciwgU1dULkxFRlRfVE9fUklHSFQpOwotCQlnYzEuZGlzcG9zZSgpOwotCQlnYzIuZGlzcG9zZSgpOwotCQkoKFByaW50ZXIpIHByaW50ZXIpLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbW9yZSB0aGFuIG9uZSBHQyBvbiBvbmUgcHJpbnRlciIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1vcmUgdGhhbiBvbmUgR0Mgb24gb25lIHByaW50ZXIiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvcHlBcmVhSUlJSUlJKCkgewotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQlSR0Igd2hpdGVSR0IgPSBnZXRSZWFsUkdCKHdoaXRlKTsKLQlSR0IgYmx1ZVJHQiA9IGdldFJlYWxSR0IoYmx1ZSk7Ci0JaW50IHdpZHRoID0gMjA7Ci0JaW50IGhlaWdodCA9IDIwOwotCWludCBkZXN0WCA9IDEwOwotCWludCBkZXN0WSA9IDUwOwotCi0JZ2Muc2V0QmFja2dyb3VuZCh3aGl0ZSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZShpbWFnZS5nZXRCb3VuZHMoKSk7Ci0JZ2Muc2V0QmFja2dyb3VuZChibHVlKTsKLQlnYy5maWxsUmVjdGFuZ2xlKDUsIDAsIDYsIDEpOwotCWdjLmNvcHlBcmVhKDAsIDAsIHdpZHRoLCBoZWlnaHQsIGRlc3RYLCBkZXN0WSk7Ci0KLQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IGltYWdlRGF0YS5wYWxldHRlOyAKLQlpbnQgcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoZGVzdFggKyA0LCBkZXN0WSk7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCB3aGl0ZVJHQiwgcGFsZXR0ZS5nZXRSR0IocGl4ZWwpKTsKLQlwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbChkZXN0WCArIDUsIGRlc3RZKTsKLSAJYXNzZXJ0RXF1YWxzKCI6YjoiLCBibHVlUkdCLCBwYWxldHRlLmdldFJHQihwaXhlbCkpOwkKLQlwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbChkZXN0WCArIDEwLCBkZXN0WSk7Ci0JYXNzZXJ0RXF1YWxzKCI6YzoiLCBibHVlUkdCLCBwYWxldHRlLmdldFJHQihwaXhlbCkpOwkKLQlwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbChkZXN0WCArIDExLCBkZXN0WSk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZDoiLCB3aGl0ZVJHQiwgcGFsZXR0ZS5nZXRSR0IocGl4ZWwpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb3B5QXJlYUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSSgpIHsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JUkdCIHdoaXRlUkdCID0gZ2V0UmVhbFJHQih3aGl0ZSk7Ci0JUkdCIGJsdWVSR0IgPSBnZXRSZWFsUkdCKGJsdWUpOwotCQotCWdjLnNldEJhY2tncm91bmQod2hpdGUpOwotCWdjLmZpbGxSZWN0YW5nbGUoaW1hZ2UuZ2V0Qm91bmRzKCkpOwotCWdjLnNldEJhY2tncm91bmQoYmx1ZSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZSg1LCAwLCA2LCAxKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMiwgMTIpOwotCWdjLmNvcHlBcmVhKGltYWdlLCAwLCAwKTsKLQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IGltYWdlRGF0YS5wYWxldHRlOyAKLQlpbnQgcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoNCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCB3aGl0ZVJHQiwgcGFsZXR0ZS5nZXRSR0IocGl4ZWwpKTsKLQlwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbCg1LCAwKTsKLQlhc3NlcnRFcXVhbHMoIjpiOiIsIGJsdWVSR0IsIHBhbGV0dGUuZ2V0UkdCKHBpeGVsKSk7Ci0JcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoMTAsIDApOwotCWFzc2VydEVxdWFscygiOmM6IiwgYmx1ZVJHQiwgcGFsZXR0ZS5nZXRSR0IocGl4ZWwpKTsJCi0JcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoMTEsIDApOwotCWFzc2VydEVxdWFscygiOmQ6Iiwgd2hpdGVSR0IsIHBhbGV0dGUuZ2V0UkdCKHBpeGVsKSk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JZ2MuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdBcmNJSUlJSUkoKSB7Ci0JZ2MuZHJhd0FyYygxMCwgMjAsIDUwLCAyNSwgOTAsIDkwKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd0ZvY3VzSUlJSSgpIHsKLQlnYy5kcmF3Rm9jdXMoMSwgMSwgNTAsIDI1KTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd0ltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJKCkgewotCUNvbG9yIGMxID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMCwgMCk7Ci0JQ29sb3IgYzIgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMCwgMCk7Ci0JQ29sb3IgYzMgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAyNTUsIDApOwotCQotCVBhbGV0dGVEYXRhIHBhbGV0dGVEYXRhID0gbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7YzEuZ2V0UkdCKCksIGMyLmdldFJHQigpLCBjMy5nZXRSR0IoKX0pOwotCUltYWdlRGF0YSBkYXRhID0gbmV3IEltYWdlRGF0YSgzMCwzMCwgOCwgcGFsZXR0ZURhdGEpOwotCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQlmb3IgKGludCB4ID0gMDsgeCA8IGRhdGEud2lkdGg7IHgrKykgewotCQkJaWYgKHggPiB5KSBkYXRhLnNldFBpeGVsKHgsIHksIHBhbGV0dGVEYXRhLmdldFBpeGVsKGMxLmdldFJHQigpKSk7Ci0JCQllbHNlIGlmICh4IDwgeSkgZGF0YS5zZXRQaXhlbCh4LCB5LCBwYWxldHRlRGF0YS5nZXRQaXhlbChjMi5nZXRSR0IoKSkpOwotCQkJZWxzZSBkYXRhLnNldFBpeGVsKHgsIHksIHBhbGV0dGVEYXRhLmdldFBpeGVsKGMzLmdldFJHQigpKSk7Ci0JCX0KLQl9Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JZGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCWRhdGEudHJhbnNwYXJlbnRQaXhlbCA9IHBhbGV0dGVEYXRhLmdldFBpeGVsKGMxLmdldFJHQigpKTsKLQlJbWFnZSBpbWFnZVRyYW5zcGFyZW50ID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotCWRhdGEudHJhbnNwYXJlbnRQaXhlbCA9IC0xOwotCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQlmb3IgKGludCB4ID0gMDsgeCA8IGRhdGEud2lkdGg7IHgrKykgewotCQkJZGF0YS5zZXRBbHBoYSh4LCB5LCAxMjcpOwotCQl9Ci0JfQkJCi0JSW1hZ2UgaW1hZ2VBbHBoYSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQkJCQkJCQkKLQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDEwMCwgMTAwKTsKLQlnYy5kcmF3SW1hZ2UoaW1hZ2VUcmFuc3BhcmVudCwgMTMwLCAxMDApOwotCWdjLmRyYXdJbWFnZShpbWFnZUFscGhhLCAxNjAsIDEwMCk7Ci0JdHJ5IHsKLQkJZ2MuZHJhd0ltYWdlKG51bGwsIDEwMCwgMTAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWltYWdlVHJhbnNwYXJlbnQuZGlzcG9zZSgpOwotCWltYWdlQWxwaGEuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSUlJSUlJSSgpIHsKLQlDb2xvciBjMSA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDAsIDApOwotCUNvbG9yIGMyID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDAsIDApOwotCUNvbG9yIGMzID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMjU1LCAwKTsKLQkKLQlQYWxldHRlRGF0YSBwYWxldHRlRGF0YSA9IG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge2MxLmdldFJHQigpLCBjMi5nZXRSR0IoKSwgYzMuZ2V0UkdCKCl9KTsKLQlJbWFnZURhdGEgZGF0YSA9IG5ldyBJbWFnZURhdGEoMzAsMzAsIDgsIHBhbGV0dGVEYXRhKTsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGRhdGEuaGVpZ2h0OyB5KyspIHsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCWlmICh4ID4geSkgZGF0YS5zZXRQaXhlbCh4LCB5LCBwYWxldHRlRGF0YS5nZXRQaXhlbChjMS5nZXRSR0IoKSkpOwotCQkJZWxzZSBpZiAoeCA8IHkpIGRhdGEuc2V0UGl4ZWwoeCwgeSwgcGFsZXR0ZURhdGEuZ2V0UGl4ZWwoYzIuZ2V0UkdCKCkpKTsKLQkJCWVsc2UgZGF0YS5zZXRQaXhlbCh4LCB5LCBwYWxldHRlRGF0YS5nZXRQaXhlbChjMy5nZXRSR0IoKSkpOwotCQl9Ci0JfQotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotCWRhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlkYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSBwYWxldHRlRGF0YS5nZXRQaXhlbChjMS5nZXRSR0IoKSk7Ci0JSW1hZ2UgaW1hZ2VUcmFuc3BhcmVudCA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQlkYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSAtMTsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGRhdGEuaGVpZ2h0OyB5KyspIHsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCWRhdGEuc2V0QWxwaGEoeCwgeSwgMTI3KTsKLQkJfQotCX0JCQotCUltYWdlIGltYWdlQWxwaGEgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JCQkJCQkJCi0JZ2MuZHJhd0ltYWdlKGltYWdlLCAxMCwgNSwgMjAsIDE1LCAxMDAsIDEyMCwgNTAsIDYwKTsKLQlnYy5kcmF3SW1hZ2UoaW1hZ2VUcmFuc3BhcmVudCwgMTAsIDUsIDIwLCAxNSwgMTAwLCAxMjAsIDEwLCAxMCk7Ci0JZ2MuZHJhd0ltYWdlKGltYWdlQWxwaGEsIDEwLCA1LCAyMCwgMTUsIDEwMCwgMTIwLCAyMCwgMTUpOwotCXRyeSB7Ci0JCWdjLmRyYXdJbWFnZShudWxsLCAxMCwgNSwgMjAsIDE1LCAxMDAsIDEyMCwgNTAsIDYwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOyAvL3Nob3VsZCBuZXZlciBnZXQgaGVyZQotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWltYWdlQWxwaGEuZGlzcG9zZSgpOwotCWltYWdlVHJhbnNwYXJlbnQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdMaW5lSUlJSSgpIHsKLQlnYy5kcmF3TGluZSgwLDAsMCwyMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd092YWxJSUlJKCkgewotCWdjLmRyYXdPdmFsKDEwLCAwLCAyMCwgMzApOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3UG9pbnRJSSgpIHsKLQlnYy5kcmF3UG9pbnQoMTAsIDEwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3UG9seWdvbiRJKCkgewotCWdjLmRyYXdQb2x5Z29uKG5ldyBpbnRbXSB7MCwwLCA1LDEwLCAwLDIwfSk7CQkJCQotCWdjLmRyYXdQb2x5Z29uKG5ldyBpbnRbXSB7MCwwfSk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdQb2x5bGluZSRJKCkgewotCWdjLmRyYXdQb2x5bGluZShuZXcgaW50W10gezAsMCwgNSwxMCwgMCwyMH0pOwkJCQkKLQlnYy5kcmF3UG9seWxpbmUobmV3IGludFtdIHswLDB9KTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd1JlY3RhbmdsZUlJSUkoKSB7Ci0JZ2MuZHJhd1JlY3RhbmdsZSgxMCwgMCwgMjAsIDMwKTsJCQkJCi0JZ2MuZHJhd1JlY3RhbmdsZSgwLCAwLCAwLCAwKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd1JlY3RhbmdsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCWdjLmRyYXdSZWN0YW5nbGUobmV3IFJlY3RhbmdsZSgxMCwgMCwgMjAsIDMwKSk7CQkJCQotCWdjLmRyYXdSZWN0YW5nbGUobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdSb3VuZFJlY3RhbmdsZUlJSUlJSSgpIHsKLQlnYy5kcmF3Um91bmRSZWN0YW5nbGUoMTAsIDAsIDIwLCAzMCwgMywgMyk7CQkJCQotCWdjLmRyYXdSb3VuZFJlY3RhbmdsZSgwLCAwLCAwLCAwLCAwLCAwKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nSUkoKSB7Ci0JZ2MuZHJhd1N0cmluZygidGVzdCIsIDUsIDUpOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3U3RyaW5nTGphdmFfbGFuZ19TdHJpbmdJSVooKSB7Ci0JZ2MuZHJhd1N0cmluZygidGVzdCIsIDUsIDUsIHRydWUpOwkJCQkKLQlnYy5kcmF3U3RyaW5nKCJ0ZXN0IiwgNSwgNSwgZmFsc2UpOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUkoKSB7Ci0JZ2MuZHJhd1RleHQoInRlc3QiLCA1LCA1KTsJCQkJCi0JZ2MuZHJhd1RleHQoIiIsIDAsIDApOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUlJKCkgewkJCQotCWdjLmRyYXdUZXh0KCJhYmMiLCA1LCA1LCAwKTsKLQlnYy5kcmF3VGV4dCgiYWJjIiwgNSwgNSwgU1dULkRSQVdfVFJBTlNQQVJFTlQpOwotCWdjLmRyYXdUZXh0KCJhYmMiLCA1LCA1LCBTV1QuRFJBV19ERUxJTUlURVIpOwotCWdjLmRyYXdUZXh0KCJhYmMiLCA1LCA1LCBTV1QuRFJBV19NTkVNT05JQyk7Ci0JZ2MuZHJhd1RleHQoImFiYyIsIDUsIDUsIFNXVC5EUkFXX1RBQik7Ci0JZ2MuZHJhd1RleHQoIiIsIDAsIDAsIDApOwotCWdjLmRyYXdUZXh0KCIiLCAwLCAwLCBTV1QuRFJBV19UUkFOU1BBUkVOVCk7CQkJCQotCWdjLmRyYXdUZXh0KCIiLCAwLCAwLCBTV1QuRFJBV19ERUxJTUlURVIpOwkJCQkKLQlnYy5kcmF3VGV4dCgiIiwgMCwgMCwgU1dULkRSQVdfTU5FTU9OSUMpOwkJCQkKLQlnYy5kcmF3VGV4dCgiIiwgMCwgMCwgU1dULkRSQVdfVEFCKTsJCQkJCi0JZ2MuZHJhd1RleHQoIlx0XHJcbmEmYmMmIiwgNSwgNSwgMCk7Ci0JZ2MuZHJhd1RleHQoIlx0XHJcbmEmYmMmIiwgNSwgNSwgU1dULkRSQVdfVFJBTlNQQVJFTlQpOwotCWdjLmRyYXdUZXh0KCJcdFxyXG5hJmJjJiIsIDUsIDUsIFNXVC5EUkFXX0RFTElNSVRFUik7Ci0JZ2MuZHJhd1RleHQoIlx0XHJcbmEmYmMmIiwgNSwgNSwgU1dULkRSQVdfTU5FTU9OSUMpOwotCWdjLmRyYXdUZXh0KCJcdFxyXG5hJmJjJiIsIDUsIDUsIFNXVC5EUkFXX1RBQik7Ci0JZ2MuZHJhd1RleHQoIlxyIiwgNSwgNSwgU1dULkRSQVdfREVMSU1JVEVSKTsKLQlnYy5kcmF3VGV4dCgiXG4iLCA1LCA1LCBTV1QuRFJBV19ERUxJTUlURVIpOwotCWdjLmRyYXdUZXh0KCImIiwgNSwgNSwgU1dULkRSQVdfTU5FTU9OSUMpOwotCWdjLmRyYXdUZXh0KCJcdCIsIDUsIDUsIFNXVC5EUkFXX1RBQik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJWigpIHsKLQlnYy5kcmF3VGV4dCgiYWJjIiwgNSwgNSwgdHJ1ZSk7CQkJCQotCWdjLmRyYXdUZXh0KCJhYmMiLCA1LCA1LCBmYWxzZSk7CQkJCQotCWdjLmRyYXdUZXh0KCIiLCAwLCAwLCB0cnVlKTsJCQkJCi0JZ2MuZHJhd1RleHQoIiIsIDAsIDAsIGZhbHNlKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JYXNzZXJ0VHJ1ZShnYy5lcXVhbHMoZ2MpKTsKLQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULk5VTEwpOwotCUdDIHRlc3RHQyA9IG5ldyBHQyhjYW52YXMpOwotCWFzc2VydEZhbHNlKHRlc3RHQy5lcXVhbHMoZ2MpKTsKLQl0ZXN0R0MuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbGxBcmNJSUlJSUkoKSB7Ci0JZ2MuZmlsbEFyYygxMCwgMjAsIDUwLCAyNSwgOTAsIDkwKTsJCQkJCi0JZ2MuZmlsbEFyYygxMCwgMjAsIDUwLCAyNSwgLTEwLCAtMTApOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9maWxsR3JhZGllbnRSZWN0YW5nbGVJSUlJWigpIHsKLQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoMTAsIDAsIDIwLCAzMCwgdHJ1ZSk7CQkJCQotCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSgwLCAwLCAwLCAwLCB0cnVlKTsJCQkJCi0JZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKDEwLCAwLCAyMCwgMzAsIGZhbHNlKTsJCQkJCi0JZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKDAsIDAsIDAsIDAsIGZhbHNlKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmlsbE92YWxJSUlJKCkgewotCWdjLmZpbGxPdmFsKDEwLCAwLCAyMCwgMzApOwkJCQkKLQlnYy5maWxsT3ZhbCgtMSwgLTEsIC0xLCAtMSk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbGxQb2x5Z29uJEkoKSB7Ci0JZ2MuZmlsbFBvbHlnb24obmV3IGludFtdIHswLDAsIDUsMTAsIDAsMjB9KTsJCQkJCi0JZ2MuZmlsbFBvbHlnb24obmV3IGludFtdIHswLDB9KTsJCQkJCi0JZ2MuZmlsbFBvbHlnb24obmV3IGludFtdIHstMSwgLTF9KTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmlsbFJlY3RhbmdsZUlJSUkoKSB7Ci0JZ2MuZmlsbFJlY3RhbmdsZShuZXcgUmVjdGFuZ2xlKDEwLCAwLCAyMCwgMzApKTsJCQkJCi0JZ2MuZmlsbFJlY3RhbmdsZShuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKTsJCQkJCi0JZ2MuZmlsbFJlY3RhbmdsZShuZXcgUmVjdGFuZ2xlKC0xLCAtMSwgLTEsIC0xKSk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbGxSZWN0YW5nbGVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQlnYy5maWxsUmVjdGFuZ2xlKDEwLCAwLCAyMCwgMzApOwkJCQkKLQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIDAsIDApOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9maWxsUm91bmRSZWN0YW5nbGVJSUlJSUkoKSB7Ci0JZ2MuZmlsbFJvdW5kUmVjdGFuZ2xlKDEwLCAwLCAyMCwgMzAsIDMsIDMpOwkJCQkKLQlnYy5maWxsUm91bmRSZWN0YW5nbGUoMCwgMCwgMCwgMCwgMCwgMCk7CQkJCQotCWdjLmZpbGxSb3VuZFJlY3RhbmdsZSgxMCwgMCwgMjAsIDMwLCAtMTAsIC0xMCk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEFkdmFuY2VXaWR0aEMoKSB7Ci0JaW50IHcgPSBnYy5nZXRBZHZhbmNlV2lkdGgoJ2EnKTsKLQlhc3NlcnRUcnVlKHcgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCYWNrZ3JvdW5kKCkgewotCS8vIHRlc3RlZCBpbiBzZXRCYWNrZ3JvdW5kIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoYXJXaWR0aEMoKSB7Ci0JaW50IHcgPSBnYy5nZXRDaGFyV2lkdGgoJ2EnKTsKLQlhc3NlcnRUcnVlKHcgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGlwcGluZygpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0Q2xpcHBpbmcgbWV0aG9kcwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250KCkgewotCS8vIHRlc3RlZCBpbiBzZXRGb250IG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnRNZXRyaWNzKCkgewotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlhc3NlcnRUcnVlKGZtLmdldEhlaWdodCgpID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0Rm9yZWdyb3VuZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lU3R5bGUoKSB7Ci0JLy8gdGVzdGVkIGluIHNldExpbmVTdHlsZSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lV2lkdGgoKSB7Ci0JLy8gdGVzdGVkIGluIHNldExpbmVXaWR0aCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZSgpIHsKLQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULk5VTEwpOwotCUdDIHRlc3RHQyA9IG5ldyBHQyhjYW52YXMsIFNXVC5MRUZUX1RPX1JJR0hUKTsKLQlpbnQgc3R5bGUgPSB0ZXN0R0MuZ2V0U3R5bGUoKTsKLQlhc3NlcnRUcnVlKChzdHlsZSAmIFNXVC5MRUZUX1RPX1JJR0hUKSAhPSAwKTsKLQl0ZXN0R0MuZGlzcG9zZSgpOwotCXRlc3RHQyA9IG5ldyBHQyhjYW52YXMpOwotCXN0eWxlID0gdGVzdEdDLmdldFN0eWxlKCk7Ci0JYXNzZXJ0VHJ1ZSgoc3R5bGUgJiBTV1QuTEVGVF9UT19SSUdIVCkgIT0gMCk7Ci0JdGVzdEdDLmRpc3Bvc2UoKTsKLQl0ZXN0R0MgPSBuZXcgR0MoY2FudmFzLCBTV1QuUklHSFRfVE9fTEVGVCk7Ci0Jc3R5bGUgPSB0ZXN0R0MuZ2V0U3R5bGUoKTsKLQlhc3NlcnRUcnVlKChzdHlsZSAmICBTV1QuUklHSFRfVE9fTEVGVCkgIT0gMCk7Ci0JdGVzdEdDLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRYT1JNb2RlKCkgewotCS8vIHRlc3RlZCBpbiBzZXRYT1JNb2RlIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCWFzc2VydFRydWUoZ2MuaGFzaENvZGUoKSA9PSBnYy5oYXNoQ29kZSgpKTsKLQlHQyBnYzIgPSBuZXcgR0Moc2hlbGwpOwotCWFzc2VydEZhbHNlKGdjLmhhc2hDb2RlKCkgPT0gZ2MyLmhhc2hDb2RlKCkpOwotCWdjMi5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNDbGlwcGVkKCkgewotCWFzc2VydEZhbHNlKGdjLmlzQ2xpcHBlZCgpKTsKLQlnYy5zZXRDbGlwcGluZyg1LDEwLDE1LDIwKTsKLQlhc3NlcnRUcnVlKGdjLmlzQ2xpcHBlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCWFzc2VydEZhbHNlKGdjLmlzRGlzcG9zZWQoKSk7Ci0JZ2MuZGlzcG9zZSgpOwotCWFzc2VydFRydWUoZ2MuaXNEaXNwb3NlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihzaGVsbC5nZXREaXNwbGF5KCksIDI1NSwgMCwgMCk7Ci0JZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JYXNzZXJ0RXF1YWxzKGNvbG9yLCBnYy5nZXRCYWNrZ3JvdW5kKCkpOwotCXRyeSB7IAotCQlnYy5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIGNvbG9yIik7CQkKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoZ2MuZ2V0QmFja2dyb3VuZCgpLGdjLmdldEJhY2tncm91bmQoKSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCXRyeSB7IAotCQlnYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgZGlzcG9zZWQiKTsJCQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENsaXBwaW5nSUlJSSgpIHsKLQkvLyBpbnRlcm1pdHRlbnRseSBmYWlscyBvbiBYUCBmb3IgcmVhc29ucyB1bmtub3duLCBjb21tZW50IG91dCB0aGUgdGVzdCBjYXNlCi0JLy8gdW50aWwgdGhlIHByb2JsZW0gaXMgZmlndXJlZCBvdXQKLS8vCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuQk9SREVSKTsKLS8vCXNoZWxsLnNldFNpemUoMTEwLDExMCk7Ci0vLwljYW52YXMuc2V0U2l6ZSgxMDAsMTAwKTsKLS8vCXNoZWxsLm9wZW4oKTsKLS8vCUdDIHRlc3RHYyA9IG5ldyBHQyhjYW52YXMpOwotLy8JdGVzdEdjLnNldENsaXBwaW5nKDAsNSwxMCwyMCk7Ci0vLwlSZWN0YW5nbGUgcmVjdCA9IHRlc3RHYy5nZXRDbGlwcGluZygpOwotLy8JYXNzZXJ0VHJ1ZShyZWN0LnggPT0gMCk7Ci0vLwlhc3NlcnRUcnVlKHJlY3QueSA9PSA1KTsKLS8vCWFzc2VydFRydWUocmVjdC53aWR0aCA9PSAxMCk7Ci0vLwlhc3NlcnRUcnVlKHJlY3QuaGVpZ2h0ID09IDIwKTsKLS8vCXRlc3RHYy5kaXNwb3NlKCk7Ci0vLwljYW52YXMuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JLy8gaW50ZXJtaXR0ZW50bHkgZmFpbHMgb24gWFAgZm9yIHJlYXNvbnMgdW5rbm93biwgY29tbWVudCBvdXQgdGhlIHRlc3QgY2FzZQotCS8vIHVudGlsIHRoZSBwcm9ibGVtIGlzIGZpZ3VyZWQgb3V0Ci0vLwlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULkJPUkRFUik7Ci0vLwlzaGVsbC5zZXRTaXplKDExMCwxMTApOwotLy8JY2FudmFzLnNldFNpemUoMTAwLDEwMCk7Ci0vLwlzaGVsbC5vcGVuKCk7Ci0vLwlHQyB0ZXN0R2MgPSBuZXcgR0MoY2FudmFzKTsKLS8vCXRlc3RHYy5zZXRDbGlwcGluZyhuZXcgUmVjdGFuZ2xlKDAsNSwxMCwyMCkpOwotLy8JUmVjdGFuZ2xlIHJlY3QgPSB0ZXN0R2MuZ2V0Q2xpcHBpbmcoKTsKLS8vCWFzc2VydFRydWUocmVjdC54ID09IDApOwotLy8JYXNzZXJ0VHJ1ZShyZWN0LnkgPT0gNSk7Ci0vLwlhc3NlcnRUcnVlKHJlY3Qud2lkdGggPT0gMTApOwotLy8JYXNzZXJ0VHJ1ZShyZWN0LmhlaWdodCA9PSAyMCk7Ci0vLwl0ZXN0R2MuZGlzcG9zZSgpOwotLy8JY2FudmFzLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlnYy5zZXRGb250KHNoZWxsLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Gb250KCkpOwotCUZvbnQgZm9udCA9IGdjLmdldEZvbnQoKTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHNoZWxsLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Gb250KCkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihzaGVsbC5nZXREaXNwbGF5KCksIDI1NSwgMCwgMCk7Ci0JZ2Muc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JYXNzZXJ0RXF1YWxzKGNvbG9yLCBnYy5nZXRGb3JlZ3JvdW5kKCkpOwotCXRyeSB7IAotCQlnYy5zZXRGb3JlZ3JvdW5kKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIGNvbG9yIik7CQkKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoZ2MuZ2V0Rm9yZWdyb3VuZCgpLGdjLmdldEZvcmVncm91bmQoKSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCXRyeSB7IAotCQlnYy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgZGlzcG9zZWQiKTsJCQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExpbmVTdHlsZUkoKSB7Ci0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQlhc3NlcnRUcnVlKGdjLmdldExpbmVTdHlsZSgpID09IFNXVC5MSU5FX1NPTElEKTsKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfREFTSCk7Ci0JYXNzZXJ0VHJ1ZShnYy5nZXRMaW5lU3R5bGUoKSA9PSBTV1QuTElORV9EQVNIKTsKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfRE9UKTsKLQlhc3NlcnRUcnVlKGdjLmdldExpbmVTdHlsZSgpID09IFNXVC5MSU5FX0RPVCk7Ci0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RBU0hET1QpOwotCWFzc2VydFRydWUoZ2MuZ2V0TGluZVN0eWxlKCkgPT0gU1dULkxJTkVfREFTSERPVCk7Ci0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RBU0hET1RET1QpOwotCWFzc2VydFRydWUoZ2MuZ2V0TGluZVN0eWxlKCkgPT0gU1dULkxJTkVfREFTSERPVERPVCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TGluZVdpZHRoSSgpIHsKLQlnYy5zZXRMaW5lV2lkdGgoMTApOwotCWFzc2VydFRydWUoZ2MuZ2V0TGluZVdpZHRoKCkgPT0gMTApOwotCWdjLnNldExpbmVXaWR0aCgwKTsKLQlhc3NlcnRUcnVlKGdjLmdldExpbmVXaWR0aCgpID09IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFhPUk1vZGVaKCkgewotCWdjLnNldFhPUk1vZGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShnYy5nZXRYT1JNb2RlKCkpOwotCWdjLnNldFhPUk1vZGUoZmFsc2UpOwotCWFzc2VydEZhbHNlKGdjLmdldFhPUk1vZGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc3RyaW5nRXh0ZW50TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JUG9pbnQgcHQgPSBnYy5zdHJpbmdFeHRlbnQoImFiYyIpOwotCWFzc2VydFRydWUocHQueCA+IDApOwotCWFzc2VydFRydWUocHQueSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RleHRFeHRlbnRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlQb2ludCBwdCA9IGdjLnRleHRFeHRlbnQoImFiYyIpOwotCWFzc2VydFRydWUocHQueCA+IDApOwotCWFzc2VydFRydWUocHQueSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RleHRFeHRlbnRMamF2YV9sYW5nX1N0cmluZ0koKSB7Ci0JUG9pbnQgcHQgPSBnYy50ZXh0RXh0ZW50KCJhYmMiLCAwKTsKLQlhc3NlcnRUcnVlKHB0LnggPiAwKTsKLQlhc3NlcnRUcnVlKHB0LnkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlTdHJpbmcgcyA9IGdjLnRvU3RyaW5nKCk7Ci0JYXNzZXJ0Tm90TnVsbChzKTsKLQlhc3NlcnRUcnVlKHMubGVuZ3RoKCkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0JLy8gZG8gbm90IHRlc3QgLSBXaW5kb3dzIG9ubHkKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0JLy8gZG8gbm90IHRlc3QgLSBXaW5kb3dzIG9ubHkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0MoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb3B5QXJlYUlJSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29weUFyZWFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdBcmNJSUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdGb2N1c0lJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd0ltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJSUlJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3TGluZUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdPdmFsSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1BvaW50SUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdQb2x5Z29uJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdQb2x5bGluZSRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3UmVjdGFuZ2xlSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1JlY3RhbmdsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3Um91bmRSZWN0YW5nbGVJSUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdTdHJpbmdMamF2YV9sYW5nX1N0cmluZ0lJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3U3RyaW5nTGphdmFfbGFuZ19TdHJpbmdJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbGxBcmNJSUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbGxHcmFkaWVudFJlY3RhbmdsZUlJSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maWxsT3ZhbElJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbGxQb2x5Z29uJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbGxSZWN0YW5nbGVJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maWxsUmVjdGFuZ2xlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbGxSb3VuZFJlY3RhbmdsZUlJSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QWR2YW5jZVdpZHRoQyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QmFja2dyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hhcldpZHRoQyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpcHBpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnRNZXRyaWNzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb3JlZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lU3R5bGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVXaWR0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFhPUk1vZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0NsaXBwZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRGlzcG9zZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDbGlwcGluZ0lJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMaW5lU3R5bGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMaW5lV2lkdGhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRYT1JNb2RlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc3RyaW5nRXh0ZW50TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RleHRFeHRlbnRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdGV4dEV4dGVudExqYXZhX2xhbmdfU3RyaW5nSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpbjMyX25ld0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvcHlBcmVhSUlJSUlJIikpIHRlc3RfY29weUFyZWFJSUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvcHlBcmVhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJIikpIHRlc3RfY29weUFyZWFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3QXJjSUlJSUlJIikpIHRlc3RfZHJhd0FyY0lJSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd0ZvY3VzSUlJSSIpKSB0ZXN0X2RyYXdGb2N1c0lJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSSIpKSB0ZXN0X2RyYXdJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd0ltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJSUlJSUlJIikpIHRlc3RfZHJhd0ltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3TGluZUlJSUkiKSkgdGVzdF9kcmF3TGluZUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdPdmFsSUlJSSIpKSB0ZXN0X2RyYXdPdmFsSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1BvaW50SUkiKSkgdGVzdF9kcmF3UG9pbnRJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1BvbHlnb24kSSIpKSB0ZXN0X2RyYXdQb2x5Z29uJEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdQb2x5bGluZSRJIikpIHRlc3RfZHJhd1BvbHlsaW5lJEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdSZWN0YW5nbGVJSUlJIikpIHRlc3RfZHJhd1JlY3RhbmdsZUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdSZWN0YW5nbGVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2RyYXdSZWN0YW5nbGVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1JvdW5kUmVjdGFuZ2xlSUlJSUlJIikpIHRlc3RfZHJhd1JvdW5kUmVjdGFuZ2xlSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3U3RyaW5nTGphdmFfbGFuZ19TdHJpbmdJSSIpKSB0ZXN0X2RyYXdTdHJpbmdMamF2YV9sYW5nX1N0cmluZ0lJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3U3RyaW5nTGphdmFfbGFuZ19TdHJpbmdJSVoiKSkgdGVzdF9kcmF3U3RyaW5nTGphdmFfbGFuZ19TdHJpbmdJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSSIpKSB0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJSSIpKSB0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSVoiKSkgdGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maWxsQXJjSUlJSUlJIikpIHRlc3RfZmlsbEFyY0lJSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmlsbEdyYWRpZW50UmVjdGFuZ2xlSUlJSVoiKSkgdGVzdF9maWxsR3JhZGllbnRSZWN0YW5nbGVJSUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmlsbE92YWxJSUlJIikpIHRlc3RfZmlsbE92YWxJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maWxsUG9seWdvbiRJIikpIHRlc3RfZmlsbFBvbHlnb24kSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmlsbFJlY3RhbmdsZUlJSUkiKSkgdGVzdF9maWxsUmVjdGFuZ2xlSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmlsbFJlY3RhbmdsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfZmlsbFJlY3RhbmdsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maWxsUm91bmRSZWN0YW5nbGVJSUlJSUkiKSkgdGVzdF9maWxsUm91bmRSZWN0YW5nbGVJSUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFkdmFuY2VXaWR0aEMiKSkgdGVzdF9nZXRBZHZhbmNlV2lkdGhDKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kIikpIHRlc3RfZ2V0QmFja2dyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hhcldpZHRoQyIpKSB0ZXN0X2dldENoYXJXaWR0aEMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaXBwaW5nIikpIHRlc3RfZ2V0Q2xpcHBpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24iKSkgdGVzdF9nZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250IikpIHRlc3RfZ2V0Rm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udE1ldHJpY3MiKSkgdGVzdF9nZXRGb250TWV0cmljcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpKSB0ZXN0X2dldEZvcmVncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVTdHlsZSIpKSB0ZXN0X2dldExpbmVTdHlsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZVdpZHRoIikpIHRlc3RfZ2V0TGluZVdpZHRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdHlsZSIpKSB0ZXN0X2dldFN0eWxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRYT1JNb2RlIikpIHRlc3RfZ2V0WE9STW9kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNDbGlwcGVkIikpIHRlc3RfaXNDbGlwcGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0Rpc3Bvc2VkIikpIHRlc3RfaXNEaXNwb3NlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q2xpcHBpbmdJSUlJIikpIHRlc3Rfc2V0Q2xpcHBpbmdJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3Rfc2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpKSB0ZXN0X3NldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMaW5lU3R5bGVJIikpIHRlc3Rfc2V0TGluZVN0eWxlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGluZVdpZHRoSSIpKSB0ZXN0X3NldExpbmVXaWR0aEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFhPUk1vZGVaIikpIHRlc3Rfc2V0WE9STW9kZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N0cmluZ0V4dGVudExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc3RyaW5nRXh0ZW50TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RleHRFeHRlbnRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3RleHRFeHRlbnRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdGV4dEV4dGVudExqYXZhX2xhbmdfU3RyaW5nSSIpKSB0ZXN0X3RleHRFeHRlbnRMamF2YV9sYW5nX1N0cmluZ0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpbjMyX25ld0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X3dpbjMyX25ld0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotRGlzcGxheSBkaXNwbGF5OwotU2hlbGwgc2hlbGw7Ci1JbWFnZSBpbWFnZTsKLUdDIGdjOwotCi0vKioKLSAqIFJldHVybiB0aGUgYWN0dWFsIFJHQiB2YWx1ZSB1c2VkIGZvciByZW5kZXJpbmcgZm9yIHRoZSBnaXZlbiBDb2xvci4KLSAqIFRoaXMgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBDb2xvcidzIFJHQiB2YWx1ZSBvbiBsb3dlci1jb2xvciBkaXNwbGF5cyAKLSAqICgxNmJwcCBvciBsZXNzKS4KLSAqLwotUkdCIGdldFJlYWxSR0IoQ29sb3IgY29sb3IpIHsKLQlJbWFnZSBjb2xvckltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JR0MgaW1hZ2VHYyA9IG5ldyBHQyhjb2xvckltYWdlKTsKLQlJbWFnZURhdGEgaW1hZ2VEYXRhOwotCVBhbGV0dGVEYXRhIHBhbGV0dGU7Ci0JaW50IHBpeGVsOwotCQotCWltYWdlR2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JaW1hZ2VHYy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQlpbWFnZUdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgMTAsIDEwKTsKLQlpbWFnZURhdGEgPSBjb2xvckltYWdlLmdldEltYWdlRGF0YSgpOwotCXBhbGV0dGUgPSBpbWFnZURhdGEucGFsZXR0ZTsKLQlpbWFnZUdjLmRpc3Bvc2UoKTsKLQljb2xvckltYWdlLmRpc3Bvc2UoKTsKLQlwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbCgwLCAwKTsKLQlyZXR1cm4gcGFsZXR0ZS5nZXRSR0IocGl4ZWwpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NTJjOGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0NEYXRhCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0NEYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzE5ZmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJKCkgewotCUltYWdlIGltYWdlOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIC0xLCAxMCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPD0gMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHdpZHRoIDw9IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMCwgMTApOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHdpZHRoIDw9IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB3aWR0aCA8PSAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAtMjApOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA8PSAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDw9IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDApOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA8PSAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDw9IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JaW1hZ2UgPSBuZXcgSW1hZ2UobnVsbCwgMTAsIDEwKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0KLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCWltYWdlLmRpc3Bvc2UoKTsKLQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JSW1hZ2UgaW1hZ2U7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IG51bGw7Ci0KLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBib3VuZHMpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JYm91bmRzID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAtMSwgMTApOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcyk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPCAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQotCWJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMTApOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcyk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPT0gMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHdpZHRoID09IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JYm91bmRzID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAxMCwgLTEpOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcyk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA8IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JYm91bmRzID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAxMCwgMCk7Ci0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgYm91bmRzKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPT0gMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA9PSAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQotCS8vIHZhbGlkIGltYWdlcwotCWJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoLTEsIC0xMCwgMTAsIDEwKTsKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBib3VuZHMpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQotCWJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMTAsIDEwKTsKLQlpbWFnZSA9IG5ldyBJbWFnZShudWxsLCBib3VuZHMpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQkKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBib3VuZHMpOwotCWltYWdlLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEoKSB7Ci0JSW1hZ2VEYXRhIGRhdGEgPSBudWxsOwotCUltYWdlIGltYWdlID0gbnVsbDsKLQkKLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZURhdGEgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIEltYWdlRGF0YSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQotLy8JUGxhdGZvcm0tc3BlY2lmaWMgdGVzdC4gIAotLy8JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEoMHhmZjAwMDAsIDB4MDBmZjAwLCAweDAwMDBmZikpOwotLy8JdHJ5IHsKLS8vCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLS8vCQlpbWFnZS5kaXNwb3NlKCk7Ci0vLwkJZmFpbCgiVW5zdXBwb3J0ZWQgY29sb3IgZGVwdGgiKTsKLS8vCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0vLwl9Ci0KLQlkYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JaW1hZ2UgPSBuZXcgSW1hZ2UobnVsbCwgZGF0YSk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCi0JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQkKLQlkYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDgsIG5ldyBQYWxldHRlRGF0YSgweDMwLCAweDBDLCAweDAzKSk7Ci0JLy8gc2V0IHJlZCBwaXhlbCBhdCB4PTksIHk9OQotCWRhdGEuc2V0UGl4ZWwoOSwgOSwgMHgzMCk7Ci0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JSW1hZ2UgZ2NJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCUdDIGdjID0gbmV3IEdDKGdjSW1hZ2UpOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7Ci0JSW1hZ2VEYXRhIGdjSW1hZ2VEYXRhID0gZ2NJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlpbnQgcmVkUGl4ZWwgPSBnY0ltYWdlRGF0YS5nZXRQaXhlbCg5LCA5KTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIGdldFJlYWxSR0IoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSksIGdjSW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCKHJlZFBpeGVsKSk7Ci0JZ2MuZGlzcG9zZSgpOwotCWdjSW1hZ2UuZGlzcG9zZSgpOwotCWltYWdlLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSgpIHsKLQlJbWFnZURhdGEgZGF0YSA9IG51bGw7Ci0JSW1hZ2VEYXRhIGRhdGExID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEsIGRhdGExKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZURhdGEgc291cmNlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZURhdGEgc291cmNlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCWRhdGExID0gbnVsbDsKLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhLCBkYXRhMSk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhIG1hc2sgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIEltYWdlRGF0YSBtYXNrID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCWRhdGExID0gbmV3IEltYWdlRGF0YSgxLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhLCBkYXRhMSk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhIHNvdXJjZSB3aWR0aCAhPSBJbWFnZURhdGEgbWFzayB3aWR0aCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIEltYWdlRGF0YSBzb3VyY2Ugd2lkdGggIT0gSW1hZ2VEYXRhIG1hc2sgd2lkdGgiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JZGF0YTEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhLCBkYXRhMSk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhIHNvdXJjZSBoZWlnaHQgIT0gSW1hZ2VEYXRhIG1hc2sgaGVpZ2h0Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhIHNvdXJjZSBoZWlnaHQgIT0gSW1hZ2VEYXRhIG1hc2sgaGVpZ2h0IiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQotCWRhdGEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQlkYXRhMSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCA4LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEsIGRhdGExKTsgLy8gSW1hZ2Ugbm93IGFjY2VwdHMgbWFza3Mgd2hlcmUgZGVwdGggIT0gMQotCWltYWdlLmRpc3Bvc2UoKTsKLQotCWRhdGEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgOCwgbmV3IFBhbGV0dGVEYXRhKDB4MzAsIDB4MEMsIDB4MDMpKTsKLQkvLyBzZXQgb3BhcXVlIHJlZCBwaXhlbCBhdCB4PTksIHk9OQotCWRhdGEuc2V0UGl4ZWwoOSwgOSwgMHgzMCk7Ci0JZGF0YTEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQlkYXRhMS5zZXRQaXhlbCg5LCA5LCAxKTsKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhLCBkYXRhMSk7Ci0JSW1hZ2UgZ2NJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCUdDIGdjID0gbmV3IEdDKGdjSW1hZ2UpOwotCUNvbG9yIGJhY2tncm91bmRDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOyAKLQlnYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCAxMCwgMTApOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7Ci0JSW1hZ2VEYXRhIGdjSW1hZ2VEYXRhID0gZ2NJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlpbnQgcmVkUGl4ZWwgPSBnY0ltYWdlRGF0YS5nZXRQaXhlbCg5LCA5KTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIGdldFJlYWxSR0IoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSksIGdjSW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCKHJlZFBpeGVsKSk7Ci0JaW50IGJsdWVQaXhlbCA9IGdjSW1hZ2VEYXRhLmdldFBpeGVsKDAsIDApOwotCWFzc2VydEVxdWFscygiOmI6IiwgZ2V0UmVhbFJHQihiYWNrZ3JvdW5kQ29sb3IpLCBnY0ltYWdlRGF0YS5wYWxldHRlLmdldFJHQihibHVlUGl4ZWwpKTsKLQlnYy5kaXNwb3NlKCk7Ci0JZ2NJbWFnZS5kaXNwb3NlKCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9pb19JbnB1dFN0cmVhbSgpIHsKLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCUltYWdlIGltYWdlID0gbnVsbDsKLQl0cnkgewotCQl0cnkgewotCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgc3RyZWFtKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIElucHV0U3RyZWFtID09IG51bGwiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIElucHV0U3RyZWFtID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImVtcHR5LnR4dCIpOwotCQl0cnkgewotCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgc3RyZWFtKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBJbnB1dFN0cmVhbSIpOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBJbnB1dFN0cmVhbSIsIFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQsIGUpOwotCQl9Ci0KLQkJaW50IG51bUZvcm1hdHMgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHMubGVuZ3RoOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbnZhbGlkSW1hZ2VGaWxlbmFtZXNbMF07Ci0JCURpc3BsYXlbXSBkaXNwbGF5cyA9IHtkaXNwbGF5LCBudWxsfTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBkaXNwbGF5cy5sZW5ndGg7IGorKykgewotCQkJRGlzcGxheSB0ZW1wRGlzcGxheSA9IGRpc3BsYXlzW2pdOwotCQkJZm9yIChpbnQgaT0wOyBpPG51bUZvcm1hdHM7IGkrKykgewotCQkJCVN0cmluZyBmb3JtYXQgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHNbaV07Ci0JCQkJc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSArICIuIiArIGZvcm1hdCk7Ci0KLQkJCQl0cnkgewotCQkJCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBzdHJlYW0pOwotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQkJCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBJbnB1dFN0cmVhbSIpOwotCQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0vLyBCdWcgNzAxNjcgLSBJbWFnZShEZXZpY2UsIElucHV0U3RyZWFtKSB0aHJvd3MgaW5jb3JyZWN0IGV4Y2VwdGlvbiBmb3IgYmFkIFBORwotLy8gcmVtb3ZlIGNvbW1lbnQgd2hlbiBidWcgaXMgZml4ZWQuCi0vLwkJCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBpbWFnZSBJbnB1dFN0cmVhbSIsIFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKFN3dFRlc3RDYXNlLmludmFsaWRJbWFnZUZpbGVuYW1lc1sxXSk7Ci0JCXRyeSB7Ci0JCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBzdHJlYW0pOwotCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJdHJ5IHsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIElucHV0U3RyZWFtIik7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGltYWdlIElucHV0U3RyZWFtIiwgU1dULkVSUk9SX0lOVkFMSURfSU1BR0UsIGUpOwotCQl9CQkKLQotCQkvLyBjcmVhdGUgdmFsaWQgaW1hZ2VzCi0JCWZvciAoaW50IGogPSAwOyBqIDwgZGlzcGxheXMubGVuZ3RoOyBqKyspIHsKLQkJCURpc3BsYXkgdGVtcERpc3BsYXkgPSBkaXNwbGF5c1tqXTsKLQkJCWludCBudW1GaWxlTmFtZXMgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBrPTA7IGs8bnVtRmlsZU5hbWVzOyBrKyspIHsKLQkJCQlmaWxlTmFtZSA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzW2tdOwkJCi0JCQkJZm9yIChpbnQgaT0wOyBpPG51bUZvcm1hdHM7IGkrKykgewotCQkJCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQkJCQlzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQkJCQkJaW1hZ2UgPSBuZXcgSW1hZ2UodGVtcERpc3BsYXksIHN0cmVhbSk7Ci0JCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJCX0KLQkJCX0KLQkJfQotCX0gZmluYWxseSB7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKLQl0cnkgewotCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBmaWxlTmFtZSk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZmlsZSBuYW1lID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBmaWxlIG5hbWUgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJU3RyaW5nIHBhdGhOYW1lID0gIm5vbmV4aXN0ZW50LnR4dCI7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHBhdGhOYW1lKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBub24tZXhpc3RlbnQgZmlsZSBuYW1lIik7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3Igbm9uLWV4aXN0ZW50IGZpbGUgbmFtZSIsIFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotCS8vIGoyc2UgYW5kIGoybWUoY2RjKSBjYW4gbG9hZCBmcm9tIGEgZmlsZSBuYW1lIGJ1dCwgajJtZShjbGRjKSB0aHJvd3MgYW4gZXhjZXB0aW9uCi0JaWYgKCFpc0oyTUUoKSkgewotCQl0cnkgewotCQkJU3RyaW5nIHBhdGhOYW1lID0gZ2V0UGF0aCgiZW1wdHkudHh0Iik7Ci0JCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBwYXRoTmFtZSk7Ci0JCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGZpbGUgbmFtZSIpOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBmaWxlIG5hbWUiLCBTV1QuRVJST1JfVU5TVVBQT1JURURfRk9STUFULCBlKTsKLQkJfQotCQotCQlpbnQgbnVtRm9ybWF0cyA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGg7Ci0JCWZpbGVOYW1lID0gU3d0VGVzdENhc2UuaW52YWxpZEltYWdlRmlsZW5hbWVzWzBdOwotCQlEaXNwbGF5W10gZGlzcGxheXMgPSB7ZGlzcGxheSwgbnVsbH07Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZGlzcGxheXMubGVuZ3RoOyBqKyspIHsKLQkJCURpc3BsYXkgdGVtcERpc3BsYXkgPSBkaXNwbGF5c1tqXTsKLQkJCWZvciAoaW50IGk9MDsgaTxudW1Gb3JtYXRzOyBpKyspIHsKLQkJCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBwYXRoTmFtZSA9IGdldFBhdGgoZmlsZU5hbWUgKyAiLiIgKyBmb3JtYXQpOwotCQkJCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBwYXRoTmFtZSk7Ci0JCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBmaWxlIG5hbWUiKTsKLQkJCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotLy8JCQkJCSBCdWcgNzAxNjcgLSBJbWFnZShEZXZpY2UsIElucHV0U3RyZWFtKSB0aHJvd3MgaW5jb3JyZWN0IGV4Y2VwdGlvbiBmb3IgYmFkIFBORwotLy8JCQkJCSByZW1vdmUgY29tbWVudCB3aGVuIGJ1ZyBpcyBmaXhlZC4KLS8vCQkJCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGltYWdlIGZpbGUgbmFtZSIsIFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQkJdHJ5IHsKLQkJCVN0cmluZyBwYXRoTmFtZSA9IGdldFBhdGgoU3d0VGVzdENhc2UuaW52YWxpZEltYWdlRmlsZW5hbWVzWzFdKTsKLQkJCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHBhdGhOYW1lKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZmlsZSBuYW1lIik7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGltYWdlIGZpbGUgbmFtZSIsIFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFLCBlKTsKLQkJfQkJCi0JCi0JCS8vIGNyZWF0ZSB2YWxpZCBpbWFnZXMKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBkaXNwbGF5cy5sZW5ndGg7IGorKykgewotCQkJRGlzcGxheSB0ZW1wRGlzcGxheSA9IGRpc3BsYXlzW2pdOwotCQkJaW50IG51bUZpbGVOYW1lcyA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGs9MDsgazxudW1GaWxlTmFtZXM7IGsrKykgewotCQkJCWZpbGVOYW1lID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNba107Ci0JCQkJZm9yIChpbnQgaT0wOyBpPG51bUZvcm1hdHM7IGkrKykgewotCQkJCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQkJCQlTdHJpbmcgcGF0aE5hbWUgPSBnZXRQYXRoKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQkJCQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcGF0aE5hbWUpOwotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JLy8gdGVzdGVkIGluIGlzRGlzcG9zZWQoKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JSW1hZ2UgaW1hZ2UxID0gbnVsbDs7Ci0KLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCQlpbWFnZTEgPSBpbWFnZTsKLQkKLQkJYXNzZXJ0RmFsc2UoIjphOiIsIGltYWdlLmVxdWFscyhudWxsKSk7Ci0JCQotCQlhc3NlcnRUcnVlKCI6YjoiLCBpbWFnZS5lcXVhbHMoaW1hZ2UxKSk7Ci0JCQotCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJaW1hZ2UxID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JCWFzc2VydEZhbHNlKCI6YzoiLCBpbWFnZS5lcXVhbHMoaW1hZ2UxKSk7Ci0JfSBmaW5hbGx5IHsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlpbWFnZTEuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCYWNrZ3JvdW5kKCkgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWltYWdlLmdldEJhY2tncm91bmQoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgaW1hZ2UiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBpbWFnZSIsIFNXVC5FUlJPUl9HUkFQSElDX0RJU1BPU0VELCBlKTsKLQl9Ci0JLy8gcmVtYWluZGVyIHRlc3RlZCBpbiBzZXRCYWNrZ3JvdW5kIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQlSZWN0YW5nbGUgYm91bmRzID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAxMCwgMjApOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWltYWdlLmdldEJvdW5kcygpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBpbWFnZSIpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGltYWdlIiwgU1dULkVSUk9SX0dSQVBISUNfRElTUE9TRUQsIGUpOwotCX0KLQkJCi0JLy8gY3JlYXRlcyBiaXRtYXAgaW1hZ2UKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCVJlY3RhbmdsZSBib3VuZHMxID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygiOmE6IiwgYm91bmRzLCBib3VuZHMxKTsKLQotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcyk7Ci0JYm91bmRzMSA9IGltYWdlLmdldEJvdW5kcygpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoIjpiOiIsIGJvdW5kcywgYm91bmRzMSk7Ci0KLQkvLyBjcmVhdGUgaWNvbiBpbWFnZQotCUltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCWJvdW5kczEgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YzoiLCBib3VuZHMsIGJvdW5kczEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlRGF0YSgpIHsJCi0JZ2V0SW1hZ2VEYXRhMSgpOwotCWdldEltYWdlRGF0YTIoMjQsIG5ldyBQYWxldHRlRGF0YSgweGZmMDAwMCwgMHhmZjAwLCAweGZmKSk7CQkKLQlnZXRJbWFnZURhdGEyKDMyLCBuZXcgUGFsZXR0ZURhdGEoMHhmZjAwMDAsIDB4ZmYwMCwgMHhmZikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCUltYWdlIGltYWdlID0gbnVsbDsKLQlJbWFnZSBpbWFnZTEgPSBudWxsOzsKLQotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JCWltYWdlMSA9IGltYWdlOwotCQotCQlhc3NlcnRFcXVhbHMoIjphOiIsIGltYWdlMS5oYXNoQ29kZSgpLCBpbWFnZS5oYXNoQ29kZSgpKTsKLQkJCi0JCUltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQlpbWFnZTEgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJYm9vbGVhbiBlcXVhbHMgPSAoaW1hZ2UxLmhhc2hDb2RlKCkgPT0gaW1hZ2UuaGFzaENvZGUoKSk7Ci0JCWFzc2VydEZhbHNlKCI6YjoiLCBlcXVhbHMpOwotCX0gZmluYWxseSB7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJaW1hZ2UxLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0JLy8gamF2YWRvYyBzdGF0ZXM6Ci0JLy8gPGI+SU1QT1JUQU5UOjwvYj4gVGhpcyBtZXRob2QgaXMgPGVtPm5vdDwvZW0+IHBhcnQgb2YgdGhlIHB1YmxpYwotCS8vIEFQSSBmb3IgPGNvZGU+SW1hZ2U8L2NvZGU+Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBqYXZhZG9jIHN0YXRlczoKLQkvLyA8Yj5JTVBPUlRBTlQ6PC9iPiBUaGlzIG1ldGhvZCBpcyA8ZW0+bm90PC9lbT4gcGFydCBvZiB0aGUgcHVibGljCi0JLy8gQVBJIGZvciA8Y29kZT5JbWFnZTwvY29kZT4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JYXNzZXJ0RmFsc2UoIjphOiIsIGltYWdlLmlzRGlzcG9zZWQoKSk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWFzc2VydFRydWUoIjpiOiIsIGltYWdlLmlzRGlzcG9zZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQotCXRyeSB7Ci0JCWltYWdlLnNldEJhY2tncm91bmQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGNvbG9yID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0gZmluYWxseSB7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQl9Ci0KLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMjU1LCAyNTUpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlpbWFnZS5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgY29sb3IiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBjb2xvciIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9IGZpbmFsbHkgewotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JfQotCi0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAyNTUsIDI1NSk7Ci0JdHJ5IHsKLQkJaW1hZ2Uuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGltYWdlIik7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgaW1hZ2UiLCBTV1QuRVJST1JfR1JBUEhJQ19ESVNQT1NFRCwgZSk7Ci0JfSBmaW5hbGx5IHsKLQkJY29sb3IuZGlzcG9zZSgpOwotCX0KLQkKLQkvLyB0aGlzIGltYWdlIGRvZXMgbm90IGhhdmUgYSB0cmFuc3BhcmVudCBwaXhlbCBieSBkZWZhdWx0IHNvIHNldEJhY2tncm91bmQgaGFzIG5vIGVmZmVjdAotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JaW1hZ2Uuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOwotCWNvbG9yID0gaW1hZ2UuZ2V0QmFja2dyb3VuZCgpOwotCWFzc2VydE51bGwoImJhY2tncm91bmQgY29sb3Igc2hvdWxkIGJlIG51bGwgZm9yIG5vbi10cmFuc3BhcmVudCBpbWFnZSIsIGNvbG9yKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JCi0JLy8gY3JlYXRlIGFuIGltYWdlIHdpdGggdHJhbnNwYXJlbmN5IGFuZCB0aGVuIHNldCB0aGUgYmFja2dyb3VuZCBjb2xvcgotCUltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgMiwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KSwgbmV3IFJHQig1MCwgMTAwLCAxNTApfSkpOwotCWltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gMDsgLy8gdHJhbnNwYXJlbnQgcGl4ZWwgaXMgY3VycmVudGx5IGJsYWNrCi0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQlpbWFnZS5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JY29sb3IgPSBpbWFnZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JYXNzZXJ0RXF1YWxzKCJiYWNrZ3JvdW5kIGNvbG9yIHNob3VsZCBoYXZlIGJlZW4gc2V0IHRvIGdyZWVuIiwgZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pLCBjb2xvcik7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0Tm90TnVsbChpbWFnZS50b1N0cmluZygpKTsKLQkJYXNzZXJ0VHJ1ZShpbWFnZS50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci0JfSBmaW5hbGx5IHsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJKCkgewotCS8vIGRvIG5vdCB0ZXN0IC0gV2luZG93cyBvbmx5Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2lvX0lucHV0U3RyZWFtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QmFja2dyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZURhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNEaXNwb3NlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2lvX0lucHV0U3RyZWFtIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2lvX0lucHV0U3RyZWFtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kIikpIHRlc3RfZ2V0QmFja2dyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZURhdGEiKSkgdGVzdF9nZXRJbWFnZURhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0Rpc3Bvc2VkIikpIHRlc3RfaXNEaXNwb3NlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSSIpKSB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUkoKTsKLX0KLS8qIGN1c3RvbSAqLwotRGlzcGxheSBkaXNwbGF5OwotCi0vKiogVGVzdCBpbXBsZW1lbnRhdGlvbiAqKi8KLQotdm9pZCBnZXRJbWFnZURhdGExKCkgewotCWludCBudW1Gb3JtYXRzID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzLmxlbmd0aDsKLQlTdHJpbmcgZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1swXTsKLQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCVN0cmluZyBmb3JtYXQgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHNbaV07Ci0JCUlucHV0U3RyZWFtIHN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUgKyAiLiIgKyBmb3JtYXQpOwotCQlJbWFnZURhdGEgZGF0YTEgPSBuZXcgSW1hZ2VEYXRhKHN0cmVhbSk7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGExKTsKLQkJSW1hZ2VEYXRhIGRhdGEyID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbWFnZSB3aWR0aCBzaG91bGQgYmUgdGhlIHNhbWUiLCBkYXRhMS53aWR0aCwgZGF0YTIud2lkdGgpOwotCQlhc3NlcnRFcXVhbHMoIkltYWdlIGhlaWdodCBzaG91bGQgYmUgdGhlIHNhbWUiLCBkYXRhMS5oZWlnaHQsIGRhdGEyLmhlaWdodCk7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gY29udGludWU7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBWZXJpZnkgSW1hZ2UuZ2V0SW1hZ2VEYXRhIHJldHVybnMgcGl4ZWxzIHdpdGggdGhlIHNhbWUgUkdCIHZhbHVlIGFzIHRoZQotICogc291cmNlIGltYWdlLiBUaGlzIHRlc3Qgb25seSBtYWtlcyBzZW5zZSB3aXRoIGRlcHRoIG9mIDI0IGFuZCAzMiBiaXRzLgotICovCi12b2lkIGdldEltYWdlRGF0YTIoaW50IGRlcHRoLCBQYWxldHRlRGF0YSBwYWxldHRlKSB7Ci0JaW50IHdpZHRoID0gMTA7Ci0JaW50IGhlaWdodCA9IDEwOwotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDB4ZmYsIDApOwotCVJHQiBjb2xvclJHQiA9IGNvbG9yLmdldFJHQigpOwotCi0JSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodCwgZGVwdGgsIHBhbGV0dGUpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JCQotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlnYy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIDEwLCAxMCk7Ci0JCQotCUltYWdlRGF0YSBuZXdEYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JUGFsZXR0ZURhdGEgbmV3UGFsZXR0ZSA9IG5ld0RhdGEucGFsZXR0ZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgewotCQkJaW50IHBpeGVsID0gbmV3RGF0YS5nZXRQaXhlbChpLCBqKTsKLQkJCVJHQiByZ2IgPSBuZXdQYWxldHRlLmdldFJHQihwaXhlbCk7Ci0JCQlhc3NlcnRUcnVlKCJyZ2IuZXF1YWxzKGNvbG9yUkdCKSIsIHJnYi5lcXVhbHMoY29sb3JSR0IpKTsKLQkJfQotCX0KLQljb2xvci5kaXNwb3NlKCk7Ci0JZ2MuZGlzcG9zZSgpOwotCWltYWdlLmRpc3Bvc2UoKTsKLX0KLVN0cmluZyBnZXRQYXRoKFN0cmluZyBmaWxlTmFtZSkgewotCVN0cmluZyB1cmxQYXRoOwotCQotCVN0cmluZyBwbHVnaW5QYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJQTFVHSU5fUEFUSCIpOwotCWlmICh2ZXJib3NlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCX0KLQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB7Ci0JCVVSTCB1cmwgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoZmlsZU5hbWUpOwotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCWZhaWwoIlVSTCA9PSBudWxsIGZvciBmaWxlICIgKyBmaWxlTmFtZSk7Ci0JCX0KLQkJdXJsUGF0aCA9IHVybC5nZXRGaWxlKCk7Ci0JfSBlbHNlIHsKLQkJdXJsUGF0aCA9IHBsdWdpblBhdGggKyAiL2RhdGEvIiArIGZpbGVOYW1lOwotCX0KLQkKLQlpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJykgdXJsUGF0aCA9IHVybFBhdGgucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CQotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MgJiYgdXJsUGF0aC5pbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcikgPT0gMCkgdXJsUGF0aCA9IHVybFBhdGguc3Vic3RyaW5nKDEpOwotCXVybFBhdGggPSB1cmxQYXRoLnJlcGxhY2VBbGwoIiUyMCIsICIgIik7CQotCQotCWlmICh2ZXJib3NlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb2x2ZWQgZmlsZSBuYW1lIGZvciAiICsgZmlsZU5hbWUgKyAiID0gIiArIHVybFBhdGgpOwotCX0KLQlyZXR1cm4gdXJsUGF0aDsKLX0KLVJHQiBnZXRSZWFsUkdCKENvbG9yIGNvbG9yKSB7Ci0JSW1hZ2UgY29sb3JJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCUdDIGltYWdlR2MgPSBuZXcgR0MoY29sb3JJbWFnZSk7Ci0JSW1hZ2VEYXRhIGltYWdlRGF0YTsKLQlQYWxldHRlRGF0YSBwYWxldHRlOwotCWludCBwaXhlbDsKLQkKLQlpbWFnZUdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCWltYWdlR2Muc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JaW1hZ2VHYy5maWxsUmVjdGFuZ2xlKDAsIDAsIDEwLCAxMCk7Ci0JaW1hZ2VEYXRhID0gY29sb3JJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlwYWxldHRlID0gaW1hZ2VEYXRhLnBhbGV0dGU7Ci0JaW1hZ2VHYy5kaXNwb3NlKCk7Ci0JY29sb3JJbWFnZS5kaXNwb3NlKCk7Ci0JcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoMCwgMCk7Ci0JcmV0dXJuIHBhbGV0dGUuZ2V0UkdCKHBpeGVsKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWI2NGVhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMzIsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMCwgMHhGRjAwLCAweEZGKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YSgpIHsKLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKC0xLCAxLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWR0aCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgLTEsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgMSwgMSwgbnVsbCwgMCwgbmV3IGJ5dGVbXSB7fSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhbGV0dGVEYXRhID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgMSwgMywgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdW5zdXBwb3J0ZWQgZGVwdGgiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlpbnRbXSB2YWxpZERlcHRocyA9IHsxLCAyLCA0LCA4LCAxNiwgMjQsIDMyfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkRGVwdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgMSwgdmFsaWREZXB0aHNbaV0sIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JfTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGFJJEIoKSB7Ci0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgtMSwgMSwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCAxLCBuZXcgYnl0ZVtdIHt9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIC0xLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDEsIG5ldyBieXRlW10ge30pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDEsIG51bGwsIDAsIG5ldyBieXRlW10ge30pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYWxldHRlRGF0YSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSwgMSwgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRhdGEgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgxLCAxLCAzLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDEsIG5ldyBieXRlW10ge30pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB1bnN1cHBvcnRlZCBkZXB0aCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWludFtdIHZhbGlkRGVwdGhzID0gezEsIDIsIDQsIDgsIDE2LCAyNCwgMzJ9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWREZXB0aHMubGVuZ3RoOyBpKyspIHsKLQkJbmV3IEltYWdlRGF0YSgxLCAxLCB2YWxpZERlcHRoc1tpXSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCAxLCBuZXcgYnl0ZVtdIHt9KTsKLQl9OwotCQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIGRhdGEgaXMgbnVsbAotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgMSwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCA0LCBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbnVsbCBkYXRhIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JLy8gZGl2aWRlIGJ5IHplcm8gZXhjZXB0aW9uIGlmIHNjYW5saW5lUGFkID09IDAKLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDgsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSwgMCwgbmV3IGJ5dGVbXSB7fSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNjYW5saW5lUGFkID09IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtKCkgewotCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JdHJ5IHsKLQkJdHJ5IHsKLQkJCW5ldyBJbWFnZURhdGEoc3RyZWFtKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIElucHV0U3RyZWFtID09IG51bGwiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQkKLQkJc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiZW1wdHkudHh0Iik7Ci0JCXRyeSB7Ci0JCQluZXcgSW1hZ2VEYXRhKHN0cmVhbSk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIElucHV0U3RyZWFtIik7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkKLQkJaW50IG51bUZvcm1hdHMgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHMubGVuZ3RoOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1swXTsKLQkJZm9yIChpbnQgaT0wOyBpPG51bUZvcm1hdHM7IGkrKykgewotCQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkJCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUgKyAiLiIgKyBmb3JtYXQpOwotCQkJbmV3IEltYWdlRGF0YShzdHJlYW0pOwotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JU3RyaW5nIGZpbGVuYW1lID0gbnVsbDsKLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKGZpbGVuYW1lKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZmlsZW5hbWUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCS8vIGoyc2UgYW5kIGoybWUoY2RjKSBjYW4gbG9hZCBmcm9tIGEgZmlsZW5hbWUgYnV0LCBqMm1lKGNsZGMpIHRocm93cyBhbiBleGNlcHRpb24KLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbG9uZSgpIHsKLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCXRyeSB7Ci0JCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNbMF0gKyAiLiIgKyBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHNbMF0pOwotCQlJbWFnZURhdGEgZGF0YTEgPSBuZXcgSW1hZ2VEYXRhKHN0cmVhbSk7Ci0JCUltYWdlRGF0YSBkYXRhMiA9IChJbWFnZURhdGEpIGRhdGExLmNsb25lKCk7Ci0JCS8vIGltYWdlRGF0YSBkb2VzIG5vdCBpbXBsZW1lbnQgYW4gZXF1YWxzKE9iamVjdCkgbWV0aG9kCi0JCWFzc2VydEVxdWFscygiOmE6IiwgZGF0YTEuYWxwaGEsIGRhdGEyLmFscGhhKTsKLQkJYXNzZXJ0RXF1YWxzKCI6YjoiLCBkYXRhMS5hbHBoYURhdGEsIGRhdGEyLmFscGhhRGF0YSk7Ci0JCWFzc2VydEVxdWFscygiOmM6IiwgZGF0YTEuYnl0ZXNQZXJMaW5lLCBkYXRhMi5ieXRlc1BlckxpbmUpOwotCQlhc3NlcnRFcXVhbHMoIjpkOiIsIGRhdGExLmRhdGEsIGRhdGEyLmRhdGEpOwotCQlhc3NlcnRFcXVhbHMoIjplOiIsIGRhdGExLmRlbGF5VGltZSwgZGF0YTIuZGVsYXlUaW1lKTsKLQkJYXNzZXJ0RXF1YWxzKCI6ZjoiLCBkYXRhMS5kZXB0aCwgZGF0YTIuZGVwdGgpOwotCQlhc3NlcnRFcXVhbHMoIjpnOiIsIGRhdGExLmRpc3Bvc2FsTWV0aG9kLCBkYXRhMi5kaXNwb3NhbE1ldGhvZCk7Ci0JCWFzc2VydEVxdWFscygiOmg6IiwgZGF0YTEuaGVpZ2h0LCBkYXRhMi5oZWlnaHQpOwotCQlhc3NlcnRFcXVhbHMoIjppOiIsIGRhdGExLm1hc2tEYXRhLCBkYXRhMi5tYXNrRGF0YSk7Ci0JCWFzc2VydEVxdWFscygiOmo6IiwgZGF0YTEubWFza1BhZCwgZGF0YTIubWFza1BhZCk7Ci0JCWFzc2VydEVxdWFscygiOms6IiwgZGF0YTEucGFsZXR0ZSwgZGF0YTIucGFsZXR0ZSk7Ci0JCWFzc2VydEVxdWFscygiOmw6IiwgZGF0YTEuc2NhbmxpbmVQYWQsIGRhdGEyLnNjYW5saW5lUGFkKTsKLQkJYXNzZXJ0RXF1YWxzKCI6bToiLCBkYXRhMS50cmFuc3BhcmVudFBpeGVsLCBkYXRhMi50cmFuc3BhcmVudFBpeGVsKTsKLQkJYXNzZXJ0RXF1YWxzKCI6bjoiLCBkYXRhMS50eXBlLCBkYXRhMi50eXBlKTsKLQkJYXNzZXJ0RXF1YWxzKCI6bzoiLCBkYXRhMS53aWR0aCwgZGF0YTIud2lkdGgpOwotCQlhc3NlcnRFcXVhbHMoIjpwOiIsIGRhdGExLngsIGRhdGEyLngpOwotCQlhc3NlcnRFcXVhbHMoIjpxOiIsIGRhdGExLnksIGRhdGEyLnkpOwotCX0gZmluYWxseSB7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBbHBoYUlJKCkgewotCWludCB2YWx1ZTsKLQkKLQlhc3NlcnRFcXVhbHMoIjphOiIsIDI1NSwgaW1hZ2VEYXRhLmdldEFscGhhKDAsIDApKTsKLQl2YWx1ZSA9IDB4QUE7Ci0JaW1hZ2VEYXRhLnNldEFscGhhKDAsIDAsIHZhbHVlKTsKLQlhc3NlcnRFcXVhbHMoIjpiOiIsIHZhbHVlLCBpbWFnZURhdGEuZ2V0QWxwaGEoMCwgMCkpOwotCi0JLy8gZXhjZXB0aW9uIGNhc2VzCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldEFscGhhKC0xLCAxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0QWxwaGEoSU1BR0VfRElNRU5TSU9OLCAxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0QWxwaGEoMCwgLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYSgwLCBJTUFHRV9ESU1FTlNJT04pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEFscGhhc0lJSSRCSSgpIHsKLQlieXRlIHZhbHVlOwotCWZpbmFsIGludCBTSVpFID0gMjA7IAotCWZpbmFsIGludCBHRVRfV0lEVEggPSAxMDsKLQlmaW5hbCBpbnQgT0ZGU0VUID0gMTA7Ci0JYnl0ZVtdIGFscGhhRGF0YSA9IG5ldyBieXRlW1NJWkVdOwotCQotCWltYWdlRGF0YS5nZXRBbHBoYXMoMCwgMSwgR0VUX1dJRFRILCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBhbHBoYURhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjphOiIsIDAsIGFscGhhRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpiOiIsIChieXRlKSAyNTUsIGFscGhhRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQl2YWx1ZSA9IChieXRlKSAweEFBOwotCWJ5dGVbXSB2YWx1ZXMgPSBuZXcgYnl0ZVtdIHt2YWx1ZSwgKGJ5dGUpICh2YWx1ZSsxKSwgKGJ5dGUpICh2YWx1ZSsyKSwgKGJ5dGUpICh2YWx1ZSszKSwgKGJ5dGUpICh2YWx1ZSs0KX07Ci0JaW1hZ2VEYXRhLnNldEFscGhhcygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRBbHBoYXMoMCwgMSwgR0VUX1dJRFRILCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBhbHBoYURhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmM6IiwgMCwgYWxwaGFEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZDoiLCAoYnl0ZSkgdmFsdWVzW2ktT0ZGU0VUXSwgYWxwaGFEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOmU6IiwgMCwgYWxwaGFEYXRhW2ldKTsKLQkJfQotCX0KLQkKLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0QWxwaGFzKDAsIDEsIEdFVF9XSURUSCpHRVRfV0lEVEgsIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZ2V0V2lkdGggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0QWxwaGFzKDAsIDEsIEdFVF9XSURUSCwgKGJ5dGVbXSkgbnVsbCwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWxwaGFzID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBhbHBoYXMgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldEFscGhhcygtMSwgMSwgR0VUX1dJRFRILCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldEFscGhhcyhJTUFHRV9ESU1FTlNJT04sIDEsIEdFVF9XSURUSCwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYXMoMCwgLTEsIEdFVF9XSURUSCwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYXMoMCwgSU1BR0VfRElNRU5TSU9OLCBHRVRfV0lEVEgsIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0QWxwaGFzKDAsIDEsIC0xLCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIDwgMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBpeGVsSUkoKSB7Ci0JaW50IHZhbHVlOwotCQotCWFzc2VydEVxdWFscygiOmE6IiwgMCwgaW1hZ2VEYXRhLmdldFBpeGVsKDAsIDApKTsKLQl2YWx1ZSA9IDB4QUE7Ci0JaW1hZ2VEYXRhLnNldFBpeGVsKDAsIDAsIHZhbHVlKTsKLQlhc3NlcnRFcXVhbHMoIjpiOiIsIHZhbHVlLCBpbWFnZURhdGEuZ2V0UGl4ZWwoMCwgMCkpOwotCi0JLy8gZXhjZXB0aW9uIGNhc2VzCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVsKC0xLCAxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWwoSU1BR0VfRElNRU5TSU9OLCAxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWwoMCwgLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbCgwLCBJTUFHRV9ESU1FTlNJT04pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCWludCB3aWR0aCA9IDM7Ci0JaW50IGhlaWdodCA9IDM7Ci0JaW50IGRlcHRoID0gNDsKLQlieXRlIHBpeGVsVmFsdWUgPSAxOwotCWJ5dGVbXSBkYXRhID0geyhieXRlKSAoKHBpeGVsVmFsdWUgPDwgNCkgKyBwaXhlbFZhbHVlKSwgKGJ5dGUpIChwaXhlbFZhbHVlIDw8IDQpLCAoYnl0ZSkgKChwaXhlbFZhbHVlIDw8IDQpICsgcGl4ZWxWYWx1ZSksIChieXRlKSAocGl4ZWxWYWx1ZSA8PCA0KSwgKGJ5dGUpICgocGl4ZWxWYWx1ZSA8PCA0KSArIHBpeGVsVmFsdWUpLCAoYnl0ZSkgKHBpeGVsVmFsdWUgPDwgNCl9OyAKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDI1NSksIG5ldyBSR0IoMTExLCAxMTEsIDExMSl9KSwgMSwgZGF0YSk7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotCQlmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKLQkJCWludCBwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbCh4LCB5KTsKLQkJCWFzc2VydEVxdWFscygiQmFkIHBpeGVsIGRhdGEiLCBwaXhlbFZhbHVlLCBwaXhlbCk7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGl4ZWxzSUlJJEJJKCkgewotCWJ5dGUgdmFsdWU7Ci0JZmluYWwgaW50IFNJWkUgPSAyMDsgCi0JZmluYWwgaW50IEdFVF9XSURUSCA9IDEwOwotCWZpbmFsIGludCBPRkZTRVQgPSAxMDsKLQlieXRlW10gcGl4ZWxEYXRhID0gbmV3IGJ5dGVbU0laRV07Ci0KLQkvLyB0ZXN0IDEgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWFzc2VydEVxdWFscygiOmE6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQl9Ci0KLQlieXRlW10gdmFsdWVzID0gbmV3IGJ5dGVbXXsweDEsIDB4MSwgMHgxLCAweDEsIDB4MX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmI6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YzoiLCAoYnl0ZSkgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAyIGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDIsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSArKykgewotCQlhc3NlcnRFcXVhbHMoIjplOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JfQotCi0JdmFsdWVzID0gbmV3IGJ5dGVbXXsweDEsIDB4MiwgMHgzLCAweDIsIDB4MX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmY6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZzoiLCAoYnl0ZSkgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOmg6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgNCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCA0LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6aToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCXZhbHVlcyA9IG5ldyBieXRlW117MHgxLCAweDIsIDB4MywgMHg0LCAweEZ9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzLCAwKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpqOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCArIHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOms6IiwgKGJ5dGUpIHZhbHVlc1tpLU9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7CQotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpsOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDggYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWFzc2VydEVxdWFscygiOm06IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQl9Ci0KLQl2YWx1ZXMgPSBuZXcgYnl0ZVtdezB4MSwgMHgyLCAweDMsIDB4RiwgKGJ5dGUpMHhGRn07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOm46IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6bzoiLCAoYnl0ZSkgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOnA6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQkKLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCpHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZ2V0V2lkdGggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgKGJ5dGVbXSkgbnVsbCwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGl4ZWxzID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygtMSwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscyhJTUFHRV9ESU1FTlNJT04sIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgLTEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgSU1BR0VfRElNRU5TSU9OLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIC0xLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIDwgMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMzIsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMCwgMHhGRjAwLCAweEZGKSk7CQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZGVwdGgiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGRlcHRoIiwgU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRILCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGl4ZWxzSUlJJElJKCkgewotCWludCB2YWx1ZTsKLQlmaW5hbCBpbnQgU0laRSA9IDIwOyAKLQlmaW5hbCBpbnQgR0VUX1dJRFRIID0gMTA7Ci0JZmluYWwgaW50IE9GRlNFVCA9IDEwOwotCWludFtdIHBpeGVsRGF0YSA9IG5ldyBpbnRbU0laRV07Ci0KLQkvLyB0ZXN0IDEgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWFzc2VydEVxdWFscygiOmE6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQl9Ci0KLQlpbnRbXSB2YWx1ZXMgPSBuZXcgaW50W117MHgxLCAweDEsIDB4MSwgMHgxLCAweDF9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzLCAwKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpiOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCArIHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmM6IiwgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAyIGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDIsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSArKykgewotCQlhc3NlcnRFcXVhbHMoIjplOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JfQotCi0JdmFsdWVzID0gbmV3IGludFtdezB4MSwgMHgyLCAweDMsIDB4MiwgMHgxfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpnOiIsIHZhbHVlc1tpLU9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7CQotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpoOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDQgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgNCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWFzc2VydEVxdWFscygiOmk6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQl9Ci0KLQl2YWx1ZXMgPSBuZXcgaW50W117MHgxLCAweDIsIDB4MywgMHg0LCAweEZ9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzLCAwKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpqOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCArIHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOms6IiwgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOmw6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgOCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCA4LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6bToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCXZhbHVlcyA9IG5ldyBpbnRbXXsweDEsIDB4MiwgMHgzLCAweEYsIDB4RkZ9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzLCAwKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpuOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCArIHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOm86IiwgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOnA6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgMTYgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMTYsIG5ldyBQYWxldHRlRGF0YSgweEY4MDAsIDB4N0UwLCAweDFGKSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6cToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCXZhbHVlcyA9IG5ldyBpbnRbXXswLCAweDIsIDB4RiwgMHhGRiwgMHhGRkFBfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6cjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpzOiIsIHZhbHVlc1tpLU9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7CQotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjp0OiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDI0IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDI0LCBuZXcgUGFsZXR0ZURhdGEoMHhGRjAwMDAsIDB4RkYwMCwgMHhGRikpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWFzc2VydEVxdWFscygiOnU6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQl9Ci0KLQl2YWx1ZXMgPSBuZXcgaW50W117MCwgMHhGRiwgMHhGRkFBLCAweEZGMDBBQX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOnY6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6dzoiLCB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwkKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6eDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAzMiBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAzMiwgbmV3IFBhbGV0dGVEYXRhKDB4RkYwMDAwMDAsIDB4RkYwMCwgMHhGRikpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWFzc2VydEVxdWFscygiOnk6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQl9Ci0KLQl2YWx1ZXMgPSBuZXcgaW50W117MCwgMHhGRiwgMHhGRkFBLCAweEZGMDBBQTAwfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ejoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjphYToiLCB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwkKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YWI6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIGV4Y2VwdGlvbiBjYXNlcwotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRIKkdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBnZXRXaWR0aCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCAoaW50W10pIG51bGwsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBpeGVscyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcGl4ZWxzID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoLTEsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoSU1BR0VfRElNRU5TSU9OLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIC0xLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIElNQUdFX0RJTUVOU0lPTiwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCAtMSwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBnZXRXaWR0aCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBnZXRXaWR0aCA8IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJHQnMoKSB7Ci0JYXNzZXJ0TnVsbCgiOmE6IiwgaW1hZ2VEYXRhLmdldFJHQnMoKSk7Ci0JUkdCW10gcmdicyA9IG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfTsKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCA4LCBuZXcgUGFsZXR0ZURhdGEocmdicykpOwotCWFzc2VydEVxdWFscygiOmI6IiwgcmdicywgaW1hZ2VEYXRhLmdldFJHQnMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VHJhbnNwYXJlbmN5TWFzaygpIHsKLS8vCUJ1ZyA3MTQ3MiAtIHRyYW5zcGFyZW5jeSBtYXNrIHNob3VsZCBiZSBudWxsCQotLy8JYXNzZXJ0TnVsbCgiOmE6IiwgaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeU1hc2soKSk7Ci0KLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0odHJhbnNwYXJlbnRJbWFnZUZpbGVuYW1lc1swXSk7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoRGlzcGxheS5nZXREZWZhdWx0KCksIHN0cmVhbSk7Ci0JdHJ5IHsKLQkJc3RyZWFtLmNsb3NlKCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQlpbWFnZURhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlJbWFnZURhdGEgbWFza0RhdGEgPSBpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCWFzc2VydE5vdE51bGwoIjpiOiIsIG1hc2tEYXRhKTsKLQotLy8JQnVnIDcxNDcyIC0gdHJhbnNwYXJlbmN5IG1hc2sgc2hvdWxkIGJlIG51bGwJCi0vKglpbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldERlZmF1bHQoKSwgZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKGltYWdlRmlsZW5hbWVzWzBdICsgJy4nICsgaW1hZ2VGb3JtYXRzW2ltYWdlRm9ybWF0cy5sZW5ndGgtMV0pKTsKLQlpbWFnZURhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQltYXNrRGF0YSA9IGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JYXNzZXJ0TnVsbCgiOmM6IiwgbWFza0RhdGEpOwotKi8JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VHJhbnNwYXJlbmN5VHlwZSgpIHsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIFNXVC5UUkFOU1BBUkVOQ1lfTk9ORSwgaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeVR5cGUoKSk7Ci0KLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0odHJhbnNwYXJlbnRJbWFnZUZpbGVuYW1lc1swXSk7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoRGlzcGxheS5nZXREZWZhdWx0KCksIHN0cmVhbSk7Ci0JdHJ5IHsKLQkJc3RyZWFtLmNsb3NlKCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQlpbWFnZURhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlhc3NlcnRGYWxzZSgiOmI6IiwgU1dULlRSQU5TUEFSRU5DWV9OT05FID09IGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lUeXBlKCkpOwotCQotCXN0cmVhbSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShpbWFnZUZpbGVuYW1lc1swXSArICcuJyArIGltYWdlRm9ybWF0c1tpbWFnZUZvcm1hdHMubGVuZ3RoLTFdKTsKLQlpbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldERlZmF1bHQoKSwgc3RyZWFtKTsKLQl0cnkgewotCQlzdHJlYW0uY2xvc2UoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCWltYWdlRGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCWFzc2VydEVxdWFscygiOmM6IiwgU1dULlRSQU5TUEFSRU5DWV9OT05FLCBpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5VHlwZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9uZXdJSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhSSRCSSRCJEJJSUlJSUlJKCkgewotCS8vIGRvIG5vdCB0ZXN0IGludGVybmFsIEFQSQotCS8vIGphdmFkb2Mgc3RhdGVzOgotCS8vIDxiPklNUE9SVEFOVDo8L2I+IFRoaXMgbWV0aG9kIGlzIDxlbT5ub3Q8L2VtPiBwYXJ0IG9mIHRoZSBwdWJsaWMKLQkvLyBBUEkgZm9yIDxjb2RlPkltYWdlRGF0YTwvY29kZT4uIEl0IGlzIG1hcmtlZCBwdWJsaWMgb25seSBzbyB0aGF0IGl0Ci0JLy8gY2FuIGJlIHNoYXJlZCB3aXRoaW4gdGhlIHBhY2thZ2VzIHByb3ZpZGVkIGJ5IFNXVC4gSXQgaXMgc3ViamVjdAotCS8vIHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZSwgYW5kIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgZnJvbQotCS8vIGFwcGxpY2F0aW9uIGNvZGUuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2NhbGVkVG9JSSgpIHsKLQlmaW5hbCBpbnQgaW1hZ2VEaW1lbnNpb24gPSA4OwotCVJHQltdIHJnYnMgPSBuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX07Ci0JYnl0ZVtdIHBpeGVsRGF0YSA9IG5ldyBieXRlWyhpbWFnZURpbWVuc2lvbippbWFnZURpbWVuc2lvbikgLyA4XTsKLQkKLQlwaXhlbERhdGFbMF0gPSAweDRGOwotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoaW1hZ2VEaW1lbnNpb24sIGltYWdlRGltZW5zaW9uLCAxLCBuZXcgUGFsZXR0ZURhdGEocmdicyksIDEsIHBpeGVsRGF0YSk7Ci0KLQlJbWFnZURhdGEgc2NhbGVkSW1hZ2VEYXRhID0gaW1hZ2VEYXRhLnNjYWxlZFRvKC1pbWFnZURpbWVuc2lvbiwgLWltYWdlRGltZW5zaW9uKTsKLQlieXRlW10gc2NhbGVkUGl4ZWxEYXRhID0gbmV3IGJ5dGVbaW1hZ2VEaW1lbnNpb25dOwotCXNjYWxlZEltYWdlRGF0YS5nZXRQaXhlbHMoMCwgaW1hZ2VEaW1lbnNpb24gLSAxLCBzY2FsZWRQaXhlbERhdGEubGVuZ3RoLCBzY2FsZWRQaXhlbERhdGEsIDApOwkKLQlieXRlW10gZXhwZWN0ZWRQaXhlbERhdGEgPSBuZXcgYnl0ZVtdIHsweDEsIDB4MSwgMHgxLCAweDEsIDAsIDAsIDB4MSwgMH07Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCBleHBlY3RlZFBpeGVsRGF0YSwgc2NhbGVkUGl4ZWxEYXRhKTsKLQotCXNjYWxlZEltYWdlRGF0YSA9IGltYWdlRGF0YS5zY2FsZWRUbyhpbWFnZURpbWVuc2lvbiAqIDEwLCBpbWFnZURpbWVuc2lvbik7Ci0Jc2NhbGVkUGl4ZWxEYXRhID0gbmV3IGJ5dGVbaW1hZ2VEaW1lbnNpb24gKiAxMF07Ci0Jc2NhbGVkSW1hZ2VEYXRhLmdldFBpeGVscygwLCAwLCBzY2FsZWRQaXhlbERhdGEubGVuZ3RoLCBzY2FsZWRQaXhlbERhdGEsIDApOwkKLQlhc3NlcnRFcXVhbHMoIjpiOiIsIDAsIHNjYWxlZFBpeGVsRGF0YVswXSk7Ci0JYXNzZXJ0RXF1YWxzKCI6YzoiLCAwLCBzY2FsZWRQaXhlbERhdGFbMV0pOwotCi0Jc2NhbGVkSW1hZ2VEYXRhID0gaW1hZ2VEYXRhLnNjYWxlZFRvKGltYWdlRGltZW5zaW9uLCBpbWFnZURpbWVuc2lvbiAqIDEwKTsKLQlzY2FsZWRQaXhlbERhdGEgPSBuZXcgYnl0ZVtpbWFnZURpbWVuc2lvbl07Ci0Jc2NhbGVkSW1hZ2VEYXRhLmdldFBpeGVscygwLCAwLCBzY2FsZWRQaXhlbERhdGEubGVuZ3RoLCBzY2FsZWRQaXhlbERhdGEsIDApOwkKLQlleHBlY3RlZFBpeGVsRGF0YSA9IG5ldyBieXRlW10gezAsIDB4MSwgMCwgMCwgMHgxLCAweDEsIDB4MSwgMHgxfTsKLQlhc3NlcnRFcXVhbHMoIjpkOiIsIGV4cGVjdGVkUGl4ZWxEYXRhLCBzY2FsZWRQaXhlbERhdGEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFscGhhSUlJKCkgewotCWludCB2YWx1ZTsKLQkKLQl2YWx1ZSA9IDB4QUE7Ci0JaW1hZ2VEYXRhLnNldEFscGhhKDAsIDAsIHZhbHVlKTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIHZhbHVlLCBpbWFnZURhdGEuZ2V0QWxwaGEoMCwgMCkpOwotCi0JLy8gZXhjZXB0aW9uIGNhc2VzCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhKC0xLCAxLCB2YWx1ZSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhKElNQUdFX0RJTUVOU0lPTiwgMSwgdmFsdWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRBbHBoYSgwLCAtMSwgdmFsdWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRBbHBoYSgwLCBJTUFHRV9ESU1FTlNJT04sIHZhbHVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRBbHBoYXNJSUkkQkkoKSB7Ci0JYnl0ZSB2YWx1ZTsKLQlmaW5hbCBpbnQgU0laRSA9IDIwOyAKLQlmaW5hbCBpbnQgT0ZGU0VUID0gMTsKLQlieXRlW10gYWxwaGFEYXRhID0gbmV3IGJ5dGVbU0laRV07Ci0JCi0JdmFsdWUgPSAoYnl0ZSkgMHhBQTsKLQlieXRlW10gdmFsdWVzID0gbmV3IGJ5dGVbXSB7dmFsdWUsIChieXRlKSAodmFsdWUrMSksIChieXRlKSAodmFsdWUrMiksIChieXRlKSAodmFsdWUrMyksIChieXRlKSAodmFsdWUrNCl9OwotCWltYWdlRGF0YS5zZXRBbHBoYXMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRBbHBoYXMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBhbHBoYURhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgYWxwaGFEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YToiLCAoYnl0ZSkgdmFsdWVzW2kgKyBPRkZTRVRdLCBhbHBoYURhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6YjoiLCAwLCBhbHBoYURhdGFbaV0pOwotCQl9Ci0JfQotCQotCS8vIGV4Y2VwdGlvbiBjYXNlcwotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRBbHBoYXMoMCwgMSwgSU1BR0VfRElNRU5TSU9OKklNQUdFX0RJTUVOU0lPTiwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwdXRXaWR0aCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRBbHBoYXMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCAoYnl0ZVtdKSBudWxsLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhbHBoYXMgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFscGhhcyA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGFzKC0xLCAxLCBJTUFHRV9ESU1FTlNJT04sIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGFzKElNQUdFX0RJTUVOU0lPTiwgMSwgSU1BR0VfRElNRU5TSU9OLCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhcygwLCAtMSwgSU1BR0VfRElNRU5TSU9OLCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhcygwLCBJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRBbHBoYXMoMCwgMSwgLTEsIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcHV0V2lkdGggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcHV0V2lkdGggPCAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UGl4ZWxJSUkoKSB7Ci0JaW50IHZhbHVlOwotCQotCXZhbHVlID0gMHhBQTsKLQlpbWFnZURhdGEuc2V0UGl4ZWwoMCwgMCwgdmFsdWUpOwotCWFzc2VydEVxdWFscygiOmE6IiwgdmFsdWUsIGltYWdlRGF0YS5nZXRQaXhlbCgwLCAwKSk7Ci0KLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWwoLTEsIDEsIHZhbHVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWwoSU1BR0VfRElNRU5TSU9OLCAxLCB2YWx1ZSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVsKDAsIC0xLCB2YWx1ZSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVsKDAsIElNQUdFX0RJTUVOU0lPTiwgdmFsdWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFBpeGVsc0lJSSRCSSgpIHsKLQlieXRlIHZhbHVlOwotCWZpbmFsIGludCBTSVpFID0gMjA7IAotCWZpbmFsIGludCBPRkZTRVQgPSAxOwotCWJ5dGVbXSBwaXhlbERhdGEgPSBuZXcgYnl0ZVtTSVpFXTsKLQotCS8vIHRlc3QgMSBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JYnl0ZVtdIHZhbHVlcyA9IG5ldyBieXRlW117MHgxLCAweDEsIDB4MSwgMHgxLCAweDF9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YToiLCAoYnl0ZSkgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6YjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAyIGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDIsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQl2YWx1ZXMgPSBuZXcgYnl0ZVtdezB4MSwgMHgyLCAweDMsIDB4MiwgMHgxfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmM6IiwgKGJ5dGUpIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmQ6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgNCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCA0LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JdmFsdWVzID0gbmV3IGJ5dGVbXXsweDEsIDB4MiwgMHgzLCAweDQsIDB4Rn07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjplOiIsIChieXRlKSB2YWx1ZXNbaSArIE9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpmOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDggYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCXZhbHVlcyA9IG5ldyBieXRlW117MHgxLCAweDIsIDB4MywgMHhGLCAoYnl0ZSkweEZGfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmc6IiwgKGJ5dGUpIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmg6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQkKLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTipJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcHV0V2lkdGggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgKGJ5dGVbXSkgbnVsbCwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGl4ZWxzID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygtMSwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscyhJTUFHRV9ESU1FTlNJT04sIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgLTEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIC0xLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIDwgMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMzIsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMCwgMHhGRjAwLCAweEZGKSk7CQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZGVwdGgiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGRlcHRoIiwgU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRILCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UGl4ZWxzSUlJJElJKCkgewotCWludCB2YWx1ZTsKLQlmaW5hbCBpbnQgU0laRSA9IDIwOyAKLQlmaW5hbCBpbnQgT0ZGU0VUID0gMTsKLQlpbnRbXSBwaXhlbERhdGEgPSBuZXcgaW50W1NJWkVdOwotCi0JLy8gdGVzdCAxIGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQlpbnRbXSB2YWx1ZXMgPSBuZXcgaW50W117MHgxLCAweDEsIDB4MSwgMHgxLCAweDF9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YToiLCB2YWx1ZXNbaSArIE9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpiOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDIgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMiwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCXZhbHVlcyA9IG5ldyBpbnRbXXsweDEsIDB4MiwgMHgzLCAweDIsIDB4MX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpjOiIsIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmQ6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgNCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCA0LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JdmFsdWVzID0gbmV3IGludFtdezB4MSwgMHgyLCAweDMsIDB4NCwgMHhGfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmU6IiwgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCA4IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDgsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQl2YWx1ZXMgPSBuZXcgaW50W117MHgxLCAweDIsIDB4MywgMHhGLCAweEZGfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmc6IiwgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6aDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAxNiBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAxNiwgbmV3IFBhbGV0dGVEYXRhKDB4RjgwMCwgMHg3RTAsIDB4MUYpKTsKLQl2YWx1ZXMgPSBuZXcgaW50W117MCwgMHgyLCAweEYsIDB4RkYsIDB4RkZBQX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjppOiIsIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmo6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgMjQgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMjQsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMCwgMHhGRjAwLCAweEZGKSk7Ci0JdmFsdWVzID0gbmV3IGludFtdezAsIDB4RkYsIDB4RkZBQSwgMHhGRjAwQUF9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6azoiLCB2YWx1ZXNbaSArIE9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpsOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDMyIGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDMyLCBuZXcgUGFsZXR0ZURhdGEoMHhGRjAwMDAwMCwgMHhGRjAwLCAweEZGKSk7Ci0JdmFsdWVzID0gbmV3IGludFtdezAsIDB4RkYsIDB4RkZBQSwgMHhGRjAwQUEwMH07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjptOiIsIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOm46IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIGV4Y2VwdGlvbiBjYXNlcwotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OKklNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwdXRXaWR0aCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCAoaW50W10pIG51bGwsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBpeGVscyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcGl4ZWxzID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoLTEsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoSU1BR0VfRElNRU5TSU9OLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIC0xLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCAtMSwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwdXRXaWR0aCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwdXRXaWR0aCA8IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGFJJEIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Nsb25lIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBbHBoYUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBbHBoYXNJSUkkQkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBpeGVsSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBpeGVsc0lJSSRCSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGl4ZWxzSUlJJElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSR0JzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUcmFuc3BhcmVuY3lNYXNrIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUcmFuc3BhcmVuY3lUeXBlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9uZXdJSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhSSRCSSRCJEJJSUlJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zY2FsZWRUb0lJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRBbHBoYUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QWxwaGFzSUlJJEJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQaXhlbElJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UGl4ZWxzSUlJJEJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQaXhlbHNJSUkkSUkiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhIikpIHRlc3RfQ29uc3RydWN0b3JJSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGFJJEIiKSkgdGVzdF9Db25zdHJ1Y3RvcklJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGFJJEIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW0iKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xvbmUiKSkgdGVzdF9jbG9uZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxwaGFJSSIpKSB0ZXN0X2dldEFscGhhSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFscGhhc0lJSSRCSSIpKSB0ZXN0X2dldEFscGhhc0lJSSRCSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGl4ZWxJSSIpKSB0ZXN0X2dldFBpeGVsSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBpeGVsc0lJSSRCSSIpKSB0ZXN0X2dldFBpeGVsc0lJSSRCSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGl4ZWxzSUlJJElJIikpIHRlc3RfZ2V0UGl4ZWxzSUlJJElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSR0JzIikpIHRlc3RfZ2V0UkdCcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VHJhbnNwYXJlbmN5TWFzayIpKSB0ZXN0X2dldFRyYW5zcGFyZW5jeU1hc2soKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRyYW5zcGFyZW5jeVR5cGUiKSkgdGVzdF9nZXRUcmFuc3BhcmVuY3lUeXBlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9uZXdJSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhSSRCSSRCJEJJSUlJSUlJIikpIHRlc3RfaW50ZXJuYWxfbmV3SUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YUkkQkkkQiRCSUlJSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2NhbGVkVG9JSSIpKSB0ZXN0X3NjYWxlZFRvSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEFscGhhSUlJIikpIHRlc3Rfc2V0QWxwaGFJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEFscGhhc0lJSSRCSSIpKSB0ZXN0X3NldEFscGhhc0lJSSRCSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UGl4ZWxJSUkiKSkgdGVzdF9zZXRQaXhlbElJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UGl4ZWxzSUlJJEJJIikpIHRlc3Rfc2V0UGl4ZWxzSUlJJEJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRQaXhlbHNJSUkkSUkiKSkgdGVzdF9zZXRQaXhlbHNJSUkkSUkoKTsKLX0KLS8qIGN1c3RvbSAqLwotSW1hZ2VEYXRhIGltYWdlRGF0YTsKLWZpbmFsIGludCBJTUFHRV9ESU1FTlNJT04gPSAxMDsKLQotdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGJ5dGUgZXhwZWN0ZWRbXSwgYnl0ZSBhY3R1YWxbXSkgewotCWlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKQotCQlyZXR1cm47Ci0JYm9vbGVhbiBlcXVhbCA9IGZhbHNlOwotCWlmIChleHBlY3RlZCAhPSBudWxsICYmIGFjdHVhbCAhPSBudWxsICYmIGV4cGVjdGVkLmxlbmd0aCA9PSBhY3R1YWwubGVuZ3RoKSB7Ci0JCWlmIChleHBlY3RlZC5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkJZXF1YWwgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZXhwZWN0ZWRbaV0gIT0gYWN0dWFsW2ldKSB7Ci0JCQkJZXF1YWwgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoIWVxdWFsKSB7Ci0JCVN0cmluZyBmb3JtYXR0ZWQ9ICIiOwotCQlpZiAobWVzc2FnZSAhPSBudWxsKQotCQkJZm9ybWF0dGVkPSBtZXNzYWdlKyIgIjsKLQkJZmFpbChmb3JtYXR0ZWQrImV4cGVjdGVkOjwiK2V4cGVjdGVkKyI+IGJ1dCB3YXM6PCIrYWN0dWFsKyI+Iik7Ci0JfQotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNjE3ZjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZUxvYWRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEltYWdlTG9hZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIoKSB7Ci0JSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JSW1hZ2VMb2FkZXJMaXN0ZW5lciBsb2FkZXJMaXN0ZW5lciA9IG5ldyBJbWFnZUxvYWRlckxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBpbWFnZURhdGFMb2FkZWQoSW1hZ2VMb2FkZXJFdmVudCBlKSB7Ci0JCQlsb2FkZXJMaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX07Ci0JfTsKLQkKLQl0cnkgewotCQlsb2FkZXIuYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEZhbHNlKCI6YToiLCBsb2FkZXIuaGFzTGlzdGVuZXJzKCkpOwotCWxvYWRlci5hZGRJbWFnZUxvYWRlckxpc3RlbmVyKGxvYWRlckxpc3RlbmVyKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBsb2FkZXIuaGFzTGlzdGVuZXJzKCkpOwotCi0JbG9hZGVyTGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJpbnRlcmxhY2VkX3RhcmdldC5wbmciKTsJCi0JbG9hZGVyLmxvYWQoc3RyZWFtKTsKLQl0cnkgewotCQlzdHJlYW0uY2xvc2UoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCWFzc2VydFRydWUoIjpjOiIsIGxvYWRlckxpc3RlbmVyQ2FsbGVkKTsKLQotCWxvYWRlckxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0Jc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgidGFyZ2V0LnBuZyIpOwkKLQlsb2FkZXIubG9hZChzdHJlYW0pOwotCXRyeSB7Ci0JCXN0cmVhbS5jbG9zZSgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JYXNzZXJ0RmFsc2UoIjpkOiIsIGxvYWRlckxpc3RlbmVyQ2FsbGVkKTsKLQotCWxvYWRlckxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JbG9hZGVyLm5vdGlmeUxpc3RlbmVycyhuZXcgSW1hZ2VMb2FkZXJFdmVudChsb2FkZXIsIGxvYWRlci5kYXRhWzBdLCAwLCB0cnVlKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgbG9hZGVyTGlzdGVuZXJDYWxsZWQpOwotCi0JbG9hZGVyLnJlbW92ZUltYWdlTG9hZGVyTGlzdGVuZXIobG9hZGVyTGlzdGVuZXIpOwotCWFzc2VydEZhbHNlKCI6ZjoiLCBsb2FkZXIuaGFzTGlzdGVuZXJzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc0xpc3RlbmVycygpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9sb2FkTGphdmFfaW9fSW5wdXRTdHJlYW0oKSB7Ci0JSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQl0cnkgewotCQl0cnkgewotCQkJbG9hZGVyLmxvYWQoc3RyZWFtKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxvYWQgaW5wdXRTdHJlYW0gPT0gbnVsbCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCQotCQlzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJlbXB0eS50eHQiKTsKLQkJdHJ5IHsKLQkJCWxvYWRlci5sb2FkKHN0cmVhbSk7Ci0JCQl0cnkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxvYWQgZnJvbSBpbnZhbGlkIGlucHV0U3RyZWFtIik7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkKLQkJaW50IG51bUZvcm1hdHMgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHMubGVuZ3RoOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1swXTsKLQkJZm9yIChpbnQgaT0wOyBpPG51bUZvcm1hdHM7IGkrKykgewotCQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkJCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUgKyAiLiIgKyBmb3JtYXQpOwotCQkJbG9hZGVyLmxvYWQoc3RyZWFtKTsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xvYWRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQlTdHJpbmcgZmlsZW5hbWUgPSBudWxsOwotCXRyeSB7Ci0JCWxvYWRlci5sb2FkKGZpbGVuYW1lKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbG9hZCBmaWxlbmFtZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gajJzZSBhbmQgajJtZShjZGMpIGNhbiBsb2FkIGZyb20gYSBmaWxlbmFtZSBidXQsIGoybWUoY2xkYykgdGhyb3dzIGFuIGV4Y2VwdGlvbgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X25vdGlmeUxpc3RlbmVyc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCgpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJbWFnZUxvYWRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiBhZGRJbWFnZUxvYWRlckxpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NhdmVMamF2YV9pb19PdXRwdXRTdHJlYW1JKCkgewotCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBudWxsOwotCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQl0cnkgewotCQl0cnkgewotCQkJbG9hZGVyLnNhdmUob3V0U3RyZWFtLCAwKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNhdmUgb3V0cHV0U3RyZWFtID09IG51bGwiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQotCQlvdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXRyeSB7Ci0JCQlsb2FkZXIuc2F2ZShvdXRTdHJlYW0sIC0xKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNhdmUgdG8gaW52YWxpZCBvdXRwdXRTdHJlYW0gZm9ybWF0Iik7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJYm9vbGVhbiBqcGdTdXBwb3J0ZWQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaT0wOyBpPGltYWdlRm9ybWF0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGltYWdlRm9ybWF0c1tpXS5lcXVhbHMoImpwZyIpKSB7Ci0JCQkJanBnU3VwcG9ydGVkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoanBnU3VwcG9ydGVkKSB7Ci0JCQlTdHJpbmcgZmlsZW5hbWUgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1swXTsKLQkJCS8vIG11c3QgdXNlIGpwZyBzaW5jZSBzYXZlIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQgaW4gcG5nIGZvcm1hdAkJCi0JCQlTdHJpbmcgZmlsZXR5cGUgPSAianBnIjsKLQkJCWluU3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlbmFtZSArICIuIiArIGZpbGV0eXBlKTsJCi0JCQlsb2FkZXIubG9hZChpblN0cmVhbSk7Ci0JCQl0cnkgewotCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZUZvcm1hdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaW1hZ2VGb3JtYXRzW2ldLmVxdWFscyhmaWxldHlwZSkpIHsKLQkJCQkJLy8gc2F2ZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0Ci0JCQkJCWxvYWRlci5zYXZlKG91dFN0cmVhbSwgaSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZmluYWxseSB7Ci0JCXRyeSB7Ci0JCQlvdXRTdHJlYW0uY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zYXZlTGphdmFfbGFuZ19TdHJpbmdJKCkgewotCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCVN0cmluZyBmaWxlbmFtZSA9IG51bGw7Ci0JdHJ5IHsKLQkJbG9hZGVyLnNhdmUoZmlsZW5hbWUsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzYXZlIGZpbGVuYW1lID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyBqMnNlIGFuZCBqMm1lKGNkYykgY2FuIGxvYWQgZnJvbSBhIGZpbGVuYW1lIGJ1dCwgajJtZShjbGRjKSB0aHJvd3MgYW4gZXhjZXB0aW9uCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRJbWFnZUxvYWRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNMaXN0ZW5lcnMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xvYWRMamF2YV9pb19JbnB1dFN0cmVhbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbG9hZExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9ub3RpZnlMaXN0ZW5lcnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUltYWdlTG9hZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NhdmVMamF2YV9pb19PdXRwdXRTdHJlYW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zYXZlTGphdmFfbGFuZ19TdHJpbmdJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEltYWdlTG9hZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIiKSkgdGVzdF9hZGRJbWFnZUxvYWRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNMaXN0ZW5lcnMiKSkgdGVzdF9oYXNMaXN0ZW5lcnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xvYWRMamF2YV9pb19JbnB1dFN0cmVhbSIpKSB0ZXN0X2xvYWRMamF2YV9pb19JbnB1dFN0cmVhbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbG9hZExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfbG9hZExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9ub3RpZnlMaXN0ZW5lcnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQiKSkgdGVzdF9ub3RpZnlMaXN0ZW5lcnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUltYWdlTG9hZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVJbWFnZUxvYWRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zYXZlTGphdmFfaW9fT3V0cHV0U3RyZWFtSSIpKSB0ZXN0X3NhdmVMamF2YV9pb19PdXRwdXRTdHJlYW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zYXZlTGphdmFfbGFuZ19TdHJpbmdJIikpIHRlc3Rfc2F2ZUxqYXZhX2xhbmdfU3RyaW5nSSgpOwotfQotLyogY3VzdG9tICovCi1ib29sZWFuIGxvYWRlckxpc3RlbmVyQ2FsbGVkOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA5ODg0Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZUxvYWRlckV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXJFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJWigpIHsKLQl0cnkgewotCQluZXcgSW1hZ2VMb2FkZXJFdmVudChudWxsLCBudWxsLCAwLCB0cnVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VMb2FkZXIgc291cmNlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQluZXcgSW1hZ2VMb2FkZXJFdmVudChuZXcgSW1hZ2VMb2FkZXIoKSwgbnVsbCwgMCwgdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JSW1hZ2VMb2FkZXJFdmVudCBldmVudCA9IG5ldyBJbWFnZUxvYWRlckV2ZW50KG5ldyBJbWFnZUxvYWRlcigpLCBudWxsLCAwLCB0cnVlKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50LnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUoZXZlbnQudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSVoiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmQ2NWYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXJMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ltYWdlRGF0YUxvYWRlZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW1hZ2VEYXRhTG9hZGVkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ltYWdlRGF0YUxvYWRlZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbWFnZURhdGFMb2FkZWRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQiKSkgdGVzdF9pbWFnZURhdGFMb2FkZWRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiZGQ1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBhbGV0dGVEYXRhCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUGFsZXR0ZURhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IoKSB7Ci0JdHJ5IHsKLQkJbmV3IFBhbGV0dGVEYXRhKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZ2IgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlQYWxldHRlRGF0YSBkYXRhID0gbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7fSk7Ci0JYXNzZXJ0RmFsc2UoIjphOiIsIGRhdGEuaXNEaXJlY3QpOwotCi0JbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bnVsbCwgbnVsbH0pOwotCWFzc2VydEZhbHNlKCI6YjoiLCBkYXRhLmlzRGlyZWN0KTsKLQotCW5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KTsKLQlhc3NlcnRGYWxzZSgiOmM6IiwgZGF0YS5pc0RpcmVjdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSUkoKSB7Ci0JUGFsZXR0ZURhdGEgZGF0YSA9IG5ldyBQYWxldHRlRGF0YSgwLCAwLCAwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBkYXRhLmlzRGlyZWN0KTsKLQotCWRhdGEgPSBuZXcgUGFsZXR0ZURhdGEoLTEsIC0xLCAtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgZGF0YS5pc0RpcmVjdCk7Ci0KLQlkYXRhID0gbmV3IFBhbGV0dGVEYXRhKDB4ZmYwMDAwLCAweDAwZmYwMCwgMHgwMDAwZmYpOwotCWFzc2VydFRydWUoIjpjOiIsIGRhdGEuaXNEaXJlY3QpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBpeGVsTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IoKSB7Ci0JLy8gaW5kZXhlZCBwYWxldHRlIHRlc3RzCQotCVJHQltdIHJnYnMgPSB7bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KSwgbmV3IFJHQig1MCwgMTAwLCAxNTApfTsKLQlQYWxldHRlRGF0YSBkYXRhID0gbmV3IFBhbGV0dGVEYXRhKHJnYnMpOwotCQotCXRyeSB7Ci0JCWRhdGEuZ2V0UGl4ZWwobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4ZWQgcGFsZXR0ZSB3aXRoIHJnYiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQlkYXRhLmdldFBpeGVsKG5ldyBSR0IoMCwgMCwgMSkpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZ2Igbm90IGZvdW5kIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEVxdWFscygiOmE6Iiwgcmdicy5sZW5ndGgtMSwgZGF0YS5nZXRQaXhlbChyZ2JzW3JnYnMubGVuZ3RoLTFdKSk7Ci0JCi0JLy8gZGlyZWN0IHBhbGV0dGUgdGVzdHMJCi0JUkdCIHJnYiA9bmV3IFJHQigweDMyLCAweDY0LCAweDk2KTsKLQlkYXRhID0gbmV3IFBhbGV0dGVEYXRhKDB4ZmYwMDAwLCAweDAwZmYwMCwgMHgwMDAwZmYpOwotCQotCXRyeSB7Ci0JCWRhdGEuZ2V0UGl4ZWwobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpcmVjdCBwYWxldHRlIHdpdGggcmdiID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKCI6YjoiLCAweDMyNjQ5NiwgZGF0YS5nZXRQaXhlbChyZ2IpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSR0JJKCkgewotCS8vIGluZGV4ZWQgcGFsZXR0ZSB0ZXN0cwkKLQlSR0JbXSByZ2JzID0ge25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSksIG5ldyBSR0IoNTAsIDEwMCwgMTUwKX07Ci0JUGFsZXR0ZURhdGEgZGF0YSA9IG5ldyBQYWxldHRlRGF0YShyZ2JzKTsKLQotCXRyeSB7Ci0JCWRhdGEuZ2V0UkdCKHJnYnMubGVuZ3RoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igbm9uZXhpc3RlbnQgcGl4ZWwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKCI6YToiLCByZ2JzW3JnYnMubGVuZ3RoLTFdLCBkYXRhLmdldFJHQihyZ2JzLmxlbmd0aC0xKSk7Ci0KLQkvLyBkaXJlY3QgcGFsZXR0ZSB0ZXN0cwkKLQlSR0IgcmdiID1uZXcgUkdCKDB4MzIsIDB4NjQsIDB4OTYpOwotCWRhdGEgPSBuZXcgUGFsZXR0ZURhdGEoMHhmZjAwMDAsIDB4MDBmZjAwLCAweDAwMDBmZik7Ci0JCi0JYXNzZXJ0RXF1YWxzKCI6YjoiLCByZ2IsIGRhdGEuZ2V0UkdCKDB4MzI2NDk2KSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UkdCcygpIHsKLQkvLyBpbmRleGVkIHBhbGV0dGUgdGVzdHMJCi0JUkdCW10gcmdicyA9IHtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfTsKLQlQYWxldHRlRGF0YSBkYXRhID0gbmV3IFBhbGV0dGVEYXRhKHJnYnMpOwotCQotCWFzc2VydEVxdWFscygiOmE6IiwgcmdicywgZGF0YS5nZXRSR0JzKCkpOwotCQotCS8vIGRpcmVjdCBwYWxldHRlIHRlc3RzCQotCWRhdGEgPSBuZXcgUGFsZXR0ZURhdGEoMHhmZjAwMDAsIDB4MDBmZjAwLCAweDAwMDBmZik7Ci0JCi0JYXNzZXJ0TnVsbCgiOmI6IiwgZGF0YS5nZXRSR0JzKCkpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBpeGVsTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJHQkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJHQnMiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IiKSkgdGVzdF9Db25zdHJ1Y3RvciRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSUkiKSkgdGVzdF9Db25zdHJ1Y3RvcklJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGl4ZWxMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiIpKSB0ZXN0X2dldFBpeGVsTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJHQkkiKSkgdGVzdF9nZXRSR0JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSR0JzIikpIHRlc3RfZ2V0UkdCcygpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2EyMGM0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSSgpIHsKLQkvLyBUZXN0IG5ldyBQb2ludCAoaW50IHgsIGludCB5KQotCVBvaW50IHAgPSBuZXcgUG9pbnQoMywgNCk7Ci0JYXNzZXJ0RXF1YWxzKDMsIHAueCk7Ci0JYXNzZXJ0RXF1YWxzKDQsIHAueSk7Ci0KLQlwID0gbmV3IFBvaW50KC00LCAtMyk7Ci0JYXNzZXJ0RXF1YWxzKC00LCBwLngpOwotCWFzc2VydEVxdWFscygtMywgcC55KTsKLQotCXAgPSBuZXcgUG9pbnQoNTAwMDAwLCA3MDAwMDApOwotCWFzc2VydEVxdWFscyg1MDAwMDAsIHAueCk7Ci0JYXNzZXJ0RXF1YWxzKDcwMDAwMCwgcC55KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlQb2ludCBwMSA9IG5ldyBQb2ludCg1LCA1KTsKLQlQb2ludCBwMiA9IG5ldyBQb2ludCg1LCA1KTsKLQlhc3NlcnRUcnVlKCJQb2ludHMgc2hvdWxkIGJlIGVxdWFsIiwgcDEuZXF1YWxzKHAyKSk7Ci0KLQlwMSA9IG5ldyBQb2ludCgtNSwgLTUpOwotCXAyID0gbmV3IFBvaW50KC01LCAtNSk7Ci0JYXNzZXJ0VHJ1ZSgiUG9pbnRzIHNob3VsZCBiZSBlcXVhbCIsIHAxLmVxdWFscyhwMikpOwotCi0JcDIgPSBuZXcgUG9pbnQoMywgNCk7Ci0JYXNzZXJ0VHJ1ZSgiUG9pbnRzIHNob3VsZCBub3QgYmUgZXF1YWwiLCAhcDEuZXF1YWxzKHAyKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JUG9pbnQgcDEgPSBuZXcgUG9pbnQoNSwgNSk7Ci0JUG9pbnQgcDIgPSBuZXcgUG9pbnQoNSwgNSk7Ci0JYXNzZXJ0VHJ1ZSgiUG9pbnRzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGhhc2hDb2RlIiwgcDEuaGFzaENvZGUoKSA9PSBwMi5oYXNoQ29kZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlQb2ludCBwID0gbmV3IFBvaW50KDMsIDQpOwotCWFzc2VydE5vdE51bGwocC50b1N0cmluZygpKTsKLQlhc3NlcnRUcnVlKHAudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotCWFzc2VydEVxdWFscygiUG9pbnQgezMsIDR9IiwgcC50b1N0cmluZygpKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJIikpIHRlc3RfQ29uc3RydWN0b3JJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNmQ5MTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJSSgpIHsKLQkvLyBUZXN0IFJHQihpbnQgcmVkLCBpbnQgZ3JlZW4sIGludCBibHVlKQotCVJHQiByZ2IgPSBuZXcgUkdCKDIwLDEwMCwyMDApOwotCQotCXJnYiA9IG5ldyBSR0IoMCwwLDApOwotCi0JcmdiID0gbmV3IFJHQigyNTUsMjU1LDI1NSk7Ci0KLQl0cnkgewotCQlyZ2IgPSBuZXcgUkdCKC0xLCAyMCwgNTApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZWQgPCAwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQlyZ2IgPSBuZXcgUkdCKDI1NiwgMjAsIDUwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVkID4gMjU1Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQlyZ2IgPSBuZXcgUkdCKDIwLCAtMSwgNTApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBncmVlbiA8IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXJnYiA9IG5ldyBSR0IoMjAsIDI1NiwgNTApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBncmVlbiA+IDI1NSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQlyZ2IgPSBuZXcgUkdCKDIwLCA1MCwgLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBibHVlIDwgMCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJcmdiID0gbmV3IFJHQigyMCwgNTAsIDI1Nik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGJsdWUgPiAyNTUiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JGRkYoKSB7Ci0KLQlSR0IgcmdiID0gbmV3IFJHQigwZiwwZiwwZik7Ci0JcmdiID0gbmV3IFJHQigwZiwxZiwxZik7Ci0JcmdiID0gbmV3IFJHQigwZiwxZiwwZik7Ci0JcmdiID0gbmV3IFJHQigwZiwwZiwxZik7Ci0JcmdiID0gbmV3IFJHQigwZiwwLjZmLDAuNGYpOwotCXJnYiA9IG5ldyBSR0IoMWYsMGYsMWYpOwotCXJnYiA9IG5ldyBSR0IoMWYsMWYsMWYpOwotCXJnYiA9IG5ldyBSR0IoMWYsMGYsMWYpOwotCXJnYiA9IG5ldyBSR0IoMWYsMWYsMGYpOwotCXJnYiA9IG5ldyBSR0IoMWYsMC42ZiwwLjRmKTsKLQlyZ2IgPSBuZXcgUkdCKDU5ZiwwZiwxZik7Ci0JcmdiID0gbmV3IFJHQig1OWYsMWYsMWYpOwotCXJnYiA9IG5ldyBSR0IoNTlmLDBmLDFmKTsKLQlyZ2IgPSBuZXcgUkdCKDU5ZiwxZiwwZik7Ci0JcmdiID0gbmV3IFJHQig1OWYsMC42ZiwwLjRmKTsKLQlyZ2IgPSBuZXcgUkdCKDYwZiwwZiwxZik7Ci0JcmdiID0gbmV3IFJHQig2MGYsMWYsMWYpOwotCXJnYiA9IG5ldyBSR0IoNjBmLDBmLDFmKTsKLQlyZ2IgPSBuZXcgUkdCKDYwZiwxZiwwZik7Ci0JcmdiID0gbmV3IFJHQig2MGYsMC42ZiwwLjRmKTsKLQlyZ2IgPSBuZXcgUkdCKDYxZiwwZiwxZik7Ci0JcmdiID0gbmV3IFJHQig2MWYsMWYsMWYpOwotCXJnYiA9IG5ldyBSR0IoNjFmLDBmLDFmKTsKLQlyZ2IgPSBuZXcgUkdCKDYxZiwxZiwwZik7Ci0JcmdiID0gbmV3IFJHQig2MWYsMC42ZiwwLjRmKTsKLQlyZ2IgPSBuZXcgUkdCKDExOWYsMGYsMWYpOwotCXJnYiA9IG5ldyBSR0IoMTE5ZiwxZiwxZik7Ci0JcmdiID0gbmV3IFJHQigxMTlmLDBmLDFmKTsKLQlyZ2IgPSBuZXcgUkdCKDExOWYsMWYsMGYpOwotCXJnYiA9IG5ldyBSR0IoMTE5ZiwwLjZmLDAuNGYpOwotCXJnYiA9IG5ldyBSR0IoMTIwZiwwZiwxZik7Ci0JcmdiID0gbmV3IFJHQigxMjBmLDFmLDFmKTsKLQlyZ2IgPSBuZXcgUkdCKDEyMGYsMGYsMWYpOwotCXJnYiA9IG5ldyBSR0IoMTIwZiwxZiwwZik7Ci0JcmdiID0gbmV3IFJHQigxMjBmLDAuNmYsMC40Zik7Ci0JcmdiID0gbmV3IFJHQigxMjFmLDBmLDFmKTsKLQlyZ2IgPSBuZXcgUkdCKDEyMWYsMWYsMWYpOwotCXJnYiA9IG5ldyBSR0IoMTIxZiwwZiwxZik7Ci0JcmdiID0gbmV3IFJHQigxMjFmLDFmLDBmKTsKLQlyZ2IgPSBuZXcgUkdCKDEyMWYsMC42ZiwwLjRmKTsKLQlyZ2IgPSBuZXcgUkdCKDE3OWYsMGYsMWYpOwotCXJnYiA9IG5ldyBSR0IoMTc5ZiwxZiwxZik7Ci0JcmdiID0gbmV3IFJHQigxNzlmLDBmLDFmKTsKLQlyZ2IgPSBuZXcgUkdCKDE3OWYsMWYsMGYpOwotCXJnYiA9IG5ldyBSR0IoMTc5ZiwwLjZmLDAuNGYpOwotCXJnYiA9IG5ldyBSR0IoMTgwZiwwZiwxZik7Ci0JcmdiID0gbmV3IFJHQigxODBmLDFmLDFmKTsKLQlyZ2IgPSBuZXcgUkdCKDE4MGYsMGYsMWYpOwotCXJnYiA9IG5ldyBSR0IoMTgwZiwxZiwwZik7Ci0JcmdiID0gbmV3IFJHQigxODBmLDAuNmYsMC40Zik7Ci0JcmdiID0gbmV3IFJHQigxODFmLDBmLDFmKTsKLQlyZ2IgPSBuZXcgUkdCKDE4MWYsMWYsMWYpOwotCXJnYiA9IG5ldyBSR0IoMTgxZiwwZiwxZik7Ci0JcmdiID0gbmV3IFJHQigxODFmLDFmLDBmKTsKLQlyZ2IgPSBuZXcgUkdCKDE4MWYsMC42ZiwwLjRmKTsKLQlyZ2IgPSBuZXcgUkdCKDIzOWYsMGYsMWYpOwotCXJnYiA9IG5ldyBSR0IoMjM5ZiwxZiwxZik7Ci0JcmdiID0gbmV3IFJHQigyMzlmLDBmLDFmKTsKLQlyZ2IgPSBuZXcgUkdCKDIzOWYsMWYsMGYpOwotCXJnYiA9IG5ldyBSR0IoMjM5ZiwwLjZmLDAuNGYpOwotCXJnYiA9IG5ldyBSR0IoMjQwZiwwZiwxZik7Ci0JcmdiID0gbmV3IFJHQigyNDBmLDFmLDFmKTsKLQlyZ2IgPSBuZXcgUkdCKDI0MGYsMGYsMWYpOwotCXJnYiA9IG5ldyBSR0IoMjQwZiwxZiwwZik7Ci0JcmdiID0gbmV3IFJHQigyNDBmLDAuNmYsMC40Zik7Ci0JcmdiID0gbmV3IFJHQigyNDFmLDBmLDFmKTsKLQlyZ2IgPSBuZXcgUkdCKDI0MWYsMWYsMWYpOwotCXJnYiA9IG5ldyBSR0IoMjQxZiwwZiwxZik7Ci0JcmdiID0gbmV3IFJHQigyNDFmLDFmLDBmKTsKLQlyZ2IgPSBuZXcgUkdCKDI0MWYsMC42ZiwwLjRmKTsKLQlyZ2IgPSBuZXcgUkdCKDI5OWYsMGYsMWYpOwotCXJnYiA9IG5ldyBSR0IoMjk5ZiwxZiwxZik7Ci0JcmdiID0gbmV3IFJHQigyOTlmLDBmLDFmKTsKLQlyZ2IgPSBuZXcgUkdCKDI5OWYsMWYsMGYpOwotCXJnYiA9IG5ldyBSR0IoMjk5ZiwwLjZmLDAuNGYpOwotCXJnYiA9IG5ldyBSR0IoMzAwZiwwZiwxZik7Ci0JcmdiID0gbmV3IFJHQigzMDBmLDFmLDFmKTsKLQlyZ2IgPSBuZXcgUkdCKDMwMGYsMGYsMWYpOwotCXJnYiA9IG5ldyBSR0IoMzAwZiwxZiwwZik7Ci0JcmdiID0gbmV3IFJHQigzMDBmLDAuNmYsMC40Zik7Ci0JcmdiID0gbmV3IFJHQigzMDFmLDBmLDFmKTsKLQlyZ2IgPSBuZXcgUkdCKDMwMWYsMWYsMWYpOwotCXJnYiA9IG5ldyBSR0IoMzAxZiwwZiwxZik7Ci0JcmdiID0gbmV3IFJHQigzMDFmLDFmLDBmKTsKLQlyZ2IgPSBuZXcgUkdCKDMwMWYsMC42ZiwwLjRmKTsKLQlyZ2IgPSBuZXcgUkdCKDM1OWYsMGYsMWYpOwotCXJnYiA9IG5ldyBSR0IoMzU5ZiwxZiwxZik7Ci0JcmdiID0gbmV3IFJHQigzNTlmLDBmLDFmKTsKLQlyZ2IgPSBuZXcgUkdCKDM1OWYsMWYsMGYpOwotCXJnYiA9IG5ldyBSR0IoMzU5ZiwwLjZmLDAuNGYpOwotCXJnYiA9IG5ldyBSR0IoMzYwZiwwZiwxZik7Ci0JcmdiID0gbmV3IFJHQigzNjBmLDFmLDFmKTsKLQlyZ2IgPSBuZXcgUkdCKDM2MGYsMGYsMWYpOwotCXJnYiA9IG5ldyBSR0IoMzYwZiwxZiwwZik7Ci0JcmdiID0gbmV3IFJHQigzNjBmLDAuNmYsMC40Zik7Ci0JCi0JdHJ5IHsKLQkJcmdiID0gbmV3IFJHQig0MDBmLCAwLjVmLCAwLjVmKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaHVlID4gMzYwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQlyZ2IgPSBuZXcgUkdCKC01ZiwgMC41ZiwgMC41Zik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGh1ZSA8IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXJnYiA9IG5ldyBSR0IoMjAwZiwgLTAuNWYsIDAuNWYpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzYXR1cmF0aW9uIDwgMCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJcmdiID0gbmV3IFJHQigyMDBmLCAzMDBmLCAwLjVmKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2F0dXJhdGlvbiA+IDEiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXJnYiA9IG5ldyBSR0IoMjAwZiwgMC41ZiwgLTAuNWYpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBicmlnaHRuZXNzIDwgMCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJcmdiID0gbmV3IFJHQigyMDBmLCAwLjVmLCA0MDBmKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYnJpZ2h0bmVzcyA+IDEiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCWludCByID0gMCwgZyA9IDEyNywgYiA9IDI1NDsKLQlSR0IgcmdiMSA9IG5ldyBSR0IociwgZywgYik7Ci0JUkdCIHJnYjI7Ci0JCi0JcmdiMiA9IHJnYjE7Ci0JaWYgKCFyZ2IxLmVxdWFscyhyZ2IyKSkgewotCQlmYWlsKCJUd28gcmVmZXJlbmNlcyB0byB0aGUgc2FtZSBSR0IgaW5zdGFuY2Ugbm90IGZvdW5kIGVxdWFsIik7Ci0JfQotCQotCXJnYjIgPSBuZXcgUkdCKHIsIGcsIGIpOwotCWlmICghcmdiMS5lcXVhbHMocmdiMikpIHsKLQkJZmFpbCgiUmVmZXJlbmNlcyB0byB0d28gZGlmZmVyZW50IFJHQiBpbnN0YW5jZXMgd2l0aCBzYW1lIFIgRyBCIHBhcmFtZXRlcnMgbm90IGZvdW5kIGVxdWFsIik7Ci0JfQotCQotCWlmIChyZ2IxLmVxdWFscyhuZXcgUkdCKHIrMSwgZywgYikpIHx8Ci0JICAgIHJnYjEuZXF1YWxzKG5ldyBSR0IociwgZysxLCBiKSkgfHwKLQkgICAgcmdiMS5lcXVhbHMobmV3IFJHQihyLCBnLCBiKzEpKSB8fAotCSAgICByZ2IxLmVxdWFscyhuZXcgUkdCKHIrMSwgZysxLCBiKzEpKSkgewotCQlmYWlsKCJDb21wYXJpbmcgdHdvIFJHQiBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29tYmluYXRpb24gb2YgUiBHIEIgcGFyYW1ldGVycyBmb3VuZCBlcXVhbCIpOyAgICAJCi0JfQotCi0JZmxvYXQgaHVlID0gMjIwZiwgc2F0ID0gMC42ZiwgYnJpZ2h0ID0gMC43ZjsKLQlyZ2IxID0gbmV3IFJHQihodWUsIHNhdCwgYnJpZ2h0KTsKLQlyZ2IyID0gcmdiMTsKLQlpZiAoIXJnYjEuZXF1YWxzKHJnYjIpKSB7Ci0JCWZhaWwoIlR3byByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIFJHQiBpbnN0YW5jZSBub3QgZm91bmQgZXF1YWwiKTsKLQl9Ci0JCi0JcmdiMiA9IG5ldyBSR0IoaHVlLCBzYXQsIGJyaWdodCk7Ci0JaWYgKCFyZ2IxLmVxdWFscyhyZ2IyKSkgewotCQlmYWlsKCJSZWZlcmVuY2VzIHRvIHR3byBkaWZmZXJlbnQgUkdCIGluc3RhbmNlcyB3aXRoIHNhbWUgSCBTIEIgcGFyYW1ldGVycyBub3QgZm91bmQgZXF1YWwiKTsKLQl9Ci0JCi0JaWYgKHJnYjEuZXF1YWxzKG5ldyBSR0IoaHVlKzEsIHNhdCwgYnJpZ2h0KSkgfHwKLQkgICAgcmdiMS5lcXVhbHMobmV3IFJHQihodWUsIHNhdCswLjFmLCBicmlnaHQpKSB8fAotCSAgICByZ2IxLmVxdWFscyhuZXcgUkdCKGh1ZSwgc2F0LCBicmlnaHQrMC4xZikpIHx8Ci0JICAgIHJnYjEuZXF1YWxzKG5ldyBSR0IoaHVlKzEsIHNhdCswLjFmLCBicmlnaHQrMC4xZikpKSB7Ci0JCWZhaWwoIkNvbXBhcmluZyB0d28gUkdCIGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb21iaW5hdGlvbiBvZiBIIFMgQiBwYXJhbWV0ZXJzIGZvdW5kIGVxdWFsIik7ICAgIAkKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2dldEhTQigpIHsKLQlmbG9hdFtdIGhzYiA9IG5ldyBmbG9hdFtdIHsKLQkJCQkwZiwwZiwwZiwKLQkJCQkwZiwxZiwxZiwKLQkJCQkwZiwxZiwwZiwKLQkJCQkwZiwwZiwxZiwKLQkJCQkwZiwwLjZmLDAuNGYsCi0JCQkJMWYsMGYsMWYsCi0JCQkJMWYsMWYsMWYsCi0JCQkJMWYsMGYsMWYsCi0JCQkJMWYsMWYsMGYsCi0JCQkJMWYsMC42ZiwwLjRmLAotCQkJCTU5ZiwwZiwxZiwKLQkJCQk1OWYsMWYsMWYsCi0JCQkJNTlmLDBmLDFmLAotCQkJCTU5ZiwxZiwwZiwKLQkJCQk1OWYsMC42ZiwwLjRmLAotCQkJCTYwZiwwZiwxZiwKLQkJCQk2MGYsMWYsMWYsCi0JCQkJNjBmLDBmLDFmLAotCQkJCTYwZiwxZiwwZiwKLQkJCQk2MGYsMC42ZiwwLjRmLAotCQkJCTYxZiwwZiwxZiwKLQkJCQk2MWYsMWYsMWYsCi0JCQkJNjFmLDBmLDFmLAotCQkJCTYxZiwxZiwwZiwKLQkJCQk2MWYsMC42ZiwwLjRmLAotCQkJCTExOWYsMGYsMWYsCi0JCQkJMTE5ZiwxZiwxZiwKLQkJCQkxMTlmLDBmLDFmLAotCQkJCTExOWYsMWYsMGYsCi0JCQkJMTE5ZiwwLjZmLDAuNGYsCi0JCQkJMTIwZiwwZiwxZiwKLQkJCQkxMjBmLDFmLDFmLAotCQkJCTEyMGYsMGYsMWYsCi0JCQkJMTIwZiwxZiwwZiwKLQkJCQkxMjBmLDAuNmYsMC40ZiwKLQkJCQkxMjFmLDBmLDFmLAotCQkJCTEyMWYsMWYsMWYsCi0JCQkJMTIxZiwwZiwxZiwKLQkJCQkxMjFmLDFmLDBmLAotCQkJCTEyMWYsMC42ZiwwLjRmLAotCQkJCTE3OWYsMGYsMWYsCi0JCQkJMTc5ZiwxZiwxZiwKLQkJCQkxNzlmLDBmLDFmLAotCQkJCTE3OWYsMWYsMGYsCi0JCQkJMTc5ZiwwLjZmLDAuNGYsCi0JCQkJMTgwZiwwZiwxZiwKLQkJCQkxODBmLDFmLDFmLAotCQkJCTE4MGYsMGYsMWYsCi0JCQkJMTgwZiwxZiwwZiwKLQkJCQkxODBmLDAuNmYsMC40ZiwKLQkJCQkxODFmLDBmLDFmLAotCQkJCTE4MWYsMWYsMWYsCi0JCQkJMTgxZiwwZiwxZiwKLQkJCQkxODFmLDFmLDBmLAotCQkJCTE4MWYsMC42ZiwwLjRmLAotCQkJCTIzOWYsMGYsMWYsCi0JCQkJMjM5ZiwxZiwxZiwKLQkJCQkyMzlmLDBmLDFmLAotCQkJCTIzOWYsMWYsMGYsCi0JCQkJMjM5ZiwwLjZmLDAuNGYsCi0JCQkJMjQwZiwwZiwxZiwKLQkJCQkyNDBmLDFmLDFmLAotCQkJCTI0MGYsMGYsMWYsCi0JCQkJMjQwZiwxZiwwZiwKLQkJCQkyNDBmLDAuNmYsMC40ZiwKLQkJCQkyNDFmLDBmLDFmLAotCQkJCTI0MWYsMWYsMWYsCi0JCQkJMjQxZiwwZiwxZiwKLQkJCQkyNDFmLDFmLDBmLAotCQkJCTI0MWYsMC42ZiwwLjRmLAotCQkJCTI5OWYsMGYsMWYsCi0JCQkJMjk5ZiwxZiwxZiwKLQkJCQkyOTlmLDBmLDFmLAotCQkJCTI5OWYsMWYsMGYsCi0JCQkJMjk5ZiwwLjZmLDAuNGYsCi0JCQkJMzAwZiwwZiwxZiwKLQkJCQkzMDBmLDFmLDFmLAotCQkJCTMwMGYsMGYsMWYsCi0JCQkJMzAwZiwxZiwwZiwKLQkJCQkzMDBmLDAuNmYsMC40ZiwKLQkJCQkzMDFmLDBmLDFmLAotCQkJCTMwMWYsMWYsMWYsCi0JCQkJMzAxZiwwZiwxZiwKLQkJCQkzMDFmLDFmLDBmLAotCQkJCTMwMWYsMC42ZiwwLjRmLAotCQkJCTM1OWYsMGYsMWYsCi0JCQkJMzU5ZiwxZiwxZiwKLQkJCQkzNTlmLDBmLDFmLAotCQkJCTM1OWYsMWYsMGYsCi0JCQkJMzU5ZiwwLjZmLDAuNGYsCi0JCQkJMzYwZiwwZiwxZiwKLQkJCQkzNjBmLDFmLDFmLAotCQkJCTM2MGYsMGYsMWYsCi0JCQkJMzYwZiwxZiwwZiwKLQkJCQkzNjBmLDAuNmYsMC40ZiwKLQkJCQkyMjBmLDAuNmYsMC43Zn07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBoc2IubGVuZ3RoOyBpKz0zKSB7Ci0JCVJHQiByZ2IxID0gbmV3IFJHQihoc2JbaV0sIGhzYltpKzFdLCBoc2JbaSsyXSk7Ci0JCWZsb2F0W10gaHNiMiA9IHJnYjEuZ2V0SFNCKCk7Ci0JCVJHQiByZ2IyID0gbmV3IFJHQihoc2IyWzBdLCBoc2IyWzFdLCBoc2IyWzJdKTsKLQkJaWYgKCFyZ2IxLmVxdWFscyhyZ2IyKSkgewotCQkJZmFpbCgiVHdvIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgUkdCIHVzaW5nIGdldEhTQigpIGZ1bmN0aW9uIG5vdCBmb3VuZCBlcXVhbCIpOwotCQl9Ci0JfQotfQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlpbnQgciA9IDI1NSwgZyA9IDEwMCwgYiA9IDA7Ci0JUkdCIHJnYjEgPSBuZXcgUkdCKHIsIGcsIGIpOwotCVJHQiByZ2IyID0gbmV3IFJHQihyLCBnLCBiKTsKLQkKLQlpbnQgaGFzaDEgPSByZ2IxLmhhc2hDb2RlKCk7Ci0JaW50IGhhc2gyID0gcmdiMi5oYXNoQ29kZSgpOwotCQotCWlmIChoYXNoMSAhPSBoYXNoMikgewotCQlmYWlsKCJUd28gUkdCIGluc3RhbmNlcyB3aXRoIHNhbWUgUiBHIEIgcGFyYW1ldGVycyByZXR1cm5lZCBkaWZmZXJlbnQgaGFzaCBjb2RlcyIpOwotCX0KLQkKLQlpZiAocmdiMS5oYXNoQ29kZSgpID09IG5ldyBSR0IoZywgYiwgcikuaGFzaENvZGUoKSB8fAotCQlyZ2IxLmhhc2hDb2RlKCkgPT0gbmV3IFJHQihiLCByLCBnKS5oYXNoQ29kZSgpKSB7Ci0JCWZhaWwoIlR3byBSR0IgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IFIgRyBCIHBhcmFtZXRlcnMgcmV0dXJuZWQgdGhlIHNhbWUgaGFzaCBjb2RlIik7Ci0JfQotfQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlSR0IgcmdiID0gbmV3IFJHQigwLCAxMDAsIDIwMCk7Ci0KLQlTdHJpbmcgcyA9IHJnYi50b1N0cmluZygpOwotCQotCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7Ci0JCWZhaWwoIlJHQi50b1N0cmluZyByZXR1cm5zIGEgbnVsbCBvciBlbXB0eSBTdHJpbmciKTsKLQl9Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yRkZGIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SFNCIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSUkiKSkgdGVzdF9Db25zdHJ1Y3RvcklJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JGRkYiKSkgdGVzdF9Db25zdHJ1Y3RvckZGRigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SFNCIikpIHRlc3RfZ2V0SFNCKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJhNGVlMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSUlJKCkgewotCS8vIFRlc3QgbmV3IFJlY3RhbmdsZSAoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0JUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKDMsIDQsIDUsIDYpOwotCWFzc2VydEVxdWFscygzLCByLngpOwotCWFzc2VydEVxdWFscyg0LCByLnkpOwotCWFzc2VydEVxdWFscyg1LCByLndpZHRoKTsKLQlhc3NlcnRFcXVhbHMoNiwgci5oZWlnaHQpOwotCi0JciA9IG5ldyBSZWN0YW5nbGUoLTQsIC0zLCAtMiwgLTEpOwotCWFzc2VydEVxdWFscygtNCwgci54KTsKLQlhc3NlcnRFcXVhbHMoLTMsIHIueSk7Ci0JYXNzZXJ0RXF1YWxzKC0yLCByLndpZHRoKTsKLQlhc3NlcnRFcXVhbHMoLTEsIHIuaGVpZ2h0KTsKLQotCXIgPSBuZXcgUmVjdGFuZ2xlKDUwMDAwMCwgNzAwMDAwLCAyMDAwMDAsIDEwMDAwMCk7Ci0JYXNzZXJ0RXF1YWxzKDUwMDAwMCwgci54KTsKLQlhc3NlcnRFcXVhbHMoNzAwMDAwLCByLnkpOwotCWFzc2VydEVxdWFscygyMDAwMDAsIHIud2lkdGgpOwotCWFzc2VydEVxdWFscygxMDAwMDAsIHIuaGVpZ2h0KTsKLX0KLQotLyoqCi0gKiBEZXN0cnVjdGl2ZWx5IHJlcGxhY2VzIHRoZSB4LCB5LCB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcwotICogaW4gdGhlIHJlY2VpdmVyIHdpdGggb25lcyB3aGljaCByZXByZXNlbnQgdGhlIHVuaW9uIG9mIHRoZQotICogcmVjdGFuZ2xlcyBzcGVjaWZpZWQgYnkgdGhlIHJlY2VpdmVyIGFuZCB0aGUgZ2l2ZW4gcmVjdGFuZ2xlLgotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGFyZ3VtZW50IGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgdGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQlSZWN0YW5nbGUgcjEgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCVJlY3RhbmdsZSByMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgMiwgMik7Ci0JcjEuYWRkKHIyKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSBhZGQgaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgxLCAyLCA0LCA0KSwgcjEpOwotCi0JcjEuYWRkKHIyKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSBhZGQgaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgxLCAyLCA0LCA0KSwgcjEpOwotCQotCXIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgMCwgMCk7Ci0JcjEuYWRkKHIyKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSBhZGQgaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KSwgcjEpOwotCi0JcjEgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCXIyID0gbmV3IFJlY3RhbmdsZSg2LCA2LCAwLCAwKTsKLQlyMS5hZGQocjIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGFkZCBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDEsIDIsIDUsIDQpLCByMSk7Ci0KLQl0cnkgewotCQlyMS5hZGQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi0vKioKLSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBvaW50IHNwZWNpZmllZCBieSB0aGUKLSAqIGFyZ3VtZW50cyBpcyBpbnNpZGUgdGhlIGFyZWEgc3BlY2lmaWVkIGJ5IHRoZSByZWNlaXZlci4KLSAqLwotcHVibGljIHZvaWQgdGVzdF9jb250YWluc0lJKCkgewotCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gcG9pbnQgKDEsIDIpIiwgci5jb250YWlucygxLCAyKSk7Ci0KLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gcG9pbnQgKDMsIDQpIiwgci5jb250YWlucygzLCA0KSk7Ci0KLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gcG9pbnQgKDMsIDUpIiwgci5jb250YWlucygzLCA1KSk7Ci0KLS8vCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoMywgNikiLCByLmNvbnRhaW5zKDMsIDYpKTsKLS8vCi0vLwlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gcG9pbnQgKDQsIDUpIiwgci5jb250YWlucyg0LCA1KSk7Ci0vLwotLy8JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBjb250YWluIHBvaW50ICg0LCA2KSIsIHIuY29udGFpbnMoNCwgNikpOwotCi0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBub3QgY29udGFpbiBwb2ludCAoOSwgMTApIiwgIXIuY29udGFpbnMoOSwgMTApKTsKLQotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgbm90IGNvbnRhaW4gcG9pbnQgKC0xLCAtMSkiLCAhci5jb250YWlucygtMSwgLTEpKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBwb2ludCBpcyBpbnNpZGUgdGhlCi0gKiBhcmVhIHNwZWNpZmllZCBieSB0aGUgcmVjZWl2ZXIuCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgYXJndW1lbnQgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBjb250YWluIFBvaW50KDEsIDIpIiwgci5jb250YWlucyhuZXcgUG9pbnQoMSwgMikpKTsKLQotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBQb2ludCgzLCA0KSIsIHIuY29udGFpbnMobmV3IFBvaW50KDMsIDQpKSk7Ci0KLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gcG9pbnQgKDMsIDUpIiwgci5jb250YWlucyhuZXcgUG9pbnQoMywgNSkpKTsKLQotLy8JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBjb250YWluIHBvaW50ICgzLCA2KSIsIHIuY29udGFpbnMobmV3IFBvaW50KDMsIDYpKSk7Ci0vLwotLy8JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBjb250YWluIHBvaW50ICg0LCA1KSIsIHIuY29udGFpbnMobmV3IFBvaW50KDQsIDUpKSk7Ci0vLwotLy8JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBjb250YWluIFBvaW50KDQsIDYpIiwgci5jb250YWlucyhuZXcgUG9pbnQoNCwgNikpKTsKLQotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgbm90IGNvbnRhaW4gUG9pbnQoOSwgMTApIiwgIXIuY29udGFpbnMobmV3IFBvaW50KDksIDEwKSkpOwotCi0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBub3QgY29udGFpbiBwb2ludCAoLTEsIC0xKSIsICFyLmNvbnRhaW5zKG5ldyBQb2ludCgtMSwgLTEpKSk7Ci0KLQl0cnkgewotCQlyLmNvbnRhaW5zKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlSZWN0YW5nbGUgcjEgPSBuZXcgUmVjdGFuZ2xlKDUsIDQsIDMsIDIpOwotCVJlY3RhbmdsZSByMiA9IG5ldyBSZWN0YW5nbGUoNSwgNCwgMywgMik7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlcyBzaG91bGQgYmUgZXF1YWwiLCByMS5lcXVhbHMocjIpKTsKLQotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCA0LCA1LCA2KTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGVzIHNob3VsZCBub3QgYmUgZXF1YWwiLCAhcjEuZXF1YWxzKHIyKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMiwgMywgNCwgNSk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlcyBzaG91bGQgbm90IGJlIGVxdWFsIiwgIXIxLmVxdWFscyhyMikpOwotCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDUsIDQsIDIsIDMpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZXMgc2hvdWxkIG5vdCBiZSBlcXVhbCIsICFyMS5lcXVhbHMocjIpKTsKLQotCXIyID0gbmV3IFJlY3RhbmdsZSg0LCA1LCAzLCAyKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGVzIHNob3VsZCBub3QgYmUgZXF1YWwiLCAhcjEuZXF1YWxzKHIyKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSg1LCA0LCAzLCAyKTsKLQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKDUsIDQsIDMsIDIpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgaGFzaENvZGUiLCByMS5oYXNoQ29kZSgpID09IHIyLmhhc2hDb2RlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JUmVjdGFuZ2xlIHIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAyLCAyKTsKLQkKLQlyMS5pbnRlcnNlY3QocjIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGludGVyc2VjdCBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDMsIDMsIDEsIDIpLCByMSk7Ci0KLQlyMSA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDAsIDApOwotCXIxLmludGVyc2VjdChyMik7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgaW50ZXJzZWN0IGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMywgMywgMCwgMCksIHIxKTsKLQotCXIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgLTEsIC0xKTsKLQlyMS5pbnRlcnNlY3QocjIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGludGVyc2VjdCBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCByMSk7Ci0KLQl0cnkgewotCQlyMS5pbnRlcnNlY3QobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVyc2VjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JUmVjdGFuZ2xlIHIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAyLCAyKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSBpbnRlcnNlY3Rpb24gaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgzLCAzLCAxLCAyKSwgcjEuaW50ZXJzZWN0aW9uKHIyKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgaW50ZXJzZWN0aW9uIGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMywgMywgMCwgMCksIHIxLmludGVyc2VjdGlvbihyMikpOwotCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIC0xLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgaW50ZXJzZWN0aW9uIGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHIxLmludGVyc2VjdGlvbihyMikpOwotCi0JdHJ5IHsKLQkJcjEuaW50ZXJzZWN0aW9uKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcnNlY3RzSUlJSSgpIHsKLQlSZWN0YW5nbGUgcjEgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCVJlY3RhbmdsZSByMiA9IG5ldyBSZWN0YW5nbGUoMiwgMywgNywgOCk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIHNob3VsZCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDIsIDMsIDcsIDgpIiwgcjEuaW50ZXJzZWN0cygyLCAzLCA3LCA4KSk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDIsIDMsIDcsIDgpIHNob3VsZCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIiwgcjIuaW50ZXJzZWN0cygxLCAyLCAzLCA0KSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMjAwLCAzMDAsIDQwMCwgNTAwKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMSwgMiwgMywgNCkgc2hvdWxkIG5vdCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDIwMCwgMzAwLCA0MDAsIDUwMCkiLCAhcjEuaW50ZXJzZWN0cygyMDAsIDMwMCwgNDAwLCA1MDApKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMjAwLCAzMDAsIDQwMCwgNTAwKSBzaG91bGQgbm90IGludGVyc2VjdCBSZWN0YW5nbGUoMSwgMiwgMywgNCkiLCAhcjIuaW50ZXJzZWN0cygxLCAyLCAzLCA0KSk7Ci0JCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDAsIDApOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgxLCAyLCAzLCA0KSBzaG91bGQgaW50ZXJzZWN0IFJlY3RhbmdsZSgzLCAzLCAwLCAwKSIsIHIxLmludGVyc2VjdHMoMywgMywgMCwgMCkpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgzLCAzLCAwLCAwKSBzaG91bGQgaW50ZXJzZWN0IFJlY3RhbmdsZSgxLCAyLCAzLCA0KSIsIHIyLmludGVyc2VjdHMoMSwgMiwgMywgNCkpOwotCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIC0xLCAtMSk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIHNob3VsZCBub3QgaW50ZXJzZWN0IFJlY3RhbmdsZSgzLCAzLCAtMSwgLTEpIiwgIXIxLmludGVyc2VjdHMoMywgMywgLTEsIC0xKSk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDMsIDMsIC0xLCAtMSkgc2hvdWxkIG5vdCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIiwgIXIyLmludGVyc2VjdHMoMSwgMiwgMywgNCkpOwotCi0JdHJ5IHsKLQkJcjEuaW50ZXJzZWN0cyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJzZWN0c0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JUmVjdGFuZ2xlIHIyID0gbmV3IFJlY3RhbmdsZSgyLCAzLCA3LCA4KTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMSwgMiwgMywgNCkgc2hvdWxkIGludGVyc2VjdCBSZWN0YW5nbGUoMiwgMywgNywgOCkiLCByMS5pbnRlcnNlY3RzKHIyKSk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDIsIDMsIDcsIDgpIHNob3VsZCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIiwgcjIuaW50ZXJzZWN0cyhyMSkpOwotCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDIwMCwgMzAwLCA0MDAsIDUwMCk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIHNob3VsZCBub3QgaW50ZXJzZWN0IFJlY3RhbmdsZSgyMDAsIDMwMCwgNDAwLCA1MDApIiwgIXIxLmludGVyc2VjdHMocjIpKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMjAwLCAzMDAsIDQwMCwgNTAwKSBzaG91bGQgbm90IGludGVyc2VjdCBSZWN0YW5nbGUoMSwgMiwgMywgNCkiLCAhcjIuaW50ZXJzZWN0cyhyMSkpOwotCQotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAwLCAwKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMSwgMiwgMywgNCkgc2hvdWxkIGludGVyc2VjdCBSZWN0YW5nbGUoMywgMywgMCwgMCkiLCByMS5pbnRlcnNlY3RzKHIyKSk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDMsIDMsIDAsIDApIHNob3VsZCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIiwgcjIuaW50ZXJzZWN0cyhyMSkpOwotCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIC0xLCAtMSk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIHNob3VsZCBub3QgaW50ZXJzZWN0IFJlY3RhbmdsZSgzLCAzLCAtMSwgLTEpIiwgIXIxLmludGVyc2VjdHMocjIpKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMywgMywgLTEsIC0xKSBzaG91bGQgbm90IGludGVyc2VjdCBSZWN0YW5nbGUoMSwgMiwgMywgNCkiLCAhcjIuaW50ZXJzZWN0cyhyMSkpOwotCi0JdHJ5IHsKLQkJcjEuaW50ZXJzZWN0cyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNFbXB0eSgpIHsKLQlSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMCwgMCk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIGlzIGVtcHR5Iiwgci5pc0VtcHR5KCkpOwotCi0JciA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgLTMsIC00KTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgaXMgZW1wdHkiLCByLmlzRW1wdHkoKSk7Ci0KLQlyID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgaXMgbm90IGVtcHR5IiwgIXIuaXNFbXB0eSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUoMywgNCwgNSwgNik7Ci0JYXNzZXJ0Tm90TnVsbChyLnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUoci50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgezMsIDQsIDUsIDZ9Iiwgci50b1N0cmluZygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF91bmlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JUmVjdGFuZ2xlIHIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAyLCAyKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSB1bmlvbiBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDEsIDIsIDQsIDQpLCByMS51bmlvbihyMikpOwotCQotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAwLCAwKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSB1bmlvbiBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpLCByMS51bmlvbihyMikpOwotCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIC0xLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgdW5pb24gaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KSwgcjEudW5pb24ocjIpKTsKLQotCXRyeSB7Ci0JCXIxLnVuaW9uKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnRhaW5zSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnRhaW5zTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJzZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVyc2VjdHNJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcnNlY3RzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRW1wdHkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF91bmlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUlJSSIpKSB0ZXN0X0NvbnN0cnVjdG9ySUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29udGFpbnNJSSIpKSB0ZXN0X2NvbnRhaW5zSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnRhaW5zTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X2NvbnRhaW5zTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJzZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9pbnRlcnNlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJzZWN0c0lJSUkiKSkgdGVzdF9pbnRlcnNlY3RzSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJzZWN0c0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfaW50ZXJzZWN0c0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0VtcHR5IikpIHRlc3RfaXNFbXB0eSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdW5pb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X3VuaW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODQyMGZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWdpb24KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWdpb24KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JLy8gdGVzdCBSZWdpb24oKQotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKCk7Ci0JaWYgKHJlZy5pc0Rpc3Bvc2VkKCkpIHsKLQkJZmFpbCgiQ29uc3RydWN0b3IgZm9yIFJlZ2lvbiBkaWRuJ3QgaW5pdGlhbGl6ZSIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UoKSB7Ci0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JaWYgKHJlZy5pc0Rpc3Bvc2VkKCkpIHsKLQkJZmFpbCgiQ29uc3RydWN0b3IgZm9yIFJlZ2lvbiBkaWRuJ3QgaW5pdGlhbGl6ZSIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZCRJKCkgewotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXRyeSB7Ci0JCXJlZy5hZGQoKGludFtdKW51bGwpOwotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRpbmcgYSBudWxsIHJlY3RhbmdsZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9CQotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJcmVnLmFkZChuZXcgaW50W117fSk7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gb24gZGlzcG9zZWQgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCX0KLQlyZWcuZGlzcG9zZSgpOwotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChuZXcgaW50W10gezAsMCwgNTAsMCwgNTAsMjUsIDAsMjV9KTsKLQlSZWN0YW5nbGUgYm94ID0gcmVnLmdldEJvdW5kcygpOwotCXJlZy5kaXNwb3NlKCk7Ci0JUmVjdGFuZ2xlIGV4cGVjdGVkID0gbmV3IFJlY3RhbmdsZSAoMCwwLDUwLDI1KTsKLQlpZiAoIWJveC5lcXVhbHMoZXhwZWN0ZWQpKSB7Ci0JCWZhaWwoImFkZCAxIGZhaWxlZCAtIGV4cGVjdGVkOiAiK2V4cGVjdGVkKyIgYWN0dWFsOiAiK2JveCk7Ci0JfQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChuZXcgaW50W10gezAsMCwgNTAsMCwgNTAsMjUsIDAsMjV9KTsKLQlyZWcuYWRkKG5ldyBpbnRbXSB7MCwyNSwgNTAsMjUsIDUwLDQwLCAwLDQwfSk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCXJlZy5kaXNwb3NlKCk7Ci0JZXhwZWN0ZWQgPSBuZXcgUmVjdGFuZ2xlICgwLDAsNTAsNDApOwotCWlmICghYm94LmVxdWFscyhleHBlY3RlZCkpIHsKLQkJZmFpbCgiYWRkIDIgZmFpbGVkIC0gZXhwZWN0ZWQ6ICIrZXhwZWN0ZWQrIiBhY3R1YWw6ICIrYm94KTsKLQl9Ci0JCi0vLwlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotLy8JcmVnLmFkZChuZXcgaW50W10gezEwLDEwLCA0MCwzMCwgMjAsNjAsIDUsNTV9KTsKLS8vCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLS8vCXJlZy5kaXNwb3NlKCk7Ci0vLwlleHBlY3RlZCA9IG5ldyBSZWN0YW5nbGUgKDUsMTAsMzUsNTApOwotLy8JaWYgKCFib3guZXF1YWxzKGV4cGVjdGVkKSkgewotLy8JCWZhaWwoImFkZCAzIGZhaWxlZCAtIGV4cGVjdGVkOiAiK2V4cGVjdGVkKyIgYWN0dWFsOiAiK2JveCk7Ci0vLwl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JLy8gYWRkIGEgcmVjdGFuZ2xlCi0JcmVnLmFkZChuZXcgUmVjdGFuZ2xlKDAsIDAsIDEwMCwgNTApKTsKLQkvLyBhZGQgYSBzZWNvbmQgcmVjdGFuZ2xlCi0JcmVnLmFkZChuZXcgUmVjdGFuZ2xlKDIwMCwgMjAwLCAxMCwxMCkpOwkKLQotCXRyeSB7Ci0JCXJlZy5hZGQoKFJlY3RhbmdsZSludWxsKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkaW5nIGEgbnVsbCByZWN0YW5nbGUiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZy5kaXNwb3NlKCk7Ci0JCi0JdHJ5IHsKLQkJcmVnLmFkZChuZXcgUmVjdGFuZ2xlKDIwLDMwLDEwLDUpKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkaW5nIGEgcmVjdGFuZ2xlIGFmdGVyIFJlZ2lvbiBnb3QgZGlzcG9zZWQiKTsKLQl9Ci0JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCkgewotCVJlZ2lvbiByZWcxID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQkvLyBtYWtlIGEgc2Vjb25kIHJlZ2lvbiBhbmQgYWRkIGl0IHRvIHRoZSBmaXJzdCBvbmUKLQlSZWdpb24gcmVnMiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMi5hZGQobmV3IFJlY3RhbmdsZSg0MCwgNTAsIDEwLCAyMCkpOwotCXJlZzEuYWRkKHJlZzIpOwotCi0JdHJ5IHsKLQkJcmVnMS5hZGQoKFJlZ2lvbiludWxsKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkaW5nIGEgbnVsbCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJcmVnMiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JCXJlZzIuYWRkKG5ldyBSZWN0YW5nbGUoMSwxLDEwMCwyMDApKTsKLQkJcmVnMi5kaXNwb3NlKCk7Ci0JCXJlZzEuYWRkKHJlZzIpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRpbmcgdG8gYSBSZWdpb24gYSBSZWdpb24gd2hpY2ggZ290IGRpc3Bvc2VkIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlyZWcxLmRpc3Bvc2UoKTsKLQkKLQl0cnkgewotCQlyZWcyID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQkJcmVnMi5hZGQobmV3IFJlY3RhbmdsZSgxLDEsMTAwLDIwMCkpOwotCQlyZWcxLmFkZChyZWcyKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkaW5nIGEgUmVnaW9uIHRvIGEgUmVnaW9uIHdoaWNoIGdvdCBkaXNwb3NlZCIpOwotCX0KLQljYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNJSSgpIHsKLQlSZWN0YW5nbGUgcmVjdDEgPSBuZXcgUmVjdGFuZ2xlKDEwLDEwLDIwMCwxMDApOwotCVBvaW50IHBvaW50SW5SZWN0MSA9IG5ldyBQb2ludCgxMCwxMCk7Ci0JUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZSg1MCw1MCwxMDAwLDEwMDApOwotCVBvaW50IHBvaW50SW5SZWN0MiA9IG5ldyBQb2ludCgxMDQ5LDEwMDkpOwotCVBvaW50IHBvaW50Tm90SW5SZWN0MTIgPSBuZXcgUG9pbnQoNDksMTEwKTsKLQkKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWJvb2xlYW4gcmVzID0gcmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0MS54LCBwb2ludEluUmVjdDEueSk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gb24gZGlzcG9zZWQgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChFeGNlcHRpb24gZSkgewotCX0KLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCWlmIChyZWcuY29udGFpbnMocG9pbnRJblJlY3QxLngsIHBvaW50SW5SZWN0MS55KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJFbXB0eSByZWdpb24gc2hvdWxkIG5vdCBjb250YWluIHBvaW50Iik7Ci0JfQotCXJlZy5hZGQocmVjdDEpOwotCWlmICghcmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0MS54LCBwb2ludEluUmVjdDEueSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiUmVnaW9uIHNob3VsZCBjb250YWluIHBvaW50Iik7Ci0JfQotCXJlZy5hZGQocmVjdDIpOwotCWlmICghcmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0MS54LCBwb2ludEluUmVjdDEueSkgfHwKLQkJIXJlZy5jb250YWlucyhwb2ludEluUmVjdDIueCwgcG9pbnRJblJlY3QyLnkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIlJlZ2lvbiBzaG91bGQgY29udGFpbiBwb2ludCIpOwotCX0KLQlpZiAocmVnLmNvbnRhaW5zKHBvaW50Tm90SW5SZWN0MTIueCwgcG9pbnROb3RJblJlY3QxMi55KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJSZWdpb24gc2hvdWxkIG5vdCBjb250YWluIHBvaW50Iik7Ci0JfQkKLQlyZWcuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlSZWN0YW5nbGUgcmVjdDEgPSBuZXcgUmVjdGFuZ2xlKDEwLDEwLDIwMCwxMDApOwotCVBvaW50IHBvaW50SW5SZWN0MSA9IG5ldyBQb2ludCgxMCwxMCk7Ci0JUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZSg1MCw1MCwxMDAwLDEwMDApOwotCVBvaW50IHBvaW50SW5SZWN0MiA9IG5ldyBQb2ludCgxMDQ5LDEwMDkpOwotCVBvaW50IHBvaW50Tm90SW5SZWN0MTIgPSBuZXcgUG9pbnQoNDksMTEwKTsKLQkKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWJvb2xlYW4gcmVzID0gcmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0MSk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gb24gZGlzcG9zZWQgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChFeGNlcHRpb24gZSkgewotCX0KLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCWlmIChyZWcuY29udGFpbnMocG9pbnRJblJlY3QxKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJFbXB0eSByZWdpb24gc2hvdWxkIG5vdCBjb250YWluIHBvaW50Iik7Ci0JfQotCXJlZy5hZGQocmVjdDEpOwotCWlmICghcmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0MSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiUmVnaW9uIHNob3VsZCBjb250YWluIHBvaW50Iik7Ci0JfQotCXJlZy5hZGQocmVjdDIpOwotCWlmICghcmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0MSkgfHwKLQkJIXJlZy5jb250YWlucyhwb2ludEluUmVjdDIpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIlJlZ2lvbiBzaG91bGQgY29udGFpbiBwb2ludCIpOwotCX0KLQlpZiAocmVnLmNvbnRhaW5zKHBvaW50Tm90SW5SZWN0MTIpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIlJlZ2lvbiBzaG91bGQgbm90IGNvbnRhaW4gcG9pbnQiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5hZGQobmV3IFJlY3RhbmdsZSgxLDEsNTAsMTAwKSk7Ci0JaWYgKHJlZy5pc0Rpc3Bvc2VkKCkpIHsKLQkJZmFpbCgiUmVnaW9uIHNob3VsZCBub3QgYmUgaW4gdGhlIGRpc3Bvc2VkIHN0YXRlIik7Ci0JfQotCQotCS8vIGRpc3Bvc2UgdHdpY2UgYXMgdGhpcyBpcyBhbGxvd2VkCi0JZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJaWYgKCFyZWcuaXNEaXNwb3NlZCgpKSB7Ci0JCQlmYWlsKCJSZWdpb24gc2hvdWxkIGJlIGluIHRoZSBkaXNwb3NlZCBzdGF0ZSIpOwotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMjUsIDEwMCwgMjAwLCA3ODApOwotCVJlY3RhbmdsZSByZWN0MiA9IG5ldyBSZWN0YW5nbGUoMzAsIDEwNSwgMjA1LCA3ODUpOwotCQotCVJlZ2lvbiByZWcxID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcxLmFkZChyZWN0MSk7Ci0KLQlSZWdpb24gcmVnMiA9IHJlZzE7Ci0JCi0JaWYgKCFyZWcxLmVxdWFscyhyZWcyKSkgewotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnMi5kaXNwb3NlKCk7Ci0JCWZhaWwoInJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgaW5zdGFuY2Ugb2YgUmVnaW9uIHNob3VsZCBiZSBjb25zaWRlcmVkIGVxdWFsIik7Ci0JfQotCQotCXJlZzIgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzIuYWRkKHJlY3QxKTsKLQkKLS8vIEN1cnJlbnRseSwgUmVnaW9ucyBhcmUgb25seSAiZXF1YWwiIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBoYW5kbGUuCi0vLyBUaGlzIGlzIHNvIHRoYXQgaWRlbnRpY2FsIG9iamVjdHMgYXJlIHByb3Blcmx5IGhhc2hlZC4KLS8vIFdlIGFyZSBjb25zaWRlcmluZyBhZGRpbmcgYSBuZXcgbWV0aG9kIHRoYXQgd2lsbCBjb21wYXJlIFJlZ2lvbnMgZm9yIHRoZSBzYW1lIGFyZWEuCi0vLwlpZiAoIXJlZzEuZXF1YWxzKHJlZzIpKSB7Ci0vLwkJcmVnMS5kaXNwb3NlKCk7Ci0vLwkJcmVnMi5kaXNwb3NlKCk7Ci0vLwkJZmFpbCgidHdvIGluc3RhbmNlcyBvZiBSZWdpb24gcmVwcmVzZW50aW5nIHRoZSBzYW1lIGFyZWEgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXF1YWwiKTsKLS8vCX0JCQotCQotCXJlZzIuZGlzcG9zZSgpOwotCXJlZzIgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCWlmIChyZWcxLmVxdWFscyhyZWcyKSkgewotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnMi5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vbiBlbXB0eSByZWdpb24gY29uc2lkZXJlZCBlcXVhbCB0byBlbXB0eSBvbmUiKTsKLQl9Ci0JCi0JcmVnMi5hZGQocmVjdDIpOwotCWlmIChyZWcxLmVxdWFscyhyZWcyKSkgewotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnMi5kaXNwb3NlKCk7Ci0JCWZhaWwoInR3byBkaWZmZXJlbnQgcmVnaW9ucyBjb25zaWRlcmVkIGVxdWFsIik7Ci0JfQotCQotCXJlZzEuZGlzcG9zZSgpOwotCXJlZzIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuZGlzcG9zZSgpOwotCQotCXRyeSB7Ci0JCVJlY3RhbmdsZSByZWN0ID0gcmVnLmdldEJvdW5kcygpOwotCQlmYWlsKCJSZWdpb24gZGlzcG9zZWQgc2hvdWxkIHRocm93IEV4Y2VwdGlvbiIpOwotCX0KLQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlSZWN0YW5nbGUgcmVjdDEgPSBuZXcgUmVjdGFuZ2xlKDEwLDEwLDUwLDMwKTsKLQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDEwMCwxMDAsMTAsMTApOwotCS8vIHRoZSByZWN0YW5nbGUgZW5jbG9zaW5nIHRoZSB0d28gcHJlY2VkaW5nIHJlY3RhbmdsZXMKLQlSZWN0YW5nbGUgcmVjdDEyQm91bmRzID0gbmV3IFJlY3RhbmdsZSgxMCwxMCwxMDAsMTAwKTsKLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5hZGQocmVjdDEpOwotCVJlY3RhbmdsZSByZWN0MUJpcyA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAocmVjdDFCaXMueCAhPSByZWN0MS54IHx8IHJlY3QxQmlzLnkgIT0gcmVjdDEueSB8fCAKLQkJcmVjdDFCaXMuaGVpZ2h0ICE9IHJlY3QxLmhlaWdodCB8fCByZWN0MUJpcy53aWR0aCAhPSByZWN0MS53aWR0aCkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJnZXRCb3VuZHMgZG9lc24ndCByZXR1cm4gdGhlIGJvcmRlcnMgb2YgdGhlIHJlY3RhbmdsZSBhcmVhIHdoaWNoIHdhcyBzZXQgdXAiKTsKLQl9Ci0JCi0JcmVnLmFkZChyZWN0Mik7Ci0JUmVjdGFuZ2xlIHJlY3QxMiA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAocmVjdDEyLnggIT0gcmVjdDEyQm91bmRzLnggfHwgcmVjdDEyLnkgIT0gcmVjdDEyQm91bmRzLnkgfHwgCi0JCXJlY3QxMi5oZWlnaHQgIT0gcmVjdDEyQm91bmRzLmhlaWdodCB8fCByZWN0MTIud2lkdGggIT0gcmVjdDEyQm91bmRzLndpZHRoKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImdldEJvdW5kcyBkb2Vzbid0IHJldHVybiB0aGUgYm9yZGVycyBvZiB0aGUgcmVzdWx0aW5nIHJlY3RhbmdsZSBhcmVhIHdoaWNoIHdhcyBzZXQgdXAiKTsKLQl9Ci0JCi0JcmVnLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlSZWdpb24gcmVnMSA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JUmVnaW9uIHJlZzIgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCQkKLQlSZWN0YW5nbGUgcmVjdDEgPSBuZXcgUmVjdGFuZ2xlKDI1LCAxMDAsIDIwMCwgNzgwKTsKLQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDMwLCAxMDUsIDIwNSwgNzg1KTsKLQkKLQlyZWcxLmFkZChyZWN0MSk7Ci0JcmVnMi5hZGQocmVjdDIpOwotCQotCWlmIChyZWcxLmhhc2hDb2RlKCkgPT0gcmVnMi5oYXNoQ29kZSgpKSB7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWcyLmRpc3Bvc2UoKTsKLQkJZmFpbCgidHdvIGRpZmZlcmVudCByZWdpb25zIHNob3VsZCBoYXZlIGRpZmZlcmVudCBoYXNoQ29kZSIpOwotCX0KLQlyZWcyLmRpc3Bvc2UoKTsJCi0KLQlyZWcyID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcyLmFkZChyZWN0MSk7Ci0KLQotLy8gQlVHOiB0aGlzIHNob3VsZCBwYXNzCQotLy8JaWYgKHJlZzEuaGFzaENvZGUoKSAhPSByZWcyLmhhc2hDb2RlKCkpIHsKLS8vCQlyZWcxLmRpc3Bvc2UoKTsKLS8vCQlyZWcyLmRpc3Bvc2UoKTsKLS8vCQlmYWlsKCJ0d28gcmVnaW9ucyByZXByZXNlbnRpbmcgc2FtZSBhcmVhIHNob3VsZCBoYXZlIHNhbWUgaGFzaENvZGUiKTsKLS8vCX0KLQkKLQlyZWcxLmRpc3Bvc2UoKTsKLQlyZWcyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQlSZWN0YW5nbGUgcmVjdDEgPSBuZXcgUmVjdGFuZ2xlKDAsMCw1MCwyNSk7Ci0JUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZSgwLDAsNTAsMjUpOwotCVJlY3RhbmdsZSByZWN0MyA9IG5ldyBSZWN0YW5nbGUoMTAsMTAsMTAsMTApOwotCVJlY3RhbmdsZSByZWN0NCA9IG5ldyBSZWN0YW5nbGUoNTAsMjUsMTAsMTApOwotCVJlY3RhbmdsZSByZWN0NSA9IG5ldyBSZWN0YW5nbGUoMjUsMjAsMjUsMTApOwotCi0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlyZWcuaW50ZXJzZWN0KHJlY3QxKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmludGVyc2VjdChyZWN0MSk7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgZm9yIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQlyZWcuYWRkKHJlY3QxKTsKLQlyZWcuaW50ZXJzZWN0KHJlY3QyKTsKLQlSZWN0YW5nbGUgYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWN0MSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCAxIik7Ci0JfQotCXJlZy5pbnRlcnNlY3QocmVjdDMpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVjdDMpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgMiIpOwotCX0KLQlyZWcuaW50ZXJzZWN0KHJlY3Q0KTsKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCAzIik7Ci0JfQotCXJlZy5hZGQocmVjdDEudW5pb24ocmVjdDQpKTsKLQlyZWcuaW50ZXJzZWN0KHJlY3Q1KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKHJlY3Q1KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDQiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChyZWN0MSk7Ci0JcmVnLmFkZChyZWN0NCk7Ci0JcmVnLmludGVyc2VjdChyZWN0NSk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhuZXcgUmVjdGFuZ2xlKDI1LDIwLDI1LDUpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDUiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigpIHsKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlSZWdpb24gcmVnMSA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMS5hZGQobmV3IFJlY3RhbmdsZSgwLDAsNTAsMjUpKTsKLQotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJcmVnLmludGVyc2VjdChyZWcxKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gb24gZGlzcG9zZWQgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCX0KLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5pbnRlcnNlY3QocmVnMSk7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIGZvciBlbXB0eSByZWdpb24iKTsKLQl9Ci0JCi0JUmVnaW9uIHJlZzIgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzIuYWRkKG5ldyBSZWN0YW5nbGUoMCwwLDUwLDI1KSk7Ci0KLQlyZWcuYWRkKHJlZzEpOwotCXJlZy5pbnRlcnNlY3QocmVnMik7Ci0JUmVjdGFuZ2xlIGJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVnMS5nZXRCb3VuZHMoKSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzIuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDEiKTsKLQl9Ci0JcmVnMi5kaXNwb3NlKCk7Ci0JCi0JUmVnaW9uIHJlZzMgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzMuYWRkKG5ldyBSZWN0YW5nbGUoMTAsMTAsMTAsMTApKTsKLQkKLQlyZWcuaW50ZXJzZWN0KHJlZzMpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVnMy5nZXRCb3VuZHMoKSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzMuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDIiKTsKLQl9Ci0JcmVnMy5kaXNwb3NlKCk7Ci0JCi0JUmVnaW9uIHJlZzQgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzQuYWRkKG5ldyBSZWN0YW5nbGUoNTAsMjUsMTAsMTApKTsKLQotCXJlZy5pbnRlcnNlY3QocmVnNCk7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWc0LmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCAzIik7Ci0JfQotCQotCVJlZ2lvbiByZWc1ID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWc1LmFkZChuZXcgUmVjdGFuZ2xlKDI1LDIwLDI1LDEwKSk7Ci0JCi0JcmVnLmFkZChyZWcxLmdldEJvdW5kcygpLnVuaW9uKHJlZzQuZ2V0Qm91bmRzKCkpKTsKLQlyZWcuaW50ZXJzZWN0KHJlZzUpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVnNS5nZXRCb3VuZHMoKSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzQuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDQiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChyZWcxKTsKLQlyZWcuYWRkKHJlZzQpOwotCXJlZy5pbnRlcnNlY3QocmVnNSk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhuZXcgUmVjdGFuZ2xlKDI1LDIwLDI1LDUpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnNC5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgNSIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotCXJlZzEuZGlzcG9zZSgpOwotCXJlZzQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVyc2VjdHNJSUlJKCkgewotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMTAsMjAsNTAsMzApOwotCVJlY3RhbmdsZSByZWN0SW50ZXIxID0gbmV3IFJlY3RhbmdsZSg1OSw0OSwxMCwyMCk7Ci0JUmVjdGFuZ2xlIHJlY3ROb3RJbnRlcjEgPSBuZXcgUmVjdGFuZ2xlKDAsNSwxMCwxNSk7Ci0JCi0JUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZSgzMCw0MCwxMCwxMDApOwotCVJlY3RhbmdsZSByZWN0SW50ZXIyID0gbmV3IFJlY3RhbmdsZSgzOSwxMzksMSw1KTsKLQlSZWN0YW5nbGUgcmVjdE5vdEludGVyMTIgPSBuZXcgUmVjdGFuZ2xlKDQwLDUwLDUsMTUpOwotCQotCQotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJYm9vbGVhbiByZXMgPSByZWcuaW50ZXJzZWN0cyhyZWN0SW50ZXIxLngsIHJlY3RJbnRlcjEueSwgcmVjdEludGVyMS53aWR0aCwgcmVjdEludGVyMS5oZWlnaHQpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIG9uIGRpc3Bvc2VkIHJlZ2lvbiIpOwotCX0KLQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlpZiAocmVnLmludGVyc2VjdHMocmVjdDEueCwgcmVjdDEueSwgcmVjdDEud2lkdGgsIHJlY3QxLmhlaWdodCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyBjYW4ndCByZXR1cm4gdHJ1ZSBvbiBlbXB0eSByZWdpb24iKTsKLQl9Ci0JcmVnLmFkZChyZWN0MSk7Ci0JaWYgKCFyZWcuaW50ZXJzZWN0cyhyZWN0MS54LCByZWN0MS55LCByZWN0MS53aWR0aCwgcmVjdDEuaGVpZ2h0KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGRpZG4ndCByZXR1cm4gdHJ1ZSIpOwotCX0KLQlpZiAoIXJlZy5pbnRlcnNlY3RzKHJlY3RJbnRlcjEueCwgcmVjdEludGVyMS55LCByZWN0SW50ZXIxLndpZHRoLCByZWN0SW50ZXIxLmhlaWdodCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyBkaWRuJ3QgcmV0dXJuIHRydWUgIik7Ci0JfQotCWlmIChyZWcuaW50ZXJzZWN0cyhyZWN0Tm90SW50ZXIxLngsIHJlY3ROb3RJbnRlcjEueSwgcmVjdE5vdEludGVyMS53aWR0aCwgcmVjdE5vdEludGVyMS5oZWlnaHQpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgcmV0dXJuIHRydWUgb24gcmVjdGFuZ2xlIG5vdCBpbnRlcnNlY3Rpbmcgd2l0aCByZWdpb24iKTsKLQl9Ci0JCi0JcmVnLmFkZChyZWN0Mik7Ci0JaWYgKCFyZWcuaW50ZXJzZWN0cyhyZWN0Mi54LCByZWN0Mi55LCByZWN0Mi53aWR0aCwgcmVjdDIuaGVpZ2h0KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGRpZG4ndCByZXR1cm4gdHJ1ZSIpOwotCX0KLQlpZiAoIXJlZy5pbnRlcnNlY3RzKHJlY3RJbnRlcjIueCwgcmVjdEludGVyMi55LCByZWN0SW50ZXIyLndpZHRoLCByZWN0SW50ZXIyLmhlaWdodCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyBkaWRuJ3QgcmV0dXJuIHRydWUgIik7Ci0JfQotCWlmIChyZWcuaW50ZXJzZWN0cyhyZWN0Tm90SW50ZXIxMi54LCByZWN0Tm90SW50ZXIxMi55LCByZWN0Tm90SW50ZXIxMi53aWR0aCwgcmVjdE5vdEludGVyMTIuaGVpZ2h0KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIHJldHVybiB0cnVlIG9uIHJlY3RhbmdsZSBub3QgaW50ZXJzZWN0aW5nIHdpdGggcmVnaW9uIik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJzZWN0c0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMTAsMjAsNTAsMzApOwotCVJlY3RhbmdsZSByZWN0SW50ZXIxID0gbmV3IFJlY3RhbmdsZSg1OSw0OSwxMCwyMCk7Ci0JUmVjdGFuZ2xlIHJlY3ROb3RJbnRlcjEgPSBuZXcgUmVjdGFuZ2xlKDAsNSwxMCwxNSk7Ci0JCi0JUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZSgzMCw0MCwxMCwxMDApOwotCVJlY3RhbmdsZSByZWN0SW50ZXIyID0gbmV3IFJlY3RhbmdsZSgzOSwxMzksMSw1KTsKLQlSZWN0YW5nbGUgcmVjdE5vdEludGVyMTIgPSBuZXcgUmVjdGFuZ2xlKDQwLDUwLDUsMTUpOwotCQotCQotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJYm9vbGVhbiByZXMgPSByZWcuaW50ZXJzZWN0cyhyZWN0SW50ZXIxKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JaWYgKHJlZy5pbnRlcnNlY3RzKHJlY3QxKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGNhbid0IHJldHVybiB0cnVlIG9uIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQlyZWcuYWRkKHJlY3QxKTsKLQlpZiAoIXJlZy5pbnRlcnNlY3RzKHJlY3QxKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGRpZG4ndCByZXR1cm4gdHJ1ZSIpOwotCX0KLQlpZiAoIXJlZy5pbnRlcnNlY3RzKHJlY3RJbnRlcjEpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgZGlkbid0IHJldHVybiB0cnVlICIpOwotCX0KLQlpZiAocmVnLmludGVyc2VjdHMocmVjdE5vdEludGVyMSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyByZXR1cm4gdHJ1ZSBvbiByZWN0YW5nbGUgbm90IGludGVyc2VjdGluZyB3aXRoIHJlZ2lvbiIpOwotCX0KLQkKLQlyZWcuYWRkKHJlY3QyKTsKLQlpZiAoIXJlZy5pbnRlcnNlY3RzKHJlY3QyKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGRpZG4ndCByZXR1cm4gdHJ1ZSIpOwotCX0KLQlpZiAoIXJlZy5pbnRlcnNlY3RzKHJlY3RJbnRlcjIpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgZGlkbid0IHJldHVybiB0cnVlICIpOwotCX0KLQlpZiAocmVnLmludGVyc2VjdHMocmVjdE5vdEludGVyMTIpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgcmV0dXJuIHRydWUgb24gcmVjdGFuZ2xlIG5vdCBpbnRlcnNlY3Rpbmcgd2l0aCByZWdpb24iKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCS8vIHRlc3QgaW4gZGlzcG9zZSgpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNFbXB0eSgpIHsKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlSZWN0YW5nbGUgZW1wdHlSZWN0MSA9IG5ldyBSZWN0YW5nbGUoMTAsMjAsMCwyMDApOwotCVJlY3RhbmdsZSBlbXB0eVJlY3QyID0gbmV3IFJlY3RhbmdsZSgxMCwyMCwxMCwwKTsKLQlSZWN0YW5nbGUgcmVjdCA9IG5ldyBSZWN0YW5nbGUoMTAsMjAsNTAsMTAwKTsKLQkKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaXNFbXB0eSBkaWRuJ3QgcmV0dXJuIHRydWUgb24gZW1wdHkgcmVnaW9uIik7Ci0JfQotCQotCXJlZy5hZGQoZW1wdHlSZWN0MSk7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImlzRW1wdHkgZGlkbid0IHJldHVybiB0cnVlIG9uIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQotCXJlZy5hZGQoZW1wdHlSZWN0Mik7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImlzRW1wdHkgZGlkbid0IHJldHVybiB0cnVlIG9uIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQotCXJlZy5hZGQocmVjdCk7Ci0JaWYgKHJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaXNFbXB0eSByZXR1cm5lZCB0cnVlIG9uIG5vbiBlbXB0eSByZWdpb24iKTsKLQl9Ci0JCi0JcmVnLmRpc3Bvc2UoKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc3VidHJhY3QkSSgpIHsKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQl0cnkgewotCQlyZWcuc3VidHJhY3QoKGludFtdKW51bGwpOwotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIGZvciBzdWJ0cmFjdCBhIG51bGwgYXJyYXkiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQkKLQlyZWcuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXJlZy5zdWJ0cmFjdChuZXcgaW50W117fSk7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gb24gZGlzcG9zZWQgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCX0KLQlyZWcuZGlzcG9zZSgpOwotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChuZXcgaW50W10gezAsMCwgNTAsMCwgNTAsMjUsIDAsMjV9KTsKLQlyZWcuc3VidHJhY3QobmV3IGludFtdIHswLDAsIDUwLDAsIDUwLDIwLCAwLDIwfSk7Ci0JUmVjdGFuZ2xlIGJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlyZWcuZGlzcG9zZSgpOwotCVJlY3RhbmdsZSBleHBlY3RlZCA9IG5ldyBSZWN0YW5nbGUgKDAsMjAsNTAsNSk7Ci0JaWYgKCFib3guZXF1YWxzKGV4cGVjdGVkKSkgewotCQlmYWlsKCJzdWJ0cmFjdCAxIGZhaWxlZCAtIGV4cGVjdGVkOiAiK2V4cGVjdGVkKyIgYWN0dWFsOiAiK2JveCk7Ci0JfQotCQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChuZXcgaW50W10gezAsMCwgNTAsMCwgNTAsMjUsIDAsMjV9KTsKLQlyZWcuYWRkKG5ldyBpbnRbXSB7MCwyNSwgNTAsMjUsIDUwLDQwLCAwLDQwfSk7Ci0JcmVnLnN1YnRyYWN0KG5ldyBpbnRbXSB7MCwyNSwgNTAsMjUsIDUwLDQwLCAwLDQwfSk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCXJlZy5kaXNwb3NlKCk7Ci0JZXhwZWN0ZWQgPSBuZXcgUmVjdGFuZ2xlICgwLDAsNTAsMjUpOwotCWlmICghYm94LmVxdWFscyhleHBlY3RlZCkpIHsKLQkJZmFpbCgic3VidHJhY3QgMiBmYWlsZWQgLSBleHBlY3RlZDogIitleHBlY3RlZCsiIGFjdHVhbDogIitib3gpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zdWJ0cmFjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMCwwLDUwLDI1KTsKLQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDAsMCw1MCwyNSk7Ci0JUmVjdGFuZ2xlIHJlY3QzID0gbmV3IFJlY3RhbmdsZSgxMCwxMCwxMCwxMCk7Ci0JUmVjdGFuZ2xlIHJlY3Q0ID0gbmV3IFJlY3RhbmdsZSg1MCwyNSwxMCwxMCk7Ci0JUmVjdGFuZ2xlIHJlY3Q1ID0gbmV3IFJlY3RhbmdsZSgwLDAsNjAsMjApOwotCi0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlyZWcuc3VidHJhY3QocmVjdDEpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIG9uIGRpc3Bvc2VkIHJlZ2lvbiIpOwotCX0KLQljYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuc3VidHJhY3QocmVjdDEpOwotCWlmICghcmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgZm9yIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQlyZWcuYWRkKHJlY3QxKTsKLQlyZWcuc3VidHJhY3QocmVjdDIpOwotCWlmICghcmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgMSIpOwotCX0KLQlyZWcuYWRkKHJlY3QxKTsKLQlyZWcuc3VidHJhY3QocmVjdDMpOwotCVJlY3RhbmdsZSBib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKHJlY3QxKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgMiIpOwotCX0KLQlyZWcuc3VidHJhY3QocmVjdDQpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVjdDEpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCAzIik7Ci0JfQotCXJlZy5hZGQocmVjdDEudW5pb24ocmVjdDQpKTsKLQlyZWcuc3VidHJhY3QocmVjdDUpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLDIwLDYwLDE1KSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIDQiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChyZWN0MSk7Ci0JcmVnLmFkZChyZWN0NCk7Ci0JcmVnLnN1YnRyYWN0KHJlY3Q1KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwyMCw2MCwxNSkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCA1Iik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc3VidHJhY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigpIHsKLQlSZWdpb24gcmVnMSA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMS5hZGQobmV3IFJlY3RhbmdsZSgwLDAsNTAsMjUpKTsKLQotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJcmVnLnN1YnRyYWN0KHJlZzEpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLnN1YnRyYWN0KHJlZzEpOwotCWlmICghcmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIGZvciBlbXB0eSByZWdpb24iKTsKLQl9Ci0JCi0JUmVnaW9uIHJlZzIgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzIuYWRkKG5ldyBSZWN0YW5nbGUoMCwwLDUwLDI1KSk7Ci0JCi0JcmVnLmFkZChyZWcxKTsKLQlyZWcuc3VidHJhY3QocmVnMik7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWcyLmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIDEiKTsKLQl9Ci0JcmVnMi5kaXNwb3NlKCk7Ci0JCi0JUmVnaW9uIHJlZzMgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzMuYWRkKG5ldyBSZWN0YW5nbGUoMTAsMTAsMTAsMTApKTsKLQkKLQlyZWcuYWRkKHJlZzEpOwotCXJlZy5zdWJ0cmFjdChyZWczKTsKLQlSZWN0YW5nbGUgYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWcxLmdldEJvdW5kcygpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnMy5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCAyIik7Ci0JfQotCXJlZzMuZGlzcG9zZSgpOwotCQotCVJlZ2lvbiByZWc0ID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWc0LmFkZChuZXcgUmVjdGFuZ2xlKDUwLDI1LDEwLDEwKSk7Ci0JCi0JcmVnLnN1YnRyYWN0KHJlZzQpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVnMS5nZXRCb3VuZHMoKSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzQuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgMyIpOwotCX0KLQotCVJlZ2lvbiByZWc1ID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWc1LmFkZChuZXcgUmVjdGFuZ2xlKDAsMCw2MCwyMCkpOwotCQotCXJlZy5hZGQocmVnMS5nZXRCb3VuZHMoKS51bmlvbihyZWc0LmdldEJvdW5kcygpKSk7Ci0JcmVnLnN1YnRyYWN0KHJlZzUpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLDIwLDYwLDE1KSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzQuZGlzcG9zZSgpOwotCQlyZWc1LmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIDQiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChyZWcxKTsKLQlyZWcuYWRkKHJlZzQpOwotCXJlZy5zdWJ0cmFjdChyZWc1KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwyMCw2MCwxNSkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWc0LmRpc3Bvc2UoKTsKLQkJcmVnNS5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCA1Iik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci0JcmVnMS5kaXNwb3NlKCk7Ci0JcmVnNC5kaXNwb3NlKCk7Ci0JcmVnNS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JCi0JU3RyaW5nIHMgPSByZWcudG9TdHJpbmcoKTsKLQkKLQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgewotCQlmYWlsKCJ0b1N0cmluZyByZXR1cm5zIG51bGwgb3IgZW1wdHkgc3RyaW5nIik7Ci0JfQotCQotCXJlZy5hZGQobmV3IFJlY3RhbmdsZSgxLDEsMTAsMjApKTsKLQlzID0gcmVnLnRvU3RyaW5nKCk7Ci0JCi0JaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApIHsKLQkJZmFpbCgidG9TdHJpbmcgcmV0dXJucyBudWxsIG9yIGVtcHR5IHN0cmluZyIpOwotCX0KLQotCXJlZy5kaXNwb3NlKCk7Ci0JcyA9IHJlZy50b1N0cmluZygpOwotCQotCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7Ci0JCWZhaWwoInRvU3RyaW5nIHJldHVybnMgbnVsbCBvciBlbXB0eSBzdHJpbmciKTsKLQl9CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSgpIHsKLQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpKSB7Ci0JCXdhcm5VbmltcGwoIlRlc3QgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkgbm90IHdyaXR0ZW4iKTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udGFpbnNJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcnNlY3RzSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJzZWN0c0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0Rpc3Bvc2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0VtcHR5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdWJ0cmFjdCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdWJ0cmFjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdWJ0cmFjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGQkSSIpKSB0ZXN0X2FkZCRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpKSB0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb250YWluc0lJIikpIHRlc3RfY29udGFpbnNJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpKSB0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3RzSUlJSSIpKSB0ZXN0X2ludGVyc2VjdHNJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3RzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9pbnRlcnNlY3RzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRGlzcG9zZWQiKSkgdGVzdF9pc0Rpc3Bvc2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0VtcHR5IikpIHRlc3RfaXNFbXB0eSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc3VidHJhY3QkSSIpKSB0ZXN0X3N1YnRyYWN0JEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N1YnRyYWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9zdWJ0cmFjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdWJ0cmFjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIikpIHRlc3Rfc3VidHJhY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIikpIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotCURpc3BsYXkgZGlzcGxheTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0ZpbGxMYXlvdXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0ZpbGxMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4YTY2My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9GaWxsTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9GaWxsTGF5b3V0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0ZpbGxMYXlvdXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9GaWxsTGF5b3V0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckkiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckkiKSkgdGVzdF9Db25zdHJ1Y3RvckkoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1BdHRhY2htZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtQXR0YWNobWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGIyMTVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1BdHRhY2htZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUF0dGFjaG1lbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUF0dGFjaG1lbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewotCUZvcm1BdHRhY2htZW50IGF0dGFjaG1lbnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTApOwotCWFzc2VydE5vdE51bGwoYXR0YWNobWVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSSgpIHsKLQlGb3JtQXR0YWNobWVudCBhdHRhY2htZW50ID0gbmV3IEZvcm1BdHRhY2htZW50KDUwLCAxMCk7Ci0JYXNzZXJ0Tm90TnVsbChhdHRhY2htZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJSSgpIHsKLQlGb3JtQXR0YWNobWVudCBhdHRhY2htZW50ID0gbmV3IEZvcm1BdHRhY2htZW50KDUwLCAxMDAsIDEwKTsKLQlhc3NlcnROb3ROdWxsKGF0dGFjaG1lbnQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0JRm9ybUF0dGFjaG1lbnQgYXR0YWNobWVudCA9IG5ldyBGb3JtQXR0YWNobWVudChzaGVsbCk7Ci0JYXNzZXJ0Tm90TnVsbChhdHRhY2htZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSgpIHsKLQlGb3JtQXR0YWNobWVudCBhdHRhY2htZW50ID0gbmV3IEZvcm1BdHRhY2htZW50KHNoZWxsLCAxMCk7Ci0JYXNzZXJ0Tm90TnVsbChhdHRhY2htZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUkoKSB7Ci0JRm9ybUF0dGFjaG1lbnQgYXR0YWNobWVudCA9IG5ldyBGb3JtQXR0YWNobWVudChzaGVsbCwgMTAsIFNXVC5MRUZUKTsKLQlhc3NlcnROb3ROdWxsKGF0dGFjaG1lbnQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUZvcm1BdHRhY2htZW50IGF0dGFjaG1lbnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTApOwotCWFzc2VydE5vdE51bGwoYXR0YWNobWVudC50b1N0cmluZygpKTsKLQlhc3NlcnRUcnVlKGF0dGFjaG1lbnQudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtQXR0YWNobWVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJIikpIHRlc3RfQ29uc3RydWN0b3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJIikpIHRlc3RfQ29uc3RydWN0b3JJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSUkiKSkgdGVzdF9Db25zdHJ1Y3RvcklJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyBTaGVsbCBzaGVsbDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1EYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2JkMmEwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGEKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtRGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtRGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvcklJIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1EYXRhKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUkiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJIikpIHRlc3RfQ29uc3RydWN0b3JJSSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUxheW91dC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2M1ZTQ3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1MYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtTGF5b3V0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1MYXlvdXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtTGF5b3V0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWREYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWYzNjkzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkRGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkRGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JYXNzZXJ0Tm90TnVsbChkYXRhKTsKLQlhc3NlcnRUcnVlKGRhdGEudmVydGljYWxBbGlnbm1lbnQgPT0gR3JpZERhdGEuQ0VOVEVSKTsKLQlhc3NlcnRUcnVlKGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9PSBHcmlkRGF0YS5CRUdJTk5JTkcpOwotCWFzc2VydFRydWUoZGF0YS53aWR0aEhpbnQgPT0gU1dULkRFRkFVTFQpOwotCWFzc2VydFRydWUoZGF0YS5oZWlnaHRIaW50ID09IFNXVC5ERUZBVUxUKTsKLQlhc3NlcnRUcnVlKGRhdGEuaG9yaXpvbnRhbEluZGVudCA9PSAwKTsKLQlhc3NlcnRUcnVlKGRhdGEuaG9yaXpvbnRhbFNwYW4gPT0gMSk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLnZlcnRpY2FsU3BhbiA9PSAxKTsKLQlhc3NlcnRUcnVlKGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9PSBmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCWFzc2VydE5vdE51bGwoZGF0YSk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID09IEdyaWREYXRhLkZJTEwpOwotCWFzc2VydFRydWUoZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID09IEdyaWREYXRhLkZJTEwpOwotCWFzc2VydFRydWUoZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID09IHRydWUpOwotCWFzc2VydFRydWUoZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9PSB0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJKCkgewotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoMTAwLCAxMDApOwotCWFzc2VydE5vdE51bGwoZGF0YSk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLndpZHRoSGludCA9PSAxMDApOwotCWFzc2VydFRydWUoZGF0YS5oZWlnaHRIaW50ID09IDEwMCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySSIpKSB0ZXN0X0NvbnN0cnVjdG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSSIpKSB0ZXN0X0NvbnN0cnVjdG9ySUkoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWRMYXlvdXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWRMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiZjJjYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkTGF5b3V0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWRMYXlvdXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9ySVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWRMYXlvdXQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySVoiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklaIikpIHRlc3RfQ29uc3RydWN0b3JJWigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93RGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzU0N2MyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0RhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0RhdGEKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93RGF0YQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0RhdGEgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93RGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvcklJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0RhdGEoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJIikpIHRlc3RfQ29uc3RydWN0b3JJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dMYXlvdXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDk0OTZhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0xheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0xheW91dCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dMYXlvdXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dMYXlvdXQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySSIpKSB0ZXN0X0NvbnN0cnVjdG9ySSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT0xFLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PTEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNkM2ZhYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PTEUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PTEUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT0xFCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT0xFIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dUIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PTEUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Vycm9ySSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZXJyb3JJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXJyb3JJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZXJyb3JJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbmRQcm9ncmFtSURMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZmluZFByb2dyYW1JRExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNPbGVGaWxlTGphdmFfaW9fRmlsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaXNPbGVGaWxlTGphdmFfaW9fRmlsZSBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PTEUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXJyb3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcnJvcklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maW5kUHJvZ3JhbUlETGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzT2xlRmlsZUxqYXZhX2lvX0ZpbGUiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dULm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcnJvckkiKSkgdGVzdF9lcnJvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Vycm9ySUkiKSkgdGVzdF9lcnJvcklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maW5kUHJvZ3JhbUlETGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9maW5kUHJvZ3JhbUlETGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzT2xlRmlsZUxqYXZhX2lvX0ZpbGUiKSkgdGVzdF9pc09sZUZpbGVMamF2YV9pb19GaWxlKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYjI3NzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVBdXRvbWF0aW9uCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUF1dG9tYXRpb24KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kaXNwb3NlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RG9jdW1lbnRhdGlvbkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERvY3VtZW50YXRpb25JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RnVuY3Rpb25EZXNjcmlwdGlvbkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZ1bmN0aW9uRGVzY3JpcHRpb25JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SGVscEZpbGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRIZWxwRmlsZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJRHNPZk5hbWVzJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJRHNPZk5hbWVzJExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGFzdEVycm9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRMYXN0RXJyb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXROYW1lSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TmFtZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXROYW1lc0lJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXROYW1lc0lJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvcGVydHlEZXNjcmlwdGlvbkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFByb3BlcnR5RGVzY3JpcHRpb25JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvcGVydHlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQcm9wZXJ0eUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VHlwZUluZm9BdHRyaWJ1dGVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUeXBlSW5mb0F0dHJpYnV0ZXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnZva2VJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnZva2VJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW52b2tlSSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW52b2tlSSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnZva2VOb1JlcGx5SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW52b2tlTm9SZXBseUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnZva2VOb1JlcGx5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnZva2VOb1JlcGx5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnZva2VOb1JlcGx5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERvY3VtZW50YXRpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGdW5jdGlvbkRlc2NyaXB0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVscEZpbGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJRHNPZk5hbWVzJExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMYXN0RXJyb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE5hbWVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXROYW1lc0lJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcm9wZXJ0eURlc2NyaXB0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJvcGVydHlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VHlwZUluZm9BdHRyaWJ1dGVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnZva2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludm9rZUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnZva2VOb1JlcGx5SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERvY3VtZW50YXRpb25JIikpIHRlc3RfZ2V0RG9jdW1lbnRhdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZ1bmN0aW9uRGVzY3JpcHRpb25JIikpIHRlc3RfZ2V0RnVuY3Rpb25EZXNjcmlwdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlbHBGaWxlSSIpKSB0ZXN0X2dldEhlbHBGaWxlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SURzT2ZOYW1lcyRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2dldElEc09mTmFtZXMkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExhc3RFcnJvciIpKSB0ZXN0X2dldExhc3RFcnJvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TmFtZUkiKSkgdGVzdF9nZXROYW1lSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TmFtZXNJSSIpKSB0ZXN0X2dldE5hbWVzSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByb3BlcnR5RGVzY3JpcHRpb25JIikpIHRlc3RfZ2V0UHJvcGVydHlEZXNjcmlwdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByb3BlcnR5SSIpKSB0ZXN0X2dldFByb3BlcnR5SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKSkgdGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSIpKSB0ZXN0X2dldFByb3BlcnR5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFR5cGVJbmZvQXR0cmlidXRlcyIpKSB0ZXN0X2dldFR5cGVJbmZvQXR0cmlidXRlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW52b2tlSSIpKSB0ZXN0X2ludm9rZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludm9rZUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpKSB0ZXN0X2ludm9rZUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW52b2tlSSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkiKSkgdGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW52b2tlTm9SZXBseUkiKSkgdGVzdF9pbnZva2VOb1JlcGx5SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpKSB0ZXN0X2ludm9rZU5vUmVwbHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludm9rZU5vUmVwbHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSIpKSB0ZXN0X2ludm9rZU5vUmVwbHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKSkgdGVzdF9zZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpKSB0ZXN0X3NldFByb3BlcnR5SUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3MTdkNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUNsaWVudFNpdGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ2xpZW50U2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2lvX0ZpbGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9pb19GaWxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmdMamF2YV9pb19GaWxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmdMamF2YV9pb19GaWxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVhY3RpdmF0ZUluUGxhY2VDbGllbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RlYWN0aXZhdGVJblBsYWNlQ2xpZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZG9WZXJiSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZG9WZXJiSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2V4ZWNJSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9leGVjSUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEluZGVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW5kZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvZ3JhbUlEKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQcm9ncmFtSUQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0RpcnR5KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pc0RpcnR5IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNGb2N1c0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2lzRm9jdXNDb250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcXVlcnlTdGF0dXNJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9xdWVyeVN0YXR1c0kgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zYXZlTGphdmFfaW9fRmlsZVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NhdmVMamF2YV9pb19GaWxlWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEluZGVudExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbmRlbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dQcm9wZXJ0aWVzTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3Nob3dQcm9wZXJ0aWVzTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9pb19GaWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2lvX0ZpbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RlYWN0aXZhdGVJblBsYWNlQ2xpZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kb1ZlcmJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9leGVjSUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW5kZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcm9ncmFtSUQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRGlydHkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRm9jdXNDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9xdWVyeVN0YXR1c0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NhdmVMamF2YV9pb19GaWxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW5kZW50TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dQcm9wZXJ0aWVzTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9pb19GaWxlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2lvX0ZpbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfaW9fRmlsZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2lvX0ZpbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RlYWN0aXZhdGVJblBsYWNlQ2xpZW50IikpIHRlc3RfZGVhY3RpdmF0ZUluUGxhY2VDbGllbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RvVmVyYkkiKSkgdGVzdF9kb1ZlcmJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9leGVjSUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpKSB0ZXN0X2V4ZWNJSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbmRlbnQiKSkgdGVzdF9nZXRJbmRlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByb2dyYW1JRCIpKSB0ZXN0X2dldFByb2dyYW1JRCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNEaXJ0eSIpKSB0ZXN0X2lzRGlydHkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRm9jdXNDb250cm9sIikpIHRlc3RfaXNGb2N1c0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3F1ZXJ5U3RhdHVzSSIpKSB0ZXN0X3F1ZXJ5U3RhdHVzSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2F2ZUxqYXZhX2lvX0ZpbGVaIikpIHRlc3Rfc2F2ZUxqYXZhX2lvX0ZpbGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbmRlbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X3NldEluZGVudExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93UHJvcGVydGllc0xqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2hvd1Byb3BlcnRpZXNMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ29udHJvbFNpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNvbnRyb2xTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNGRhOGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ29udHJvbFNpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ29udHJvbFNpdGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ29udHJvbFNpdGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDb250cm9sU2l0ZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDb250cm9sU2l0ZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZEV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkUHJvcGVydHlMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkUHJvcGVydHlMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJhY2tncm91bmQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRGb250IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Rm9yZWdyb3VuZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNpdGVQcm9wZXJ0eUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNpdGVQcm9wZXJ0eUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlESUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVQcm9wZXJ0eUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVQcm9wZXJ0eUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpdGVQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTaXRlUHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDb250cm9sU2l0ZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRXZlbnRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNpdGVQcm9wZXJ0eUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2l0ZVByb3BlcnR5SUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkRXZlbnRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpKSB0ZXN0X2FkZEV2ZW50TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIikpIHRlc3RfYWRkRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKSkgdGVzdF9hZGRQcm9wZXJ0eUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kIikpIHRlc3RfZ2V0QmFja2dyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udCIpKSB0ZXN0X2dldEZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvcmVncm91bmQiKSkgdGVzdF9nZXRGb3JlZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaXRlUHJvcGVydHlJIikpIHRlc3RfZ2V0U2l0ZVByb3BlcnR5SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRElMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRElMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlUHJvcGVydHlMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTaXRlUHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpKSB0ZXN0X3NldFNpdGVQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI1ZWI5MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGcmFtZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnJhbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlNmQ3Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGcmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVGcmFtZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVGcmFtZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZyYW1lIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZyYW1lKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udGFpbmVyTWVudXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRhaW5lck1lbnVzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsZU1lbnVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRGaWxlTWVudXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRXaW5kb3dNZW51cygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0V2luZG93TWVudXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb250YWluZXJNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldENvbnRhaW5lck1lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZpbGVNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZpbGVNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRXaW5kb3dNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFdpbmRvd01lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGcmFtZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRhaW5lck1lbnVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGaWxlTWVudXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFdpbmRvd01lbnVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250YWluZXJNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZpbGVNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFdpbmRvd01lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRhaW5lck1lbnVzIikpIHRlc3RfZ2V0Q29udGFpbmVyTWVudXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZpbGVNZW51cyIpKSB0ZXN0X2dldEZpbGVNZW51cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0V2luZG93TWVudXMiKSkgdGVzdF9nZXRXaW5kb3dNZW51cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q29udGFpbmVyTWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIikpIHRlc3Rfc2V0Q29udGFpbmVyTWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGaWxlTWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIikpIHRlc3Rfc2V0RmlsZU1lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0V2luZG93TWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIikpIHRlc3Rfc2V0V2luZG93TWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGdW5jdGlvbkRlc2NyaXB0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGdW5jdGlvbkRlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YTcyODMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnVuY3Rpb25EZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUZ1bmN0aW9uRGVzY3JpcHRpb24KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRnVuY3Rpb25EZXNjcmlwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZ1bmN0aW9uRGVzY3JpcHRpb24gZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnVuY3Rpb25EZXNjcmlwdGlvbihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnVuY3Rpb25EZXNjcmlwdGlvbigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZGM1YmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudCIpKSB0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVBhcmFtZXRlckRlc2NyaXB0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQYXJhbWV0ZXJEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDIwNjFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVBhcmFtZXRlckRlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlUGFyYW1ldGVyRGVzY3JpcHRpb24KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlUGFyYW1ldGVyRGVzY3JpcHRpb24KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQYXJhbWV0ZXJEZXNjcmlwdGlvbiBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQYXJhbWV0ZXJEZXNjcmlwdGlvbihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUGFyYW1ldGVyRGVzY3JpcHRpb24oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVByb3BlcnR5RGVzY3JpcHRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVByb3BlcnR5RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiOTFhNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQcm9wZXJ0eURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlUHJvcGVydHlEZXNjcmlwdGlvbgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVQcm9wZXJ0eURlc2NyaXB0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUHJvcGVydHlEZXNjcmlwdGlvbiBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQcm9wZXJ0eURlc2NyaXB0aW9uKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQcm9wZXJ0eURlc2NyaXB0aW9uKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YmQ1YmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5WYXJpYW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLlZhcmlhbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JGKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckYgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9ySSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySVMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9ySVMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JRGlzcGF0Y2goKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSURpc3BhdGNoIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JVW5rbm93bigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JVW5rbm93biBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JTKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvclMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvclooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rpc3Bvc2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBdXRvbWF0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRBdXRvbWF0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm9vbGVhbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Qm9vbGVhbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJ5UmVmKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCeVJlZiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERpc3BhdGNoKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREaXNwYXRjaCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZsb2F0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRGbG9hdCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2hvcnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNob3J0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUeXBlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUeXBlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VW5rbm93bigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VW5rbm93biBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJ5UmVmRigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QnlSZWZGIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QnlSZWZJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCeVJlZkkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCeVJlZlMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJ5UmVmUyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJ5UmVmWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QnlSZWZaIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JGIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySVMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSURpc3BhdGNoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lVbmtub3duIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yUyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBdXRvbWF0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb29sZWFuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCeVJlZiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGlzcGF0Y2giKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZsb2F0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNob3J0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFR5cGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFVua25vd24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJ5UmVmRiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QnlSZWZJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCeVJlZlMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJ5UmVmWiIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yRiIpKSB0ZXN0X0NvbnN0cnVjdG9yRigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJIikpIHRlc3RfQ29uc3RydWN0b3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklTIikpIHRlc3RfQ29uc3RydWN0b3JJUygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSURpc3BhdGNoIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JRGlzcGF0Y2goKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSVVua25vd24iKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lVbmtub3duKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24iKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yUyIpKSB0ZXN0X0NvbnN0cnVjdG9yUygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JaIikpIHRlc3RfQ29uc3RydWN0b3JaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QXV0b21hdGlvbiIpKSB0ZXN0X2dldEF1dG9tYXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvb2xlYW4iKSkgdGVzdF9nZXRCb29sZWFuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCeVJlZiIpKSB0ZXN0X2dldEJ5UmVmKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREaXNwYXRjaCIpKSB0ZXN0X2dldERpc3BhdGNoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGbG9hdCIpKSB0ZXN0X2dldEZsb2F0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbnQiKSkgdGVzdF9nZXRJbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNob3J0IikpIHRlc3RfZ2V0U2hvcnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0cmluZyIpKSB0ZXN0X2dldFN0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VHlwZSIpKSB0ZXN0X2dldFR5cGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFVua25vd24iKSkgdGVzdF9nZXRVbmtub3duKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCeVJlZkYiKSkgdGVzdF9zZXRCeVJlZkYoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJ5UmVmSSIpKSB0ZXN0X3NldEJ5UmVmSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QnlSZWZTIikpIHRlc3Rfc2V0QnlSZWZTKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCeVJlZloiKSkgdGVzdF9zZXRCeVJlZlooKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnREaWFsb2cuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY4MzM5NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnREaWFsb2cKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludERpYWxvZwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnREaWFsb2cgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZyB7Ci0JCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnREaWFsb2coU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXByaW50RGlhbG9nID0gbmV3IFByaW50RGlhbG9nKHNoZWxsLCBTV1QuTk9ORSk7Ci0Jc2V0RGlhbG9nKHByaW50RGlhbG9nKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpIHsKLQluZXcgUHJpbnREaWFsb2coc2hlbGwpOwotCQotCXRyeSB7Ci0JCW5ldyBQcmludERpYWxvZyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpIHsKLQluZXcgUHJpbnREaWFsb2coc2hlbGwsIFNXVC5OT05FKTsKLQkKLQl0cnkgewotCQluZXcgUHJpbnREaWFsb2cobnVsbCwgU1dULk5PTkUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RW5kUGFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RW5kUGFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByaW50VG9GaWxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQcmludFRvRmlsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNjb3BlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTY29wZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0YXJ0UGFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U3RhcnRQYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfb3BlbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfb3BlbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVuZFBhZ2VJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRFbmRQYWdlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFByaW50VG9GaWxlWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0UHJpbnRUb0ZpbGVaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2NvcGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTY29wZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTdGFydFBhZ2VJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTdGFydFBhZ2VJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50RGlhbG9nKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVuZFBhZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFByaW50VG9GaWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTY29wZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3RhcnRQYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9vcGVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmRQYWdlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UHJpbnRUb0ZpbGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTY29wZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFN0YXJ0UGFnZUkiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVuZFBhZ2UiKSkgdGVzdF9nZXRFbmRQYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcmludFRvRmlsZSIpKSB0ZXN0X2dldFByaW50VG9GaWxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTY29wZSIpKSB0ZXN0X2dldFNjb3BlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdGFydFBhZ2UiKSkgdGVzdF9nZXRTdGFydFBhZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW4iKSkgdGVzdF9vcGVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFbmRQYWdlSSIpKSB0ZXN0X3NldEVuZFBhZ2VJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRQcmludFRvRmlsZVoiKSkgdGVzdF9zZXRQcmludFRvRmlsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNjb3BlSSIpKSB0ZXN0X3NldFNjb3BlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U3RhcnRQYWdlSSIpKSB0ZXN0X3NldFN0YXJ0UGFnZUkoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi0JUHJpbnREaWFsb2cgcHJpbnREaWFsb2c7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmZlMzA3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlTdHJpbmcgZGV0YWlsID0gIiI7Ci0JaWYgKFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCkgPT0gbnVsbCkgewotCQkvKiBUaGVyZSBhcmVuJ3QgYW55IHByaW50ZXJzLCBzbyB2ZXJpZnkgdGhhdCB0aGUKLQkJICogY29uc3RydWN0b3IgdGhyb3dzIGFuIEVSUk9SX05PX0hBTkRMRVMgU1dURXJyb3IuCi0JCSAqLwotCQl0cnkgewotCQkJUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoKTsKLQkJCXByaW50ZXIuZGlzcG9zZSgpOwotCQl9IGNhdGNoIChTV1RFcnJvciBleCkgewotCQkJaWYgKGV4LmNvZGUgPT0gU1dULkVSUk9SX05PX0hBTkRMRVMpIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiRVJST1JfTk9fSEFORExFUyBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9IGVsc2UgewotCQkvKiBUaGVyZSBpcyBhdCBsZWFzdCBhIGRlZmF1bHQgcHJpbnRlciwgc28gdmVyaWZ5IHRoYXQKLQkJICogdGhlIGNvbnN0cnVjdG9yIGRvZXMgbm90IHRocm93IGFueSBleGNlcHRpb25zLgotCQkgKi8KLQkJdHJ5IHsKLQkJCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKCk7Ci0JCQlwcmludGVyLmRpc3Bvc2UoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQkJZGV0YWlsID0gZXguZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWFzc2VydEZhbHNlKCJFeGNlcHRpb24gdGhyb3duOiAiICsgZGV0YWlsLCBleGNlcHRpb25UaHJvd24pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlTdHJpbmcgZGV0YWlsID0gIiI7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JaWYgKGRhdGEgPT0gbnVsbCkgewotCQkvKiBUaGVyZSBhcmVuJ3QgYW55IHByaW50ZXJzLCBzbyB2ZXJpZnkgdGhhdCB0aGUKLQkJICogY29uc3RydWN0b3IgdGhyb3dzIGFuIEVSUk9SX05PX0hBTkRMRVMgU1dURXJyb3IuCi0JCSAqLwotCQl0cnkgewotCQkJUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoZGF0YSk7Ci0JCQlwcmludGVyLmRpc3Bvc2UoKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZXgpIHsKLQkJCWlmIChleC5jb2RlID09IFNXVC5FUlJPUl9OT19IQU5ETEVTKSBleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIkVSUk9SX05PX0hBTkRMRVMgbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JfSBlbHNlIHsKLQkJLyogVGhlcmUgaXMgYXQgbGVhc3QgYSBkZWZhdWx0IHByaW50ZXIsIHNvIHZlcmlmeSB0aGF0Ci0JCSAqIHRoZSBjb25zdHJ1Y3RvciBkb2VzIG5vdCB0aHJvdyBhbnkgZXhjZXB0aW9ucy4KLQkJICovCi0JCXRyeSB7Ci0JCQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQkJCXByaW50ZXIuZGlzcG9zZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCQlkZXRhaWwgPSBleC5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJYXNzZXJ0RmFsc2UoIkV4Y2VwdGlvbiB0aHJvd246ICIgKyBkZXRhaWwsIGV4Y2VwdGlvblRocm93bik7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NhbmNlbEpvYigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY2FuY2VsSm9iIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCkgewotCVByaW50ZXJEYXRhIGRhdGEgPSBQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpOwotCS8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIGRvbid0IGRvIHRoaXMgdGVzdAotCWlmIChkYXRhID09IG51bGwpIHJldHVybjsKLQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQlSZWN0YW5nbGUgdHJpbSA9IHByaW50ZXIuY29tcHV0ZVRyaW0oMCwgMCwgMTAsIDEwKTsKLQlhc3NlcnRUcnVlKCJ0cmltIHdpZHRoIG9yIGhlaWdodCBpcyBpbmNvcnJlY3QiLCB0cmltLndpZHRoID49IDEwICYmIHRyaW0uaGVpZ2h0ID49IDEwKTsKLQlwcmludGVyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lbmRKb2IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2VuZEpvYiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VuZFBhZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2VuZFBhZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JLy8gaWYgdGhlcmUgYXJlbid0IGFueSBwcmludGVycywgZG9uJ3QgZG8gdGhpcyB0ZXN0Ci0JaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuOwotCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotCVJlY3RhbmdsZSBib3VuZHMgPSBwcmludGVyLmdldEJvdW5kcygpOwotCWFzc2VydFRydWUoImJvdW5kcyB3aWR0aCBvciBoZWlnaHQgaXMgemVybyIsIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCXByaW50ZXIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JLy8gaWYgdGhlcmUgYXJlbid0IGFueSBwcmludGVycywgZG9uJ3QgZG8gdGhpcyB0ZXN0Ci0JaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuOwotCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gcHJpbnRlci5nZXRDbGllbnRBcmVhKCk7Ci0JYXNzZXJ0VHJ1ZSgiY2xpZW50QXJlYSB3aWR0aCBvciBoZWlnaHQgaXMgemVybyIsIGNsaWVudEFyZWEud2lkdGggPiAwICYmIGNsaWVudEFyZWEuaGVpZ2h0ID4gMCk7Ci0JcHJpbnRlci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RFBJKCkgewotCVByaW50ZXJEYXRhIGRhdGEgPSBQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpOwotCS8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIGRvbid0IGRvIHRoaXMgdGVzdAotCWlmIChkYXRhID09IG51bGwpIHJldHVybjsKLQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQlQb2ludCBkcGkgPSBwcmludGVyLmdldERQSSgpOwotCWFzc2VydFRydWUoImRwaSB4IG9yIHkgaXMgemVybyIsIGRwaS54ID4gMCAmJiBkcGkueSA+IDApOwotCXByaW50ZXIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERlZmF1bHRQcmludGVyRGF0YSgpIHsKLQkvLyBUZXN0ZWQgaW4gdGVzdF9nZXRQcmludGVyRGF0YS4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQcmludGVyRGF0YSgpIHsKLQlQcmludGVyRGF0YSBkYXRhID0gUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKTsKLQkvLyBpZiB0aGVyZSBhcmVuJ3QgYW55IHByaW50ZXJzLCBkb24ndCBkbyB0aGlzIHRlc3QKLQlpZiAoZGF0YSA9PSBudWxsKSByZXR1cm47Ci0JUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoZGF0YSk7Ci0JYXNzZXJ0VHJ1ZSgiZ2V0UHJpbnRlckRhdGEgIT0gZGF0YSB1c2VkIGluIGNvbnN0cnVjdG9yIiwKLQkJCWRhdGEgPT0gcHJpbnRlci5nZXRQcmludGVyRGF0YSgpKTsKLQlwcmludGVyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQcmludGVyTGlzdCgpIHsKLQlQcmludGVyRGF0YSBkYXRhID0gUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKTsKLQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCS8qIElmIHRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIHZlcmlmeSB0aGF0IHRoZQotCQkgKiBwcmludGVyIGxpc3QgaXMgZW1wdHkuCi0JCSAqLwotCQlQcmludGVyRGF0YSBsaXN0W10gPSBQcmludGVyLmdldFByaW50ZXJMaXN0KCk7Ci0JCWFzc2VydFRydWUoInByaW50ZXIgbGlzdCBjb250YWlucyBpdGVtcyBldmVuIHRob3VnaCB0aGVyZSBhcmUgbm8gcHJpbnRlcnMiLAotCQkJCWxpc3QubGVuZ3RoID09IDApOwotCX0gZWxzZSB7Ci0JCS8qIElmIHRoZXJlIGlzIGF0IGxlYXN0IGEgZGVmYXVsdCBwcmludGVyLCB2ZXJpZnkKLQkJICogdGhhdCB0aGUgcHJpbnRlciBsaXN0IGlzIG5vdCBlbXB0eS4KLQkJICovCi0JCVByaW50ZXJEYXRhIGxpc3RbXSA9IFByaW50ZXIuZ2V0UHJpbnRlckxpc3QoKTsKLQkJYXNzZXJ0VHJ1ZSgicHJpbnRlciBsaXN0IGlzIGVtcHR5IiwgbGlzdC5sZW5ndGggPiAwKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N0YXJ0Sm9iTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3N0YXJ0Sm9iTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zdGFydFBhZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3N0YXJ0UGFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2FuY2VsSm9iIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlVHJpbUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VuZEpvYiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZW5kUGFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDbGllbnRBcmVhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREUEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlZmF1bHRQcmludGVyRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJpbnRlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFByaW50ZXJMaXN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc3RhcnRKb2JMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc3RhcnRQYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2FuY2VsSm9iIikpIHRlc3RfY2FuY2VsSm9iKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlVHJpbUlJSUkiKSkgdGVzdF9jb21wdXRlVHJpbUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VuZEpvYiIpKSB0ZXN0X2VuZEpvYigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZW5kUGFnZSIpKSB0ZXN0X2VuZFBhZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpZW50QXJlYSIpKSB0ZXN0X2dldENsaWVudEFyZWEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERQSSIpKSB0ZXN0X2dldERQSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGVmYXVsdFByaW50ZXJEYXRhIikpIHRlc3RfZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcmludGVyRGF0YSIpKSB0ZXN0X2dldFByaW50ZXJEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcmludGVyTGlzdCIpKSB0ZXN0X2dldFByaW50ZXJMaXN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc3RhcnRKb2JMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3N0YXJ0Sm9iTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N0YXJ0UGFnZSIpKSB0ZXN0X3N0YXJ0UGFnZSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmU2MWE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50ZXJEYXRhCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnRlckRhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJEYXRhIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IG5ldyBQcmludGVyRGF0YSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKLQlQcmludGVyRGF0YSBkYXRhID0gbmV3IFByaW50ZXJEYXRhKCJoZWxsbyIsICJ0aGVyZSIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCVByaW50ZXJEYXRhIGRhdGEgPSBuZXcgUHJpbnRlckRhdGEoKTsKLQlhc3NlcnROb3ROdWxsKGRhdGEudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcm9ncmFtX1Byb2dyYW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJvZ3JhbV9Qcm9ncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OGU1Y2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcm9ncmFtX1Byb2dyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLlByb2dyYW0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLlByb2dyYW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3Byb2dyYW1fUHJvZ3JhbSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotCXByaXZhdGUgRGlzcGxheSBkaXNwbGF5OwotCQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3Byb2dyYW1fUHJvZ3JhbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JU3RyaW5nW10gZXh0ZW5zaW9ucyA9IFByb2dyYW0uZ2V0RXh0ZW5zaW9ucygpOwotCS8vIE5vIGFzc2VydGlvbiBoZXJlIGJlY2F1c2UgdGhlIGRvYyBkb2VzIG5vdCBndWFyYW50ZWUgYSBub24tbnVsbCByZXN1bHQuCi0JaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpPTA7IGk8ZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJUHJvZ3JhbSBwcm9ncmFtID0gUHJvZ3JhbS5maW5kUHJvZ3JhbShleHRlbnNpb25zW2ldKTsKLQkJCWlmIChwcm9ncmFtICE9IG51bGwpIHsKLQkJCQlhc3NlcnRUcnVlKHByb2dyYW0uZXF1YWxzKHByb2dyYW0pKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCi0JLy8gVGhpcyB0ZXN0IGlzIGluY29tcGxldGUgYmVjYXVzZSBhIHRydWUgdGVzdCBvZiBleGVjdXRlIHdvdWxkIG9wZW4KLQkvLyBhbiBhcHBsaWNhdGlvbiB0aGF0IGNhbm5vdCBiZSBwcm9ncmFtbWF0aWNhbGx5IGNsb3NlZC4KLQkKLQl0cnkgewotCQlQcm9ncmFtW10gcHJvZ3JhbXMgPSBQcm9ncmFtLmdldFByb2dyYW1zKCk7Ci0JCWlmIChwcm9ncmFtcyAhPSBudWxsICYmIHByb2dyYW1zLmxlbmd0aCA+IDApIHsKLQotCQkJLy8gQ2Fubm90IHRlc3QgZW1wdHkgc3RyaW5nIGFyZ3VtZW50IGJlY2F1c2UgaXQgbWF5IGxhdW5jaCBzb21ldGhpbmcuCi0JCQkvL2Jvb2xlYW4gcmVzdWx0ID0gcHJvZ3JhbXNbMF0uZXhlY3V0ZSgiIik7Ci0JCQkvL2Fzc2VydEZhbHNlKHJlc3VsdCk7Ci0JCQkKLQkJCS8vIHRlc3QgbnVsbCBhcmd1bWVudAotCQkJCQotCQkJcHJvZ3JhbXNbMF0uZXhlY3V0ZShudWxsKTsKLQkJCWZhaWwoIkZhaWxlZCB0byB0aHJvdyBFUlJPUl9OVUxMX0FSR1VNRU5UIik7Ci0JCX0KLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byB0aHJvdyBFUlJPUl9OVUxMX0FSR1VNRU5UIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9maW5kUHJvZ3JhbUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSBQcm9ncmFtLmdldEV4dGVuc2lvbnMoKTsKLQkvLyBObyBhc3NlcnRpb24gaGVyZSBiZWNhdXNlIHRoZSBkb2MgZG9lcyBub3QgZ3VhcmFudGVlIGEgbm9uLW51bGwgcmVzdWx0LgotCWlmIChleHRlbnNpb25zICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaT0wOyBpPGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCVByb2dyYW0gcHJvZ3JhbSA9IFByb2dyYW0uZmluZFByb2dyYW0oZXh0ZW5zaW9uc1tpXSk7Ci0JCQkvLyBObyBhc3NlcnRpb24gaGVyZSBiZWNhdXNlIGEgbnVsbCByZXN1bHQgaXMgYWxsb3dlZC4KLQkJfQotCX0KLQkKLQl0cnkgewotCQlQcm9ncmFtIHByb2dyYW0gPSBQcm9ncmFtLmZpbmRQcm9ncmFtKG51bGwpOwotCQlmYWlsKCJGYWlsZWQgdG8gdGhyb3cgRVJST1JfTlVMTF9BUkdVTUVOVCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIHRocm93IEVSUk9SX05VTExfQVJHVU1FTlQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJZmFpbCgiSW52YWxpZCBFeGNlcHRpb24gdGhyb3duIG9mIHR5cGUgIitlLmdldENsYXNzKCkpOwotCX0gY2F0Y2ggKEVycm9yIGUpIHsKLQkJZmFpbCgiSW52YWxpZCBFcnJvciB0aHJvd24gb2YgdHlwZSAiK2UuZ2V0Q2xhc3MoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEV4dGVuc2lvbnMoKSB7Ci0JU3RyaW5nW10gZXh0ZW5zaW9ucyA9IFByb2dyYW0uZ2V0RXh0ZW5zaW9ucygpOwotCS8vIE5vIGFzc2VydGlvbiBoZXJlIGJlY2F1c2UgdGhlIGRvYyBkb2VzIG5vdCBndWFyYW50ZWUgYSBub24tbnVsbCByZXN1bHQuCi0JaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpPTA7IGk8ZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0Tm90TnVsbChleHRlbnNpb25zW2ldKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZURhdGEoKSB7Ci0JU3RyaW5nW10gZXh0ZW5zaW9ucyA9IFByb2dyYW0uZ2V0RXh0ZW5zaW9ucygpOwotCS8vIE5vIGFzc2VydGlvbiBoZXJlIGJlY2F1c2UgdGhlIGRvYyBkb2VzIG5vdCBndWFyYW50ZWUgYSBub24tbnVsbCByZXN1bHQuCi0JaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpPTA7IGk8ZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJUHJvZ3JhbSBwcm9ncmFtID0gUHJvZ3JhbS5maW5kUHJvZ3JhbShleHRlbnNpb25zW2ldKTsKLQkJCWlmIChwcm9ncmFtICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgZGF0YSA9IHByb2dyYW0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJLy8gTm90aGluZyB0byBkby4KLQkJCX0KLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXROYW1lKCkgewotCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSBQcm9ncmFtLmdldEV4dGVuc2lvbnMoKTsKLQkvLyBObyBhc3NlcnRpb24gaGVyZSBiZWNhdXNlIHRoZSBkb2MgZG9lcyBub3QgZ3VhcmFudGVlIGEgbm9uLW51bGwgcmVzdWx0LgotCWlmIChleHRlbnNpb25zICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaT0wOyBpPGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCVByb2dyYW0gcHJvZ3JhbSA9IFByb2dyYW0uZmluZFByb2dyYW0oZXh0ZW5zaW9uc1tpXSk7Ci0JCQlpZiAocHJvZ3JhbSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBwcm9ncmFtLmdldE5hbWUoKTsKLQkJCQlhc3NlcnROb3ROdWxsKCJQcm9ncmFtIGhhcyBudWxsIG5hbWUiLG5hbWUpOwotCQkJfQotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByb2dyYW1zKCkgewotCVByb2dyYW1bXSBwcm9ncmFtcyA9IFByb2dyYW0uZ2V0UHJvZ3JhbXMoKTsKLQkKLQkvLyBUaGUgcmVzdWx0IGlzIG5vdCB3ZWxsLWRvY3VtZW50ZWQsIGJ1dCBpdCBzaG91bGQgCi0JLy8gYmUgbm9uLW51bGwgYW5kIGNvbnRhaW4gbm8gbnVsbCBlbnRyaWVzLgotCQotCWFzc2VydE5vdE51bGwocHJvZ3JhbXMpOwotCQotCUhhc2h0YWJsZSBsb29rdXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JZm9yIChpbnQgaT0wOyBpPHByb2dyYW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQotCQkvLyB0ZXN0IG5vbi1udWxsIGVudHJ5Ci0JCWFzc2VydE5vdE51bGwocHJvZ3JhbXNbaV0pOwotCQkKLQkJLy8gdGVzdCB1bmlxdWUgaGFzaCBjb2RlCi0JCWludCBoYXNoQ29kZSA9IHByb2dyYW1zW2ldLmhhc2hDb2RlKCk7Ci0JCUludGVnZXIga2V5ID0gbmV3IEludGVnZXIoaGFzaENvZGUpOwotCQlpZiAobG9va3VwLmNvbnRhaW5zKGtleSkpIHsKLQkJCWZhaWwoIkR1cGxpY2F0ZSBoYXNoIGNvZGUgZm9yICIrcHJvZ3JhbXNbaV0rIiAoc2FtZSBhcyAiKyhQcm9ncmFtKWxvb2t1cC5nZXQoa2V5KSsiKSIpOwotCQl9Ci0JCWVsc2UgewotCQkJbG9va3VwLnB1dChrZXkscHJvZ3JhbXNbaV0pOwotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2dldFByb2dyYW1zCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF1bmNoTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0KLQkvLyBUaGlzIHRlc3QgaXMgaW5jb21wbGV0ZSBiZWNhdXNlIGEgdHJ1ZSB0ZXN0IG9mIGxhdW5jaCB3b3VsZCBvcGVuCi0JLy8gYW4gYXBwbGljYXRpb24gdGhhdCBjYW5ub3QgYmUgcHJvZ3JhbW1hdGljYWxseSBjbG9zZWQuCi0JCi0JLy8gQ2Fubm90IHRlc3QgZW1wdHkgc3RyaW5nIGFyZ3VtZW50IGJlY2F1c2UgaXQgbWF5IGxhdW5jaCBzb21ldGhpbmcuCi0JCi0JLy8gdGVzdCBudWxsIGFyZ3VtZW50Ci0JCi0JdHJ5IHsKLQkJUHJvZ3JhbS5sYXVuY2gobnVsbCk7Ci0JCWZhaWwoIkZhaWxlZCB0byB0aHJvdyBFUlJPUl9OVUxMX0FSR1VNRU5UIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gdGhyb3cgRVJST1JfTlVMTF9BUkdVTUVOVCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JU3RyaW5nW10gZXh0ZW5zaW9ucyA9IFByb2dyYW0uZ2V0RXh0ZW5zaW9ucygpOwotCS8vIE5vIGFzc2VydGlvbiBoZXJlIGJlY2F1c2UgdGhlIGRvYyBkb2VzIG5vdCBndWFyYW50ZWUgYSBub24tbnVsbCByZXN1bHQuCi0JaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpPTA7IGk8ZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJUHJvZ3JhbSBwcm9ncmFtID0gUHJvZ3JhbS5maW5kUHJvZ3JhbShleHRlbnNpb25zW2ldKTsKLQkJCWlmIChwcm9ncmFtICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgc3RyaW5nID0gcHJvZ3JhbS50b1N0cmluZygpOwotCQkJCWFzc2VydE5vdE51bGwoInRvU3RyaW5nIHJldHVybmVkIG51bGwiLHN0cmluZyk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3Byb2dyYW1fUHJvZ3JhbSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFeHRlbnNpb25zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maW5kUHJvZ3JhbUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZURhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE5hbWUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFByb2dyYW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGF1bmNoTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2V4ZWN1dGVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2V4ZWN1dGVMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmluZFByb2dyYW1MamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2ZpbmRQcm9ncmFtTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEV4dGVuc2lvbnMiKSkgdGVzdF9nZXRFeHRlbnNpb25zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZURhdGEiKSkgdGVzdF9nZXRJbWFnZURhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE5hbWUiKSkgdGVzdF9nZXROYW1lKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcm9ncmFtcyIpKSB0ZXN0X2dldFByb2dyYW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXVuY2hMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2xhdW5jaExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MDlkZDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0J1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b24KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCi1CdXR0b24gYnV0dG9uOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlzZXRXaWRnZXQoYnV0dG9uKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCS8vIFRlc3QgQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULk5VTEwpOwotCi0JYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCi0JYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULkNIRUNLKTsKLQotCWJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5UT0dHTEUpOwotCi0JYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULkFSUk9XKTsKLQotCWJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIIHwgU1dULkNIRUNLKTsKLQotCXRyeSB7Ci0JCWJ1dHRvbiA9IG5ldyBCdXR0b24obnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfTsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJfTsKLQl9OwotCQotCXRyeSB7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkU2VsZWN0aW9uTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlidXR0b24ubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGxpc3RlbmVyQ2FsbGVkKTsKLQkKLQl0cnkgewotCQlidXR0b24ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JYnV0dG9uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlidXR0b24ubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRGYWxzZShsaXN0ZW5lckNhbGxlZCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0JYnV0dG9uLmNvbXB1dGVTaXplKDAsIDApOwotCi0JYnV0dG9uLmNvbXB1dGVTaXplKDAsIDAsIGZhbHNlKTsKLQotCWJ1dHRvbi5jb21wdXRlU2l6ZSgtMTAsIC0xMCk7Ci0KLQlidXR0b24uY29tcHV0ZVNpemUoLTEwLCAtMTAsIGZhbHNlKTsKLQotCWJ1dHRvbi5jb21wdXRlU2l6ZSgxMCwgMTApOwotCi0JYnV0dG9uLmNvbXB1dGVTaXplKDEwLCAxMCwgZmFsc2UpOwotCi0JYnV0dG9uLmNvbXB1dGVTaXplKDEwMDAwLCAxMDAwMCk7Ci0KLQlidXR0b24uY29tcHV0ZVNpemUoMTAwMDAsIDEwMDAwLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxpZ25tZW50KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEFsaWdubWVudEkoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRTZWxlY3Rpb25aCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpIHsKLQkvLyB0ZXN0ZWQgaW4gIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFsaWdubWVudEkoKSB7Ci0JYnV0dG9uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JYXNzZXJ0RXF1YWxzKFNXVC5MRUZULCBidXR0b24uZ2V0QWxpZ25tZW50KCkpOwotCi0JYnV0dG9uLnNldEFsaWdubWVudChTV1QuUklHSFQpOwotCWFzc2VydEVxdWFscyhTV1QuUklHSFQsIGJ1dHRvbi5nZXRBbGlnbm1lbnQoKSk7Ci0KLQlidXR0b24uc2V0QWxpZ25tZW50KFNXVC5DRU5URVIpOwotCWFzc2VydEVxdWFscyhTV1QuQ0VOVEVSLCBidXR0b24uZ2V0QWxpZ25tZW50KCkpOwotCi0JYnV0dG9uLnNldEFsaWdubWVudChTV1QuVVApOyAvLyBiYWQgdmFsdWUgZm9yIHB1c2ggYnV0dG9uCi0JYXNzZXJ0VHJ1ZShTV1QuVVAgIT0gYnV0dG9uLmdldEFsaWdubWVudCgpKTsKLQotCUJ1dHRvbiBhcnJvd0J1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5BUlJPVyk7Ci0JYXJyb3dCdXR0b24uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQlhc3NlcnRFcXVhbHMoU1dULkxFRlQsIGFycm93QnV0dG9uLmdldEFsaWdubWVudCgpKTsKLQotCWFycm93QnV0dG9uLnNldEFsaWdubWVudChTV1QuUklHSFQpOwotCWFzc2VydEVxdWFscyhTV1QuUklHSFQsIGFycm93QnV0dG9uLmdldEFsaWdubWVudCgpKTsKLQotCWFycm93QnV0dG9uLnNldEFsaWdubWVudChTV1QuVVApOwotCWFzc2VydEVxdWFscyhTV1QuVVAsIGFycm93QnV0dG9uLmdldEFsaWdubWVudCgpKTsKLQotCWFycm93QnV0dG9uLnNldEFsaWdubWVudChTV1QuRE9XTik7Ci0JYXNzZXJ0RXF1YWxzKFNXVC5ET1dOLCBhcnJvd0J1dHRvbi5nZXRBbGlnbm1lbnQoKSk7Ci0KLQlhcnJvd0J1dHRvbi5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7IC8vIGJhZCB2YWx1ZSBmb3IgYXJyb3cgYnV0dG9uCi0JYXNzZXJ0VHJ1ZShTV1QuQ0VOVEVSICE9IGFycm93QnV0dG9uLmdldEFsaWdubWVudCgpKTsKLQlhcnJvd0J1dHRvbi5kaXNwb3NlKCk7Ci0KLQlpbnQgYWxpZ25tZW50ID0gNTU7IC8vIHNvbWUgYm9ndXMgbnVtYmVyCi0JYnV0dG9uLnNldEFsaWdubWVudChhbGlnbm1lbnQpOwotCWFzc2VydFRydWUoYWxpZ25tZW50ICE9IGJ1dHRvbi5nZXRBbGlnbm1lbnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9jdXMoKSB7Ci0JQnV0dG9uIGJ0biA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5BUlJPVyk7Ci0JYnRuLnNldEZvY3VzKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCUltYWdlIGltYWdlID0gYnV0dG9uLmdldEltYWdlKCk7Ci0JYnV0dG9uLnNldEltYWdlKGltYWdlKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2UsIGJ1dHRvbi5nZXRJbWFnZSgpKTsKLQotCWJ1dHRvbi5zZXRJbWFnZShudWxsKTsKLQlhc3NlcnROdWxsKGJ1dHRvbi5nZXRJbWFnZSgpKTsKLQotCWltYWdlID0gbmV3IEltYWdlKHNoZWxsLmdldERpc3BsYXkoKSwgMTAsIDEwKTsKLQlidXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCWFzc2VydEVxdWFscyhpbWFnZSwgYnV0dG9uLmdldEltYWdlKCkpOwotCi0JYnV0dG9uLnNldEltYWdlKG51bGwpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlidXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCQlidXR0b24uc2V0SW1hZ2UobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGltYWdlIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uWigpIHsKLQkvLyB0ZXN0IHNldFNlbGVjdGlvbiBmb3IgY2hlY2sgYm94Ci0JYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULkNIRUNLKTsKLQlidXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWFzc2VydFRydWUoYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQlidXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCi0JLy8gdGVzdCBzZXRTZWxlY3Rpb24gZm9yIGFycm93IGJ1dHRvbgotCUJ1dHRvbiBuZXdCdXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuQVJST1cpOwotCW5ld0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSghbmV3QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQluZXdCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFuZXdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCW5ld0J1dHRvbi5kaXNwb3NlKCk7Ci0KLQkvLyB0ZXN0IHNldFNlbGVjdGlvbiBmb3IgcHVzaCBidXR0b24KLQluZXdCdXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JbmV3QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQlhc3NlcnRUcnVlKCFuZXdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCW5ld0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCWFzc2VydFRydWUoIW5ld0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JbmV3QnV0dG9uLmRpc3Bvc2UoKTsKLQotCS8vIHRlc3Qgc2V0U2VsZWN0aW9uIGZvciByYWRpbyBidXR0b24KLQluZXdCdXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUkFESU8pOwotCW5ld0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShuZXdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCW5ld0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCWFzc2VydFRydWUoIW5ld0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JbmV3QnV0dG9uLmRpc3Bvc2UoKTsKLQotCS8vIHRlc3Qgc2V0U2VsZWN0aW9uIGZvciB0b2dnbGUgYnV0dG9uCi0JbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlRPR0dMRSk7Ci0JbmV3QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQlhc3NlcnRUcnVlKG5ld0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JbmV3QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghbmV3QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQluZXdCdXR0b24uZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmdbXSBjYXNlcyA9IHsiIiwgInNvbWUgdGV4dCIsICJsZGthc2hkb2VodWZ3ZW92Y25oc2x2aHJlZ29qZWJja3JlYXZia3VoeGJpdWZ2Y3loYmlmdXlld3ZiaXVyZXlkLixjbW5lc2xqbGlld2pmY2h2YndvaWZpdmJld29yaXh1aWV1cnZiaXV2Ym9oZmxrc2plYWhmY2xpdXJlYWZneWNpYWJlbGl0dnlyd3RsaWN1eXJ0bGl1cmV5YmNsaXV5cmV1Y2V5dmJsaXVyZXliY3QiLCAiXG4gXG4gXGIgXHQgIiwgIlwwIn07Ci0JaW50IGdvb2RDYXNlcyA9IDQ7Ci0JZm9yIChpbnQgaT0wOyBpPGdvb2RDYXNlczsgaSsrKXsKLQkJYnV0dG9uLnNldFRleHQoY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCJnb29kIGNhc2U6ICIgKyBTdHJpbmcudmFsdWVPZihpKSwgYnV0dG9uLmdldFRleHQoKS5lcXVhbHMoY2FzZXNbaV0pKTsKLQl9OwotCi0JdHJ5IHsKLQkJYnV0dG9uLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRleHQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlidXR0b24uc2V0VGV4dCgiIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBbGlnbm1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFsaWdubWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvY3VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbloiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFsaWdubWVudCIpKSB0ZXN0X2dldEFsaWdubWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2UiKSkgdGVzdF9nZXRJbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEFsaWdubWVudEkiKSkgdGVzdF9zZXRBbGlnbm1lbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb2N1cyIpKSB0ZXN0X3NldEZvY3VzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbloiKSkgdGVzdF9zZXRTZWxlY3Rpb25aKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vL2N1c3RvbQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcChpbnQgc3R5bGUpIHsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIHN0eWxlKTsKLSAgICBzZXRXaWRnZXQoYnV0dG9uKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMCwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5DSEVDSyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULlJBRElPKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuVE9HR0xFKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQVJST1cpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICAKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQ0hFQ0spOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5SQURJTyk7Ci0gICAgYnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuVE9HR0xFKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQVJST1cpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiAoKSB7Ci0vLyAgICBkaWZmZXJlbmNlcyBiZXR3ZWVuIHB1c2ggYW5kIHRoZSByZXN0IG9mIHRoZSBidXR0b25zCi0vLwkgIGRpZmZlcmVudCBhY3Jvc3MgcGxhdGZvcm1zCi0vLyAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMywgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQ0hFQ0spOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEzLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5SQURJTyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTMsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULlRPR0dMRSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTMsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULkFSUk9XKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMywgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24gKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoJyAnLCAzMiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQ0hFQ0spOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoJyAnLCAzMiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuUkFESU8pOwotICAgIGJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgnICcsIDMyLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5UT0dHTEUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoJyAnLCAzMiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICAvL2Fycm93IGRvZXMgbm90IHByb2R1Y2UgYSB0cmF2ZXJzZSBtbmVtb25pYyBvbiB4cAotICAgIHNldFVwKFNXVC5BUlJPVyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgnICcsIDMyLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMCwgMjAsIDIwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQ0hFQ0spOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMTUsIDE1LCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuUkFESU8pOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMTUsIDE1LCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuVE9HR0xFKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDE1LCAxNSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULkFSUk9XKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDE1LCAxNSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlNjUxMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhcwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcyBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotQ2FudmFzIGNhbnZhczsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCAwKTsKLQlzdXBlci5zZXRXaWRnZXQoY2FudmFzKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0KFdpZGdldCB3KSB7Ci0JaWYgKCFjYW52YXMuaXNEaXNwb3NlZCgpKQotCQljYW52YXMuZGlzcG9zZSgpOwotCWNhbnZhcyA9IChDYW52YXMpdzsKLQlzdXBlci5zZXRXaWRnZXQodyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQlDYW52YXMgbmV3Q2FudmFzOwotCXRyeSB7Ci0JCW5ld0NhbnZhcyA9IG5ldyBDYW52YXMobnVsbCwgU1dULk5PTkUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2FyZXQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Q2FyZXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zY3JvbGxJSUlJSUlaKCkgewotCWNhbnZhcy5zY3JvbGwoMTAwLCAxMDAsIDAsIDAsIDUwLCA1MCwgZmFsc2UpOwotCWNhbnZhcy5zY3JvbGwoMTAwLCAxMDAsIDAsIDAsIDUwLCA1MCwgdHJ1ZSk7Ci0KLQljYW52YXMuc2Nyb2xsKDEwMDAwLCAxMDAwMCwgMTAwLCAxMDAsIDUwMCwgNTAwLCBmYWxzZSk7Ci0JY2FudmFzLnNjcm9sbCgxMDAwMCwgMTAwMDAsIDEwMCwgMTAwLCA1MDAsIDUwMCwgdHJ1ZSk7Ci0KLQljYW52YXMuc2Nyb2xsKC0xMDAsIC0xMDAsIDEwLCAxMCwgMzAsIDMwLCBmYWxzZSk7Ci0JY2FudmFzLnNjcm9sbCgtMTAwLCAtMTAwLCAxMCwgMTAsIDMwLCAzMCwgdHJ1ZSk7Ci0KLQljYW52YXMuc2Nyb2xsKDEwLCAxMCwgLTIwMCwgLTIwMCwgMTAwLCAxMDAsIGZhbHNlKTsKLQljYW52YXMuc2Nyb2xsKDEwLCAxMCwgLTIwMCwgLTIwMCwgMTAwLCAxMDAsIHRydWUpOwotCi0JY2FudmFzLnNjcm9sbCgxMDAsIDEwMCwgNTAsIDUwLCAtNTAsIC01MCwgZmFsc2UpOwotCWNhbnZhcy5zY3JvbGwoMTAwLCAxMDAsIDUwLCA1MCwgLTUwLCAtNTAsIHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENhcmV0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0KCkgewotCWludCBudW1iZXIgPSA1OwotCUNhcmV0W10gY2FyZXRzID0gbmV3IENhcmV0W251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljYXJldHNbaV0gPSBuZXcgQ2FyZXQoY2FudmFzLCBTV1QuTk9ORSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY2FudmFzLnNldENhcmV0KGNhcmV0c1tpXSk7Ci0JCWFzc2VydEVxdWFscygiQ2FyZXQgIyAiICsgaSArICJub3Qgc2V0IHByb3Blcmx5IiwgY2FudmFzLmdldENhcmV0KCksIGNhcmV0c1tpXSk7Ci0JfQotCi0JY2FudmFzLnNldENhcmV0KG51bGwpOwotCWFzc2VydE51bGwoIkNhcmV0IHNob3VsZCBiZSBudWxsIiAsIGNhbnZhcy5nZXRDYXJldCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCUZvbnREYXRhIGZvbnREYXRhID0gY2FudmFzLmdldEZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCUZvbnQgZm9udCA9IG5ldyBGb250KGNhbnZhcy5nZXREaXNwbGF5KCksIGZvbnREYXRhLmdldE5hbWUoKSwgOCwgZm9udERhdGEuZ2V0U3R5bGUoKSk7Ci0JY2FudmFzLnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY2FudmFzLmdldEZvbnQoKS5lcXVhbHMoZm9udCkpOwotCWNhbnZhcy5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDYXJldCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2Nyb2xsSUlJSUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2FyZXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2FyZXQiKSkgdGVzdF9nZXRDYXJldCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2Nyb2xsSUlJSUlJWiIpKSB0ZXN0X3Njcm9sbElJSUlJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENhcmV0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0IikpIHRlc3Rfc2V0Q2FyZXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tKi8KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEwLCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTAsIDIwLCAyMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmI5YjA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhcmV0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYXJldAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IHsKLQotQ2FudmFzIGNhbnZhczsKLUNhcmV0IGNhcmV0OwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JY2FudmFzID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULk5VTEwpOwotCWNhcmV0ID0gbmV3IENhcmV0KGNhbnZhcywgU1dULk5VTEwpOwotCXNldFdpZGdldChjYXJldCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzSSgpIHsKLQlDYXJldCBuZXdDYXJldDsKLQl0cnkgewotCQluZXdDYXJldCA9IG5ldyBDYXJldChudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQlSZWN0YW5nbGUgcmVjdCA9IG5ldyBSZWN0YW5nbGUoMCwwLDMwLDMwKTsKLQljYXJldC5zZXRCb3VuZHMocmVjdCk7Ci0JYXNzZXJ0VHJ1ZShjYXJldC5nZXRCb3VuZHMoKS5lcXVhbHMocmVjdCkpOwotCi0JcmVjdCA9IG5ldyBSZWN0YW5nbGUoMCwwLDMwLDMwKTsKLQljYXJldC5zZXRCb3VuZHMocmVjdCk7Ci0JYXNzZXJ0VHJ1ZSghY2FyZXQuZ2V0Qm91bmRzKCkuZXF1YWxzKG5ldyBSZWN0YW5nbGUgKDAsMCw2MCw3MCkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TG9jYXRpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKGNhbnZhcywgY2FyZXQuZ2V0UGFyZW50KCkpOwotCi0JYXNzZXJ0VHJ1ZShjYXJldC5nZXREaXNwbGF5KCk9PXNoZWxsLmdldERpc3BsYXkoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2l6ZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2l6ZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFZpc2libGUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VmlzaWJsZVoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1Zpc2libGUoKSB7Ci0JY2FyZXQuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCFjYXJldC5pc1Zpc2libGUoKSk7IC8vYmVjYXVzZSB0aGUgc2hlbGwgaXMgbm90IHZpc2libGUKLQotCWNhcmV0LnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydFRydWUoIWNhcmV0LmlzVmlzaWJsZSgpKTsKLQotCWNhcmV0LnNldFZpc2libGUodHJ1ZSk7Ci0JY2FudmFzLnNldFZpc2libGUodHJ1ZSk7Ci0Jc2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKGNhcmV0LmdldFZpc2libGUoKSA9PSB0cnVlKTsKLQljYW52YXMuc2V0VmlzaWJsZShmYWxzZSk7Ci0JaWYgKGZDaGVja1Zpc2liaWxpdHkpIHsKLQkJYXNzZXJ0VHJ1ZSghY2FyZXQuZ2V0VmlzaWJsZSgpKTsKLQl9Ci0KLQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQljYW52YXMuc2V0VmlzaWJsZShmYWxzZSk7Ci0JY2FyZXQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghY2FyZXQuZ2V0VmlzaWJsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCb3VuZHNJSUlJKCkgewotCWNhcmV0LnNldEJvdW5kcygwLCAwLCAzMCwgMzApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCWNhcmV0LnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKDAsMCwzMCwzMCkpOwotCi0JdHJ5IHsKLQkJY2FyZXQuc2V0Qm91bmRzKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBib3VuZHMgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlGb250IGZvbnQgPSBjYXJldC5nZXRGb250KCk7Ci0JY2FyZXQuc2V0Rm9udChmb250KTsKLQlhc3NlcnRFcXVhbHMoZm9udCwgY2FyZXQuZ2V0Rm9udCgpKTsKLQljYXJldC5zZXRGb250KG51bGwpOwotCQotCWZvbnQgPSBuZXcgRm9udChjYXJldC5nZXREaXNwbGF5KCksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWNhcmV0LnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0RXF1YWxzKGZvbnQsIGNhcmV0LmdldEZvbnQoKSk7Ci0KLQljYXJldC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWNhcmV0LnNldEZvbnQoZm9udCk7Ci0JCWNhcmV0LnNldEZvbnQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGZvbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBjYXJldC5nZXRJbWFnZSgpOwotCWNhcmV0LnNldEltYWdlKGltYWdlKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2UsIGNhcmV0LmdldEltYWdlKCkpOwotCi0JY2FyZXQuc2V0SW1hZ2UobnVsbCk7Ci0JYXNzZXJ0TnVsbChjYXJldC5nZXRJbWFnZSgpKTsKLQotCWltYWdlID0gbmV3IEltYWdlKHNoZWxsLmdldERpc3BsYXkoKSwgMTAsIDEwKTsKLQljYXJldC5zZXRJbWFnZShpbWFnZSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlLCBjYXJldC5nZXRJbWFnZSgpKTsKLQotCWNhcmV0LnNldEltYWdlKG51bGwpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQl0cnkgewotCQljYXJldC5zZXRJbWFnZShpbWFnZSk7Ci0JCWNhcmV0LnNldEltYWdlKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBpbWFnZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExvY2F0aW9uSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldExvY2F0aW9uSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2l6ZUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmlzaWJsZVooKSB7Ci0JY2FyZXQuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCJDYXJldCBzaG91bGQgYmUgdmlzaWJsZSIsIGNhcmV0LmdldFZpc2libGUoKT09dHJ1ZSk7Ci0KLQljYXJldC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCJDYXJldCBzaG91bGQgbm90IGJlIHZpc2libGUiLCBjYXJldC5nZXRWaXNpYmxlKCk9PWZhbHNlKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMb2NhdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaXplIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRWaXNpYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1Zpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJvdW5kc0lJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExvY2F0aW9uSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2l6ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXNJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250IikpIHRlc3RfZ2V0Rm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2UiKSkgdGVzdF9nZXRJbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9jYXRpb24iKSkgdGVzdF9nZXRMb2NhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaXplIikpIHRlc3RfZ2V0U2l6ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VmlzaWJsZSIpKSB0ZXN0X2dldFZpc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzVmlzaWJsZSIpKSB0ZXN0X2lzVmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Qm91bmRzSUlJSSIpKSB0ZXN0X3NldEJvdW5kc0lJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExvY2F0aW9uSUkiKSkgdGVzdF9zZXRMb2NhdGlvbklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNpemVJSSIpKSB0ZXN0X3NldFNpemVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmlzaWJsZVoiKSkgdGVzdF9zZXRWaXNpYmxlWigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbG9yRGlhbG9nLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29sb3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhhMGUzZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29sb3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db2xvckRpYWxvZwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29sb3JEaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29sb3JEaWFsb2cgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZyB7Ci0KLUNvbG9yRGlhbG9nIGNvbG9yRGlhbG9nOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db2xvckRpYWxvZyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JY29sb3JEaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2coc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXREaWFsb2coY29sb3JEaWFsb2cpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpIHsKLQluZXcgQ29sb3JEaWFsb2coc2hlbGwpOwotCQotCXRyeSB7Ci0JCW5ldyBDb2xvckRpYWxvZyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpIHsKLQluZXcgQ29sb3JEaWFsb2coc2hlbGwsIFNXVC5OVUxMKTsKLQkKLQl0cnkgewotCQluZXcgQ29sb3JEaWFsb2cobnVsbCwgU1dULk5VTEwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UkdCKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfb3BlbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfb3BlbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKCkgewotCVJHQiByZ2IgPSBuZXcgUkdCKDAsIDAsIDApOwotCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29sb3JEaWFsb2cuZ2V0UkdCKCkgPT0gbnVsbCk7CQotCQkKLQljb2xvckRpYWxvZy5zZXRSR0IocmdiKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBjb2xvckRpYWxvZy5nZXRSR0IoKSA9PSByZ2IpOwotCi0JY29sb3JEaWFsb2cuc2V0UkdCKG51bGwpOwotCWFzc2VydFRydWUoIjpjOiIsIGNvbG9yRGlhbG9nLmdldFJHQigpID09IG51bGwpOwkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db2xvckRpYWxvZygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSR0IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X29wZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSR0IiKSkgdGVzdF9nZXRSR0IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW4iKSkgdGVzdF9vcGVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSR0JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiIpKSB0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjlkNzUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm8KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi0JQ29tYm8gY29tYm87Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljb21ibyA9IG5ldyBDb21ibyhzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KGNvbWJvKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCWNvbWJvID0gbmV3IENvbWJvKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9IHtTV1QuRFJPUF9ET1dOLCBTV1QuU0lNUExFfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbWJvID0gbmV3IENvbWJvKHNoZWxsLCBjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBTdHJpbmcudmFsdWVPZihpKSwgKGNvbWJvLmdldFN0eWxlKCkgJiBjYXNlc1tpXSkgPT0gY2FzZXNbaV0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0cnkgewotCQljb21iby5hZGQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW0gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQljb21iby5hZGQoIiIpOwotCWFzc2VydEVxdWFscygiOmE6IiwgbmV3IFN0cmluZ1tdeyIifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci0JY29tYm8uYWRkKCIiKTsKLQlhc3NlcnRFcXVhbHMoIjpiOiIsIG5ldyBTdHJpbmdbXXsiIiwgIiJ9LCBjb21iby5nZXRJdGVtcygpKTsKLQljb21iby5hZGQoImZyZWQiKTsKLQlhc3NlcnRFcXVhbHMoIjpjOiIsIG5ldyBTdHJpbmdbXXsiIiwgIiIsICJmcmVkIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJKCkgewotCXRyeSB7Ci0JCWNvbWJvLmFkZChudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCWNvbWJvLmFkZCgic3RyaW5nIiwgLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCA8IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JY29tYm8uYWRkKCJzdHJpbmcwIiwgMCk7Ci0JdHJ5IHsKLQkJY29tYm8uYWRkKCJzdHJpbmcxIiwgMik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4ID4gc2l6ZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCi0JY29tYm8uYWRkKCJmcmVkIiwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCJmcmVkIiwgbmV3IFN0cmluZ1tdeyJmcmVkIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotCWNvbWJvLmFkZCgiZnJlZCIsIDApOwotCWFzc2VydEVxdWFscygiZnJlZCBmcmVkIiwgbmV3IFN0cmluZ1tdeyJmcmVkIiwgImZyZWQifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci0JY29tYm8uYWRkKCJmcmVkIik7Ci0JYXNzZXJ0RXF1YWxzKCJmcmVkIGZyZWQgZnJlZCIsIG5ldyBTdHJpbmdbXXsiZnJlZCIsICJmcmVkIiwgImZyZWQifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCi0JaW50IG51bWJlciA9IDM7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWNvbWJvLmFkZCgiZnJlZCIsIG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKCJmcmVkMCBmcmVkMSBmcmVkMiBmcmVkIiwgbmV3IFN0cmluZ1tdeyJmcmVkMCIsICJmcmVkMSIsICJmcmVkMiIsICJmcmVkIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotCi0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JbnVtYmVyID0gMzsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JY29tYm8uYWRkKCJmcmVkIiwgMSk7Ci0JYXNzZXJ0RXF1YWxzKCJmcmVkMCBmcmVkIGZyZWQxIGZyZWQyIiwgbmV3IFN0cmluZ1tdeyJmcmVkMCIsICJmcmVkIiwgImZyZWQxIiwgImZyZWQyIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotCWNvbWJvLmFkZCgiZnJlZCIsIDApOwotCWFzc2VydEVxdWFscygiZnJlZCBmcmVkMCBmcmVkIGZyZWQxIGZyZWQyIiwgbmV3IFN0cmluZ1tdeyJmcmVkIiwgImZyZWQwIiwgImZyZWQiLCAiZnJlZDEiLCAiZnJlZDIifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci0JY29tYm8uYWRkKCJmcmVkIiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKCJmcmVkIGZyZWQwIGZyZWQgZnJlZDEgZnJlZCBmcmVkMiIsIG5ldyBTdHJpbmdbXXsiZnJlZCIsICJmcmVkMCIsICJmcmVkIiwgImZyZWQxIiwgImZyZWQiLCAiZnJlZDIifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCU1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCXRyeSB7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCQotCS8vIHRlc3Qgd2hldGhlciBhbGwgY29udGVudCBtb2RpZnlpbmcgQVBJIG1ldGhvZHMgc2VuZCBhIE1vZGlmeSBldmVudAkKLQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQljb21iby5zZXRUZXh0KCJuZXcgdGV4dCIpOwkKLQlhc3NlcnRUcnVlKCJzZXRUZXh0IGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQljb21iby5yZW1vdmVNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCWNvbWJvLnNldFRleHQoImxpbmUiKTsJCi0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0JdHJ5IHsKLQkJY29tYm8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JdHJ5IHsKLQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JY29tYm8uc2VsZWN0KDApOwotCWFzc2VydFRydWUoIjphOiIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQljb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdHJ5IHsKLQkJY29tYm8ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbGVhclNlbGVjdGlvbigpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JY29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDAsIDApKSk7Ci0JY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCA1KSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgY29tYm8uZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgwLCAwKSkpOyAgLy9ub3RoaW5nIGlzIHNlbGVjdGVkCi0JY29tYm8uc2V0VGV4dCgic29tZSB0ZXh0Iik7Ci0JY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCA1KSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgY29tYm8uZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgwLCA1KSkpOwotCWNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgY29tYm8uZ2V0U2VsZWN0aW9uKCkueD09Y29tYm8uZ2V0U2VsZWN0aW9uKCkueSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0JLy8gc3VwZXIgY2xhc3MgdGVzdCBpcyBzdWZmaWNpZW50Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29weSgpIHsKLQljb21iby5zZXRUZXh0KCIxMjM0NTYiKTsKLQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDEsMykpOwotCWNvbWJvLmNvcHkoKTsKLQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsMCkpOwotCWNvbWJvLnBhc3RlKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0VGV4dCgpLmVxdWFscygiMjMxMjM0NTYiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY3V0KCkgewotCWNvbWJvLnNldFRleHQoIjEyMzQ1NiIpOwotCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMSwzKSk7Ci0JY29tYm8uY3V0KCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0VGV4dCgpLmVxdWFscygiMTQ1NiIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdEFsbCgpIHsKLQljb21iby5hZGQoIjEyMyIpOwotCWNvbWJvLmFkZCgiNDU2Iik7Ci0JY29tYm8uYWRkKCI3ODkiKTsKLQljb21iby5zZWxlY3QoMCk7Ci0JY29tYm8uc2VsZWN0KDIpOwotCWNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKT09IC0xKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RJKCkgewotCS8vIGluZGljZXMgb3V0IG9mIHJhbmdlIGFyZSBpZ25vcmVkCi0JU3RyaW5nW10gaXRlbXMgPSB7Iml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIn07Ci0JY29tYm8uc2V0SXRlbXMoaXRlbXMpOwotCWNvbWJvLnNlbGVjdCgxKTsKLQljb21iby5kZXNlbGVjdCgxMCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCWNvbWJvLnJlbW92ZUFsbCgpOwotCQotCWNvbWJvLmRlc2VsZWN0KDIpOwotCi0JaW50IG51bWJlciA9IDEwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLnNlbGVjdChpKTsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk9PWkpOwotCQljb21iby5kZXNlbGVjdChpKTsKLQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk9PS0xKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRyZW4oKSB7Ci0JLy8gQ29tYm8gY2Fubm90IGhhdmUgY2hpbGRyZW4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIGNvbWJvLmdldEl0ZW1Db3VudCgpID09IGkpOwotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JfQotCWFzc2VydFRydWUoIjphYToiLCBjb21iby5nZXRJdGVtQ291bnQoKSA9PSBudW1iZXIpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgY29tYm8uZ2V0SXRlbUNvdW50KCkgPT0gbnVtYmVyLWkpOwotCQljb21iby5yZW1vdmUoMCk7Ci0JfQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWFzc2VydFRydWUoIjpjOiIsIGNvbWJvLmdldEl0ZW1Db3VudCgpID09IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1IZWlnaHQoKSB7Ci0JY29tYm8uZ2V0SXRlbUhlaWdodCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCXRyeSB7Ci0JCWNvbWJvLmdldEl0ZW0oMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JaW50IG51bWJlciA9IDEwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRUcnVlKGNvbWJvLmdldEl0ZW0oaSkuZXF1YWxzKCJmcmVkIiArIGkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQljb21iby5yZW1vdmVBbGwoKTsKLQljb21iby5hZGQoIjEiKTsKLQljb21iby5hZGQoIjIiKTsKLQljb21iby5hZGQoIjMiKTsKLQlTdHJpbmdbXSBpdGVtcyA9IGNvbWJvLmdldEl0ZW1zKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgaXRlbXMubGVuZ3RoPT0zKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBpdGVtc1swXS5lcXVhbHMoIjEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgaXRlbXNbMV0uZXF1YWxzKCIyIikpOwotCWFzc2VydFRydWUoIjphOiIsIGl0ZW1zWzJdLmVxdWFscygiMyIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRPcmllbnRhdGlvbigpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0T3JpZW50YXRpb24KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0JY29tYm8uc2V0VGV4dCgiMTIzNDU2Iik7Ci0JY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgxLDMpKTsKLQljb21iby5nZXRTZWxlY3Rpb24oKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDEsMykpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCX0KLQlhc3NlcnRFcXVhbHMoLTEsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uc2VsZWN0KGkpOwotCQlhc3NlcnRFcXVhbHMoaSwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JfQotCi0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKC0xLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLnNlbGVjdChpKTsKLQkJY29tYm8uZGVzZWxlY3QoaSk7Ci0JCWFzc2VydEVxdWFscygtMSwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0JU3RyaW5nW10gY2FzZXMgPSB7IiIsICJmcmVkIiwgImZyZWRmcmVkIn07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQljb21iby5zZXRUZXh0KGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIFN0cmluZy52YWx1ZU9mKGkpLCBjYXNlc1tpXS5lcXVhbHMoY29tYm8uZ2V0VGV4dCgpKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRIZWlnaHQoKSB7Ci0JY29tYm8uZ2V0VGV4dEhlaWdodCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRMaW1pdCgpIHsKLQljb21iby5zZXRUZXh0TGltaXQoMyk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0VGV4dExpbWl0KCk9PTMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc0ZvY3VzKCkgewotCS8vIG5vdCBwdWJsaWMgYXBpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nKCkgewotCWNvbWJvLmFkZCgic3RyaW5nMCIpOwotCXRyeSB7Ci0JCWNvbWJvLmluZGV4T2YobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQljb21iby5yZW1vdmVBbGwoKTsKLQkKLQlpbnQgbnVtYmVyID0gNTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0RXF1YWxzKGksIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSkpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydEVxdWFscygtMSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpKSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JY29tYm8ucmVtb3ZlKCJmcmVkMyIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQotCQlhc3NlcnRFcXVhbHMoaSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpKSk7Ci0JYXNzZXJ0RXF1YWxzKC0xLCBjb21iby5pbmRleE9mKCJmcmVkMyIpKTsKLQlmb3IgKGludCBpID0gNDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRFcXVhbHMoaSAtIDEsIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSkpOwotCi0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWNvbWJvLnJlbW92ZSgyKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykKLQkJYXNzZXJ0RXF1YWxzKGksIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSkpOwotCWFzc2VydEVxdWFscygtMSwgY29tYm8uaW5kZXhPZigiZnJlZDIiKSk7Ci0JZm9yIChpbnQgaSA9IDM7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBjb21iby5pbmRleE9mKCJmcmVkIiArIGkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJKCkgewotCWNvbWJvLmFkZCgic3RyaW5nMCIpOwotCXRyeSB7Ci0JCWNvbWJvLmluZGV4T2YobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoLTEsIGNvbWJvLmluZGV4T2YoInN0cmluZzAiLCAtMSkpOwotCWNvbWJvLnJlbW92ZUFsbCgpOwotCQotCWludCBudW1iZXIgPSA1OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRUcnVlKCI6YToiICsgaSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpLCAwKSA9PSBpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpLCBpICsgMSkgPT0gLTEpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQotCQlhc3NlcnRUcnVlKCI6YToiICsgaSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpLCAwKSA9PSBpKTsKLQlmb3IgKGludCBpID0gMzsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpLCAzKSA9PSBpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpLCBpKSA9PSBpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9wYXN0ZSgpIHsKLQljb21iby5zZXRUZXh0KCIxMjM0NTYiKTsKLQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDEsMykpOwotCWNvbWJvLmN1dCgpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFRleHQoKS5lcXVhbHMoIjE0NTYiKSk7Ci0JY29tYm8ucGFzdGUoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRUZXh0KCkuZXF1YWxzKCIxMjM0NTYiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWxsKCkgewotCWNvbWJvLmFkZCgiMSIpOwotCWNvbWJvLmFkZCgiMiIpOwotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldEl0ZW1zKCkubGVuZ3RoPT0wKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJKCkgewotCXRyeSB7Ci0JCWNvbWJvLnJlbW92ZSgwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQljb21iby5yZW1vdmUoMyk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JY29tYm8uYWRkKCJzdHJpbmcwIik7Ci0JdHJ5IHsKLQkJY29tYm8ucmVtb3ZlKC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0KLQlpbnQgbnVtYmVyID0gNTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBpdGVtcyIsIG51bWJlciAtIGksIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLQkJY29tYm8ucmVtb3ZlKDApOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIik7ICAvLyBhbGwgaXRlbXMgdGhlIHNhbWUKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBpdGVtcyIsIG51bWJlciAtIGksIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLQkJY29tYm8ucmVtb3ZlKDApOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOyAvLyBkaWZmZXJlbnQgaXRlbXMKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoImluZGV4ICIgKyBpLCBudW1iZXIgLSBpLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0JCWNvbWJvLnNlbGVjdCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbmRleCAiICsgaSwgMCwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWNvbWJvLnJlbW92ZSgwKTsKLQkJaWYgKFN3dEp1bml0LmlzV2luZG93cyB8fCBTd3RKdW5pdC5pc0dUSyB8fCBTd3RKdW5pdC5pc0NhcmJvbikgewotCQkJLy8gVGhlIGJlaGF2aW9yIG9uIFdpbmRvd3MgYW5kIEdUSyB3aGVuIHRoZSBzZWxlY3RlZCBpdGVtIGlzIHJlbW92ZWQKLQkJCS8vIGlzIHRvIHNpbXBseSBzYXkgdGhhdCBubyBpdGVtcyBhcmUgc2VsZWN0ZWQuCi0JCQlhc3NlcnRFcXVhbHMoImluZGV4ICIgKyBpLCAtMSwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUaGUgYmVoYXZpb3Igb24gb3RoZXIgcGxhdGZvcm1zIHdoZW4gdGhlIHNlbGVjdGVkIGl0ZW0gaXMgcmVtb3ZlZAotCQkJLy8gaXMgdG8gc2VsZWN0IHRoZSBpdGVtIHRoYXQgaXMgbm93IGF0IHRoZSBzYW1lIGluZGV4LCBhbmQgc2VuZCBhCi0JCQkvLyBzZWxlY3Rpb24gZXZlbnQuIElmIHRoZXJlIGlzIG5vIGl0ZW0gYXQgdGhlIHNlbGVjdGVkIGluZGV4LCB0aGVuCi0JCQkvLyB0aGUgcGxhdGZvcm0gc2F5cyB0aGF0IG5vIGl0ZW1zIGFyZSBzZWxlY3RlZC4KLQkJCWlmIChpIDwgbnVtYmVyIC0gMSkgewotCQkJCWFzc2VydEVxdWFscygiaW5kZXggIiArIGksIDAsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRFcXVhbHMoImluZGV4ICIgKyBpLCAtMSwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7IC8vIGRpZmZlcmVudCBpdGVtcwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCJpbmRleCAiICsgaSwgbnVtYmVyIC0gaSwgY29tYm8uZ2V0SXRlbUNvdW50KCkpOwotCQljb21iby5yZW1vdmUobnVtYmVyLWktMSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUlJKCkgewotCWludCBudW1iZXIgPSA1OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JfQotCWNvbWJvLnJlbW92ZSgwLCA0KTsKLQlhc3NlcnRFcXVhbHMoMCwgY29tYm8uZ2V0SXRlbUNvdW50KCkpOwotCi0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiKTsKLQl9Ci0JY29tYm8ucmVtb3ZlKDAsIDIpOwotCWFzc2VydEVxdWFscygyLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0KLQljb21iby5yZW1vdmVBbGwoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCX0KLQljb21iby5yZW1vdmUoMiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JfQotCWNvbWJvLnJlbW92ZSgzLCAyKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0KLQljb21iby5yZW1vdmVBbGwoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCX0KLQotCXRyeSB7Ci0JCWNvbWJvLnJlbW92ZSgyLCAxMDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCWNvbWJvLnJlbW92ZSgtMSwgbnVtYmVyLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdGFydCBpbmRleCA8IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKG51bWJlciAtIGksIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLQkJY29tYm8ucmVtb3ZlKCJmcmVkIiArIGkpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKG51bWJlciAtIGksIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLQkJY29tYm8ucmVtb3ZlKCJmcmVkIik7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JdHJ5IHsKLQkJY29tYm8ucmVtb3ZlKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCXRyeSB7CQotCQljb21iby5yZW1vdmUoImZyZWQiKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbSBub3QgZm91bmQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWFzc2VydEVxdWFscyhudW1iZXIsIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiBhZGRNb2RpZnlMaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiBhZGRTZWxlY3Rpb25MaXN0ZW5lciBtZXRob2QKLX0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0SSgpIHsKLQljb21iby5hZGQoIjEyMyIpOwotCWNvbWJvLmFkZCgiNDU2Iik7Ci0JY29tYm8uYWRkKCI3ODkiKTsKLQljb21iby5zZWxlY3QoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKT09IDEpOwotCQotCS8vIGluZGljZXMgb3V0IG9mIHJhbmdlIGFyZSBpZ25vcmVkCi0JY29tYm8uc2VsZWN0KDEwKTsKLQlhc3NlcnRFcXVhbHMoMSwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0cnkgewotCQljb21iby5zZXRJdGVtKDAsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJY29tYm8uc2V0SXRlbSgzLCBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQljb21iby5zZXRJdGVtKDAsICJmcmVkIik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWNvbWJvLmFkZCgic3RyaW5nMCIpOwotCXRyeSB7Ci0JCWNvbWJvLnNldEl0ZW0oMCwgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW0gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQljb21iby5zZXRJdGVtKC0xLCAibmV3IHZhbHVlIik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IDwgMCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JY29tYm8uYWRkKCJqb2UiKTsKLQljb21iby5zZXRJdGVtKDAsICJmcmVkIik7CQotCWFzc2VydFRydWUoImZyZWQiLCBjb21iby5nZXRJdGVtKDApLmVxdWFscygiZnJlZCIpKTsKLQotCXRyeSB7Ci0JCWNvbWJvLnNldEl0ZW0oNCwgImZyZWQiKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQljb21iby5yZW1vdmVBbGwoKTsKLQlpbnQgbnVtYmVyID0gNTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5zZXRJdGVtKGksICJmcmVkIiArIGkpOwotCWFzc2VydEVxdWFscygiOmE6IiwgbmV3IFN0cmluZ1tdeyJmcmVkMCIsICJmcmVkMSIsICJmcmVkMiIsICJmcmVkMyIsICJmcmVkNCJ9LCBjb21iby5nZXRJdGVtcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0cnkgewotCQljb21iby5zZXRJdGVtcyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbXMgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlTdHJpbmdbXVtdIGl0ZW1zID0ge3t9LCB7IiJ9LCB7IiIsICIifSwgeyJmcmVkIn0sIHsiZnJlZDAiLCAiZnJlZDAifSwgeyJmcmVkIiwgImZyZWQifX07Ci0KLQlmb3IgKGludCBpID0gMCA7IGk8IGl0ZW1zLmxlbmd0aDsgaSsrKXsKLQkJY29tYm8uc2V0SXRlbXMoaXRlbXNbaV0pOwotCQlhc3NlcnRFcXVhbHMoIjphOiIgKyBpLCBpdGVtc1tpXSwgY29tYm8uZ2V0SXRlbXMoKSk7fQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE9yaWVudGF0aW9uSSgpIHsKLQljb21iby5zZXRPcmllbnRhdGlvbihTV1QuUklHSFRfVE9fTEVGVCk7Ci0JaWYgKChjb21iby5nZXRTdHlsZSgpICYgU1dULk1JUlJPUkVEKSAhPSAwKSB7Ci0JCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldE9yaWVudGF0aW9uKCk9PVNXVC5SSUdIVF9UT19MRUZUKTsKLQl9Ci0JY29tYm8uc2V0T3JpZW50YXRpb24oU1dULkxFRlRfVE9fUklHSFQpOwotCWFzc2VydFRydWUoIjpiOiIsIGNvbWJvLmdldE9yaWVudGF0aW9uKCk9PVNXVC5MRUZUX1RPX1JJR0hUKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXRyeSB7Ci0JCWNvbWJvLnNldFNlbGVjdGlvbihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcG9pbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JaW50IG51bWJlciA9IDU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgNSkpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMCwgMCkpKTsKLQljb21iby5zZXRUZXh0KCJzb21lIHRleHQiKTsKLQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsIDUpKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBjb21iby5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDAsIDUpKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExpbWl0SSgpIHsKLQl0cnkgewotCQljb21iby5zZXRUZXh0TGltaXQoMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpbWl0ID09IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JY29tYm8uc2V0VGV4dExpbWl0KDMpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFRleHRMaW1pdCgpPT0zKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JdHJ5IHsKLQkJY29tYm8uc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGV4dCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlTdHJpbmdbXSBjYXNlcyA9IHsiIiwgImZyZWQiLCAiZnJlZDAifTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbWJvLnNldFRleHQoY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCI6YToiICsgaSwgY29tYm8uZ2V0VGV4dCgpLmVxdWFscyhjYXNlc1tpXSkpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQljb21iby5zZXRUZXh0KGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksIGNvbWJvLmdldFRleHQoKS5lcXVhbHMoY2FzZXNbaV0pKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbWJvLnNldFRleHQoY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCI6YzoiICsgaSwgY29tYm8uZ2V0VGV4dCgpLmVxdWFscyhjYXNlc1tpXSkpOwotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbGVhclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvcHkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2N1dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE9yaWVudGF0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0SGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0TGltaXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFzdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0T3JpZW50YXRpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGltaXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSIpKSB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpKSB0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbGVhclNlbGVjdGlvbiIpKSB0ZXN0X2NsZWFyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb3B5IikpIHRlc3RfY29weSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY3V0IikpIHRlc3RfY3V0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdEFsbCIpKSB0ZXN0X2Rlc2VsZWN0QWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdEkiKSkgdGVzdF9kZXNlbGVjdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUhlaWdodCIpKSB0ZXN0X2dldEl0ZW1IZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE9yaWVudGF0aW9uIikpIHRlc3RfZ2V0T3JpZW50YXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgiKSkgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dCIpKSB0ZXN0X2dldFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRIZWlnaHQiKSkgdGVzdF9nZXRUZXh0SGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0TGltaXQiKSkgdGVzdF9nZXRUZXh0TGltaXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSIpKSB0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZ0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Bhc3RlIikpIHRlc3RfcGFzdGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFsbCIpKSB0ZXN0X3JlbW92ZUFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSSIpKSB0ZXN0X3JlbW92ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUlJIikpIHRlc3RfcmVtb3ZlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0SSIpKSB0ZXN0X3NlbGVjdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRPcmllbnRhdGlvbkkiKSkgdGVzdF9zZXRPcmllbnRhdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGltaXRJIikpIHRlc3Rfc2V0VGV4dExpbWl0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm91bmRzSUlJSSgpIHsKLQljb21iby5zZXRCb3VuZHMoMTAsIDIwLCAzMCwgNDApOwotCS8vIG9ubHkgY2hlY2sgeCwgeSwgYW5kIHdpZHRoIC0geW91IGNhbid0IHNldCB0aGUgaGVpZ2h0IG9mIGEgY29tYm8KLQlhc3NlcnRUcnVlKGNvbWJvLmdldEJvdW5kcygpLnggPT0gMTApOwotCWFzc2VydFRydWUoY29tYm8uZ2V0Qm91bmRzKCkueSA9PSAyMCk7Ci0JYXNzZXJ0VHJ1ZShjb21iby5nZXRCb3VuZHMoKS53aWR0aCA9PSAzMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JY29tYm8uc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoMTAsIDIwLCAzMCwgNDApKTsKLQkvLyBvbmx5IGNoZWNrIHgsIHksIGFuZCB3aWR0aCAtIHlvdSBjYW4ndCBzZXQgdGhlIGhlaWdodCBvZiBhIGNvbWJvCi0JYXNzZXJ0VHJ1ZShjb21iby5nZXRCb3VuZHMoKS54ID09IDEwKTsKLQlhc3NlcnRUcnVlKGNvbWJvLmdldEJvdW5kcygpLnkgPT0gMjApOwotCWFzc2VydFRydWUoY29tYm8uZ2V0Qm91bmRzKCkud2lkdGggPT0gMzApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVJSSgpIHsKLQljb21iby5zZXRTaXplKDMwLCA0MCk7Ci0JLy8gb25seSBjaGVjayB0aGUgd2lkdGggLSB5b3UgY2FuJ3Qgc2V0IHRoZSBoZWlnaHQgb2YgYSBjb21ibwotCWFzc2VydFRydWUoY29tYm8uZ2V0U2l6ZSgpLnggPT0gMzApOwotCi0JY29tYm8uc2V0U2l6ZSgzMiwgNDMpOwotCS8vIG9ubHkgY2hlY2sgdGhlIHdpZHRoIC0geW91IGNhbid0IHNldCB0aGUgaGVpZ2h0IG9mIGEgY29tYm8KLQlhc3NlcnRUcnVlKGNvbWJvLmdldFNpemUoKS54ID09IDMyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQljb21iby5zZXRTaXplKG5ldyBQb2ludCgzMCwgNDApKTsKLQkvLyBvbmx5IGNoZWNrIHRoZSB3aWR0aCAtIHlvdSBjYW4ndCBzZXQgdGhlIGhlaWdodCBvZiBhIGNvbWJvCi0JYXNzZXJ0VHJ1ZShjb21iby5nZXRTaXplKCkueCA9PSAzMCk7Ci0KLQljb21iby5zZXRCb3VuZHMoMzIsIDQzLCAzMywgNDQpOwotCS8vIG9ubHkgY2hlY2sgdGhlIHdpZHRoIC0geW91IGNhbid0IHNldCB0aGUgaGVpZ2h0IG9mIGEgY29tYm8KLQlhc3NlcnRUcnVlKGNvbWJvLmdldFNpemUoKS54ID09IDMzKTsKLQotCWNvbWJvLnNldEJvdW5kcygzMiwgNDMsIDMwLCA0MCk7Ci0JY29tYm8uc2V0TG9jYXRpb24oMTEsIDIyKTsKLQljb21iby5zZXRTaXplKG5ldyBQb2ludCgzMiwgNDMpKTsKLQkvLyBvbmx5IGNoZWNrIHRoZSB3aWR0aCAtIHlvdSBjYW4ndCBzZXQgdGhlIGhlaWdodCBvZiBhIGNvbWJvCi0JYXNzZXJ0VHJ1ZShjb21iby5nZXRTaXplKCkueCA9PSAzMik7Ci19Ci0KLXByaXZhdGUgdm9pZCBhZGQoKSB7Ci0gICAgY29tYm8uYWRkKCJ0aGlzIik7Ci0gICAgY29tYm8uYWRkKCJpcyIpOwotICAgIGNvbWJvLmFkZCgiU1dUIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24gKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudChjb21iby5nZXRTaXplKCkueC0xMCwgNSwgMzAsIGNvbWJvLmdldEl0ZW1IZWlnaHQoKSoyLCAKLSAgICAgICAgICAgIAkJIENvbnNpc3RlbmN5VXRpbGl0eS5TRUxFQ1RJT04pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfRE9XTiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24gKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEzLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIC8vb24gYXJyb3cKLSAgICBjb25zaXN0ZW5jeUV2ZW50KGNvbWJvLmdldFNpemUoKS54LTEwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIC8vb24gdGV4dAotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDMsIENvbnNpc3RlbmN5VXRpbGl0eS5FU0NBUEVfTUVOVSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAyMCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U4YTA4OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZSB7Ci0KLUNvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgMCk7Ci0Jc3VwZXIuc2V0V2lkZ2V0KGNvbXBvc2l0ZSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludFtdIGNhc2VzID0ge1NXVC5IX1NDUk9MTCwgU1dULlZfU0NST0xMLCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEx9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIGNhc2VzW2ldKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGlsZHJlbigpIHsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIG5ldyBDb250cm9sW117fSwgY29tcG9zaXRlLmdldENoaWxkcmVuKCkpOwotCUNvbXBvc2l0ZSBjMSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCAwKTsKLQlhc3NlcnRFcXVhbHMoIjpiOiIsIG5ldyBDb250cm9sW117YzF9LCBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKSk7Ci0KLQlMaXN0IGMyID0gbmV3IExpc3QoY29tcG9zaXRlLCAwKTsKLQlhc3NlcnRFcXVhbHMoIjpjOiIsIG5ldyBDb250cm9sW117YzEsIGMyfSwgY29tcG9zaXRlLmdldENoaWxkcmVuKCkpOwotCi0JQnV0dG9uIGMzID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIDApOwotCWFzc2VydEVxdWFscygiOmQ6IiwgbmV3IENvbnRyb2xbXXtjMSwgYzIsIGMzfSwgY29tcG9zaXRlLmdldENoaWxkcmVuKCkpOwotCi0JYzIuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygiOmU6IiwgbmV3IENvbnRyb2xbXXtjMSwgYzN9LCBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKSk7Ci0JCi0JQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLQkJY2hpbGRyZW5baV0uZGlzcG9zZSgpOwotCi0JYXNzZXJ0RXF1YWxzKCI6ZjoiLCBuZXcgQ29udHJvbFtde30sIGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMYXlvdXQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRhYkxpc3QoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VGFiTGlzdCRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xheW91dCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9sYXlvdXRaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0WigpIHsKLQkvLyB0ZXN0ZWQgaW4gc3BlY2lmaWMgTGF5b3V0IGNsYXNzZXMKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0KCkgewotCS8vIHRlc3RlZCBpbiBzcGVjaWZpYyBMYXlvdXQgY2xhc3NlcwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRhYkxpc3QkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0JQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQlDb250cm9sW10gdGFibGlzdCA9IG5ldyBDb250cm9sW10ge2J1dHRvbjEsIGJ1dHRvbjJ9OwotCWNvbXBvc2l0ZS5zZXRUYWJMaXN0KHRhYmxpc3QpOwotCWFzc2VydEVxdWFscyh0YWJsaXN0LCBjb21wb3NpdGUuZ2V0VGFiTGlzdCgpKTsKLQlidXR0b24xLmRpc3Bvc2UoKTsKLQlidXR0b24yLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRyZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExheW91dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGFiTGlzdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGF5b3V0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sYXlvdXRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUYWJMaXN0JExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGlsZHJlbiIpKSB0ZXN0X2dldENoaWxkcmVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMYXlvdXQiKSkgdGVzdF9nZXRMYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRhYkxpc3QiKSkgdGVzdF9nZXRUYWJMaXN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXlvdXQiKSkgdGVzdF9sYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xheW91dFoiKSkgdGVzdF9sYXlvdXRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IikpIHRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGFiTGlzdCRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldFRhYkxpc3QkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXQoV2lkZ2V0IHcpIHsKLQlpZiAoY29tcG9zaXRlICE9IG51bGwpCi0JCWNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JY29tcG9zaXRlID0gKENvbXBvc2l0ZSl3OwotCXN1cGVyLnNldFdpZGdldCh3KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWRlYWEyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQkvLyBhYnN0cmFjdCBjbGFzcwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpIHsKLQlDb250cm9sTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQ29udHJvbExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9OwotCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX07Ci0JfTsKLQljb250cm9sLmFkZENvbnRyb2xMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5Nb3ZlLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULlJlc2l6ZSwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JY29udHJvbC5yZW1vdmVDb250cm9sTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyKCkgewotCUZvY3VzTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRm9jdXNMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfTsKLQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX07Ci0JfTsKLQljb250cm9sLmFkZEZvY3VzTGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuRm9jdXNJbiwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5Gb2N1c091dCwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JY29udHJvbC5yZW1vdmVGb2N1c0xpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKSB7Ci0JSGVscExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEhlbHBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGVscFJlcXVlc3RlZChIZWxwRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX07Ci0JfTsKLQljb250cm9sLmFkZEhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5IZWxwLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQljb250cm9sLnJlbW92ZUhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lcigpIHsKLQlLZXlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBLZXlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfTsKLQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX07Ci0JfTsKLQljb250cm9sLmFkZEtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULktleURvd24sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuS2V5VXAsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWNvbnRyb2wucmVtb3ZlS2V5TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZE1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyKCkgewotCU1vdXNlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTW91c2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX07Ci0JCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfTsKLQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9OwotCX07Ci0JY29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULk1vdXNlRG93biwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5Nb3VzZVVwLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULk1vdXNlRG91YmxlQ2xpY2ssIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWNvbnRyb2wucmVtb3ZlTW91c2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTW91c2VNb3ZlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQlNb3VzZU1vdmVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX07Ci0JfTsKLQljb250cm9sLmFkZE1vdXNlTW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULk1vdXNlTW92ZSwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JY29udHJvbC5yZW1vdmVNb3VzZU1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTW91c2VUcmFja0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyKCkgewotCU1vdXNlVHJhY2tMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNb3VzZVRyYWNrTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vdXNlRW50ZXIoTW91c2VFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfTsKLQkJcHVibGljIHZvaWQgbW91c2VFeGl0KE1vdXNlRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX07Ci0JCXB1YmxpYyB2b2lkIG1vdXNlSG92ZXIoTW91c2VFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfTsKLQl9OwotCWNvbnRyb2wuYWRkTW91c2VUcmFja0xpc3RlbmVyKGxpc3RlbmVyKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULk1vdXNlRW50ZXIsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuTW91c2VFeGl0LCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULk1vdXNlSG92ZXIsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWNvbnRyb2wucmVtb3ZlTW91c2VUcmFja0xpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRQYWludExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lcigpIHsKLQlQYWludExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9OwotCX07Ci0JY29udHJvbC5hZGRQYWludExpc3RlbmVyKGxpc3RlbmVyKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQlHQyBnYyA9IGV2ZW50LmdjID0gbmV3IEdDKGNvbnRyb2wpOwkKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuUGFpbnQsIGV2ZW50KTsKLQlnYy5kaXNwb3NlKCk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQljb250cm9sLnJlbW92ZVBhaW50TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFRyYXZlcnNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyKCkgewotCVRyYXZlcnNlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX07Ci0JfTsKLQljb250cm9sLmFkZFRyYXZlcnNlTGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuVHJhdmVyc2UsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWNvbnRyb2wucmVtb3ZlVHJhdmVyc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSSgpIHsKLQljb250cm9sLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JUG9pbnQgc2l6ZSA9IGNvbnRyb2wuZ2V0U2l6ZSgpOwotCWNvbnRyb2wuY29tcHV0ZVNpemUoc2l6ZS54LCBzaXplLnkpOwotCWFzc2VydEVxdWFscyhzaXplLngsIGNvbnRyb2wuZ2V0U2l6ZSgpLngpOwotCWFzc2VydEVxdWFscyhzaXplLnksIGNvbnRyb2wuZ2V0U2l6ZSgpLnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCWNvbnRyb2wuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLQlQb2ludCBzaXplID0gY29udHJvbC5nZXRTaXplKCk7Ci0JY29udHJvbC5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSwgZmFsc2UpOwotCWFzc2VydEVxdWFscyhzaXplLngsIGNvbnRyb2wuZ2V0U2l6ZSgpLngpOwotCWFzc2VydEVxdWFscyhzaXplLnksIGNvbnRyb2wuZ2V0U2l6ZSgpLnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZvcmNlRm9jdXMoKSB7Ci0JLy8gdGhpcyBpcyBkaWZmaWN1bHQgdG8gdGVzdCBpbiBDb250cm9sLgotCS8vIHN1YmNsYXNzZXMgdGhhdCB3aXNoIHRvIHRlc3QgdGhpcyBzaG91bGQgb3ZlcnJpZGUuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWNjZXNzaWJsZSgpIHsKLQlBY2Nlc3NpYmxlIGFjY2Vzc2libGUgPSBjb250cm9sLmdldEFjY2Vzc2libGUoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBhY2Nlc3NpYmxlICE9IG51bGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3JkZXJXaWR0aCgpIHsKLQljb250cm9sLmdldEJvcmRlcldpZHRoKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEJvdW5kc0lJSUkgYW5kIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFbmFibGVkKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEVuYWJsZWRaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExheW91dERhdGEoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TGF5b3V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYXRpb24oKSB7Ci0JY29udHJvbC5zZXRCb3VuZHMoMzIsIDQzLCAzMCwgNDApOwotCWFzc2VydFRydWUoY29udHJvbC5nZXRMb2NhdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMzIsIDQzKSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lbnUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TWVudUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9uaXRvcigpIHsKLQlNb25pdG9yIG1vbml0b3IgPSBjb250cm9sLmdldE1vbml0b3IoKTsKLQlhc3NlcnROb3ROdWxsKG1vbml0b3IpOwotCURpc3BsYXkgZGlzcGxheSA9IGNvbnRyb2wuZ2V0RGlzcGxheSgpOwotCU1vbml0b3JbXSBtb25pdG9ycyA9IGRpc3BsYXkuZ2V0TW9uaXRvcnMoKTsKLQlpbnQgaTsKLQkvKiBtb25pdG9yIG11c3QgYmUgbGlzdGVkIGluIERpc3BsYXkuZ2V0TW9uaXRvcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKG1vbml0b3IuZXF1YWxzKG1vbml0b3JzW2ldKSkgYnJlYWs7Ci0JfQotCWlmIChpID09IG1vbml0b3JzLmxlbmd0aCkgewotCQlmYWlsKCJDb250cm9sLmdldE1vbml0b3IgZG9lcyBub3QgcmV0dXJuIGEgbW9uaXRvciBsaXN0ZWQgaW4gRGlzcGxheS5nZXRNb25pdG9ycyIpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKHNoZWxsLCBjb250cm9sLmdldFBhcmVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaGVsbCgpIHsKLQlhc3NlcnRFcXVhbHMoc2hlbGwsIGNvbnRyb2wuZ2V0U2hlbGwoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2l6ZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRTaXplSUkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb29sVGlwVGV4dCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VmlzaWJsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRWaXNpYmxlWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBpbnRlbnRpb25hbGx5IG5vdCB0ZXN0ZWQgLSBub3QgcHVibGljIEFQSQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRW5hYmxlZCgpIHsKLQljb250cm9sLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShjb250cm9sLmlzRW5hYmxlZCgpKTsKLQotCWNvbnRyb2wuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5pc0VuYWJsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNGb2N1c0NvbnRyb2woKSB7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5pc0ZvY3VzQ29udHJvbCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1JlcGFyZW50YWJsZSgpIHsKLQlhc3NlcnRFcXVhbHMgKCJpc1JlcGFyZW50YWJsZSIsIGNvbnRyb2wuaXNSZXBhcmVudGFibGUoKSwgaXNSZXBhcmVudGFibGVQbGF0Zm9ybSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1Zpc2libGUoKSB7Ci0JY29udHJvbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoIWNvbnRyb2wuaXNWaXNpYmxlKCkpOyAgLy9iZWNhdXNlIHRoZSBzaGVsbCBpcyBub3QgdmlzaWJsZQotCi0JY29udHJvbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFjb250cm9sLmlzVmlzaWJsZSgpKTsKLQotCWlmICghU3d0SnVuaXQuaXNBSVgpIHsKLQkJY29udHJvbC5zZXRWaXNpYmxlKHRydWUpOwotCQlzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCQlhc3NlcnRUcnVlKCJXaW5kb3cgc2hvdWxkIGJlIHZpc2libGUiLCBjb250cm9sLmlzVmlzaWJsZSgpKTsKLQkJc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWFzc2VydFRydWUoIldpbmRvdyBzaG91bGQgbm90IGJlIHZpc2libGUiLCAhY29udHJvbC5pc1Zpc2libGUoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdmVBYm92ZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCWNvbnRyb2wubW92ZUFib3ZlKG51bGwpOwotCi0JY29udHJvbC5tb3ZlQWJvdmUoY29udHJvbCk7Ci0KLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIDApOwotCWNvbnRyb2wubW92ZUFib3ZlKGIpOwotCWIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdmVCZWxvd0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCWNvbnRyb2wubW92ZUJlbG93KG51bGwpOwotCi0JY29udHJvbC5tb3ZlQmVsb3coY29udHJvbCk7Ci0KLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIDApOwotCWNvbnRyb2wubW92ZUJlbG93KGIpOwotCWIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3BhY2soKSB7Ci0JY29udHJvbC5wYWNrKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFja1ooKSB7Ci0JY29udHJvbC5wYWNrKHRydWUpOwotCWNvbnRyb2wucGFjayhmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVkcmF3KCkgewotCWNvbnRyb2wucmVkcmF3KCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVkcmF3SUlJSVooKSB7Ci0JY29udHJvbC5yZWRyYXcoMCwgMCwgMCwgMCwgZmFsc2UpOwotCi0JY29udHJvbC5yZWRyYXcoMCwgMCwgMCwgMCwgdHJ1ZSk7Ci0KLQljb250cm9sLnJlZHJhdygtMTAsIC0xMCwgLTEwLCAtMTAsIHRydWUpOwotCi0JY29udHJvbC5yZWRyYXcoMTAsIDEwLCAxMCwgMTAsIHRydWUpOwotCi0JY29udHJvbC5yZWRyYXcoMTAsIDEwLCAxMCwgMTAsIGZhbHNlKTsKLQotCWNvbnRyb2wucmVkcmF3KDEwMDAwLCAxMDAwMCwgMTAwMDAsIDEwMDAwLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZEZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZU1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZE1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW91c2VNb3ZlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW91c2VUcmFja0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZE1vdXNlVHJhY2tMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZFBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlVHJhdmVyc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkVHJhdmVyc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihjb250cm9sLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQljb250cm9sLnNldEJhY2tncm91bmQoY29sb3IpOwotCWFzc2VydEVxdWFscyhjb2xvciwgY29udHJvbC5nZXRCYWNrZ3JvdW5kKCkpOwotCWNvbnRyb2wuc2V0QmFja2dyb3VuZChudWxsKTsKLQlhc3NlcnRUcnVlKCFjb250cm9sLmdldEJhY2tncm91bmQoKS5lcXVhbHMoY29sb3IpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm91bmRzSUlJSSgpIHsKLQljb250cm9sLnNldEJvdW5kcygxMCwgMjAsIDMwLCA0MCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMTAsIDIwLCAzMCwgNDApLCBjb250cm9sLmdldEJvdW5kcygpKTsKLQotCWNvbnRyb2wuc2V0Qm91bmRzKDIwLCAzMCwgNDAsIDUwKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNvbnRyb2wuZ2V0Qm91bmRzKCkuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMTAsIDIwLCAzMCwgNDApKSk7Ci0KLQljb250cm9sLnNldEJvdW5kcygxMCwgMjAsIDMwLCA0MCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JY29udHJvbC5zZXRCb3VuZHMobmV3IFJlY3RhbmdsZSgxMCwgMjAsIDMwLCA0MCkpOwotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDEwLCAyMCwgMzAsIDQwKSwgY29udHJvbC5nZXRCb3VuZHMoKSk7Ci0KLQljb250cm9sLnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKDIwLCAzMCwgNDAsIDUwKSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBjb250cm9sLmdldEJvdW5kcygpLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDEwLCAyMCwgMzAsIDQwKSkpOwotCi0JdHJ5IHsKLQkJY29udHJvbC5zZXRCb3VuZHMobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWNvbnRyb2wuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoMTAsIDIwLCAzMCwgNDApKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDYXB0dXJlWigpIHsKLQljb250cm9sLnNldENhcHR1cmUodHJ1ZSk7Ci0KLQljb250cm9sLnNldENhcHR1cmUoZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yKCkgewotCWNvbnRyb2wuc2V0Q3Vyc29yKG51bGwpOwotCi0JQ3Vyc29yIGMgPSBuZXcgQ3Vyc29yKGNvbnRyb2wuZ2V0RGlzcGxheSgpLCAwKTsKLQljb250cm9sLnNldEN1cnNvcihjKTsKLQljLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFbmFibGVkWigpIHsKLQljb250cm9sLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShjb250cm9sLmdldEVuYWJsZWQoKSk7Ci0KLQljb250cm9sLnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIWNvbnRyb2wuZ2V0RW5hYmxlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb2N1cygpIHsKLQljb250cm9sLnNldEZvY3VzKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlGb250IGZvbnQgPSBjb250cm9sLmdldEZvbnQoKTsKLQljb250cm9sLnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0RXF1YWxzKGZvbnQsIGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkKLQlmb250ID0gbmV3IEZvbnQoY29udHJvbC5nZXREaXNwbGF5KCksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWNvbnRyb2wuc2V0Rm9udChmb250KTsKLQlhc3NlcnRFcXVhbHMoZm9udCwgY29udHJvbC5nZXRGb250KCkpOwotCi0JY29udHJvbC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWNvbnRyb2wuc2V0Rm9udChmb250KTsKLQkJY29udHJvbC5zZXRGb250KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBmb250Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoY29udHJvbC5nZXREaXNwbGF5KCksIDI1NSwgMCwgMCk7Ci0JY29udHJvbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQlhc3NlcnRFcXVhbHMoY29sb3IsIGNvbnRyb2wuZ2V0Rm9yZWdyb3VuZCgpKTsKLQljb250cm9sLnNldEZvcmVncm91bmQobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5nZXRGb3JlZ3JvdW5kKCkuZXF1YWxzKGNvbG9yKSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExheW91dERhdGFMamF2YV9sYW5nX09iamVjdCgpIHsKLQljb250cm9sLnNldExheW91dERhdGEodGhpcyk7Ci0JYXNzZXJ0RXF1YWxzKHRoaXMsIGNvbnRyb2wuZ2V0TGF5b3V0RGF0YSgpKTsKLQotCWNvbnRyb2wuc2V0TGF5b3V0RGF0YSgiYXNsZHNhaGRhaGNhc2xjc2hkYWMiKTsKLQlhc3NlcnRFcXVhbHMoImFzbGRzYWhkYWhjYXNsY3NoZGFjIiwgY29udHJvbC5nZXRMYXlvdXREYXRhKCkpOwotCi0JY29udHJvbC5zZXRMYXlvdXREYXRhKHRoaXMuZ2V0Q2xhc3MoKSk7Ci0JYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0Q2xhc3MoKSwgY29udHJvbC5nZXRMYXlvdXREYXRhKCkpOwotCi0JY29udHJvbC5zZXRMYXlvdXREYXRhKG51bGwpOwotCWFzc2VydE51bGwoY29udHJvbC5nZXRMYXlvdXREYXRhKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExvY2F0aW9uSUkoKSB7Ci0JY29udHJvbC5zZXRCb3VuZHMoMzIsIDQzLCAzMCwgNDApOwotCWNvbnRyb2wuc2V0TG9jYXRpb24oMTEsIDIyKTsKLQljb250cm9sLnNldFNpemUoMzIsIDQzKTsKLQlhc3NlcnRFcXVhbHMoY29udHJvbC5nZXRMb2NhdGlvbigpLCBuZXcgUG9pbnQoMTEsIDIyKSk7Ci0KLQljb250cm9sLnNldExvY2F0aW9uKDEwLCAxMCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbnRyb2wuZ2V0TG9jYXRpb24oKSwgbmV3IFBvaW50KDEwLCAxMCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl0cnkgewotCQljb250cm9sLnNldExvY2F0aW9uKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsb2NhdGlvbiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCVBvaW50IGxvYyA9IG5ldyBQb2ludCgzMCwgNDApOwotCWNvbnRyb2wuc2V0TG9jYXRpb24obG9jKTsKLQlhc3NlcnRFcXVhbHMoY29udHJvbC5nZXRMb2NhdGlvbigpLCBsb2MpOwotCi0JbG9jID0gbmV3IFBvaW50KDEwLCAxMCk7Ci0JY29udHJvbC5zZXRMb2NhdGlvbihsb2MpOwotCWFzc2VydEVxdWFscyhjb250cm9sLmdldExvY2F0aW9uKCksIGxvYyk7Ci0KLQlsb2MgPSBuZXcgUG9pbnQoMTAwMDAsIDEwMDAwKTsKLQljb250cm9sLnNldExvY2F0aW9uKGxvYyk7Ci0JYXNzZXJ0RXF1YWxzKGNvbnRyb2wuZ2V0TG9jYXRpb24oKSwgbG9jKTsKLQotCWxvYyA9IG5ldyBQb2ludCgtMTAsIC0xMCk7Ci0JY29udHJvbC5zZXRMb2NhdGlvbihsb2MpOwotCWFzc2VydEVxdWFscyhjb250cm9sLmdldExvY2F0aW9uKCksIGxvYyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWVudUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51ICgpIHsKLQkvKiB0aGlzIGlzIGEgdmFsaWQgdGhpbmcgdG8gZG8sIHlvdSBjYW4gcmVzZXQgYSBtZW51IHRvIG5vdGhpbmcgKi8KLQljb250cm9sLnNldE1lbnUobnVsbCk7Ci0KLQlNZW51IG0gPSBuZXcgTWVudShjb250cm9sKTsKLQljb250cm9sLnNldE1lbnUobSk7Ci0JYXNzZXJ0RXF1YWxzKG0sIGNvbnRyb2wuZ2V0TWVudSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQYXJlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKCkgewotCWlmIChjb250cm9sLmlzUmVwYXJlbnRhYmxlKCkpIHsKLQkJU2hlbGwgb3JpZ2luYWxQYXJlbnQgPSBuZXcgU2hlbGwoKTsKLQkJU2hlbGwgbmV3UGFyZW50ID0gbmV3IFNoZWxsKCk7Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihvcmlnaW5hbFBhcmVudCwgU1dULlBVU0gpOwotCQliLnNldFBhcmVudChuZXdQYXJlbnQpOwotCQlvcmlnaW5hbFBhcmVudC5kaXNwb3NlKCk7Ci0JCWFzc2VydFRydWUoIWIuaXNEaXNwb3NlZCgpKTsKLQkJbmV3UGFyZW50LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVkcmF3WigpIHsKLQljb250cm9sLnNldFJlZHJhdyhmYWxzZSk7Ci0KLQljb250cm9sLnNldFJlZHJhdyh0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplSUkoKSB7Ci0JY29udHJvbC5zZXRCb3VuZHMoMzIsIDQzLCAzMCwgNDApOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMzAsIDQwKSwgY29udHJvbC5nZXRTaXplKCkpOwotCi0JY29udHJvbC5zZXRCb3VuZHMoMzIsIDQzLCAzMCwgNDApOwotCWNvbnRyb2wuc2V0TG9jYXRpb24oMTEsIDIyKTsKLQljb250cm9sLnNldFNpemUoMzIsIDQzKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDMyLCA0MyksIGNvbnRyb2wuZ2V0U2l6ZSgpKTsKLQotCWNvbnRyb2wuc2V0U2l6ZSgwLCAwKTsKLQkKLQljb250cm9sLnNldFNpemUoMTAsIDEwKTsKLQotCWNvbnRyb2wuc2V0U2l6ZSgxMDAwMCwgMTAwMDApOwotCi0JY29udHJvbC5zZXRTaXplKC0xMCwgLTEwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQljb250cm9sLnNldFNpemUobmV3IFBvaW50KDMwLCA0MCkpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMzAsIDQwKSwgY29udHJvbC5nZXRTaXplKCkpOwotCi0JdHJ5IHsKLQkJY29udHJvbC5zZXRTaXplKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzaXplID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JY29udHJvbC5zZXRTaXplKG5ldyBQb2ludCgwLCAwKSk7Ci0JCi0JY29udHJvbC5zZXRTaXplKG5ldyBQb2ludCgxMCwgMTApKTsKLQotCWNvbnRyb2wuc2V0U2l6ZShuZXcgUG9pbnQoMTAwMDAsIDEwMDAwKSk7Ci0KLQljb250cm9sLnNldFNpemUobmV3IFBvaW50KC0xMCwgLTEwKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQljb250cm9sLnNldFRvb2xUaXBUZXh0KCJUaGlzIGlzIGEgdGlwIik7Ci0JYXNzZXJ0RXF1YWxzKCJUaGlzIGlzIGEgdGlwIiwgY29udHJvbC5nZXRUb29sVGlwVGV4dCgpKTsKLQotCWNvbnRyb2wuc2V0VG9vbFRpcFRleHQobnVsbCk7Ci0JYXNzZXJ0TnVsbChjb250cm9sLmdldFRvb2xUaXBUZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFZpc2libGVaKCkgewotCWNvbnRyb2wuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKGNvbnRyb2wuZ2V0VmlzaWJsZSgpKTsKLQotCWNvbnRyb2wuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5nZXRWaXNpYmxlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvQ29udHJvbElJKCkgewotCVBvaW50IGNvbnRyb2xDb29yZHMgPSBjb250cm9sLnRvQ29udHJvbCgwLCAwKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDAsIDApLCBjb250cm9sLnRvRGlzcGxheShjb250cm9sQ29vcmRzLngsIGNvbnRyb2xDb29yZHMueSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JUG9pbnQgY29udHJvbENvb3JkcyA9IGNvbnRyb2wudG9Db250cm9sKG5ldyBQb2ludCgwLCAwKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgwLCAwKSwgY29udHJvbC50b0Rpc3BsYXkoY29udHJvbENvb3JkcykpOwotCXRyeSB7Ci0JCWNvbnRyb2wudG9Db250cm9sKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzaXplID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvRGlzcGxheUlJKCkgewotCVBvaW50IGRpc3BsYXlDb29yZHMgPSBjb250cm9sLnRvRGlzcGxheSgwLCAwKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDAsIDApLCBjb250cm9sLnRvQ29udHJvbChkaXNwbGF5Q29vcmRzLngsIGRpc3BsYXlDb29yZHMueSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvRGlzcGxheUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JUG9pbnQgZGlzcGxheUNvb3JkcyA9IGNvbnRyb2wudG9EaXNwbGF5KG5ldyBQb2ludCgwLCAwKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgwLCAwKSwgY29udHJvbC50b0NvbnRyb2woZGlzcGxheUNvb3JkcykpOwotCXRyeSB7Ci0JCWNvbnRyb2wudG9EaXNwbGF5KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzaXplID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RyYXZlcnNlSSgpIHsKLQljb250cm9sLnRyYXZlcnNlKFNXVC5UUkFWRVJTRV9FU0NBUEUpOwotCWNvbnRyb2wudHJhdmVyc2UoU1dULlRSQVZFUlNFX1JFVFVSTik7Ci0JY29udHJvbC50cmF2ZXJzZShTV1QuVFJBVkVSU0VfVEFCX05FWFQpOwotCWNvbnRyb2wudHJhdmVyc2UoU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUyk7Ci0JY29udHJvbC50cmF2ZXJzZShTV1QuVFJBVkVSU0VfQVJST1dfTkVYVCk7Ci0JY29udHJvbC50cmF2ZXJzZShTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3VwZGF0ZSgpIHsKLQljb250cm9sLnVwZGF0ZSgpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZE1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRUcmF2ZXJzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZvcmNlRm9jdXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFjY2Vzc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvcmRlcldpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExheW91dERhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExvY2F0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNZW51Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNb25pdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaXplIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb29sVGlwVGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNGb2N1c0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzUmVwYXJlbnRhYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1Zpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdmVBYm92ZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3ZlQmVsb3dMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFjayIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFja1oiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlZHJhdyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVkcmF3SUlJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZU1vdXNlTW92ZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZU1vdXNlVHJhY2tMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlUGFpbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVRyYXZlcnNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Qm91bmRzSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENhcHR1cmVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvY3VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGF5b3V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMb2NhdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1lbnVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UGFyZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UmVkcmF3WiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2l6ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvQ29udHJvbElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b0Rpc3BsYXlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9EaXNwbGF5TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdHJhdmVyc2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF91cGRhdGUiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIikpIHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRGb2N1c0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lciIpKSB0ZXN0X2FkZEZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKSkgdGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIiKSkgdGVzdF9hZGRLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRNb3VzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lciIpKSB0ZXN0X2FkZE1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyIikpIHRlc3RfYWRkTW91c2VNb3ZlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTW91c2VUcmFja0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyIikpIHRlc3RfYWRkTW91c2VUcmFja0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRQYWludExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lciIpKSB0ZXN0X2FkZFBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRUcmF2ZXJzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lciIpKSB0ZXN0X2FkZFRyYXZlcnNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJIikpIHRlc3RfY29tcHV0ZVNpemVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZm9yY2VGb2N1cyIpKSB0ZXN0X2ZvcmNlRm9jdXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFjY2Vzc2libGUiKSkgdGVzdF9nZXRBY2Nlc3NpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kIikpIHRlc3RfZ2V0QmFja2dyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm9yZGVyV2lkdGgiKSkgdGVzdF9nZXRCb3JkZXJXaWR0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFbmFibGVkIikpIHRlc3RfZ2V0RW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udCIpKSB0ZXN0X2dldEZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvcmVncm91bmQiKSkgdGVzdF9nZXRGb3JlZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMYXlvdXREYXRhIikpIHRlc3RfZ2V0TGF5b3V0RGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9jYXRpb24iKSkgdGVzdF9nZXRMb2NhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWVudSIpKSB0ZXN0X2dldE1lbnUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1vbml0b3IiKSkgdGVzdF9nZXRNb25pdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNoZWxsIikpIHRlc3RfZ2V0U2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNpemUiKSkgdGVzdF9nZXRTaXplKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb29sVGlwVGV4dCIpKSB0ZXN0X2dldFRvb2xUaXBUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRWaXNpYmxlIikpIHRlc3RfZ2V0VmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW5hYmxlZCIpKSB0ZXN0X2lzRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNGb2N1c0NvbnRyb2wiKSkgdGVzdF9pc0ZvY3VzQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNSZXBhcmVudGFibGUiKSkgdGVzdF9pc1JlcGFyZW50YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNWaXNpYmxlIikpIHRlc3RfaXNWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3ZlQWJvdmVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X21vdmVBYm92ZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3ZlQmVsb3dMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X21vdmVCZWxvd0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wYWNrIikpIHRlc3RfcGFjaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcGFja1oiKSkgdGVzdF9wYWNrWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVkcmF3IikpIHRlc3RfcmVkcmF3KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWRyYXdJSUlJWiIpKSB0ZXN0X3JlZHJhd0lJSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1vdXNlTW92ZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlUGFpbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVRyYXZlcnNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlVHJhdmVyc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJvdW5kc0lJSUkiKSkgdGVzdF9zZXRCb3VuZHNJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDYXB0dXJlWiIpKSB0ZXN0X3NldENhcHR1cmVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvciIpKSB0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFbmFibGVkWiIpKSB0ZXN0X3NldEVuYWJsZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb2N1cyIpKSB0ZXN0X3NldEZvY3VzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGF5b3V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3Rfc2V0TGF5b3V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMb2NhdGlvbklJIikpIHRlc3Rfc2V0TG9jYXRpb25JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUiKSkgdGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFBhcmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUiKSkgdGVzdF9zZXRQYXJlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSZWRyYXdaIikpIHRlc3Rfc2V0UmVkcmF3WigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2l6ZUlJIikpIHRlc3Rfc2V0U2l6ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmlzaWJsZVoiKSkgdGVzdF9zZXRWaXNpYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9Db250cm9sSUkiKSkgdGVzdF90b0NvbnRyb2xJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3RvQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvRGlzcGxheUlJIikpIHRlc3RfdG9EaXNwbGF5SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvRGlzcGxheUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF90b0Rpc3BsYXlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90cmF2ZXJzZUkiKSkgdGVzdF90cmF2ZXJzZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3VwZGF0ZSIpKSB0ZXN0X3VwZGF0ZSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLQlDb250cm9sIGNvbnRyb2w7Ci0JYm9vbGVhbiBldmVudE9jY3VycmVkOwotCi1wcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXQoV2lkZ2V0IHcpIHsKLQljb250cm9sID0gKENvbnRyb2wpdzsKLQlzdXBlci5zZXRXaWRnZXQodyk7Ci19Ci0KLS8qIGEgZGlmZmVyZW50IG1ldGhvZCBpbiBDb25zaXN0ZW5jeVV0aWxpdHkgaXMgaW52b2tlZCBkZXBlbmRpbmcgb24gd2hhdCBtZXRob2QgCi0gKiBlcXVhbHMKLSAqIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSzoKLSAqIAkJCXBhcmFtQSBpcyB0aGUgeCBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wgCQkJCSAgCi0gKiAJCQlwYXJhbUIgaXMgdGhlIHkgY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sCi0gKiAJCQlwYXJhbUMgaXMgdGhlIG1vdXNlIGJ1dHRvbiB0byBjbGljay4KLSAqIAkJCXBhcmFtRCBpZiBpdCBlcXVhbHMgQ29uc2lzdGVuY3lVdGlsaXR5LkVTQ0FQRV9NRU5VLCB0aGVuIGFub3RoZXIgY2xpY2sKLSAqIAkJCXdpbGwgYmUgbWFkZSBvbiB0aGUgYm9yZGVyIG9mIHRoZSBzaGVsbCwgdG8gZXNjYXBlIHRoZSBtZW51IHRoYXQgY2FtZSB1cAotICogCQkJKGllIHJpZ2h0IGNsaWNraW5nIGluIGEgdGV4dCB3aWRnZXQpCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0Q2xpY2soRGlzcGxheSwgUG9pbnQsIGludCkKLSAqIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9ET1VCTEVDTElDSwotICogCQkJcGFyYW1BIGlzIHRoZSB4IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCAJCQkJICAKLSAqIAkJCXBhcmFtQiBpcyB0aGUgeSBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wKLSAqIAkJCXBhcmFtQyBpcyB0aGUgbW91c2UgYnV0dG9uIHRvIGNsaWNrLgotICogCQkJaW52b2tlcyBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdERvdWJsZUNsaWNrKERpc3BsYXksIFBvaW50LCBpbnQpCi0gKiBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRzoKLSAqIAkJCXBhcmFtQSBpcyB0aGUgeCBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wgb2YgdGhlIG9yaWdpbiBvZiBkcmFnCi0gKiAJCQlwYXJhbUIgaXMgdGhlIHkgY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sIG9mIHRoZSBvcmlnaW4gb2YgZHJhZwotICogCQkJcGFyYW1DIGlzIHRoZSB4IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCBvZiB0aGUgZGVzdGluYXRpb24gb2YgZHJhZwotICogCQkJcGFyYW1EIGlzIHRoZSB5IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCBvZiB0aGUgZGVzdGluYXRpb24gb2YgZHJhZwotICogCQkJaW52b2tlcyBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdERyYWcoRGlzcGxheSwgUG9pbnQsIFBvaW50KQotICogQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUzogIAotICogCQkgCXBhcmFtQSBpcyB0aGUgY2hhcmFjdGVyIHRvIHByZXNzCi0gKiAJCQlwYXJhbUIgaXMgdGhlIGtleUNvZGUgCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0S2V5UHJlc3MoRGlzcGxheSwgaW50LCBpbnQpCi0gKiBDb25zaXN0ZW5jeVV0aWxpdHkuRE9VQkxFX0tFWV9QUkVTUzogIAotICogCQkgCXBhcmFtQSBpcyB0aGUgY2hhcmFjdGVyIHRvIHByZXNzIGFuZCBob2xkCi0gKiAJCQlwYXJhbUIgaXMgdGhlIGtleUNvZGUgCi0gKiAJCQlwYXJhbUMgaXMgdGhlIHNlY29uZCBrZXkgdG8gcHJlc3Mgd2hpbGUgdGhlIGZpcnN0IG9uZSBpcyBoZWxkIChpZSBjdHJsLWEpCi0gKiAJCQlwYXJhbUQgaXMgdGhlIHNlY29uZCBrZXljb2RlCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0RG91YmxlS2V5UHJlc3MoRGlzcGxheSwgaW50LCBpbnQsIGludCwgaW50KSAKLSAqIENvbnNpc3RlbmN5VXRpbGl0eS5TRUxFQ1RJT046Ci0gKiAJCQlwYXJhbUEgaXMgdGhlIHggY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sIG9mIHRoZSBmaXJzdCBjbGljawotICogCQkJcGFyYW1CIGlzIHRoZSB5IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCBvZiB0aGUgZmlyc3QgY2xpY2sKLSAqIAkJCXBhcmFtQyBpcyB0aGUgeCBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wgb2YgdGhlIHNlY29uZCBjbGljawotICogCQkJcGFyYW1EIGlzIHRoZSB5IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCBvZiB0aGUgc2Vjb25kIGNsaWNrCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0U2VsZWN0aW9uKERpc3BsYXksIFBvaW50LCBQb2ludCkKLSAqIENvbnNpc3RlbmN5VXRpbGl0eS5TSEVMTF9JQ09OSUZZOgotICogCQkJcGFyYW1BIGlzIHRoZSBidXR0b24gdG8gY2xpY2sgd2l0aAotICogCQkJaW52b2tlcyBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdFNoZWxsSWNvbmlmeShEaXNwbGF5LCBQb2ludCwgaW50KQotICovCi1wcm90ZWN0ZWQgdm9pZCBjb25zaXN0ZW5jeUV2ZW50KGZpbmFsIGludCBwYXJhbUEsIGZpbmFsIGludCBwYXJhbUIsIAotICAgICAgICAJCQkJCQlmaW5hbCBpbnQgcGFyYW1DLCBmaW5hbCBpbnQgcGFyYW1ELAotICAgICAgICAJCQkJCQlmaW5hbCBpbnQgbWV0aG9kLCBWZWN0b3IgZXZlbnRzLCBib29sZWFuIGZvY3VzKSB7Ci0gICAgaWYoZlRlc3RDb25zaXN0ZW5jeSkgewotICAgICAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0gICAgICAgIGlmKGV2ZW50cyA9PSBudWxsKSAKLSAgICAgICAgICAgIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHRlc3QgPSBnZXRUZXN0TmFtZSgpOwotICAgICAgICAKLSAgICAgICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQoKSk7Ci0gICAgICAgIHNoZWxsLnNldFRleHQoIlBhcmVudCIpOwotCi0gICAgICAgIHNoZWxsLnBhY2soKTsKLSAgICAJc2hlbGwub3BlbigpOwotICAgIAlpZihjb250cm9sIGluc3RhbmNlb2YgU2hlbGwpIHsKLSAgICAJICAgICgoU2hlbGwpY29udHJvbCkucGFjaygpOwotICAgICAgICAJKChTaGVsbCljb250cm9sKS5vcGVuKCk7Ci0gICAgCX0KLSAgICAJZmluYWwgUG9pbnRbXSBwdCA9IGRldGVybWluZUxvY2F0aW9ucyhwYXJhbUEsIHBhcmFtQiwgcGFyYW1DLCBwYXJhbUQsIG1ldGhvZCk7Ci0gICAgICAgIGlmKGZvY3VzICYmICFjb250cm9sLnNldEZvY3VzKCkpCi0gICAgICAgICAgICBjb250cm9sLmZvcmNlRm9jdXMoKTsKLSAgICAgICAgU3RyaW5nW10gZXhwZWN0ZWRFdmVudHMgPSBob29rRXhwZWN0ZWRFdmVudHModGVzdCwgZXZlbnRzKTsKLSAgICAgICAgbmV3IFRocmVhZCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBkaXNwbGF5Lndha2UoKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2gobWV0aG9kKSB7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLOgotICAgICAgICAgICAgICAgIAkJQXNzZXJ0LmFzc2VydFRydWUodGVzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3RDbGljayhkaXNwbGF5LCBwdFswXSwgcGFyYW1DKSk7Ci0gICAgICAgICAgICAgICAgCQlpZihwYXJhbUQgPT0gQ29uc2lzdGVuY3lVdGlsaXR5LkVTQ0FQRV9NRU5VKSB7Ci0gICAgICAgICAgICAgICAgCQkgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdCwgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0Q2xpY2soZGlzcGxheSwgcHRbMV0sIDEpKTsKLSAgICAgICAgICAgICAgICAJCX0gIAotICAgICAgICAgICAgICAgIAkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RPVUJMRUNMSUNLOgotICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0RG91YmxlQ2xpY2soZGlzcGxheSwgcHRbMF0sIHBhcmFtQykpOwotICAgICAgICAgICAgICAgICAgICAJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRlc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0S2V5UHJlc3MoZGlzcGxheSwgcGFyYW1BLCBwYXJhbUIpKTsKLSAgICAgICAgICAgICAgICAgICAgCWJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnNpc3RlbmN5VXRpbGl0eS5ET1VCTEVfS0VZX1BSRVNTOgotICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdERvdWJsZUtleVByZXNzKGRpc3BsYXksIHBhcmFtQSwgcGFyYW1CLCBwYXJhbUMsIHBhcmFtRCkpOwotICAgICAgICAgICAgICAgICAgICAJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdERyYWcoZGlzcGxheSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdFswXSwgcHRbMV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnNpc3RlbmN5VXRpbGl0eS5TRUxFQ1RJT046Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRlc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0U2VsZWN0aW9uKGRpc3BsYXksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRbMF0sIHB0WzFdKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zaXN0ZW5jeVV0aWxpdHkuU0hFTExfSUNPTklGWToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKFN3dEp1bml0LmlzQ2FyYm9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0U2hlbGxJY29uaWZ5KGRpc3BsYXksIHB0WzBdLCBwYXJhbUEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdFNoZWxsSWNvbmlmeShkaXNwbGF5LCBwdFsxXSwgcGFyYW1BKSk7Ci0gICAgICAgICAgICAgICAgICAgIAlpZihjb250cm9sIGluc3RhbmNlb2YgU2hlbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCSAgICBkaXNwbGF5LnN5bmNFeGVjKG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICgoU2hlbGwpY29udHJvbCkuc2V0TWluaW1pemVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfX0pOwotICAgICAgICAgICAgICAgICAgICAJfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIAkgICAgZmFpbCgiSWNvbmlmeWluZyBhIG5vbiBzaGVsbCBjb250cm9sIik7Ci0gICAgICAgICAgICAgICAgICAgIAlicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFRocmVhZCgpIHsKLQkJCQkgICAgcHVibGljIHZvaWQgcnVuKCkgewotCQkJCSAgICAgICAgc2hlbGwuZGlzcG9zZSgpOwotCQkJCSAgICB9Ci0JCQkJfSk7Ci0gICAgICAgICAgICAgfQotICAgICAgICB9LnN0YXJ0KCk7Ci0KLSAgICAgICAgd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgaWYoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLSAgICAgICAgfQotICAgICAgICBzZXRVcCgpOyAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIHJlc3VsdHMgPSBuZXcgU3RyaW5nW2V2ZW50cy5zaXplKCldOwotICAgICAgICBldmVudHMuY29weUludG8ocmVzdWx0cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0ZXN0ICsgIiBldmVudCBvcmRlcmluZyIsIGV4cGVjdGVkRXZlbnRzLCByZXN1bHRzKTsKLSAgICB9Ci19Ci0KLXByb3RlY3RlZCB2b2lkIGNvbnNpc3RlbmN5RXZlbnQoaW50IHBhcmFtQSwgaW50IHBhcmFtQiwgCi0JCQkJCQkJCWludCBwYXJhbUMsIGludCBwYXJhbUQsCi0JCQkJCQkJCWludCBtZXRob2QsIFZlY3RvciBldmVudHMpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KHBhcmFtQSwgcGFyYW1CLCBwYXJhbUMsIHBhcmFtRCwgbWV0aG9kLCBldmVudHMsIHRydWUpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBjb25zaXN0ZW5jeUV2ZW50KGludCBwYXJhbUEsIGludCBwYXJhbUIsIAotCQkJCQkJCQlpbnQgcGFyYW1DLCBpbnQgcGFyYW1ELAotCQkJCQkJCQlpbnQgbWV0aG9kKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudChwYXJhbUEsIHBhcmFtQiwgcGFyYW1DLCBwYXJhbUQsIG1ldGhvZCwgbnVsbCwgdHJ1ZSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCkgewotICAgIHNoZWxsLnNldExheW91dChuZXcgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0KCkpOwotICAgIHNoZWxsLnBhY2soKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoU2hlbGwgc2hlbGwpIHsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIHNoZWxsLnBhY2soKTsKLX0KLQotCi1wcm90ZWN0ZWQgUG9pbnRbXSBkZXRlcm1pbmVMb2NhdGlvbnMoaW50IHBhcmFtQSwgaW50IHBhcmFtQiwKLSAgICAgICAgCQkJCQkJICAgICBpbnQgcGFyYW1DLCBpbnQgcGFyYW1ELCBpbnQgbWV0aG9kKSB7Ci0gICAgUG9pbnRbXSBhcnJheSA9IG5ldyBQb2ludFsyXTsKLSAgICBpZihtZXRob2QgPj0gQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKQotICAgICAgICBhcnJheVswXSA9IGNvbnRyb2wudG9EaXNwbGF5KHBhcmFtQSwgcGFyYW1CKTsKLSAgICBpZihtZXRob2QgPj0gQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpIAotICAgICAgICBhcnJheVsxXSA9IGNvbnRyb2wudG9EaXNwbGF5KHBhcmFtQywgcGFyYW1EKTsKLSAgICBpZihtZXRob2QgPT0gQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLICYmIHBhcmFtRCA9PSBDb25zaXN0ZW5jeVV0aWxpdHkuRVNDQVBFX01FTlUpCi0gICAgICAgIGFycmF5WzFdID0gc2hlbGwudG9EaXNwbGF5KDI1LCAtMTApOwotICAgIGVsc2UgaWYobWV0aG9kID09IENvbnNpc3RlbmN5VXRpbGl0eS5TSEVMTF9JQ09OSUZZKSB7Ci0gICAgICAgIGFycmF5WzBdID0gY29udHJvbC50b0Rpc3BsYXkoMCwwKTsKLSAgICAgICAgYXJyYXlbMV0gPSBjb250cm9sLnRvRGlzcGxheShjb250cm9sLmdldFNpemUoKS54IC0yMCwgMCk7Ci0gICAgfQotICAgIHJldHVybiBhcnJheTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YTAwZDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQoY29vbEJhcik7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoICJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Db3VudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1PcmRlcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbU9yZGVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbVNpemVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtU2l6ZXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMb2NrZWQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldExvY2tlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFdyYXBJbmRpY2VzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRXcmFwSW5kaWNlcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtTGF5b3V0JEkkSSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJdGVtTGF5b3V0JEkkSSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9ja2VkWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TG9ja2VkWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFdyYXBJbmRpY2VzJEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFdyYXBJbmRpY2VzJEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1PcmRlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbVNpemVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TG9ja2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXcmFwSW5kaWNlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbUxheW91dCRJJEkkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TG9ja2VkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0V3JhcEluZGljZXMkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfQ2hldnJvbkRyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSSIpKSB0ZXN0X2dldEl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtT3JkZXIiKSkgdGVzdF9nZXRJdGVtT3JkZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1TaXplcyIpKSB0ZXN0X2dldEl0ZW1TaXplcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9ja2VkIikpIHRlc3RfZ2V0TG9ja2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRXcmFwSW5kaWNlcyIpKSB0ZXN0X2dldFdyYXBJbmRpY2VzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtIikpIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SXRlbUxheW91dCRJJEkkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldEl0ZW1MYXlvdXQkSSRJJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExvY2tlZFoiKSkgdGVzdF9zZXRMb2NrZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRXcmFwSW5kaWNlcyRJIikpIHRlc3Rfc2V0V3JhcEluZGljZXMkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogQ3VzdG9tICovCi0KLUNvb2xCYXIgY29vbEJhcjsKLQotCi1wcml2YXRlIHZvaWQgY3JlYXRlQ29vbEJhcihWZWN0b3IgZXZlbnRzKSB7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIFN0cmluZyB0ZXN0ID0gZ2V0VGVzdE5hbWUoKTsKLSAgICBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIFNXVC5GTEFUKTsKLQlUb29sQmFyW10gY29vbEl0ZW1Ub29sQmFyID0gbmV3IFRvb2xCYXJbMl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCWNvb2xJdGVtVG9vbEJhcltpXSA9IG5ldyBUb29sQmFyKGNvb2xCYXIsIFNXVC5GTEFUKTsKLQkJaG9va0V4cGVjdGVkRXZlbnRzKGNvb2xJdGVtLCB0ZXN0LCBldmVudHMpOwotCQlob29rRXhwZWN0ZWRFdmVudHMoY29vbEl0ZW1Ub29sQmFyW2ldLCB0ZXN0LCBldmVudHMpOwotCQlpbnQgdG9vbEl0ZW1XaWR0aCA9IDA7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKSB7Ci0JCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtKGNvb2xJdGVtVG9vbEJhcltpXSwgU1dULkNIRUNLKTsKLQkJCWl0ZW0uc2V0VGV4dCgiQ0IiICsgKChpKjIpICsgaikpOwotCQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiVG9vbEl0ZW0gVG9vbFRpcCIgKyBpICsgaik7Ci0JCQlpZiAoaXRlbS5nZXRXaWR0aCgpID4gdG9vbEl0ZW1XaWR0aCkKLQkJCSAgICB0b29sSXRlbVdpZHRoID0gaXRlbS5nZXRXaWR0aCgpOwotCQkJaG9va0V4cGVjdGVkRXZlbnRzKGl0ZW0sIHRlc3QsIGV2ZW50cyk7Ci0JCX0KLSAgICAgICAgY29vbEl0ZW0uc2V0Q29udHJvbChjb29sSXRlbVRvb2xCYXJbaV0pOwotICAgICAgICBQb2ludCBzaXplOwotICAgICAgICBpZihpID09IDEpCi0gICAgICAgICAgICBzaXplID0gY29vbEl0ZW1Ub29sQmFyW2ldLmNvbXB1dGVTaXplKDIwLCBTV1QuREVGQVVMVCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNpemUgPSBjb29sSXRlbVRvb2xCYXJbaV0uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgUG9pbnQgY29vbFNpemUgPSBjb29sSXRlbS5jb21wdXRlU2l6ZSAoc2l6ZS54LCBzaXplLnkpOwotICAgICAgICBjb29sSXRlbS5zZXRNaW5pbXVtU2l6ZSh0b29sSXRlbVdpZHRoLzMsIGNvb2xTaXplLnkpOwotICAgICAgICBjb29sSXRlbS5zZXRQcmVmZXJyZWRTaXplKGNvb2xTaXplKTsKLSAgICAgICAgY29vbEl0ZW0uc2V0U2l6ZShjb29sU2l6ZS54LzMsIGNvb2xTaXplLnkpOwotICAgICAgICBjb29sSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgQ29vbEl0ZW1TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQl9Ci0Jc2V0V2lkZ2V0KGNvb2xCYXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25NZW51RGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZUNvb2xCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIFBvaW50W10gcG9pbnRzID0gY29vbEJhci5nZXRJdGVtU2l6ZXMoKTsKLSAgICAvL2NoZXZyb24KLSAgICBjb25zaXN0ZW5jeUV2ZW50KHBvaW50c1swXS54LTEyLCAwLCAzLCBDb25zaXN0ZW5jeVV0aWxpdHkuRVNDQVBFX01FTlUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZUNvb2xCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIFBvaW50W10gcG9pbnRzID0gY29vbEJhci5nZXRJdGVtU2l6ZXMoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KHBvaW50c1swXS54LCAyLCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfQ2hldnJvbkRyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlQ29vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgUG9pbnRbXSBwb2ludHMgPSBjb29sQmFyLmdldEl0ZW1TaXplcygpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQocG9pbnRzWzBdLngtMTIsIDAsIHBvaW50c1swXS54LTEyLCA1LCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZUNvb2xCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIFBvaW50W10gcG9pbnRzID0gY29vbEJhci5nZXRJdGVtU2l6ZXMoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KHBvaW50c1swXS54LCAwLCBwb2ludHNbMF0ueCwgNSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfQ2hldnJvbk1vdXNlU2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlQ29vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgUG9pbnRbXSBwb2ludHMgPSBjb29sQmFyLmdldEl0ZW1TaXplcygpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQocG9pbnRzWzBdLngtMTIsIDAsIHBvaW50c1swXS54LTgsIDMwLCBDb25zaXN0ZW5jeVV0aWxpdHkuU0VMRUNUSU9OLCBldmVudHMpOwotfQotCi1jbGFzcyBDb29sSXRlbVNlbGVjdGlvbkxpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciB7Ci0JcHJpdmF0ZSBNZW51IG1lbnUgPSBudWxsOwotCQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCS8qKgotCQkgKiBBIHNlbGVjdGlvbiBldmVudCB3aWxsIGJlIGZpcmVkIHdoZW4gdGhlIGNvb2wgaXRlbQotCQkgKiBpcyBzZWxlY3RlZCBieSBpdHMgZ3JpcHBlciBvciBpZiB0aGUgZHJvcCBkb3duIGFycm93Ci0JCSAqIChvciAnY2hldnJvbicpIGlzIHNlbGVjdGVkLiBFeGFtaW5lIHRoZSBldmVudCBkZXRhaWwKLQkJICogdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSB3aWRnZXQgd2FzIHNlbGVjdGVkLgotCQkgKi8KLQkJaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQVJST1cpIHsKLQkJCS8qIElmIHRoZSBwb3B1cCBtZW51IGlzIGFscmVhZHkgdXAgKGkuZS4gdXNlciBwcmVzc2VkIGFycm93IHR3aWNlKSwKLQkJCSAqIHRoZW4gZGlzcG9zZSBpdC4KLQkJCSAqLwotCQkJaWYgKG1lbnUgIT0gbnVsbCkgewotCQkJCW1lbnUuZGlzcG9zZSgpOwotCQkJCW1lbnUgPSBudWxsOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJLyogR2V0IHRoZSBjb29sIGl0ZW0gYW5kIGNvbnZlcnQgaXRzIGJvdW5kcyB0byBkaXNwbGF5IGNvb3JkaW5hdGVzLiAqLwotCQkJQ29vbEl0ZW0gY29vbEl0ZW0gPSAoQ29vbEl0ZW0pIGV2ZW50LndpZGdldDsKLQkJCVJlY3RhbmdsZSBpdGVtQm91bmRzID0gY29vbEl0ZW0uZ2V0Qm91bmRzICgpOwotCQkJaXRlbUJvdW5kcy53aWR0aCA9IGV2ZW50LnggLSBpdGVtQm91bmRzLng7Ci0JCQlQb2ludCBwdCA9IGNvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludCAoaXRlbUJvdW5kcy54LCBpdGVtQm91bmRzLnkpKTsKLQkJCWl0ZW1Cb3VuZHMueCA9IHB0Lng7Ci0JCQlpdGVtQm91bmRzLnkgPSBwdC55OwotCQkJCi0JCQkvKiBHZXQgdGhlIHRvb2xiYXIgZnJvbSB0aGUgY29vbCBpdGVtLiAqLwotCQkJVG9vbEJhciB0b29sQmFyID0gKFRvb2xCYXIpIGNvb2xJdGVtLmdldENvbnRyb2wgKCk7Ci0JCQlUb29sSXRlbVtdIHRvb2xzID0gdG9vbEJhci5nZXRJdGVtcyAoKTsKLQkJCWludCB0b29sQ291bnQgPSB0b29scy5sZW5ndGg7Ci0JCQkJCQkJCi0JCQkvKiBDb252ZXJ0IHRoZSBib3VuZHMgb2YgZWFjaCB0b29sIGl0ZW0gdG8gZGlzcGxheSBjb29yZGluYXRlcywKLQkJCSAqIGFuZCBkZXRlcm1pbmUgd2hpY2ggb25lcyBhcmUgcGFzdCB0aGUgYm91bmRzIG9mIHRoZSBjb29sIGl0ZW0uCi0JCQkgKi8KLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdG9vbENvdW50KSB7Ci0JCQkJUmVjdGFuZ2xlIHRvb2xCb3VuZHMgPSB0b29sc1tpXS5nZXRCb3VuZHMgKCk7Ci0JCQkJcHQgPSB0b29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQodG9vbEJvdW5kcy54LCB0b29sQm91bmRzLnkpKTsKLQkJCQl0b29sQm91bmRzLnggPSBwdC54OwotCQkJCXRvb2xCb3VuZHMueSA9IHB0Lnk7Ci0JCSAgCQlSZWN0YW5nbGUgaW50ZXJzZWN0aW9uID0gaXRlbUJvdW5kcy5pbnRlcnNlY3Rpb24gKHRvb2xCb3VuZHMpOwotCQkgIAkJaWYgKCFpbnRlcnNlY3Rpb24uZXF1YWxzICh0b29sQm91bmRzKSkgYnJlYWs7Ci0JCSAgCQlpKys7Ci0JCQl9Ci0JCQkKLQkJCS8qIENyZWF0ZSBhIHBvcC11cCBtZW51IHdpdGggaXRlbXMgZm9yIGVhY2ggb2YgdGhlIGhpZGRlbiBidXR0b25zLiAqLwotCQkJbWVudSA9IG5ldyBNZW51IChjb29sQmFyKTsKLQkJCWZvciAoaW50IGogPSBpOyBqIDwgdG9vbENvdW50OyBqKyspIHsKLQkJCQlUb29sSXRlbSB0b29sID0gdG9vbHNbal07Ci0JCQkJU3RyaW5nIHRleHQgPSB0b29sLmdldFRleHQoKTsKLQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULk5PTkUpOwotCQkJCW1lbnVJdGVtLnNldFRleHQodGV4dCk7Ci0JCQl9Ci0JCQkKLQkJCS8qIERpc3BsYXkgdGhlIHBvcC11cCBtZW51IGF0IHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgYXJyb3cgYnV0dG9uLgotCQkJICogRGlzcG9zZSB0aGUgbWVudSB3aGVuIHRoZSB1c2VyIGlzIGRvbmUgd2l0aCBpdC4KLQkJCSAqLwotCQkJcHQgPSBjb29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJbWVudS5zZXRMb2NhdGlvbiAocHQueCwgcHQueSk7Ci0JCQltZW51LnNldFZpc2libGUgKHRydWUpOwotCQkJRGlzcGxheSBkaXNwbGF5ID0gY29vbEJhci5nZXREaXNwbGF5ICgpOwotCQkJd2hpbGUgKG1lbnUgIT0gbnVsbCAmJiAhbWVudS5pc0Rpc3Bvc2VkKCkgJiYgbWVudS5pc1Zpc2libGUgKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQkJfQotCQkJaWYgKG1lbnUgIT0gbnVsbCkgewotCQkJCW1lbnUuZGlzcG9zZSAoKTsKLQkJCQltZW51ID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLX0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGVjOWZhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sSXRlbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0Jc2V0V2lkZ2V0KGNvb2xJdGVtKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySSgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0JCi0JdHJ5IHsKLQkJY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0obnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7CQotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhcklJKCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwLCAwKTsKLQl0cnkgewotCQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwLCAtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4ID09IC0xIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0JfQotCXRyeSB7Ci0JCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDAsIDIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCA9PSAyIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0JfQotCWFzc2VydEVxdWFscygxLCBjb29sQmFyLmdldEl0ZW1Db3VudCgpKTsKLQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwLCAxKTsKLQlhc3NlcnRFcXVhbHMoMiwgY29vbEJhci5nZXRJdGVtQ291bnQoKSk7Ci0JY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKDMsIGNvb2xCYXIuZ2V0SXRlbUNvdW50KCkpOwotCWFzc2VydEVxdWFscyhjb29sSXRlbSwgY29vbEJhci5nZXRJdGVtKDApKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUkoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiZm9vIik7Ci0KLQlQb2ludCBzaXplID0gY29vbEl0ZW0uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQljb29sSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JUG9pbnQgc2l6ZTIgPSBjb29sSXRlbS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCWFzc2VydFRydWUoc2l6ZTIueCA9PSBzaXplLngpOwotCi0Jc2l6ZSA9IGNvb2xJdGVtLmNvbXB1dGVTaXplKDUwLCAyNSk7Ci0Jc2l6ZTIgPSBjb29sSXRlbS5jb21wdXRlU2l6ZSgxMDAsIDI1KTsKLQlhc3NlcnRFcXVhbHMoc2l6ZS54ICsgNTAsIHNpemUyLngpOwotCWFzc2VydEVxdWFscyhzaXplLnksIHNpemUyLnkpOwotCi0Jc2l6ZSA9IGNvb2xJdGVtLmNvbXB1dGVTaXplKDEsMSk7Ci0Jc2l6ZTIgPSBjb29sSXRlbS5jb21wdXRlU2l6ZSgyNiwgMjYpOwotCWFzc2VydEVxdWFscygyNSwgc2l6ZTIueCAtIHNpemUueCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoImZvbyIpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkKLQlSZWN0YW5nbGUgcmVjdCA9IGNvb2xJdGVtLmdldEJvdW5kcygpOwotCVBvaW50IHNpemUgPSBjb29sSXRlbS5nZXRTaXplKCk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUueCwgcmVjdC53aWR0aCk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUueSwgcmVjdC5oZWlnaHQpOwotCQotCWNvb2xJdGVtLnNldFNpemUoMjUsIDI1KTsKLQlyZWN0ID0gY29vbEl0ZW0uZ2V0Qm91bmRzKCk7Ci0JY29vbEl0ZW0uc2V0U2l6ZSgxMDAsIDI1KTsKLQlSZWN0YW5nbGUgbmV3UmVjdCA9IGNvb2xJdGVtLmdldEJvdW5kcygpOwotCWFzc2VydEVxdWFscyhyZWN0LndpZHRoICsgNzUsIG5ld1JlY3Qud2lkdGgpOwotCWFzc2VydEVxdWFscyhyZWN0LngsIG5ld1JlY3QueCk7Ci0JYXNzZXJ0RXF1YWxzKHJlY3QueSwgbmV3UmVjdC55KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250cm9sKCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlhc3NlcnROdWxsKGNvb2xJdGVtLmdldENvbnRyb2woKSk7Ci0KLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCUNvbnRyb2wgY29udHJvbCA9IGNvb2xJdGVtLmdldENvbnRyb2woKTsKLQlhc3NlcnRFcXVhbHMoYnV0dG9uLCBjb250cm9sKTsKLQotCWJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQljb250cm9sID0gY29vbEl0ZW0uZ2V0Q29udHJvbCgpOwotCWFzc2VydEVxdWFscyhidXR0b24sIGNvbnRyb2wpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1pbmltdW1TaXplKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRNaW5pbXVtU2l6ZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0JYXNzZXJ0RXF1YWxzKGNvb2xCYXIsIGNvb2xJdGVtLmdldFBhcmVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQcmVmZXJyZWRTaXplKCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoImZvb2JhciIpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkKLQlQb2ludCBwcmVmID0gY29vbEl0ZW0uZ2V0UHJlZmVycmVkU2l6ZSgpOwotCWNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUocHJlZik7Ci0JYXNzZXJ0RXF1YWxzKHByZWYsIGNvb2xJdGVtLmdldFByZWZlcnJlZFNpemUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2l6ZSgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJmb28iKTsKLQljb29sSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JCi0JUG9pbnQgc2l6ZSA9IGNvb2xJdGVtLmdldFNpemUoKTsKLQlSZWN0YW5nbGUgcmVjdCA9IGNvb2xJdGVtLmdldEJvdW5kcygpOwotCWFzc2VydEVxdWFscyhyZWN0LndpZHRoLCBzaXplLngpOwotCWFzc2VydEVxdWFscyhyZWN0LmhlaWdodCwgc2l6ZS55KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQljb29sSXRlbS5zZXRDb250cm9sKG51bGwpOwotCQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiZm9vYmFyIik7Ci0JCi0JUG9pbnQgc2l6ZSA9IGNvb2xJdGVtLmdldFNpemUoKTsKLQljb29sSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JUG9pbnQgc2l6ZTIgPSBjb29sSXRlbS5nZXRTaXplKCk7Ci0JYXNzZXJ0VHJ1ZShzaXplMi54ID4gc2l6ZS54KTsKLQkKLQlpZiAoIU1JTklNQUxfQ09ORk9STUFOQ0UpIHsKLQkJc2l6ZSA9IGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlzaXplMiA9IGNvb2xJdGVtLmNvbXB1dGVTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJYXNzZXJ0RXF1YWxzKHNpemUyLCBjb29sSXRlbS5nZXRTaXplKCkpOwotCX0KLQkKLQlidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQlidXR0b24uZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gY29udHJvbC5pc0Rpc3Bvc2VkKCkiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQl0cnkgewotCQljb29sSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiBjb250cm9sIGhhcyB3cm9uZyBwYXJlbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1TaXplSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE1pbmltdW1TaXplSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5pbXVtU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE1pbmltdW1TaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFByZWZlcnJlZFNpemVJSSgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJmb29iYXIiKTsKLQljb29sSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JCi0JUG9pbnQgc2l6ZSA9IGNvb2xJdGVtLmdldFNpemUoKTsKLQljb29sSXRlbS5zZXRQcmVmZXJyZWRTaXplKHNpemUpOwotCWFzc2VydEVxdWFscyhzaXplLngsIGNvb2xJdGVtLmdldFNpemUoKS54KTsKLQljb29sSXRlbS5zZXRTaXplKGNvb2xJdGVtLmdldFByZWZlcnJlZFNpemUoKSk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUsIGNvb2xJdGVtLmdldFNpemUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UHJlZmVycmVkU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiZm9vYmFyIik7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQotCVBvaW50IHNpemUgPSBuZXcgUG9pbnQoNTAsIDMwKTsKLQljb29sSXRlbS5zZXRQcmVmZXJyZWRTaXplKHNpemUpOwotCVBvaW50IHNpemUyID0gY29vbEl0ZW0uZ2V0UHJlZmVycmVkU2l6ZSgpOwotCWNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUoNTAsIDMwKTsKLQlhc3NlcnRFcXVhbHMoc2l6ZTIsIGNvb2xJdGVtLmdldFByZWZlcnJlZFNpemUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2l6ZUlJKCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoImZvbyIpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQotCWNvb2xJdGVtLnNldFNpemUoNTAsIDUwKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDUwLCA1MCksIGNvb2xJdGVtLmdldFNpemUoKSk7Ci0KLQljb29sSXRlbS5zZXRTaXplKDAsIDApOwotCVBvaW50IHNtYWxsZXN0ID0gY29vbEl0ZW0uZ2V0U2l6ZSgpOwotCWNvb2xJdGVtLnNldFNpemUoMSwgMSk7Ci0JYXNzZXJ0RXF1YWxzKHNtYWxsZXN0LCBjb29sSXRlbS5nZXRTaXplKCkpOwotCQotCVJlY3RhbmdsZSByZWN0ID0gY29vbEl0ZW0uZ2V0Qm91bmRzKCk7Ci0JUG9pbnQgc2l6ZSA9IGNvb2xJdGVtLmdldFNpemUoKTsKLQljb29sSXRlbS5zZXRTaXplKHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQlhc3NlcnRFcXVhbHMoc2l6ZSwgY29vbEl0ZW0uZ2V0U2l6ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJmb28iKTsKLQljb29sSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JCi0JUG9pbnQgc2l6ZSA9IG5ldyBQb2ludCg1MCwgNTApOwotCWNvb2xJdGVtLnNldFNpemUoc2l6ZSk7Ci0JUG9pbnQgc2l6ZTIgPSBjb29sSXRlbS5nZXRTaXplKCk7Ci0JY29vbEl0ZW0uc2V0U2l6ZSg1MCwgNTApOwotCWFzc2VydEVxdWFscyhzaXplMiwgY29vbEl0ZW0uZ2V0U2l6ZSgpKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWluaW11bVNpemUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJlZmVycmVkU2l6ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2l6ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5pbXVtU2l6ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5pbXVtU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFByZWZlcnJlZFNpemVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UHJlZmVycmVkU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNpemVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhckkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhcklJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhcklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSSIpKSB0ZXN0X2NvbXB1dGVTaXplSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udHJvbCIpKSB0ZXN0X2dldENvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1pbmltdW1TaXplIikpIHRlc3RfZ2V0TWluaW11bVNpemUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UHJlZmVycmVkU2l6ZSIpKSB0ZXN0X2dldFByZWZlcnJlZFNpemUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNpemUiKSkgdGVzdF9nZXRTaXplKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNaW5pbXVtU2l6ZUlJIikpIHRlc3Rfc2V0TWluaW11bVNpemVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluaW11bVNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0TWluaW11bVNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRQcmVmZXJyZWRTaXplSUkiKSkgdGVzdF9zZXRQcmVmZXJyZWRTaXplSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFByZWZlcnJlZFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0UHJlZmVycmVkU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNpemVJSSIpKSB0ZXN0X3NldFNpemVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXN0YXRpYyBmaW5hbCBib29sZWFuIE1JTklNQUxfQ09ORk9STUFOQ0UgPSBmYWxzZTsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhOGRmMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRlY29yYXRpb25zCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EZWNvcmF0aW9ucwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucyBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCS8vIGRvIG5vdGhpbmcsIGV2ZW4gdGhvdWdoIHRoaXMgaXMgbm90IGFuIGFic3RyYWN0IGNsYXNzLCBpdCB3YXMgbmV2ZXIgbWVhbnQgdG8gCi0JLy8gYmUgaW5zdGFudGlhdGVkCi19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQkvLyBkbyBub3RoaW5nLCBldmVuIHRob3VnaCB0aGlzIGlzIG5vdCBhbiBhYnN0cmFjdCBjbGFzcywgaXQgd2FzIG5ldmVyIG1lYW50IHRvIAotCS8vIGJlIGluc3RhbnRpYXRlZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpIHsKLQlkZWNvcmF0aW9ucy5jb21wdXRlVHJpbSgwLDAsMCwwKTsKLQlkZWNvcmF0aW9ucy5jb21wdXRlVHJpbSgwLDAsMTAsMjApOwotfQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kaXNwb3NlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCb3VuZHMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGllbnRBcmVhKCkgewotCVJlY3RhbmdsZSByZWN0ID0gZGVjb3JhdGlvbnMuZ2V0Q2xpZW50QXJlYSgpOwotCWFzc2VydFRydWUoIjphOiIsIHJlY3QuaGVpZ2h0ID49IDApOwotCWFzc2VydFRydWUoIjpiOiIsIHJlY3Qud2lkdGggPj0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVmYXVsdEJ1dHRvbigpIHsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihkZWNvcmF0aW9ucywgU1dULlBVU0gpOwotCWRlY29yYXRpb25zLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBkZWNvcmF0aW9ucy5nZXREZWZhdWx0QnV0dG9uKCkgPT0gYnV0dG9uKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZSgpIHsKLQlJbWFnZVtdIGNhc2VzID0ge251bGwsIG5ldyBJbWFnZShudWxsLCAxMDAsIDEwMCl9OwotCWZvcihpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKXsKLQkJZGVjb3JhdGlvbnMuc2V0SW1hZ2UoY2FzZXNbaV0pOwotCSAJYXNzZXJ0RXF1YWxzKGRlY29yYXRpb25zLmdldEltYWdlKCksIGNhc2VzW2ldKTsKLQkgCWlmIChjYXNlc1tpXSE9bnVsbCkKLQkgIAkJY2FzZXNbaV0uZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEltYWdlcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExvY2F0aW9uKCkgewotCWRlY29yYXRpb25zLnNldExvY2F0aW9uKDEwLDE1KTsKLQlhc3NlcnRUcnVlKCI6YToiLCBkZWNvcmF0aW9ucy5nZXRMb2NhdGlvbigpLnggPT0gMTApOwotCWFzc2VydFRydWUoIjpiOiIsIGRlY29yYXRpb25zLmdldExvY2F0aW9uKCkueSA9PSAxNSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4aW1pemVkKCkgewotCS8vIHRlc3RlZCBpbiBzZXRNYXhpbWl6ZWQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVudUJhcigpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCBkZWNvcmF0aW9ucy5nZXRNZW51QmFyKCkgPT0gbnVsbCk7Ci0JTWVudSBiYXIgPSBuZXcgTWVudSAoZGVjb3JhdGlvbnMsIFNXVC5CQVIpOwotCWRlY29yYXRpb25zLnNldE1lbnVCYXIgKGJhcik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgZGVjb3JhdGlvbnMuZ2V0TWVudUJhcigpID09IGJhcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWluaW1pemVkKCkgewotCS8vIHRlc3RlZCBpbiBzZXRNaW5pbWl6ZWQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2l6ZSgpIHsKLQkvLyBzdXBlciBjbGFzcyB0ZXN0IHN1ZmZpY2llbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCWRlY29yYXRpb25zLnNldFRleHQoInRlc3QiKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBkZWNvcmF0aW9ucy5nZXRUZXh0KCkuZXF1YWxzKCJ0ZXN0IikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzUmVwYXJlbnRhYmxlKCkgewotCS8qIERlY29yYXRpb25zIGFyZSBub3QgcmVwYXJlbnRhYmxlLCBzZWUgd2luMzIgaW1wbGVtZW50YXRpb24gb2YgaXNSZXBhcmVudGFibGUoKSAqLwotCWFzc2VydEZhbHNlKGRlY29yYXRpb25zLmlzUmVwYXJlbnRhYmxlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldERlZmF1bHRCdXR0b25Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uKCkgewotCWFzc2VydE51bGwoZGVjb3JhdGlvbnMuZ2V0RGVmYXVsdEJ1dHRvbigpKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihkZWNvcmF0aW9ucywgU1dULk5VTEwpOwotCWRlY29yYXRpb25zLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLQlhc3NlcnRUcnVlKCJidXR0b24gbm90IGRlZmF1bHQiLCBkZWNvcmF0aW9ucy5nZXREZWZhdWx0QnV0dG9uKCkgPT0gYnV0dG9uKTsKLQlpZiAoZkNoZWNrQm9ndXNUZXN0Q2FzZXMpIHsKLQkJZGVjb3JhdGlvbnMuc2V0RGVmYXVsdEJ1dHRvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChkZWNvcmF0aW9ucy5nZXREZWZhdWx0QnV0dG9uKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JYXNzZXJ0TnVsbCgiOmE6IiwgZGVjb3JhdGlvbnMuZ2V0SW1hZ2UoKSk7Ci0JbG9hZEltYWdlcygpOwotCWRlY29yYXRpb25zLnNldEltYWdlKGltYWdlc1swXSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgaW1hZ2VzWzBdID09IGRlY29yYXRpb25zLmdldEltYWdlKCkpOwotCWFzc2VydFRydWUoIjpjOiIsIGltYWdlc1sxXSAhPSBkZWNvcmF0aW9ucy5nZXRJbWFnZSgpKTsKLQlkZWNvcmF0aW9ucy5zZXRJbWFnZShudWxsKTsKLQlhc3NlcnROdWxsKCI6ZDoiLCBkZWNvcmF0aW9ucy5nZXRJbWFnZSgpKTsKLQlmcmVlSW1hZ2VzKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEltYWdlcyRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWF4aW1pemVkWigpIHsKLQlkZWNvcmF0aW9ucy5zZXRNYXhpbWl6ZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIjoxOiIsIGRlY29yYXRpb25zLmdldE1heGltaXplZCgpID09IGZhbHNlKTsKLQlkZWNvcmF0aW9ucy5zZXRNYXhpbWl6ZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgZGVjb3JhdGlvbnMuZ2V0TWF4aW1pemVkKCkgPT0gdHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6IiwgZGVjb3JhdGlvbnMuZ2V0TWluaW1pemVkKCkgPT0gZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1lbnVCYXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSgpIHsKLQlhc3NlcnROdWxsKGRlY29yYXRpb25zLmdldE1lbnUoKSk7Ci0JTWVudSB0ZXN0TWVudSA9IG5ldyBNZW51KGRlY29yYXRpb25zKTsKLQlkZWNvcmF0aW9ucy5zZXRNZW51KHRlc3RNZW51KTsKLQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbWVudSIsIGRlY29yYXRpb25zLmdldE1lbnUoKSA9PSB0ZXN0TWVudSk7Ci0JZGVjb3JhdGlvbnMuc2V0TWVudShudWxsKTsKLQlhc3NlcnROdWxsKGRlY29yYXRpb25zLmdldE1lbnUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluaW1pemVkWigpIHsKLQlkZWNvcmF0aW9ucy5zZXRNaW5pbWl6ZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIjoxOiIsIGRlY29yYXRpb25zLmdldE1pbmltaXplZCgpID09IGZhbHNlKTsKLQlkZWNvcmF0aW9ucy5zZXRNaW5pbWl6ZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgZGVjb3JhdGlvbnMuZ2V0TWluaW1pemVkKCkgPT0gdHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6IiwgZGVjb3JhdGlvbnMuZ2V0TWF4aW1pemVkKCkgPT0gZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0cnkgewotCQlkZWNvcmF0aW9ucy5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlTdHJpbmcgdGVzdFN0ciA9ICJ0ZXN0IHN0cmluZyI7Ci0JZGVjb3JhdGlvbnMuc2V0VGV4dCh0ZXN0U3RyKTsKLQlhc3NlcnRUcnVlKCJhIiwgZGVjb3JhdGlvbnMuZ2V0VGV4dCgpLmVxdWFscyh0ZXN0U3RyKSk7Ci0JZGVjb3JhdGlvbnMuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiYiIsIGRlY29yYXRpb25zLmdldFRleHQoKS5lcXVhbHMoIiIpKTsKLQl0cnkgewotCQlkZWNvcmF0aW9ucy5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmlzaWJsZVooKSB7Ci0JLy8gdGVzdCBpbiBzdWJjbGFzc2VzCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnMoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVRyaW1JSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaWVudEFyZWEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlZmF1bHRCdXR0b24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExvY2F0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNYXhpbWl6ZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1lbnVCYXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1pbmltaXplZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2l6ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNSZXBhcmVudGFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERlZmF1bHRCdXR0b25Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlcyRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNYXhpbWl6ZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNZW51QmFyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltaXplZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVRyaW1JSUlJIikpIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDbGllbnRBcmVhIikpIHRlc3RfZ2V0Q2xpZW50QXJlYSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGVmYXVsdEJ1dHRvbiIpKSB0ZXN0X2dldERlZmF1bHRCdXR0b24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlIikpIHRlc3RfZ2V0SW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlcyIpKSB0ZXN0X2dldEltYWdlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9jYXRpb24iKSkgdGVzdF9nZXRMb2NhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWF4aW1pemVkIikpIHRlc3RfZ2V0TWF4aW1pemVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNZW51QmFyIikpIHRlc3RfZ2V0TWVudUJhcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWluaW1pemVkIikpIHRlc3RfZ2V0TWluaW1pemVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaXplIikpIHRlc3RfZ2V0U2l6ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dCIpKSB0ZXN0X2dldFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzUmVwYXJlbnRhYmxlIikpIHRlc3RfaXNSZXBhcmVudGFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldERlZmF1bHRCdXR0b25Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uIikpIHRlc3Rfc2V0RGVmYXVsdEJ1dHRvbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZXMkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWF4aW1pemVkWiIpKSB0ZXN0X3NldE1heGltaXplZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1lbnVCYXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSIpKSB0ZXN0X3NldE1lbnVCYXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluaW1pemVkWiIpKSB0ZXN0X3NldE1pbmltaXplZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmlzaWJsZVoiKSkgdGVzdF9zZXRWaXNpYmxlWigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLURlY29yYXRpb25zIGRlY29yYXRpb25zOwotSW1hZ2VbXSBpbWFnZXMgPSBuZXcgSW1hZ2UgW1N3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGgqU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXMubGVuZ3RoXTsKLQotcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0KFdpZGdldCB3KSB7Ci0JaWYgKGRlY29yYXRpb25zICE9IG51bGwgJiYgIWRlY29yYXRpb25zLmlzRGlzcG9zZWQoKSkKLQkJZGVjb3JhdGlvbnMuZGlzcG9zZSgpOwotCWRlY29yYXRpb25zID0gKERlY29yYXRpb25zKXc7Ci0Jc3VwZXIuc2V0V2lkZ2V0KHcpOwotfQotCi0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgbG9hZEltYWdlcygpIHsKLQlpbnQgbnVtRm9ybWF0cyA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGg7Ci0JaW50IG51bUZpbGVzID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXMubGVuZ3RoOwotCWZvciAoaW50IGk9MDsgaTxudW1Gb3JtYXRzOyBpKyspIHsKLQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkJaW50IGluZGV4ID0gaSpudW1GaWxlczsKLQkJZm9yIChpbnQgaj0wOyBqPG51bUZpbGVzOyBqKyspewotCQkJU3RyaW5nIGZpbGVOYW1lID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNbal07Ci0JCQlJbnB1dFN0cmVhbSAgcmVzb3VyY2UgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSArICIuIiArIGZvcm1hdCk7Ci0JCQlpbWFnZXMgW2luZGV4K2pdID0gbmV3IEltYWdlIChzaGVsbC5nZXREaXNwbGF5KCksIHJlc291cmNlKTsKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2UuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjb250aW51ZTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIGZyZWVJbWFnZXMoKSB7Ci0JZm9yIChpbnQgaT0wOyBpPGltYWdlcy5sZW5ndGg7IGkrKykgaW1hZ2VzW2ldLmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0YWM4OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpYWxvZwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlhbG9nCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZyBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCWFzc2VydFRydWUoIjphOiIsIGRpYWxvZy5nZXRQYXJlbnQoKSA9PSBzaGVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3R5bGUoKSB7Ci0JLy8gd2UgdXNlIHRoaXMgY2FsbCBpbiBhIENvbnN0cnVjdG9yIHRlc3Qgc28gdGhhdCB3ZSBjYW4KLQkvLyBjaGVjayBpZiB0aGUgc3R5bGUgaXMgdGhlIG9uZSB0aGF0IHdhcyBjcmVhdGVkCi0JZGlhbG9nLmdldFN0eWxlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlhc3NlcnRUcnVlKCI6MToiLCBkaWFsb2cuZ2V0VGV4dCgpID09ICIiKTsKLQlTdHJpbmcgdGVzdFN0ciA9ICJ0ZXN0IHN0cmluZyI7Ci0JZGlhbG9nLnNldFRleHQodGVzdFN0cik7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgZGlhbG9nLmdldFRleHQoKS5lcXVhbHModGVzdFN0cikpOwotCWRpYWxvZy5zZXRUZXh0KCIiKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBkaWFsb2cuZ2V0VGV4dCgpLmVxdWFscygiIikpOwotCXRyeSB7Ci0JCWRpYWxvZy5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2coKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0eWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlIikpIHRlc3RfZ2V0U3R5bGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgU2hlbGwgc2hlbGw7Ci1wcml2YXRlIERpYWxvZyBkaWFsb2c7Ci1wcml2YXRlIGludCBqdW5pdFN0eWxlOwotCi1wcm90ZWN0ZWQgdm9pZCBzZXREaWFsb2coRGlhbG9nIG5ld0RpYWxvZykgewotCWRpYWxvZyA9IG5ld0RpYWxvZzsKLX0KLXByb3RlY3RlZCB2b2lkIHNldFN0eWxlKGludCBzdHlsZSkgewotCXN0eWxlID0ganVuaXRTdHlsZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXJlY3RvcnlEaWFsb2cuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXJlY3RvcnlEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU2MmU5OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlyZWN0b3J5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpcmVjdG9yeURpYWxvZyBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlyZWN0b3J5RGlhbG9nKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlkaXJEaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0RGlhbG9nKGRpckRpYWxvZyk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKSB7Ci0JRGlyZWN0b3J5RGlhbG9nIGRkID0gbmV3IERpcmVjdG9yeURpYWxvZyhzaGVsbCk7Ci0JdHJ5IHsKLQkJbmV3IERpcmVjdG9yeURpYWxvZyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbnVsbCBwYXJlbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGaWx0ZXJQYXRoKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZpbHRlclBhdGhMamF2YV9sYW5nX1N0cmluZwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfb3BlbigpIHsKLQlpZiAoZlRlc3REaWFsb2dPcGVuKQotCQlkaXJEaWFsb2cub3BlbigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZpbHRlclBhdGhMamF2YV9sYW5nX1N0cmluZygpIHsKLQlhc3NlcnRUcnVlKCI6MToiLCBkaXJEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpID09ICIiKTsKLQlTdHJpbmcgdGVzdFN0ciA9ICIuLyoiOwotCWRpckRpYWxvZy5zZXRGaWx0ZXJQYXRoKHRlc3RTdHIpOwotCWFzc2VydFRydWUoIjoyOiIsIGRpckRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkuZXF1YWxzKHRlc3RTdHIpKTsKLQlkaXJEaWFsb2cuc2V0RmlsdGVyUGF0aCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjM6IiwgZGlyRGlhbG9nLmdldEZpbHRlclBhdGgoKS5lcXVhbHMoIiIpKTsKLQlkaXJEaWFsb2cuc2V0RmlsdGVyUGF0aChudWxsKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBkaXJEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpID09IG51bGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZygpIHsKLQlhc3NlcnRUcnVlKCI6MToiLCBkaXJEaWFsb2cuZ2V0TWVzc2FnZSgpID09ICIiKTsKLQlTdHJpbmcgdGVzdFN0ciA9ICJ0ZXN0IHN0cmluZyI7Ci0JZGlyRGlhbG9nLnNldE1lc3NhZ2UodGVzdFN0cik7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgZGlyRGlhbG9nLmdldE1lc3NhZ2UoKS5lcXVhbHModGVzdFN0cikpOwotCWRpckRpYWxvZy5zZXRNZXNzYWdlKCIiKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBkaXJEaWFsb2cuZ2V0TWVzc2FnZSgpLmVxdWFscygiIikpOwotCXRyeSB7Ci0JCWRpckRpYWxvZy5zZXRNZXNzYWdlKG51bGwpOwotCQlmYWlsICgibnVsbCBhcmd1bWVudCBkaWQgbm90IHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpcmVjdG9yeURpYWxvZygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGaWx0ZXJQYXRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNZXNzYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9vcGVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RmlsdGVyUGF0aCIpKSB0ZXN0X2dldEZpbHRlclBhdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1lc3NhZ2UiKSkgdGVzdF9nZXRNZXNzYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9vcGVuIikpIHRlc3Rfb3BlbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RmlsdGVyUGF0aExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0RmlsdGVyUGF0aExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNZXNzYWdlTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRNZXNzYWdlTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1EaXJlY3RvcnlEaWFsb2cgZGlyRGlhbG9nOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZTRhODIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCS8vIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSBEaXNwbGF5IG9iamVjdCBwZXIgdGhyZWFkLgotCS8vIElmIGEgc2Vjb25kIERpc3BsYXkgaXMgY3JlYXRlZCBvbiB0aGUgc2FtZSB0aHJlYWQsIGFuIAotCS8vIEludmFsaWRUaHJlYWRBY2Nlc3NFeGNlcHRpb24gaXMgdGhyb3duLgotCS8vCi0JLy8gRWFjaCB0ZXN0IHdpbGwgY3JlYXRlIGl0cyBvd24gRGlzcGxheSBhbmQgbXVzdCBkaXNwb3NlIG9mIGl0IAotCS8vIGJlZm9yZSBjb21wbGV0aW5nLgotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQlEaXNwbGF5IGRpc3AgPSBuZXcgRGlzcGxheSgpOwotCWRpc3AuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhKCkgewotCURpc3BsYXkgZGlzcDsKLQlkaXNwID0gbmV3IERpc3BsYXkobnVsbCk7Ci0JZGlzcC5kaXNwb3NlKCk7Ci0JCi0JZGlzcCA9IG5ldyBEaXNwbGF5KG5ldyBEZXZpY2VEYXRhKCkpOwotCWRpc3AuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEZpbHRlcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKSB7Ci0JZmluYWwgaW50IENMT1NFX0NBTExCQUNLID0gMDsKLQlmaW5hbCBpbnQgRElTUE9TRV9DQUxMQkFDSyA9IDE7Ci0JZmluYWwgYm9vbGVhbltdIGNhbGxiYWNrUmVjZWl2ZWQgPSBuZXcgYm9vbGVhbltdIHtmYWxzZSwgZmFsc2V9OwotCQotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS50eXBlID09IFNXVC5DbG9zZSkKLQkJCQljYWxsYmFja1JlY2VpdmVkW0NMT1NFX0NBTExCQUNLXSA9IHRydWU7Ci0JCQllbHNlIGlmIChlLnR5cGUgPT0gU1dULkRpc3Bvc2UpCi0JCQkJY2FsbGJhY2tSZWNlaXZlZFtESVNQT1NFX0NBTExCQUNLXSA9IHRydWU7Ci0JCX07Ci0JfTsKLQkKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCXRyeSB7Ci0JCQlkaXNwbGF5LmFkZEZpbHRlcihTV1QuRGlzcG9zZSwgbnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRGaWx0ZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBhZGRGaWx0ZXIgd2l0aCBudWxsIGFyZ3VtZW50IiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQlkaXNwbGF5LmFkZEZpbHRlcihTV1QuQ2xvc2UsIGxpc3RlbmVyKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmNsb3NlKCk7Ci0JfQotCWFzc2VydFRydWUoY2FsbGJhY2tSZWNlaXZlZFtDTE9TRV9DQUxMQkFDS10pOwotCWFzc2VydEZhbHNlKGNhbGxiYWNrUmVjZWl2ZWRbRElTUE9TRV9DQUxMQkFDS10pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpIHsKLQlmaW5hbCBpbnQgQ0xPU0VfQ0FMTEJBQ0sgPSAwOwotCWZpbmFsIGludCBESVNQT1NFX0NBTExCQUNLID0gMTsKLQlmaW5hbCBib29sZWFuW10gY2FsbGJhY2tSZWNlaXZlZCA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCBmYWxzZX07Ci0JCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULkNsb3NlKQotCQkJCWNhbGxiYWNrUmVjZWl2ZWRbQ0xPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKGUudHlwZSA9PSBTV1QuRGlzcG9zZSkKLQkJCQljYWxsYmFja1JlY2VpdmVkW0RJU1BPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJfTsKLQl9OwotCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJdHJ5IHsKLQkJCWRpc3BsYXkuYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZExpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgYWRkTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50IiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQlkaXNwbGF5LmFkZExpc3RlbmVyKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5jbG9zZSgpOwotCX0KLQlhc3NlcnRGYWxzZSgiOmE6IiwgY2FsbGJhY2tSZWNlaXZlZFtDTE9TRV9DQUxMQkFDS10pOwotCWFzc2VydFRydWUoIjpiOiIsIGNhbGxiYWNrUmVjZWl2ZWRbRElTUE9TRV9DQUxMQkFDS10pOwotCi0JZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIGxpc3RlbmVyKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmNsb3NlKCk7Ci0JfQotCWFzc2VydFRydWUoIjpjOiIsIGNhbGxiYWNrUmVjZWl2ZWRbQ0xPU0VfQ0FMTEJBQ0tdKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hc3luY0V4ZWNMamF2YV9sYW5nX1J1bm5hYmxlKCkgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRpc3BsYXkuYmVlcCgpOwotCQkJfQotCQl9KTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYmVlcCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuYmVlcCgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWRpc3BsYXkuY2xvc2UoKTsKLQlhc3NlcnRUcnVlKGRpc3BsYXkuaXNEaXNwb3NlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlRXhlY0xqYXZhX2xhbmdfUnVubmFibGUoKSB7Ci0JLy8gQWxzbyB0ZXN0cyBkaXNwb3NlIGFuZCBpc0Rpc3Bvc2VkCi0JRGlzcGxheSB0ZXN0RGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZGlzcG9zZUV4ZWNSYW4gPSBmYWxzZTsKLQl0ZXN0RGlzcGxheS5kaXNwb3NlRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWRpc3Bvc2VFeGVjUmFuID0gdHJ1ZTsKLQkJfQotCX0pOwotCWFzc2VydEVxdWFscygiRGlzcGxheSBzaG91bGQgbm90IGJlIGRpc3Bvc2VkIiwgZmFsc2UsIHRlc3REaXNwbGF5LmlzRGlzcG9zZWQoKSk7Ci0JdGVzdERpc3BsYXkuZGlzcG9zZSgpOwotCWFzc2VydFRydWUoIkRpc3BsYXkgc2hvdWxkIGJlIGRpc3Bvc2VkIiwgdGVzdERpc3BsYXkuaXNEaXNwb3NlZCgpKTsKLQlhc3NlcnRUcnVlKCJEaXNwb3NlRXhlYyBSdW5uYWJsZSBkaWQgbm90IHJ1biIsIGRpc3Bvc2VFeGVjUmFuKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9maW5kRGlzcGxheUxqYXZhX2xhbmdfVGhyZWFkKCkgewotCWFzc2VydE51bGwoRGlzcGxheS5maW5kRGlzcGxheShuZXcgVGhyZWFkKCkpKTsKLQkKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWFzc2VydEVxdWFscyhkaXNwbGF5LCBEaXNwbGF5LmZpbmREaXNwbGF5KFRocmVhZC5jdXJyZW50VGhyZWFkKCkpKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmluZFdpZGdldEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ZpbmRXaWRnZXRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWN0aXZlU2hlbGwoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwub3BlbigpOwotCQlhc3NlcnRUcnVlKGRpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKSA9PSBzaGVsbCk7Ci0JCXNoZWxsLmRpc3Bvc2UoKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBkaXNwbGF5LmdldEJvdW5kcygpOwotCQlhc3NlcnROb3ROdWxsKHJlY3QpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGllbnRBcmVhKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBkaXNwbGF5LmdldENsaWVudEFyZWEoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWN0KTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q3VycmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q3Vyc29yQ29udHJvbCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuZ2V0Q3Vyc29yQ29udHJvbCgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDdXJzb3JMb2NhdGlvbigpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVBvaW50IHB0ID0gZGlzcGxheS5nZXRDdXJzb3JMb2NhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKHB0KTsKLQkJYXNzZXJ0VHJ1ZShwdC54ID49IDApOwotCQlhc3NlcnRUcnVlKHB0LnkgPj0gMCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEN1cnNvclNpemUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEN1cnNvclNpemUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREYXRhKCkgewotCS8vIHRlc3RlZCBpbiBzZXREYXRhKE9iamVjdCkgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCS8vIHRlc3RlZCBpbiBzZXREYXRhKFN0cmluZywgT2JqZWN0KSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZWZhdWx0KCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0Tm90TnVsbChEaXNwbGF5LmdldERlZmF1bHQoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERpc21pc3NhbEFsaWdubWVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWludCBhbGlnbm1lbnQgPSBkaXNwbGF5LmdldERpc21pc3NhbEFsaWdubWVudCgpOwotCQlhc3NlcnRUcnVlKCJnZXREaXNtaXNzYWxBbGlnbm1lbnQgc2hvdWxkIHJldHVybiBTV1QuTEVGVCBvciBTV1QuUklHSFQiLAotCQkJYWxpZ25tZW50ID09IFNXVC5MRUZUIHx8IGFsaWdubWVudCA9PSBTV1QuUklHSFQpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREb3VibGVDbGlja1RpbWUoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlpbnQgdGltZSA9IGRpc3BsYXkuZ2V0RG91YmxlQ2xpY2tUaW1lKCk7Ci0JCWFzc2VydFRydWUodGltZSA+IDApOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb2N1c0NvbnRyb2woKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LmdldEZvY3VzQ29udHJvbCgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJY29uRGVwdGgoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlpbnQgZGVwdGggPSBkaXNwbGF5LmdldEljb25EZXB0aCgpOwotCQlhc3NlcnRUcnVlKGRlcHRoID4gMCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1vbml0b3JzKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JTW9uaXRvcltdIG1vbml0b3JzID0gZGlzcGxheS5nZXRNb25pdG9ycygpOwotCWFzc2VydE5vdE51bGwobW9uaXRvcnMpOwotCWFzc2VydFRydWUoImF0IGxlYXN0IG9uZSBtb25pdG9yIHNob3VsZCBiZSByZXR1cm5lZCIsIG1vbml0b3JzLmxlbmd0aCA+PSAxKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1vbml0b3JzLmxlbmd0aDsgaSsrKQotCQlhc3NlcnRUcnVlKCJtb25pdG9yIGF0IGluZGV4ICIraSsiIHNob3VsZCBub3QgYmUgbnVsbCIsIG1vbml0b3JzW2ldICE9IG51bGwpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByaW1hcnlNb25pdG9yKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JTW9uaXRvciBtb25pdG9yID0gZGlzcGxheS5nZXRQcmltYXJ5TW9uaXRvcigpOwotCWFzc2VydE5vdE51bGwobW9uaXRvcik7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2hlbGxzKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJU2hlbGwgc2hlbGwxID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlTaGVsbCBzaGVsbDIgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5nZXRTaGVsbHMoKS5sZW5ndGggPT0gMik7Ci0JCXNoZWxsMS5kaXNwb3NlKCk7Ci0JCXNoZWxsMi5kaXNwb3NlKCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN5bmNUaHJlYWQoKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlmaW5hbCBib29sZWFuW10gdGhyZWFkUmFuID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2V9OwotCQlUaHJlYWQgbm9uVUlUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBBc3N1bWUgbm8gc3luY0V4ZWMgcnVubmFibGUgaXMgY3VycmVudGx5IGJlaW5nIGludm9rZWQuCi0JCQkJYXNzZXJ0TnVsbChkaXNwbGF5LmdldFN5bmNUaHJlYWQoKSk7Ci0JCQkJCi0JCQkJLy8gQ3JlYXRlIGEgcnVubmFibGUgYW5kIGludm9rZSB3aXRoIHN5bmNFeGVjIHRvIHZlcmlmeSB0aGF0Ci0JCQkJLy8gdGhlIGludm9raW5nIHRocmVhZCBpcyB0aGUgc3luY1RocmVhZC4KLQkJCQlmaW5hbCBUaHJlYWQgaW52b2tpbmdUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlhc3NlcnRFcXVhbHMoaW52b2tpbmdUaHJlYWQsIGRpc3BsYXkuZ2V0U3luY1RocmVhZCgpKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCQotCQkJCS8vIENyZWF0ZSBhIHJ1bm5hYmxlIGFuZCBpbnZva2Ugd2l0aCBhc3luY0V4ZWMgdG8gdmVyaWZ5IHRoYXQKLQkJCQkvLyB0aGUgc3luY1RocmVhZCBpcyBudWxsIHdoaWxlIGl0J3MgcnVubmluZy4KLQkJCQlmaW5hbCBib29sZWFuW10gYXN5bmNFeGVjUmFuID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2V9OwotCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJYXNzZXJ0TnVsbChkaXNwbGF5LmdldFN5bmNUaHJlYWQoKSk7Ci0JCQkJCQlhc3luY0V4ZWNSYW5bMF0gPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJd2hpbGUgKCFhc3luY0V4ZWNSYW5bMF0pIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQl9Ci0JCQkJdGhyZWFkUmFuWzBdID0gdHJ1ZTsKLQkJCQlkaXNwbGF5Lndha2UoKTsKLQkJCX0KLQkJfSk7Ci0JCW5vblVJVGhyZWFkLnN0YXJ0KCk7Ci0JCQotCQl3aGlsZSAoIXRocmVhZFJhblswXSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN5c3RlbUNvbG9ySSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWludCBbXSBjb2xvcklkcyA9IHsKLQkJCVNXVC5DT0xPUl9XSURHRVRfREFSS19TSEFET1csIFNXVC5DT0xPUl9XSURHRVRfTk9STUFMX1NIQURPVywKLQkJCVNXVC5DT0xPUl9XSURHRVRfTElHSFRfU0hBRE9XLCBTV1QuQ09MT1JfV0lER0VUX0hJR0hMSUdIVF9TSEFET1csCi0JCQlTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQsIFNXVC5DT0xPUl9XSURHRVRfQk9SREVSLAotCQkJU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5ELCBTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5ELAotCQkJU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCwgU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OLAotCQkJU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OX1RFWFQsCi0JCX07Ci0JCWZvciAoaW50IGk9MDsgaSA8IGNvbG9ySWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnROb3ROdWxsKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoY29sb3JJZHNbaV0pKTsKLQkJfQotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTeXN0ZW1Gb250KCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJRm9udCBmb250ID0gZGlzcGxheS5nZXRTeXN0ZW1Gb250KCk7Ci0JCWFzc2VydE5vdE51bGwoZm9udCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRocmVhZCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBkbyBub3QgdGVzdCBpbnRlcm5hbCBBUEkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBkbyBub3QgdGVzdCBpbnRlcm5hbCBBUEkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUkoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSk7Ci0JCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24xLnNldEJvdW5kcygwLDAsMTAwLDEwMCk7Ci0JCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24yLnNldEJvdW5kcygyMDAsMTAwLDEwMCwxMDApOwotCQlzaGVsbC5zZXRCb3VuZHMoMCwwLDQwMCw0MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQlQb2ludCBzaGVsbE9mZnNldCA9IHNoZWxsLmdldExvY2F0aW9uKCk7Ci0JCVBvaW50IHJlc3VsdDsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KC0yMDAsLTEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIC0xMCwgLTIwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMjEwLC0xMjApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCAzMCwgNDApOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KC0xNzAsLTYwKSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDIwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCAtNSwgLTE1KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgxOTUsODUpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCAyNSwgMzUpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDIyNSwxMzUpLCByZXN1bHQpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTIwMCAtIHNoZWxsT2Zmc2V0LngsLTEwMCAtIHNoZWxsT2Zmc2V0LnkpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCAtMiwgLTQpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KC0yMDIgLSBzaGVsbE9mZnNldC54LC0xMDQgLSBzaGVsbE9mZnNldC55KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgNiwgOCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTE5NCAtIHNoZWxsT2Zmc2V0LngsLTkyIC0gc2hlbGxPZmZzZXQueSksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCAwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludChzaGVsbE9mZnNldC54ICsgMjAwLHNoZWxsT2Zmc2V0LnkgKyAxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCAtMywgLTYpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KHNoZWxsT2Zmc2V0LnggKyAxOTcsc2hlbGxPZmZzZXQueSArIDk0KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgbnVsbCwgOSwgMTIpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KHNoZWxsT2Zmc2V0LnggKyAyMDksc2hlbGxPZmZzZXQueSArIDExMiksIHJlc3VsdCk7Ci0JCQotCQlidXR0b24xLmRpc3Bvc2UoKTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIDAsIDApOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIGZyb20gY29udHJvbCBiZWluZyBkaXNwb3NlZCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIGZyb20gY29udHJvbCBiZWluZyBkaXNwb3NlZCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQkJfQotCQl0cnkgewotCQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgMCwgMCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgdG8gY29udHJvbCBiZWluZyBkaXNwb3NlZCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIHRvIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCXNoZWxsLmRpc3Bvc2UoKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbElJSUkoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSk7Ci0JCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24xLnNldEJvdW5kcygwLDAsMTAwLDEwMCk7Ci0JCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24yLnNldEJvdW5kcygyMDAsMTAwLDEwMCwxMDApOwotCQlzaGVsbC5zZXRCb3VuZHMoMCwwLDQwMCw0MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQlQb2ludCBzaGVsbE9mZnNldCA9IHNoZWxsLmdldExvY2F0aW9uKCk7Ci0JCVJlY3RhbmdsZSByZXN1bHQ7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCAwLCAwLCAxMDAsIDEwMCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKC0yMDAsLTEwMCwxMDAsMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgLTEwLCAtMjAsIDEzMCwgMTQwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTIxMCwtMTIwLDEzMCwxNDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCA1MCwgNjAsIDE3MCwgMTgwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTE1MCwtNDAsMTcwLDE4MCksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCAwLCAwLCAxMDAsIDEwMCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDIwMCwxMDAsMTAwLDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIC01LCAtMTUsIDEyNSwgMTM1KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMTk1LDg1LDEyNSwxMzUpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCA0NSwgNTUsIDE2NSwgMTc1KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMjQ1LDE1NSwxNjUsMTc1KSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIDAsIDAsIDEwMCwgMTAwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTIwMCAtIHNoZWxsT2Zmc2V0LngsLTEwMCAtIHNoZWxsT2Zmc2V0LnksMTAwLDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIC0yLCAtNCwgMTA2LCAxMDgpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMjAyIC0gc2hlbGxPZmZzZXQueCwtMTA0IC0gc2hlbGxPZmZzZXQueSwxMDYsMTA4KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgMTAsIDEyLCAxMTQsIDExNik7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKC0xOTAgLSBzaGVsbE9mZnNldC54LC04OCAtIHNoZWxsT2Zmc2V0LnksMTE0LDExNiksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCAwLCAwLCAxMDAsIDEwMCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKHNoZWxsT2Zmc2V0LnggKyAyMDAsc2hlbGxPZmZzZXQueSArIDEwMCwxMDAsMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgbnVsbCwgLTMsIC02LCAxMDksIDExMik7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKHNoZWxsT2Zmc2V0LnggKyAxOTcsc2hlbGxPZmZzZXQueSArIDk0LDEwOSwxMTIpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCAxNSwgMTgsIDEyMSwgMTI0KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoc2hlbGxPZmZzZXQueCArIDIxNSxzaGVsbE9mZnNldC55ICsgMTE4LDEyMSwxMjQpLCByZXN1bHQpOwotCQkKLQkJYnV0dG9uMS5kaXNwb3NlKCk7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCAwLCAwLCAxMDAsIDEwMCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgZnJvbSBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgZnJvbSBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCAwLCAwLCAxMDAsIDEwMCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgdG8gY29udHJvbCBiZWluZyBkaXNwb3NlZCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIHRvIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCXNoZWxsLmRpc3Bvc2UoKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSk7Ci0JCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24xLnNldEJvdW5kcygwLDAsMTAwLDEwMCk7Ci0JCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24yLnNldEJvdW5kcygyMDAsMTAwLDEwMCwxMDApOwotCQlzaGVsbC5zZXRCb3VuZHMoMCwwLDQwMCw0MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQlQb2ludCByZXN1bHQ7Ci0JCVBvaW50IHBvaW50ID0gbmV3IFBvaW50KDAsMCk7Ci0JCVBvaW50IHNoZWxsT2Zmc2V0ID0gc2hlbGwuZ2V0TG9jYXRpb24oKTsKLQotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgcG9pbnQpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KC0yMDAsLTEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIG5ldyBQb2ludCgtMTAsLTIwKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTIxMCwtMTIwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgbmV3IFBvaW50KDMwLDQwKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTE3MCwtNjApLCByZXN1bHQpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgcG9pbnQpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDIwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCBuZXcgUG9pbnQoLTUsLTE1KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMTk1LDg1KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgbmV3IFBvaW50KDI1LDM1KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMjI1LDEzNSksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCBwb2ludCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTIwMCAtIHNoZWxsT2Zmc2V0LngsLTEwMCAtIHNoZWxsT2Zmc2V0LnkpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCBuZXcgUG9pbnQoLTIsLTQpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMjAyIC0gc2hlbGxPZmZzZXQueCwtMTA0IC0gc2hlbGxPZmZzZXQueSksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIG5ldyBQb2ludCg2LDgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMTk0IC0gc2hlbGxPZmZzZXQueCwtOTIgLSBzaGVsbE9mZnNldC55KSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIHBvaW50KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludChzaGVsbE9mZnNldC54ICsgMjAwLHNoZWxsT2Zmc2V0LnkgKyAxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCBuZXcgUG9pbnQoLTMsLTYpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludChzaGVsbE9mZnNldC54ICsgMTk3LHNoZWxsT2Zmc2V0LnkgKyA5NCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIG5ldyBQb2ludCg5LDEyKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoc2hlbGxPZmZzZXQueCArIDIwOSxzaGVsbE9mZnNldC55ICsgMTEyKSwgcmVzdWx0KTsKLQkJCi0JCWJ1dHRvbjEuZGlzcG9zZSgpOwotCQl0cnkgewotCQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgcG9pbnQpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIGZyb20gY29udHJvbCBiZWluZyBkaXNwb3NlZCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIGZyb20gY29udHJvbCBiZWluZyBkaXNwb3NlZCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQkJfQotCQl0cnkgewotCQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgcG9pbnQpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIHRvIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCB0byBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgKFBvaW50KSBudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgcG9pbnQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBvaW50IGJlaW5nIG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCXNoZWxsLmRpc3Bvc2UoKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULk5PX1RSSU0pOwotCQlCdXR0b24gYnV0dG9uMSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYnV0dG9uMS5zZXRCb3VuZHMoMCwwLDEwMCwxMDApOwotCQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYnV0dG9uMi5zZXRCb3VuZHMoMjAwLDEwMCwxMDAsMTAwKTsKLQkJc2hlbGwuc2V0Qm91bmRzKDAsMCw0MDAsNDAwKTsKLQkJc2hlbGwub3BlbigpOwotCQkKLQkJUmVjdGFuZ2xlIHJlc3VsdDsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBuZXcgUmVjdGFuZ2xlKDAsMCwxMDAsMTAwKTsKLQkJUG9pbnQgc2hlbGxPZmZzZXQgPSBzaGVsbC5nZXRMb2NhdGlvbigpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgcmVjdCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKC0yMDAsLTEwMCwxMDAsMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgbmV3IFJlY3RhbmdsZSgtMTAsIC0yMCwgMTMwLCAxNDApKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTIxMCwtMTIwLDEzMCwxNDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCBuZXcgUmVjdGFuZ2xlKDUwLCA2MCwgMTcwLCAxODApKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTE1MCwtNDAsMTcwLDE4MCksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCByZWN0KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMjAwLDEwMCwxMDAsMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgbmV3IFJlY3RhbmdsZSgtNSwgLTE1LCAxMjUsIDEzNSkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgxOTUsODUsMTI1LDEzNSksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIG5ldyBSZWN0YW5nbGUoNDUsIDU1LCAxNjUsIDE3NSkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgyNDUsMTU1LDE2NSwxNzUpLCByZXN1bHQpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgcmVjdCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKC0yMDAgLSBzaGVsbE9mZnNldC54LC0xMDAgLSBzaGVsbE9mZnNldC55LDEwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCBuZXcgUmVjdGFuZ2xlKC0yLCAtNCwgMTA2LCAxMDgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTIwMiAtIHNoZWxsT2Zmc2V0LngsLTEwNCAtIHNoZWxsT2Zmc2V0LnksMTA2LDEwOCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIG5ldyBSZWN0YW5nbGUoMTAsIDEyLCAxMTQsIDExNikpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMTkwIC0gc2hlbGxPZmZzZXQueCwtODggLSBzaGVsbE9mZnNldC55LDExNCwxMTYpLCByZXN1bHQpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgbnVsbCwgcmVjdCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKHNoZWxsT2Zmc2V0LnggKyAyMDAsc2hlbGxPZmZzZXQueSArIDEwMCwxMDAsMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgbnVsbCwgbmV3IFJlY3RhbmdsZSgtMywgLTYsIDEwOSwgMTEyKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKHNoZWxsT2Zmc2V0LnggKyAxOTcsc2hlbGxPZmZzZXQueSArIDk0LDEwOSwxMTIpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCBuZXcgUmVjdGFuZ2xlKDE1LCAxOCwgMTIxLCAxMjQpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoc2hlbGxPZmZzZXQueCArIDIxNSxzaGVsbE9mZnNldC55ICsgMTE4LDEyMSwxMjQpLCByZXN1bHQpOwotCQkKLQkKLQkJYnV0dG9uMS5kaXNwb3NlKCk7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCByZWN0KTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCBmcm9tIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCBmcm9tIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIHJlY3QpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIHRvIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCB0byBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgKFJlY3RhbmdsZSkgbnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIHBvaW50Iik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgYmVpbmcgbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9wb3N0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCWZpbmFsIGludCBLRVlDT0RFID0gU1dULlNISUZUOwotCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJdHJ5IHsKLQkJCWRpc3BsYXkucG9zdChudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBvc3Qgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwb3N0IHdpdGggbnVsbCBhcmd1bWVudCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULk5PX1RSSU0pOwotCQlzaGVsbC5zZXRCb3VuZHMoZGlzcGxheS5nZXRCb3VuZHMoKSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQotCQlFdmVudCBldmVudDsKLQkJCi0JCS8vIFRlc3Qga2V5IGV2ZW50cyAoZG93bi91cCkKLQkJZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudHlwZSA9IFNXVC5LZXlEb3duOwotCQlldmVudC5rZXlDb2RlID0gLTE7ICAJCQkJLy8gYm9ndXMga2V5IGNvZGUKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsJLy8gdXNlcyBkZWZhdWx0IDAgY2hhcmFjdGVyCi0JCS8vIGRvbid0IHRlc3QgS2V5RG93bi9LZXlVcCB3aXRoIGEgY2hhcmFjdGVyIHRvIGF2b2lkIHNlbmRpbmcgdG8gCi0JCS8vIHJhbmRvbSB3aW5kb3cgaWYgdGVzdCBzaGVsbCBsb29zZXMgZm9jdXMKLQkJCi0JCWV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50LnR5cGUgPSBTV1QuS2V5VXA7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5wb3N0KGV2ZW50KSk7Ci0KLQkJZXZlbnQudHlwZSA9IFNXVC5LZXlEb3duOwotCQlldmVudC5rZXlDb2RlID0gS0VZQ09ERTsKLQkJc2hlbGwuc2V0Rm9jdXMoKTsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsKLQkJZXZlbnQudHlwZSA9IFNXVC5LZXlVcDsKLQkJc2hlbGwuc2V0Rm9jdXMoKTsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsKLQkJCi0JCS8vIFRlc3QgbW91c2UgZXZlbnRzIChkb3duL3VwL21vdmUpCi0JCWV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50LnR5cGUgPSBTV1QuTW91c2VNb3ZlOwotCQlSZWN0YW5nbGUgYm91bmRzID0gc2hlbGwuZ2V0Qm91bmRzKCk7Ci0JCWV2ZW50LnggPSBib3VuZHMueCArIGJvdW5kcy53aWR0aC8yOwotCQlldmVudC55ID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0LzI7Ci0JCXNoZWxsLnNldEZvY3VzKCk7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5wb3N0KGV2ZW50KSk7Ci0JCQotCQlldmVudCA9IG5ldyBFdmVudCgpOwotCQlldmVudC50eXBlID0gU1dULk1vdXNlRG93bjsKLQkJYXNzZXJ0RmFsc2UoZGlzcGxheS5wb3N0KGV2ZW50KSk7ICAvLyBtaXNzaW5nIGJ1dHRvbgotCQlldmVudC5idXR0b24gPSAxOwotCQlzaGVsbC5zZXRGb2N1cygpOwotCQlhc3NlcnRUcnVlKGRpc3BsYXkucG9zdChldmVudCkpOwotCQkKLQkJZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudHlwZSA9IFNXVC5Nb3VzZVVwOwotCQlhc3NlcnRGYWxzZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsgIC8vIG1pc3NpbmcgYnV0dG9uCi0JCWV2ZW50LmJ1dHRvbiA9IDE7Ci0JCXNoZWxsLnNldEZvY3VzKCk7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5wb3N0KGV2ZW50KSk7Ci0JCQotCQkvLyBUZXN0IHVuc3VwcG9ydGVkIGV2ZW50Ci0JCWV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50LnR5cGUgPSBTV1QuTW91c2VEb3VibGVDbGljazsKLQkJYXNzZXJ0RmFsc2UoZGlzcGxheS5wb3N0KGV2ZW50KSk7Ci0JCQotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQotCQkvLyBjYW4ndCB2ZXJpZnkgdGhhdCB0aGUgZXZlbnRzIHdlcmUgYWN0dWFsbHkgc2VudCB0byBhIGxpc3RlbmVyLgotCQkvLyB0aGUgdGVzdCBzaGVsbCB3b24ndCByZWNlaXZlIGFueSBldmVudHMgaWYgaXQgaGFzIGxvc3QgZm9jdXMsIAotCQkvLyBlLmcuLCBkdWUgdG8gdXNlciBpbnRlcnZlbnRpb24gb3IgYW5vdGhlciBwcm9jZXNzIHBvcHBpbmcgdXAgCi0JCS8vIGEgd2luZG93LiAKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVhZEFuZERpc3BhdGNoKCkgewotCS8vIFRoZSBmb2xsb3dpbmcgdGVzdHMgcmVseSBvbiByZWFkQW5kRGlzcGF0Y2ggaW4gb3JkZXIgdG8gc3VjY2VlZCwKLQkvLyB0aHVzIG5vIHRlc3QgaXMgbmVlZGVkIGhlcmUuCi0JLy8gICAgdGVzdF9nZXRTeW5jVGhyZWFkKCkKLQkvLyAgICB0ZXN0X3Bvc3RMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUZpbHRlcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKSB7Ci0JZmluYWwgaW50IENMT1NFX0NBTExCQUNLID0gMDsKLQlmaW5hbCBpbnQgRElTUE9TRV9DQUxMQkFDSyA9IDE7Ci0JZmluYWwgYm9vbGVhbltdIGNhbGxiYWNrUmVjZWl2ZWQgPSBuZXcgYm9vbGVhbltdIHtmYWxzZSwgZmFsc2V9OwotCQotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS50eXBlID09IFNXVC5DbG9zZSkKLQkJCQljYWxsYmFja1JlY2VpdmVkW0NMT1NFX0NBTExCQUNLXSA9IHRydWU7Ci0JCQllbHNlIGlmIChlLnR5cGUgPT0gU1dULkRpc3Bvc2UpCi0JCQkJY2FsbGJhY2tSZWNlaXZlZFtESVNQT1NFX0NBTExCQUNLXSA9IHRydWU7Ci0JCX07Ci0JfTsKLQkKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCXRyeSB7Ci0JCQlkaXNwbGF5LnJlbW92ZUZpbHRlcihTV1QuRGlzcG9zZSwgbnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZW1vdmVGaWx0ZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZW1vdmVGaWx0ZXIgd2l0aCBudWxsIGFyZ3VtZW50IiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQlkaXNwbGF5LmFkZEZpbHRlcihTV1QuQ2xvc2UsIGxpc3RlbmVyKTsKLQkJZGlzcGxheS5yZW1vdmVGaWx0ZXIoU1dULkNsb3NlLCBsaXN0ZW5lcik7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5jbG9zZSgpOwotCX0KLQlhc3NlcnRGYWxzZShjYWxsYmFja1JlY2VpdmVkW0NMT1NFX0NBTExCQUNLXSk7Ci0JYXNzZXJ0RmFsc2UoY2FsbGJhY2tSZWNlaXZlZFtESVNQT1NFX0NBTExCQUNLXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKCkgewotCWZpbmFsIGludCBDTE9TRV9DQUxMQkFDSyA9IDA7Ci0JZmluYWwgaW50IERJU1BPU0VfQ0FMTEJBQ0sgPSAxOwotCWZpbmFsIGJvb2xlYW5bXSBjYWxsYmFja1JlY2VpdmVkID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2UsIGZhbHNlfTsKLQkKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGUudHlwZSA9PSBTV1QuQ2xvc2UpCi0JCQkJY2FsbGJhY2tSZWNlaXZlZFtDTE9TRV9DQUxMQkFDS10gPSB0cnVlOwotCQkJZWxzZSBpZiAoZS50eXBlID09IFNXVC5EaXNwb3NlKQotCQkJCWNhbGxiYWNrUmVjZWl2ZWRbRElTUE9TRV9DQUxMQkFDS10gPSB0cnVlOwotCQl9OwotCX07Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQl0cnkgewotCQkJZGlzcGxheS5yZW1vdmVMaXN0ZW5lcihTV1QuQ2xvc2UsIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZW1vdmVMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCWRpc3BsYXkuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIGxpc3RlbmVyKTsKLQkJZGlzcGxheS5yZW1vdmVMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbGlzdGVuZXIpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuY2xvc2UoKTsKLQl9Ci0JYXNzZXJ0RmFsc2UoY2FsbGJhY2tSZWNlaXZlZFtDTE9TRV9DQUxMQkFDS10pOwotCWFzc2VydEZhbHNlKGNhbGxiYWNrUmVjZWl2ZWRbRElTUE9TRV9DQUxMQkFDS10pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbGVhc2UoKSB7Ci0JLy8gT3ZlcnJpZGluZyB0ZXN0X3JlbGVhc2UgZnJvbSBEZXZpY2UuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QXBwTmFtZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCURpc3BsYXkuc2V0QXBwTmFtZSgiTXkgQXBwbGljYXRpb24gTmFtZSIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEN1cnNvckxvY2F0aW9uSUkoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LnNldEN1cnNvckxvY2F0aW9uKDAsMCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEN1cnNvckxvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuc2V0Q3Vyc29yTG9jYXRpb24obmV3IFBvaW50KDAsMCkpOwotCQl0cnkgewotCQkJZGlzcGxheS5zZXRDdXJzb3JMb2NhdGlvbihudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgYXJndW1lbnQiKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNldEN1cnNvckxvY2F0aW9uIHdpdGggbnVsbCBhcmd1bWVudCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LnNldERhdGEobmV3IEludGVnZXIoMTApKTsKLQkJSW50ZWdlciBpID0gKEludGVnZXIpZGlzcGxheS5nZXREYXRhKCk7Ci0JCWFzc2VydE5vdE51bGwoaSk7Ci0JCWFzc2VydFRydWUoaS5lcXVhbHMobmV3IEludGVnZXIoMTApKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldERhdGFMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5zZXREYXRhKCJJbnRlZ2VyIiwgbmV3IEludGVnZXIoMTApKTsKLQkJZGlzcGxheS5zZXREYXRhKCJTdHJpbmciLCAieHl6Iik7Ci0JCUludGVnZXIgaSA9IChJbnRlZ2VyKWRpc3BsYXkuZ2V0RGF0YSgiSW50ZWdlciIpOwotCQlhc3NlcnROb3ROdWxsKGkpOwotCQlhc3NlcnRUcnVlKGkuZXF1YWxzKG5ldyBJbnRlZ2VyKDEwKSkpOwotCQlTdHJpbmcgcyA9IChTdHJpbmcpZGlzcGxheS5nZXREYXRhKCJTdHJpbmciKTsKLQkJYXNzZXJ0Tm90TnVsbChzKTsKLQkJYXNzZXJ0VHJ1ZShzLmVxdWFscygieHl6IikpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTeW5jaHJvbml6ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyKCkgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgYm9vbGVhbltdIGFzeW5jRXhlY1JhbiA9IG5ldyBib29sZWFuW10ge2ZhbHNlfTsKLQkKLQl0cnkgewotCQl0cnkgewotCQkJZGlzcGxheS5zZXRTeW5jaHJvbml6ZXIobnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwb3N0IHdpdGggbnVsbCBhcmd1bWVudCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3Igc2V0IHN5bmNocm9uaXplciB3aXRoIG51bGwgYXJndW1lbnQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCWNsYXNzIE15U3luY2hyb25pemVyIGV4dGVuZHMgU3luY2hyb25pemVyIHsKLQkJCWJvb2xlYW4gaW52b2tlZCA9IGZhbHNlOwotCQkJTXlTeW5jaHJvbml6ZXIoRGlzcGxheSBkKSB7Ci0JCQkJc3VwZXIoZCk7Ci0JCQl9Ci0JCQlwcm90ZWN0ZWQgdm9pZCBhc3luY0V4ZWMgKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCQkJaW52b2tlZCA9IHRydWU7Ci0JCQkJc3VwZXIuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJCX0KLQkJfQotCQkKLQkJTXlTeW5jaHJvbml6ZXIgbXlTeW5jaHJvbml6ZXIgPSBuZXcgTXlTeW5jaHJvbml6ZXIoZGlzcGxheSk7Ci0JCWRpc3BsYXkuc2V0U3luY2hyb25pemVyKG15U3luY2hyb25pemVyKTsKLQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWFzeW5jRXhlY1JhblswXSA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQl3aGlsZSAoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkge30KLQkJYXNzZXJ0VHJ1ZShteVN5bmNocm9uaXplci5pbnZva2VkKTsKLQkJYXNzZXJ0VHJ1ZShhc3luY0V4ZWNSYW5bMF0pOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zbGVlcCgpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVRocmVhZCB0aHJlYWQ7Ci0JCWJvb2xlYW4gZXZlbnRRdWV1ZWQ7Ci0JCQotCQkvLyBFbnN1cmUgZXZlbnQgcXVldWUgaXMgZW1wdHksIG90aGVyd2lzZSBzbGVlcCgpIHdpbGwganVzdCByZXR1cm4uCi0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHt9Ci0JCXRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gRGVsYXkgdG8gZW5zdXJlIHRoZSBVSSB0aHJlYWQgaGFzIGJlZW4gcHV0IHRvIHNsZWVwLgotCQkJCQlzbGVlcCgzMDAwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCX0KLQkJCQkvLyBVc2Ugd2FrZSgpIHRvIHJldml2ZSBmcm9tIHNsZWVwKCkuCi0JCQkJZGlzcGxheS53YWtlKCk7Ci0JCQl9Ci0JCX07Ci0JCXRocmVhZC5zdGFydCgpOwotCQkvLyBOb3RlIHRoYXQgc2xlZXAgc2VlbXMgdG8gYWx3YXlzIHJldHVybiB0cnVlLCBhdCBsZWFzdAotCQkvLyBvbiBXaW5kb3dzLCBzaW5jZSB3YWtlKCkgdXNlcyBhIG51bGwgZXZlbnQuIAotCQlldmVudFF1ZXVlZCA9IGRpc3BsYXkuc2xlZXAoKTsKLQkJCi0JCS8vIEVuc3VyZSBldmVudCBxdWV1ZSBpcyBlbXB0eSwgb3RoZXJ3aXNlIHNsZWVwKCkgd2lsbCBqdXN0IHJldHVybi4KLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkge30KLQkJdGhyZWFkID0gbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBEZWxheSB0byBlbnN1cmUgdGhlIFVJIHRocmVhZCBoYXMgYmVlbiBwdXQgdG8gc2xlZXAuCi0JCQkJCXNsZWVwKDMwMDApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJfQotCQkJCS8vIENhdXNlIE9TIHRvIGdlbmVyYXRlIGFuIGV2ZW50IHRvIHJldml2ZSBmcm9tIHNsZWVwKCkuCi0JCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCVNoZWxsIHMgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCQkJCQlzLm9wZW4oKTsKLQkJCQkJCXMuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX07Ci0JCXRocmVhZC5zdGFydCgpOwotCQlldmVudFF1ZXVlZCA9IGRpc3BsYXkuc2xlZXAoKTsKLQkJYXNzZXJ0VHJ1ZShldmVudFF1ZXVlZCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N5bmNFeGVjTGphdmFfbGFuZ19SdW5uYWJsZSgpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRpc3BsYXkuYmVlcCgpOwotCQkJfQotCQl9KTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdGltZXJFeGVjSUxqYXZhX2xhbmdfUnVubmFibGUoKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlmaW5hbCBib29sZWFuW10gdGltZXJFeGVjUmFuID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2V9OwotCQlmaW5hbCBib29sZWFuW10gdGhyZWFkUmFuID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2V9OwotCQkKLQkJdHJ5IHsKLQkJCWRpc3BsYXkudGltZXJFeGVjKDAsIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGltZXJFeGVjIHdpdGggbnVsbCBydW5uYWJsZSIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgdGltZXJFeGVjIHdpdGggbnVsbCBydW5uYWJsZSIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJZGlzcGxheS50aW1lckV4ZWMoLTEwMCwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRpbWVyRXhlY1JhblswXSA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQkJCQotCQlmaW5hbCBpbnQgZGVsYXkgPSAzMDAwOwotCQlmaW5hbCBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlkaXNwbGF5LnRpbWVyRXhlYyhkZWxheSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCS8vIGRlYnVnIGludGVybWl0dGVudCB0ZXN0IGZhaWx1cmUKLQkJCQlpZiAoZW5kVGltZSA8IChzdGFydFRpbWUgKyBkZWxheSkpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJEaXNwbGF5LnRpbWVyRXhlYyByYW4gZWFybHkgIiArICgoc3RhcnRUaW1lICsgZGVsYXkpIC0gZW5kVGltZSkpOwotCQkJCX0KLQkJCQkvL2Fzc2VydFRydWUoIlRpbWVyIHJhbiBlYXJseSEgbXMgZWFybHk6ICIsIGVuZFRpbWUgPj0gKHN0YXJ0VGltZSArIGRlbGF5KSk7Ci0JCQkJdGhyZWFkUmFuWzBdID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXdoaWxlICghdGhyZWFkUmFuWzBdKSB7Ci0JCQkvLyBUaGUgcmVhZCBhbmQgZGlzcGF0Y2ggbG9vcCBtdXN0IGJlIHJ1bm5pbmcgaW4gb3JkZXIKLQkJCS8vIGZvciB0aGUgcnVubmFibGUgaW4gdGhlIHRpbWVyIGV4ZWMgdG8gYmUgZXhlY3V0ZWQuCi0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJCi0JCS8vIFZlcmlmeSB0aGUgdGltZXJFeGVjIHdpdGggbGVzcyB0aGFuIHplcm8gbWlsbGlzZWNvbmRzIGRpZG4ndCBleGVjdXRlLgotCQlhc3NlcnRGYWxzZSgiPCAwIG1zIHRpbWVyIGRpZCBleGVjdXRlIiwgdGltZXJFeGVjUmFuWzBdKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdXBkYXRlKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS51cGRhdGUoKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2FrZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2xlZXAoKSBtZXRob2QKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRmlsdGVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hc3luY0V4ZWNMamF2YV9sYW5nX1J1bm5hYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9iZWVwIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZUV4ZWNMamF2YV9sYW5nX1J1bm5hYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maW5kRGlzcGxheUxqYXZhX2xhbmdfVGhyZWFkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maW5kV2lkZ2V0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QWN0aXZlU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q3VycmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q3Vyc29yQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q3Vyc29yTG9jYXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEN1cnNvclNpemUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERhdGFMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVmYXVsdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGlzbWlzc2FsQWxpZ25tZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREb3VibGVDbGlja1RpbWUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvY3VzQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SWNvbkRlcHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNb25pdG9ycyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJpbWFyeU1vbml0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNoZWxscyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3luY1RocmVhZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3lzdGVtQ29sb3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTeXN0ZW1Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUaHJlYWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wb3N0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZWFkQW5kRGlzcGF0Y2giKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUZpbHRlcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QXBwTmFtZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDdXJzb3JMb2NhdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDdXJzb3JMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERhdGFMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFN5bmNocm9uaXplckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NsZWVwIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RpbWVyRXhlY0lMamF2YV9sYW5nX1J1bm5hYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF91cGRhdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dha2UiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkRmlsdGVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpKSB0ZXN0X2FkZEZpbHRlcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpKSB0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYXN5bmNFeGVjTGphdmFfbGFuZ19SdW5uYWJsZSIpKSB0ZXN0X2FzeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2JlZXAiKSkgdGVzdF9iZWVwKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbG9zZSIpKSB0ZXN0X2Nsb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlRXhlY0xqYXZhX2xhbmdfUnVubmFibGUiKSkgdGVzdF9kaXNwb3NlRXhlY0xqYXZhX2xhbmdfUnVubmFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZpbmREaXNwbGF5TGphdmFfbGFuZ19UaHJlYWQiKSkgdGVzdF9maW5kRGlzcGxheUxqYXZhX2xhbmdfVGhyZWFkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maW5kV2lkZ2V0SSIpKSB0ZXN0X2ZpbmRXaWRnZXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBY3RpdmVTaGVsbCIpKSB0ZXN0X2dldEFjdGl2ZVNoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDdXJyZW50IikpIHRlc3RfZ2V0Q3VycmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q3Vyc29yQ29udHJvbCIpKSB0ZXN0X2dldEN1cnNvckNvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEN1cnNvckxvY2F0aW9uIikpIHRlc3RfZ2V0Q3Vyc29yTG9jYXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEN1cnNvclNpemUiKSkgdGVzdF9nZXRDdXJzb3JTaXplKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREYXRhIikpIHRlc3RfZ2V0RGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfZ2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREZWZhdWx0IikpIHRlc3RfZ2V0RGVmYXVsdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGlzbWlzc2FsQWxpZ25tZW50IikpIHRlc3RfZ2V0RGlzbWlzc2FsQWxpZ25tZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREb3VibGVDbGlja1RpbWUiKSkgdGVzdF9nZXREb3VibGVDbGlja1RpbWUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvY3VzQ29udHJvbCIpKSB0ZXN0X2dldEZvY3VzQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SWNvbkRlcHRoIikpIHRlc3RfZ2V0SWNvbkRlcHRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNb25pdG9ycyIpKSB0ZXN0X2dldE1vbml0b3JzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcmltYXJ5TW9uaXRvciIpKSB0ZXN0X2dldFByaW1hcnlNb25pdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaGVsbHMiKSkgdGVzdF9nZXRTaGVsbHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN5bmNUaHJlYWQiKSkgdGVzdF9nZXRTeW5jVGhyZWFkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTeXN0ZW1Db2xvckkiKSkgdGVzdF9nZXRTeXN0ZW1Db2xvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN5c3RlbUZvbnQiKSkgdGVzdF9nZXRTeXN0ZW1Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUaHJlYWQiKSkgdGVzdF9nZXRUaHJlYWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUkiKSkgdGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSUlJIikpIHRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbElJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcG9zdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X3Bvc3RMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlYWRBbmREaXNwYXRjaCIpKSB0ZXN0X3JlYWRBbmREaXNwYXRjaCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRmlsdGVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUZpbHRlcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QXBwTmFtZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0QXBwTmFtZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDdXJzb3JMb2NhdGlvbklJIikpIHRlc3Rfc2V0Q3Vyc29yTG9jYXRpb25JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q3Vyc29yTG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0Q3Vyc29yTG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldERhdGFMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFN5bmNocm9uaXplckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIiKSkgdGVzdF9zZXRTeW5jaHJvbml6ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zbGVlcCIpKSB0ZXN0X3NsZWVwKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUiKSkgdGVzdF9zeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RpbWVyRXhlY0lMamF2YV9sYW5nX1J1bm5hYmxlIikpIHRlc3RfdGltZXJFeGVjSUxqYXZhX2xhbmdfUnVubmFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3VwZGF0ZSIpKSB0ZXN0X3VwZGF0ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2FrZSIpKSB0ZXN0X3dha2UoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1ib29sZWFuIGRpc3Bvc2VFeGVjUmFuOwotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JLy8gdGVzdGVkIGluIHZpcnR1YWxseSBldmVyeSBtZXRob2QgYW5kIGluIHBhcnRpY3VsYXIKLQkvLyAgIHRlc3RfZGlzcG9zZUV4ZWNMamF2YV9sYW5nX1J1bm5hYmxlCi19Ci0KLS8qIE92ZXJsb2FkZWQgdGVzdHMgZnJvbSBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UgKi8KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RFBJKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJUG9pbnQgcCA9IGRpc3BsYXkuZ2V0RFBJKCk7Ci0JCWFzc2VydFRydWUoImhvcml6b250YWwgRFBJIG5vdCBncmVhdGVyIHRoYW4gemVybyIsIHAueCA+IDApOwotCQlhc3NlcnRUcnVlKCJ2ZXJ0aWNhbCBEUEkgbm90IGdyZWF0ZXIgdGhhbiB6ZXJvIiwgcC55ID4gMCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERlcHRoKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJaW50IGQgPSBkaXNwbGF5LmdldERlcHRoKCk7Ci0JCWFzc2VydFRydWUoImRlcHRoIG5vdCBncmVhdGVyIHRoYW4gemVybyIsIGQgPiAwKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udExpc3RMamF2YV9sYW5nX1N0cmluZ1ooKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlGb250RGF0YVtdIHNjYWxhYmxlID0gZGlzcGxheS5nZXRGb250TGlzdChudWxsLCB0cnVlKTsKLQkJRm9udERhdGFbXSBub25fc2NhbGFibGUgPSBkaXNwbGF5LmdldEZvbnRMaXN0KG51bGwsIGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSgibm8gZm9udHMgZGV0ZWN0ZWQiLCAoc2NhbGFibGUubGVuZ3RoICsgbm9uX3NjYWxhYmxlLmxlbmd0aCkgPiAwKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0V2FybmluZ3MoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlib29sZWFuIHJlc3VsdCA9IGRpc3BsYXkuZ2V0V2FybmluZ3MoKTsKLQkJLy8gU2luY2UgdGhlIGJlaGF2aW9yIGlzIHBsYXRmb3JtIHNwZWNpZmljLCB0aGVyZSdzCi0JCS8vIG5vIGdvb2QgdGVzdCBmb3IgdGhlIHJlc3VsdCB2YWx1ZS4KLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNEaXNwb3NlZCgpIHsKLQlEaXNwbGF5IGRpc3AgPSBuZXcgRGlzcGxheSgpOwotCWFzc2VydEZhbHNlKGRpc3AuaXNEaXNwb3NlZCgpKTsKLQlkaXNwLmRpc3Bvc2UoKTsKLQlhc3NlcnRUcnVlKGRpc3AuaXNEaXNwb3NlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRXYXJuaW5nc1ooKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LnNldFdhcm5pbmdzKHRydWUpOwotCQlkaXNwbGF5LnNldFdhcm5pbmdzKGZhbHNlKTsKLQkJLy8gU2luY2UgdGhlIGJlaGF2aW9yIGlzIHBsYXRmb3JtIHNwZWNpZmljLCB0aGVyZSdzCi0JCS8vIG5vIGdvb2QgdGVzdCBmb3IgaW52b2tpbmcgdGhpcyBtZXRob2QuCi0JCS8vIE5vdGUgdGhhdCBvbiBXaW5kb3dzLCB0aGUgaW1wbGVtZW50YXRpb24gaXMgYSBuby1vcC4KLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGU1MDdiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCWFzc2VydE5vdE51bGwoZXZlbnQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Qm91bmRzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50LnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUoZXZlbnQudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRmlsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDZjYWNhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2cKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRmlsZURpYWxvZyBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRmlsZURpYWxvZyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0RGlhbG9nKGZpbGVEaWFsb2cpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCkgewotCS8vIFRlc3QgRmlsZURpYWxvZyhTaGVsbCkKLQlGaWxlRGlhbG9nIGZkID0gbmV3IEZpbGVEaWFsb2coc2hlbGwpOwotCXRyeSB7Ci0JCW5ldyBGaWxlRGlhbG9nKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCkgewotCS8vIFRlc3QgRmlsZURpYWxvZyhTaGVsbCwgaW50KQotCUZpbGVEaWFsb2cgZmQ7Ci0JZmQgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULk5VTEwpOwotCWFzc2VydFRydWUoZmQuZ2V0U3R5bGUoKT09U1dULk5VTEwpOwotCWZkID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JYXNzZXJ0VHJ1ZShmZC5nZXRTdHlsZSgpPT1TV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCWZkID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5QUklNQVJZX01PREFMKTsKLQlhc3NlcnRUcnVlKGZkLmdldFN0eWxlKCk9PVNXVC5QUklNQVJZX01PREFMKTsKLQlmZCA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuU1lTVEVNX01PREFMKTsKLQlhc3NlcnRUcnVlKGZkLmdldFN0eWxlKCk9PVNXVC5TWVNURU1fTU9EQUwpOwotfQotcHVibGljIHZvaWQgdGVzdF9nZXRGaWxlTmFtZSgpIHsKLQkvLwl0ZXN0ZWQgaW4gdGVzdF9zZXRGaWxlTmFtZUxqYXZhX2xhbmdfU3RyaW5nKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGaWxlTmFtZXMoKSB7Ci0JU3RyaW5nW10gbmFtZXMgPSBmaWxlRGlhbG9nLmdldEZpbGVOYW1lcygpOwotCWFzc2VydFRydWUobmFtZXMubGVuZ3RoPT0wKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGaWx0ZXJFeHRlbnNpb25zKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZpbHRlckV4dGVuc2lvbnMkTGphdmFfbGFuZ19TdHJpbmcoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZpbHRlck5hbWVzKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZpbHRlck5hbWVzJExqYXZhX2xhbmdfU3RyaW5nKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGaWx0ZXJQYXRoKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZpbHRlclBhdGhMamF2YV9sYW5nX1N0cmluZwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW4oKSB7Ci0JaWYgKGZUZXN0RGlhbG9nT3BlbikKLQkJZmlsZURpYWxvZy5vcGVuKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RmlsZU5hbWVMamF2YV9sYW5nX1N0cmluZygpIHsKLQlmaWxlRGlhbG9nLnNldEZpbGVOYW1lKCIiKTsKLQlTdHJpbmcgbmFtZSA9IGZpbGVEaWFsb2cuZ2V0RmlsZU5hbWUoKTsKLQlhc3NlcnRUcnVlKG5hbWUuZXF1YWxzKCIiKSk7Ci0JZmlsZURpYWxvZy5zZXRGaWxlTmFtZShudWxsKTsKLQluYW1lID0gZmlsZURpYWxvZy5nZXRGaWxlTmFtZSgpOwotCWFzc2VydFRydWUobmFtZT09bnVsbCk7Ci0JZmlsZURpYWxvZy5zZXRGaWxlTmFtZSgic29tZWZpbGUudGVzdCIpOwotCW5hbWUgPSBmaWxlRGlhbG9nLmdldEZpbGVOYW1lKCk7Ci0JYXNzZXJ0VHJ1ZShuYW1lLmVxdWFscygic29tZWZpbGUudGVzdCIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGaWx0ZXJFeHRlbnNpb25zJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyJ0eHQiLCJqYXZhIn0pOwotCVN0cmluZyBmaWx0ZXJzW10gPSBmaWxlRGlhbG9nLmdldEZpbHRlckV4dGVuc2lvbnMoKTsKLQlhc3NlcnRUcnVlKGZpbHRlcnMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoZmlsdGVyc1swXS5lcXVhbHMoInR4dCIpKTsKLQlhc3NlcnRUcnVlKGZpbHRlcnNbMV0uZXF1YWxzKCJqYXZhIikpOwotCWZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIifSk7Ci0JZmlsdGVycyA9IGZpbGVEaWFsb2cuZ2V0RmlsdGVyRXh0ZW5zaW9ucygpOwotCWFzc2VydFRydWUoZmlsdGVycy5sZW5ndGggPT0gMSk7Ci0JZmlsZURpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG51bGwpOwotCWZpbHRlcnMgPSBmaWxlRGlhbG9nLmdldEZpbHRlckV4dGVuc2lvbnMoKTsKLQlhc3NlcnRUcnVlKGZpbHRlcnM9PW51bGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZpbHRlck5hbWVzJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWZpbGVEaWFsb2cuc2V0RmlsdGVyTmFtZXMobmV3IFN0cmluZ1tdIHsiYS50eHQiLCJiLmphdmEifSk7Ci0JU3RyaW5nIGZpbHRlcnNbXSA9IGZpbGVEaWFsb2cuZ2V0RmlsdGVyTmFtZXMoKTsKLQlhc3NlcnRUcnVlKGZpbHRlcnMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoZmlsdGVyc1swXS5lcXVhbHMoImEudHh0IikpOwotCWFzc2VydFRydWUoZmlsdGVyc1sxXS5lcXVhbHMoImIuamF2YSIpKTsKLQlmaWxlRGlhbG9nLnNldEZpbHRlck5hbWVzKG5ldyBTdHJpbmdbXSB7IiJ9KTsKLQlmaWx0ZXJzID0gZmlsZURpYWxvZy5nZXRGaWx0ZXJOYW1lcygpOwotCWFzc2VydFRydWUoZmlsdGVycy5sZW5ndGggPT0gMSk7Ci0JZmlsZURpYWxvZy5zZXRGaWx0ZXJOYW1lcyhudWxsKTsKLQlmaWx0ZXJzID0gZmlsZURpYWxvZy5nZXRGaWx0ZXJOYW1lcygpOwotCWFzc2VydFRydWUoZmlsdGVycz09bnVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RmlsdGVyUGF0aExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWFzc2VydFRydWUoIjoxOiIsIGZpbGVEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpID09ICIiKTsKLQlTdHJpbmcgdGVzdFN0ciA9ICIuLyoiOwotCWZpbGVEaWFsb2cuc2V0RmlsdGVyUGF0aCh0ZXN0U3RyKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBmaWxlRGlhbG9nLmdldEZpbHRlclBhdGgoKS5lcXVhbHModGVzdFN0cikpOwotCWZpbGVEaWFsb2cuc2V0RmlsdGVyUGF0aCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjM6IiwgZmlsZURpYWxvZy5nZXRGaWx0ZXJQYXRoKCkuZXF1YWxzKCIiKSk7Ci0JZmlsZURpYWxvZy5zZXRGaWx0ZXJQYXRoKG51bGwpOwotCWFzc2VydFRydWUoIjo0OiIsIGZpbGVEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpID09IG51bGwpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZpbGVEaWFsb2coKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RmlsZU5hbWUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZpbGVOYW1lcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RmlsdGVyRXh0ZW5zaW9ucyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RmlsdGVyTmFtZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZpbHRlclBhdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X29wZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZpbGVOYW1lTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZpbHRlckV4dGVuc2lvbnMkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZpbHRlck5hbWVzJExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZpbGVOYW1lIikpIHRlc3RfZ2V0RmlsZU5hbWUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZpbGVOYW1lcyIpKSB0ZXN0X2dldEZpbGVOYW1lcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RmlsdGVyRXh0ZW5zaW9ucyIpKSB0ZXN0X2dldEZpbHRlckV4dGVuc2lvbnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZpbHRlck5hbWVzIikpIHRlc3RfZ2V0RmlsdGVyTmFtZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZpbHRlclBhdGgiKSkgdGVzdF9nZXRGaWx0ZXJQYXRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9vcGVuIikpIHRlc3Rfb3BlbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RmlsZU5hbWVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEZpbGVOYW1lTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZpbHRlckV4dGVuc2lvbnMkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRGaWx0ZXJFeHRlbnNpb25zJExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGaWx0ZXJOYW1lcyRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEZpbHRlck5hbWVzJExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1GaWxlRGlhbG9nIGZpbGVEaWFsb2c7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRm9udERpYWxvZy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZvbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA3OWQ5NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRm9udERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Gb250RGlhbG9nCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Gb250RGlhbG9nCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZvbnREaWFsb2cgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZyB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZvbnREaWFsb2coU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWZvbnREaWFsb2cgPSBuZXcgRm9udERpYWxvZyhzaGVsbCwgU1dULk5VTEwpOwotCXNldERpYWxvZyhmb250RGlhbG9nKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKSB7Ci0JRm9udERpYWxvZyBmZCA9IG5ldyBGb250RGlhbG9nKHNoZWxsKTsKLQl0cnkgewotCQluZXcgRm9udERpYWxvZyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpIHsKLQl0cnkgewotCQluZXcgRm9udERpYWxvZyhudWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250RGF0YSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb250RGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250TGlzdCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Rm9udExpc3Qgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSR0IoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0UkdCTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9vcGVuKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9vcGVuIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udERhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKCkgewotCUZvbnREYXRhIFtdIGZvbnREYXRhID0gbmV3IEZvbnREYXRhIFsxXTsKLQlmb250RGF0YSBbMF0gPSBuZXcgRm9udERhdGEgKCk7Ci0KLQlhc3NlcnROdWxsKGZvbnREaWFsb2cuZ2V0Rm9udExpc3QoKSk7CQotCQkKLQlmb250RGlhbG9nLnNldEZvbnRMaXN0KGZvbnREYXRhKTsKLQlhc3NlcnRFcXVhbHMoZm9udERpYWxvZy5nZXRGb250TGlzdCgpLCBmb250RGF0YSk7Ci0KLQlmb250RGlhbG9nLnNldEZvbnRMaXN0KG51bGwpOwotCWFzc2VydE51bGwoZm9udERpYWxvZy5nZXRGb250TGlzdCgpKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExpc3QkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9udExpc3QkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKCkgewotCVJHQiByZ2IgPSBuZXcgUkdCKDI1NSwgMCwgMCk7Ci0JZm9udERpYWxvZy5zZXRSR0IocmdiKTsKLQlSR0IgcmdiMiA9IGZvbnREaWFsb2cuZ2V0UkdCKCk7Ci0JYXNzZXJ0RXF1YWxzKHJnYiwgcmdiMik7CQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZvbnREaWFsb2coKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udERhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnRMaXN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSR0IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X29wZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnREYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExpc3QkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UkdCTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnREYXRhIikpIHRlc3RfZ2V0Rm9udERhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnRMaXN0IikpIHRlc3RfZ2V0Rm9udExpc3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJHQiIpKSB0ZXN0X2dldFJHQigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfb3BlbiIpKSB0ZXN0X29wZW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnREYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSIpKSB0ZXN0X3NldEZvbnREYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExpc3QkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSIpKSB0ZXN0X3NldEZvbnRMaXN0JExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIikpIHRlc3Rfc2V0UkdCTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1Gb250RGlhbG9nIGZvbnREaWFsb2c7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfR3JvdXAuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTI4Mzk3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXAKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfR3JvdXAgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0dyb3VwKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlncm91cCA9IG5ldyBHcm91cChzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KGdyb3VwKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCWdyb3VwID0gbmV3IEdyb3VwKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9IHtTV1QuU0hBRE9XX0lOLCBTV1QuU0hBRE9XX09VVCwgU1dULlNIQURPV19FVENIRURfSU4sIFNXVC5TSEFET1dfRVRDSEVEX09VVH07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykKLQkJZ3JvdXAgPSBuZXcgR3JvdXAoc2hlbGwsIGNhc2VzW2ldKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlVHJpbUlJSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVUcmltSUlJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENsaWVudEFyZWEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmdbXSBjYXNlcyA9IHsiIiwgInNvbWUgdGV4dCIsICJsZGthc2hkb2VodWZ3ZW92Y25oc2x2aHJlZ29qZWJja3JlYXZia3VoeGJpdWZ2Y3loYmlmdXlld3ZiaXVyZXlkLixjbW5lc2xqbGlld2pmY2h2YndvaWZpdmJld29yaXh1aWV1cnZiaXV2Ym9oZmxrc2plYWhmY2xpdXJlYWZneWNpYWJlbGl0dnlyd3RsaWN1eXJ0bGl1cmV5YmNsaXV5cmV1Y2V5dmJsaXVyZXliY3QifTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWdyb3VwLnNldFRleHQoY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCJjYXNlOiAiICsgU3RyaW5nLnZhbHVlT2YoaSksIGdyb3VwLmdldFRleHQoKS5lcXVhbHMoY2FzZXNbaV0pKTsKLQl9OwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0dyb3VwKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlVHJpbUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaWVudEFyZWEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlVHJpbUlJSUkiKSkgdGVzdF9jb21wdXRlVHJpbUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1Hcm91cCBncm91cDsKLQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMjAsIDEwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQ5OWY1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbG9hZEltYWdlcygpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotCWZyZWVJbWFnZXMoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJKCkgewotCS8vIGFic3RyYWN0IGNsYXNzCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SUkoKSB7Ci0JLy8gYWJzdHJhY3QgY2xhc3MKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQlhc3NlcnROdWxsKGl0ZW0uZ2V0SW1hZ2UoKSk7Ci0JaXRlbS5zZXRJbWFnZShpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIGl0ZW0uZ2V0SW1hZ2UoKSk7Ci0JYXNzZXJ0VHJ1ZShpdGVtLmdldEltYWdlKCkgIT0gaW1hZ2VzWzFdKTsKLQlpdGVtLnNldEltYWdlKG51bGwpOwotCWFzc2VydE51bGwoaXRlbS5nZXRJbWFnZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JU3RyaW5nIHRlc3RTdHIgPSAidGVzdCBzdHJpbmciOwotCWl0ZW0uc2V0VGV4dCh0ZXN0U3RyKTsKLQlhc3NlcnRUcnVlKCJhIiwgaXRlbS5nZXRUZXh0KCkuZXF1YWxzKHRlc3RTdHIpKTsKLQlpdGVtLnNldFRleHQoIiIpOwotCWFzc2VydFRydWUoImIiLCBpdGVtLmdldFRleHQoKS5lcXVhbHMoIiIpKTsKLQl0cnkgewotCQlpdGVtLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZSIpKSB0ZXN0X2dldEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1JdGVtIGl0ZW07Ci1JbWFnZVtdIGltYWdlcyA9IG5ldyBJbWFnZSBbU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzLmxlbmd0aCpTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lcy5sZW5ndGhdOwotCi1wcml2YXRlIHZvaWQgbG9hZEltYWdlcygpIHsKLQlpbnQgbnVtRm9ybWF0cyA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGg7Ci0JaW50IG51bUZpbGVzID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXMubGVuZ3RoOwotCWZvciAoaW50IGk9MDsgaTxudW1Gb3JtYXRzOyBpKyspIHsKLQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkJaW50IGluZGV4ID0gaSpudW1GaWxlczsKLQkJZm9yIChpbnQgaj0wOyBqPG51bUZpbGVzOyBqKyspewotCQkJU3RyaW5nIGZpbGVOYW1lID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNbal07Ci0JCQlJbnB1dFN0cmVhbSAgcmVzb3VyY2UgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSArICIuIiArIGZvcm1hdCk7Ci0JCQlpbWFnZXMgW2luZGV4K2pdID0gbmV3IEltYWdlIChzaGVsbC5nZXREaXNwbGF5KCksIHJlc291cmNlKTsKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2UuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjb250aW51ZTsKLQkJCX0KLQkJfQotCX0KLX0KLXByb3RlY3RlZCB2b2lkIHNldFdpZGdldChXaWRnZXQgd2lkZ2V0KSB7Ci0JaXRlbSA9IChJdGVtKSB3aWRnZXQ7Ci0Jc3VwZXIuc2V0V2lkZ2V0KHdpZGdldCk7Ci19Ci0KLXByaXZhdGUgdm9pZCBmcmVlSW1hZ2VzKCkgewotCWZvciAoaW50IGk9MDsgaTxpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGltYWdlc1tpXSAhPSBudWxsKQotCQkJaW1hZ2VzW2ldLmRpc3Bvc2UoKTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGFiZWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2MwMDYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWwKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGFiZWwgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIDApOwotCXNldFdpZGdldChsYWJlbCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotLy8Jc3VwZXIudGVhckRvd24oKTsKLQotCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCWFzc2VydEVxdWFscyhzaGVsbC5pc0Rpc3Bvc2VkKCksIGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKGxhYmVsLmlzRGlzcG9zZWQoKSwgZmFsc2UpOwotCX0KLQotCXNoZWxsLmRpc3Bvc2UoKTsKLQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQlhc3NlcnRUcnVlKHNoZWxsLmlzRGlzcG9zZWQoKSk7Ci0JCWFzc2VydFRydWUobGFiZWwuaXNEaXNwb3NlZCgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpewotCXRyeSB7Ci0JCWxhYmVsID0gbmV3IExhYmVsKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7IC8vc2hvdWxkIG5ldmVyIGdldCBoZXJlCi0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCAwKTsKLQotCWludFtdIGNhc2VzID0ge1NXVC5MRUZULCBTV1QuUklHSFQsIFNXVC5DRU5URVIsIFNXVC5TRVBBUkFUT1IsIFNXVC5IT1JJWk9OVEFMLCBTV1QuVkVSVElDQUwsIFNXVC5TSEFET1dfSU4sIFNXVC5TSEFET1dfT1VUfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgY2FzZXNbaV0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCS8vIHN1cGVyIGNsYXNzIHRlc3QgaXMgc3VmZmljaWVudAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEFsaWdubWVudCgpewotCWludFtdIGNhc2VzID0ge1NXVC5MRUZULCBTV1QuUklHSFQsIFNXVC5DRU5URVJ9OwotCWZvciAoaW50IGk9MDsgaTxjYXNlcy5sZW5ndGg7IGkrKykKLQl7Ci0gCSAgbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIGNhc2VzW2ldKTsKLQkgIGFzc2VydEVxdWFscyhsYWJlbC5nZXRBbGlnbm1lbnQoKSwgY2FzZXNbaV0pOwotCX0gCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2UoKXsKLQlJbWFnZVtdIGNhc2VzID0ge251bGwsIG5ldyBJbWFnZShudWxsLCAxMDAsIDEwMCl9OwotCWZvcihpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKXsKLQkgbGFiZWwuc2V0SW1hZ2UoY2FzZXNbaV0pOwotCSBhc3NlcnRFcXVhbHMobGFiZWwuZ2V0SW1hZ2UoKSwgY2FzZXNbaV0pOwotCSBpZiAoY2FzZXNbaV0hPW51bGwpCi0JICBjYXNlc1tpXS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKXsKLQlTdHJpbmdbXSBjYXNlcyA9IHsiIiwgInNvbWUgbmFtZSIsICJzZGFzZGxranNoY2Rhc2NlY29ld2N3ZSJ9OwotCWZvcihpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKXsKLQkgbGFiZWwuc2V0VGV4dChjYXNlc1tpXSk7Ci0JIGFzc2VydEVxdWFscyhsYWJlbC5nZXRUZXh0KCksIGNhc2VzW2ldKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxpZ25tZW50SSgpewotCWludFtdIGNhc2VzID0ge1NXVC5MRUZULCBTV1QuUklHSFQsIFNXVC5DRU5URVJ9OwotCWZvciAoaW50IGk9MDsgaTxjYXNlcy5sZW5ndGg7IGkrKykKLQl7Ci0gCSAgbGFiZWwuc2V0QWxpZ25tZW50KGNhc2VzW2ldKTsKLQkgIGFzc2VydEVxdWFscyhsYWJlbC5nZXRBbGlnbm1lbnQoKSwgY2FzZXNbaV0pOwotCX0gCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9jdXMoKSB7Ci0JLy8gc3VwZXIgY2xhc3MgdGVzdCBpcyBzdWZmaWNpZW50Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCS8vIHRlc3RlZCBpbiBnZXRJbWFnZSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKXsKLQl0cnkgewotCQlsYWJlbC5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGFiZWwoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFsaWdubWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFsaWdubWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvY3VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxpZ25tZW50IikpIHRlc3RfZ2V0QWxpZ25tZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZSIpKSB0ZXN0X2dldEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWxpZ25tZW50SSIpKSB0ZXN0X3NldEFsaWdubWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvY3VzIikpIHRlc3Rfc2V0Rm9jdXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1MYWJlbCBsYWJlbDsKLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDIwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTc1NzgxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCVNoZWxsIHNoZWxsOwotCUNvbXBvc2l0ZSBjb21wb3NpdGU7Ci0JCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIDApOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlpZiAoY29tcG9zaXRlICE9IG51bGwpIHsKLQkJY29tcG9zaXRlLmRpc3Bvc2UoKTsKLQl9Ci0JaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGluay5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMxN2U2My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpbmsgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCi0JTGluayBsaW5rOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaW5rKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlsaW5rID0gbmV3IExpbmsoc2hlbGwsIFNXVC5OT05FKTsKLQlzZXRXaWRnZXQobGluayk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQkvLyBUZXN0IExpbmsoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKQotCWxpbmsgPSBuZXcgTGluayhzaGVsbCwgU1dULk5VTEwpOwotCWxpbmsuZGlzcG9zZSgpOwotCWxpbmsgPSBuZXcgTGluayhzaGVsbCwgU1dULk5PTkUpOwotCWxpbmsuZGlzcG9zZSgpOwotCWxpbmsgPSBuZXcgTGluayhzaGVsbCwgU1dULkJPUkRFUik7Ci0JbGluay5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJbGluayA9IG5ldyBMaW5rKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX07Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCX07Ci0JfTsKLQkKLQl0cnkgewotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRTZWxlY3Rpb25MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaW5rLm5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShsaXN0ZW5lckNhbGxlZCk7Ci0JCi0JdHJ5IHsKLQkJbGluay5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlsaW5rLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaW5rLm5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0RmFsc2UobGlzdGVuZXJDYWxsZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCWxpbmsuY29tcHV0ZVNpemUoMCwgMCk7Ci0KLQlsaW5rLmNvbXB1dGVTaXplKDAsIDAsIGZhbHNlKTsKLQotCWxpbmsuY29tcHV0ZVNpemUoLTEwLCAtMTApOwotCi0JbGluay5jb21wdXRlU2l6ZSgtMTAsIC0xMCwgZmFsc2UpOwotCi0JbGluay5jb21wdXRlU2l6ZSgxMCwgMTApOwotCi0JbGluay5jb21wdXRlU2l6ZSgxMCwgMTAsIGZhbHNlKTsKLQotCWxpbmsuY29tcHV0ZVNpemUoMTAwMDAsIDEwMDAwKTsKLQotCWxpbmsuY29tcHV0ZVNpemUoMTAwMDAsIDEwMDAwLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpIHsKLQkvLyB0ZXN0ZWQgaW4gIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmdbXSBjYXNlcyA9IHsKLQkJCSIiLAotCQkJImEiLAotCQkJImFhIiwKLQkJCSJhYWFhYWFhYWFhIiwKLQkJCSJhJiIsCi0JCQkiJiIsCi0JCQkiJmEiLAotCQkJIiZhJiIsCi0JCQkiJmEiLAotCQkJIiY8YT4iLAotCQkJIjxhPiIsCi0JCQkiJmE8YT4iLAotCQkJIjxhPjwvYT4iLAotCQkJIjxhPjwvYT4mIiwKLQkJCSI8YT48L2E+YSYiLAotCQkJIjxhPjwvYT4mYSIsCi0JCQkiJmE8YT5hPC9hPiZhIiwKLQkJCSImYTxhPiZhPC9hPiZhIiwKLQkJCSJUZXh0IDxhIGhyZWY9XCJ1cmwuY29tXCI+TGluazwvYT4gdGV4dCA8QSBjb2xvcj0jMjEyMTIxPkxpbmsgMjwvQT4gIiwKLQkJCSJUZXh0PGEgIFx0ICAgeHh4PVwieXl5ICBcIiAgICAgICAgaWQ9XCJpZHNcIiBocmVmPVwiSFJFRlwiICAgICA+TGluazwgL2E+RW5kIiwKLQkJCSJUZSYmeHQgJnRleHQgJiYgPGE+TCZpbms8L2E+IGgmaSA8YT5mZSYmbGlwZTwvYT4gJmwgJmVuZCYmIiwKLQkJCSJUZXh0IDxhIGlkPVwiMVwiPkxpbms8L2E+IHNvbWV0aGluZyA8YSBocmVmPVwiYmxhIGJsYTJcIiA+TGluazI8L2E+IHNvbWV0aGluZ2Vsc2UgPGE+TGluazMgbGFyZ2UgbGFyZ2U8L2E+LiBzb21lIHRleHQgdG8gdGVzdCB0aGlzIHdyYXBwaW5nIHRoaW5nIDxBIGhyZWY9XCJsYXN0XCI+dGhpcyBpcyBzdXBwb3NlIHRvIGJlIGEgdmVyeSBsb25nIGxpbmsgdGV4dCB0aGUgc3ByYXdzIG92ZXIgc2V2ZXJhbCBsaW5lcyBpbiB0aGUgdGV4dCBsYXlvdXQ8L2E+LmVuZCIsCi0JCQkiVGhlIFNXVCBjb21wb25lbnQgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSA8QT5lZmZpY2llbnQ8L0E+LCA8QT5wb3J0YWJsZTwvQT4gPEE+YWNjZXNzIHRvIHRoZSB1c2VyLWludGVyZmFjZSBmYWNpbGl0aWVzIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtczwvQT4gb24gd2hpY2ggaXQgaXMgaW1wbGVtZW50ZWQuIiwKLQkJCSJzb21lIHRleHQiLCAKLQkJCSJsZGthc2hkb2VodWZ3ZW92Y25oc2x2aHJlZ29qZWJja3JlYXZia3VoeGJpdWZ2Y3loYmlmdXlld3ZiaXVyZXlkLixjbW5lc2xqbGlld2pmY2h2YndvaWZpdmJld29yaXh1aWV1cnZiaXV2Ym9oZmxrc2plYWhmY2xpdXJlYWZneWNpYWJlbGl0dnlyd3RsaWN1eXJ0bGl1cmV5YmNsaXV5cmV1Y2V5dmJsaXVyZXliY3QiLCAKLQkJCSJcbiBcbiBcYiBcdCAiLCAKLQkJCSJcMCJ9OwotCWZvciAoaW50IGk9MDsgaTxjYXNlcy5sZW5ndGg7IGkrKyl7Ci0JCWxpbmsuc2V0VGV4dChjYXNlc1tpXSk7Ci0JCWFzc2VydEVxdWFscyhsaW5rLmdldFRleHQoKSAsIGNhc2VzW2ldKTsKLQl9Ci0JdHJ5IHsKLQkJbGluay5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB0ZXh0ID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaW5rKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxN2FhOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3QgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlsaXN0ID0gbmV3IExpc3Qoc2hlbGwsIFNXVC5NVUxUSSk7Ci0KLQlzZXRXaWRnZXQobGlzdCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQlsaXN0ID0gbmV3IExpc3QobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsgLy9zaG91bGQgbmV2ZXIgZ2V0IGhlcmUKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludFtdIGNhc2VzID0KLQkJewotCQkJMCwKLQkJCVNXVC5TSU5HTEUsCi0JCQlTV1QuTVVMVEksCi0JCQlTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwsCi0JCQlTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwsCi0JCQlTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQlsaXN0ID0gbmV3IExpc3Qoc2hlbGwsIGNhc2VzW2ldKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0cnkgewotCQlsaXN0LmFkZChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWxpc3QuYWRkKCIiKTsKLQlhc3NlcnRTYW1lKCI6YToiLCBuZXcgU3RyaW5nW10geyIifSwgbGlzdC5nZXRJdGVtcygpKTsKLQlsaXN0LmFkZCgic29tZSBcbiB0ZXh0Iik7Ci0JYXNzZXJ0U2FtZSgiOmI6IiwgbmV3IFN0cmluZ1tdIHsiIiwgInNvbWUgXG4gdGV4dCJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotCWxpc3QuYWRkKCJzb21lIHRleHQiKTsKLQlhc3NlcnRTYW1lKCI6YzoiLCBuZXcgU3RyaW5nW10geyIiLCAic29tZSBcbiB0ZXh0IiwgInNvbWUgdGV4dCJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotCQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiBsaXN0Ci0KLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQl0cnkgewotCQlsaXN0LmFkZChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3QuYWRkKCIiKTsKLQlhc3NlcnRTYW1lKCI6YToiLCBuZXcgU3RyaW5nW10geyIifSwgbGlzdC5nZXRJdGVtcygpKTsKLQlsaXN0LmFkZCgic29tZSBcbiB0ZXh0Iik7Ci0JYXNzZXJ0U2FtZSgiOmI6IiwgbmV3IFN0cmluZ1tdIHsiIiwgInNvbWUgXG4gdGV4dCJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotCWxpc3QuYWRkKCJzb21lIHRleHQiKTsKLQlhc3NlcnRTYW1lKCI6YzoiLCBuZXcgU3RyaW5nW10geyIiLCAic29tZSBcbiB0ZXh0IiwgInNvbWUgdGV4dCJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSgpIHsKLQl0cnkgewotCQlsaXN0LmFkZCgic29tZSB0ZXh0IiwgMik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQlsaXN0LmFkZCgiIiwgMCk7Ci0JYXNzZXJ0U2FtZSgiOmE6IiwgbmV3IFN0cmluZ1tdIHsiIn0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JbGlzdC5hZGQoInNvbWUgXG4gdGV4dCIsIDEpOwotCWFzc2VydFNhbWUoIjpiOiIsIG5ldyBTdHJpbmdbXSB7IiIsICJzb21lIFxuIHRleHQifSwgbGlzdC5nZXRJdGVtcygpKTsKLQlsaXN0LmFkZCgic29tZSB0ZXh0IiwgMCk7Ci0JYXNzZXJ0U2FtZSgiOmM6IiwgbmV3IFN0cmluZ1tdIHsic29tZSB0ZXh0IiwgIiIsICJzb21lIFxuIHRleHQiIH0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JCi0JdHJ5IHsKLQkJbGlzdC5hZGQobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gc3RyaW5nID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCWxpc3QuYWRkKCJzdHJpbmciLCAtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gaW5kZXggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JLy8gdGVzdCBzaW5nbGUtc2VsZWN0aW9uIGxpc3QKLQotCXNldFNpbmdsZUxpc3QoKTsKLQotCXRyeSB7Ci0JCWxpc3QuYWRkKCJzb21lIHRleHQiLCAyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCQotCWxpc3QuYWRkKCIiLCAwKTsKLQlhc3NlcnRTYW1lKCI6YToiLCBuZXcgU3RyaW5nW10geyIifSwgbGlzdC5nZXRJdGVtcygpKTsKLQlsaXN0LmFkZCgic29tZSBcbiB0ZXh0IiwgMSk7Ci0JYXNzZXJ0U2FtZSgiOmI6IiwgbmV3IFN0cmluZ1tdIHsiIiwgInNvbWUgXG4gdGV4dCJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotCWxpc3QuYWRkKCJzb21lIHRleHQiLCAwKTsKLQlhc3NlcnRTYW1lKCI6YzoiLCBuZXcgU3RyaW5nW10geyJzb21lIHRleHQiLCAiIiwgInNvbWUgXG4gdGV4dCIgfSwgbGlzdC5nZXRJdGVtcygpKTsKLQkKLQl0cnkgewotCQlsaXN0LmFkZChudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBzdHJpbmcgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbGlzdC5hZGQoInN0cmluZyIsIC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBpbmRleCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JdHJ5IHsKLQkJbGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkKLQlsaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaXN0LnNlbGVjdCgwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0JbGlzdC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJbGlzdC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkKLQkvLyB0ZXN0IHNpbmdsZS1zZWxlY3Rpb24gbGlzdAotCi0Jc2V0U2luZ2xlTGlzdCgpOwotCQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJbGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkKLQlsaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaXN0LnNlbGVjdCgwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0JbGlzdC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJbGlzdC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQkvLyBzdXBlciBjbGFzcyB0ZXN0IGlzIHN1ZmZpY2llbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdCRJKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0JU3RyaW5nW10gZW1wdHkgPSB7Ci0JfTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0U2FtZSgiOmE6IiwgbGlzdC5nZXRTZWxlY3Rpb24oKSwgaXRlbXMpOwotCXRyeSB7Ci0JCWxpc3QuZGVzZWxlY3QobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uKCksIGl0ZW1zKTsKLQlsaXN0LmRlc2VsZWN0KG5ldyBpbnRbXSB7Ci0JfSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbigpLCBpdGVtcyk7Ci0JbGlzdC5kZXNlbGVjdChuZXcgaW50W10geyAwIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmlzU2VsZWN0ZWQoMCksIGZhbHNlKTsKLQlhc3NlcnRUcnVlKGxpc3QuaXNTZWxlY3RlZCgxKSk7Ci0JbGlzdC5kZXNlbGVjdChuZXcgaW50W10geyAyLCAwLCAwIH0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDMgfSk7Ci0JLyoJYXNzZXJ0KCI6ZDoiLCAhbGlzdC5pc1NlbGVjdGVkKDApKTsKLQlhc3NlcnQoIjpkZDoiLCAhbGlzdC5pc1NlbGVjdGVkKDIpKTsKLQlhc3NlcnQoIjpkZGQ6IiwgbGlzdC5pc1NlbGVjdGVkKDEpKTsKLQlhc3NlcnQoIjpkZGQ6IiwgbGlzdC5pc1NlbGVjdGVkKDEpKTsqLwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0JdHJ5IHsKLQkJbGlzdC5kZXNlbGVjdChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0JbGlzdC5kZXNlbGVjdChuZXcgaW50W10ge30pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCWxpc3QuZGVzZWxlY3QobmV3IGludFtdIHsgMSB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDMgfSk7Ci0JbGlzdC5kZXNlbGVjdChuZXcgaW50W10geyAwIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMyB9KTsKLQlsaXN0LmRlc2VsZWN0KG5ldyBpbnRbXSB7IDMgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCWxpc3QuZGVzZWxlY3QobmV3IGludFtdIHsgMiwgMCwgMCB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdEFsbCgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCVN0cmluZ1tdIGVtcHR5ID0gewotCX07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydFNhbWUoaXRlbXMsIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoZW1wdHksIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQlhc3NlcnRFcXVhbHMobmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9LCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKGVtcHR5LCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0SSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9ICJmcmVkIiArIGk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0KLQlTdHJpbmdbXSBpdGVtczIgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiIsICJpdGVtMyIgfTsKLQlTdHJpbmdbXSBlbXB0eSA9IHsKLQl9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMyKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtczIpOwotCWFzc2VydFNhbWUoaXRlbXMyLCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQlsaXN0LmRlc2VsZWN0KDUpOwotCWFzc2VydFNhbWUoaXRlbXMyLCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQlsaXN0LmRlc2VsZWN0KDEpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgbGlzdC5pc1NlbGVjdGVkKDEpKTsKLQlsaXN0LmRlc2VsZWN0KDEpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgbGlzdC5pc1NlbGVjdGVkKDEpKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zMik7Ci0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQlhc3NlcnRFcXVhbHMobmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9LCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQlsaXN0LmRlc2VsZWN0KDUpOwotCWFzc2VydEVxdWFscyhuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0sIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCWxpc3QuZGVzZWxlY3QoMik7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMikpOwotCWxpc3QuZGVzZWxlY3QoMSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMSkpOwotCWxpc3QuZGVzZWxlY3QoMSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0SUkoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSAiZnJlZCIgKyBpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQotCS8vIHRlc3RzIGlmIGRlc2VsZWN0KGksIGopIGlzIHRoZSBzYW1lIGFzIGZvciAoaT0wOyBpPD1qOyArK2kpIGRlc2VsZWN0KGkpOwotCWludFtdW10gY2FzZXMgPSB7IHsgMywgMSB9LCB7Ci0JCQktMywgLTIgfSwgewotCQkJLTIsIC0xIH0sIHsKLQkJCS0xLCAtMSB9LCB7Ci0JCQkxMCwgMSB9Ci0JfTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyArK2kpIHsKLQkJZGVzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIGNhc2VzW2ldWzBdLCBjYXNlc1tpXVsxXSwgbmV3IGludFtdIHsgMCwgMSwgMiwgMywgNCB9KTsKLQl9Ci0JaWYgKGZDaGVja1NXVFBvbGljeSkgewotCQlkZXNlbGVjdElJX2hlbHBlcihpdGVtcywgLTEsIDMsIG5ldyBpbnRbXSB7IDQgfSk7Ci0JCWRlc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAtMSwgMzAsIG5ldyBpbnRbXSB7Ci0JCX0pOwotCX0KLQlkZXNlbGVjdElJX2hlbHBlcihpdGVtcywgMSwgMywgbmV3IGludFtdIHsgMCwgNCB9KTsKLQlkZXNlbGVjdElJX2hlbHBlcihpdGVtcywgMSwgMSwgbmV3IGludFtdIHsgMCwgMiwgMywgNCB9KTsKLQkvLyBkb25lCi0KLQlTdHJpbmdbXSBpdGVtczIgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiIsICJpdGVtMyIgfTsKLQlTdHJpbmdbXSBlbXB0eSA9IHsKLQl9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMyKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtczIpOwotCWFzc2VydFNhbWUoIjphOiIsIGl0ZW1zMiwgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0JbGlzdC5kZXNlbGVjdCgwLCAwKTsKLQlhc3NlcnRTYW1lKCI6YjoiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiwgMyB9KTsKLQlsaXN0LmRlc2VsZWN0KDAsIDApOwotCWFzc2VydFNhbWUoIjpiYmI6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDIsIDMgfSk7Ci0JbGlzdC5kZXNlbGVjdCgyLCAzKTsKLQlhc3NlcnRFcXVhbHMoIjpiYjoiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSB9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zMik7Ci0JbGlzdC5kZXNlbGVjdCgwLCAyKTsKLQlhc3NlcnRFcXVhbHMoIjpkZGRkOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAzIH0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMyKTsKLQlsaXN0LmRlc2VsZWN0KDIsIDApOwotCWFzc2VydFNhbWUoCi0JCSI6ZGRkZGQ6IiwKLQkJbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMgfSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JCi0JbGlzdC5zZXRJdGVtcyhpdGVtczIpOwotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQkKLQlsaXN0LnNlbGVjdCgwKTsKLQotCWxpc3QuZGVzZWxlY3QoLTMsIC0yKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0KC0yLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCi0JbGlzdC5kZXNlbGVjdCgtMSwgLTEpOwotCWFzc2VydEVxdWFscygiOmU6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0KLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCi0JbGlzdC5kZXNlbGVjdCgxLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQotCWxpc3QuZGVzZWxlY3QoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0KDMsIDMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10ge30pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQlsaXN0LmRlc2VsZWN0KDEsIDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQlsaXN0LmRlc2VsZWN0KDAsIDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMyB9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0JbGlzdC5kZXNlbGVjdCgxLCAzKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9jdXNJbmRleCgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIn07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oMCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpKTsKLQlsaXN0LnNldFNlbGVjdGlvbigyKTsKLQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5nZXRGb2N1c0luZGV4KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCi0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQlsaXN0LnJlbW92ZSgyKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JbGlzdC5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQlsaXN0LnJlbW92ZSgyKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JbGlzdC5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSGVpZ2h0KCkgewotCUZvbnREYXRhIGZvbnREYXRhID0gbGlzdC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQlpbnQgbGluZUhlaWdodDsKLQlGb250IGZvbnQ7Ci0JCi0JZm9udCA9IG5ldyBGb250KGxpc3QuZ2V0RGlzcGxheSgpLCBmb250RGF0YS5nZXROYW1lKCksIDgsIGZvbnREYXRhLmdldFN0eWxlKCkpOwotCWxpc3Quc2V0Rm9udChmb250KTsKLQlsaW5lSGVpZ2h0ID0gbGlzdC5nZXRJdGVtSGVpZ2h0KCk7Ci0JbGlzdC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotCWZvbnQgPSBuZXcgRm9udChsaXN0LmdldERpc3BsYXkoKSwgZm9udERhdGEuZ2V0TmFtZSgpLCAxMiwgZm9udERhdGEuZ2V0U3R5bGUoKSk7Ci0JbGlzdC5zZXRGb250KGZvbnQpOwotCWludCBuZXdMaW5lSGVpZ2h0ID0gbGlzdC5nZXRJdGVtSGVpZ2h0KCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbmV3TGluZUhlaWdodCA+IGxpbmVIZWlnaHQpOwotCWxpc3Quc2V0Rm9udChudWxsKTsKLQlmb250LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSSgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCVN0cmluZ1tdIGVtcHR5ID0gewotCX07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JU3RyaW5nIGl0ZW0gPSBudWxsOwotCXRyeSB7Ci0JCWl0ZW0gPSBsaXN0LmdldEl0ZW0oNSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCWl0ZW0gPSBsaXN0LmdldEl0ZW0oLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtKDMpLCAiaXRlbTMiKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQl0cnkgewotCQlpdGVtID0gbGlzdC5nZXRJdGVtKDUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJaXRlbSA9IGxpc3QuZ2V0SXRlbSgtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCS8vYXNzZXJ0KCI6YToiLCBsaXN0LmdldEl0ZW0oNSk9PW51bGwpOwotCWFzc2VydEVxdWFscygiaXRlbTMiLCBsaXN0LmdldEl0ZW0oMykpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JU3RyaW5nW11bXSBjYXNlcyA9IHsgewotCQl9LCB7Ci0JCQkiIiB9LCB7Ci0JCQkiIiwgIiIgfSwgewotCQkJInRleHQxIiwgInRleHQyIiB9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWxpc3Quc2V0SXRlbXMoY2FzZXNbaV0pOwotCQlhc3NlcnRFcXVhbHMoImNhc2U6ICIgKyBpLCBjYXNlc1tpXSwgbGlzdC5nZXRJdGVtcygpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCVN0cmluZ1tdW10gY2FzZXMgPSB7IHsKLQkJfSwgewotCQkJIiIgfSwgewotCQkJIiIsICIiIH0sIHsKLQkJCSJ0ZXh0MSIsICJ0ZXh0MiIgfQotCX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQkvLwkJU3lzdGVtLm91dC5wcmludGxuKCJsb29wOiIgKyBpKTsKLQkJbGlzdC5zZXRJdGVtcyhjYXNlc1tpXSk7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKGNhc2VzW2ldKTsKLQkJLy8JCVN5c3RlbS5vdXQucHJpbnRsbigibGlzdDoiICsgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0JCS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oImNhc2U6IiArIGkgKyBjYXNlc1tpXSk7Ci0JCWFzc2VydFNhbWUoImNhc2U6ICIgKyBpLCBjYXNlc1tpXSwgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDE7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQlsaXN0LnNldEl0ZW1zKGNhc2VzW2ldKTsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oMCk7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJjYXNlOiAiICsgU3RyaW5nLnZhbHVlT2YoaSksCi0JCQlsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyBjYXNlc1tpXVswXSB9KTsKLQl9Ci0KLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiB9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWludFtdIHNlbCA9IHsgMCwgMiB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoLCAyKTsKLQlTdHJpbmdbXSBzZWxJdGVtcyA9IG5ldyBTdHJpbmdbXSB7aXRlbXNbMF0sIGl0ZW1zWzJdfTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uKCksIHNlbEl0ZW1zKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKDAsIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLmxlbmd0aCwgMik7Ci0Jc2VsSXRlbXMgPSBuZXcgU3RyaW5nW10ge2l0ZW1zWzBdLCBpdGVtc1sxXX07Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbigpLCBzZWxJdGVtcyk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMSwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKVswXSwgaXRlbXNbMV0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oMSwgMCk7Ci0JU3RyaW5nW10gZW1wdHkgPSB7Ci0JfTsKLQlhc3NlcnRFcXVhbHMoZW1wdHksIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCi0JU3RyaW5nW10gYm9ndXNfaXRlbXMgPSB7ICJib2d1c190ZXh0MSIsICJib2d1c190ZXh0MiIsICJib2d1c190ZXh0MyIgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihib2d1c19pdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGVtcHR5LCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiBsaXN0cyAKLQotCXNldFNpbmdsZUxpc3QoKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCXNlbCA9IG5ldyBpbnRbXSB7IDAgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydEVxdWFscygxLCBsaXN0LmdldFNlbGVjdGlvbigpLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGl0ZW1zWzBdLCBsaXN0LmdldFNlbGVjdGlvbigpWzBdKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKDEsIDEpOwotCWFzc2VydEVxdWFscygxLCBsaXN0LmdldFNlbGVjdGlvbigpLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGl0ZW1zWzFdLCBsaXN0LmdldFNlbGVjdGlvbigpWzBdKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgaXRlbXMgY29udGFpbmVkIGluIHRoZSByZWNlaXZlci4KLSAqCi0gKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgaXRlbXMKLSAqCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEVycm9yIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9DQU5OT1RfR0VUX0NPVU5UIC0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscyBiZWNhdXNlIG9mIGFuIG9wZXJhdGluZyBzeXN0ZW0gZmFpbHVyZTwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQl0cnkgewotCQlsaXN0LnNldFNlbGVjdGlvbigoU3RyaW5nW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkNvdW50KCksIDApOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgInRleHQyIiB9KTsKLQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiB9OwotCi0JLy8gbm90IHByb3Blcmx5IHNwZWMnZCBmb3IgbXVsdGktc2VsZWN0IGxpc3RzCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldFNlbGVjdGlvbkluZGV4KCkpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscygtMSwgbGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmdbXSB7ICJ0ZXh0MSIgfSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAidGV4dDIiIH0pOwotCWFzc2VydEVxdWFscygxLCBsaXN0LmdldFNlbGVjdGlvbkluZGV4KCkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgInRleHQzIiB9KTsKLQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoLTEsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uSW5kaWNlcygpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiB9OwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JaW50W10gc2VsID0geyAwLCAxLCAyIH07Ci0JYXNzZXJ0U2FtZShzZWwsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShzZWwsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IDAgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUoc2VsLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlzZWwgPSBuZXcgaW50W10geyAxIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRTYW1lKHNlbCwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0Jc2VsID0gbmV3IGludFtdIHsgMiB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShzZWwsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IDMgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlzZWwgPSBuZXcgaW50W10geyAtMSwgMCwgMSwgMiwgMyB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10geyAwLCAxLCAyIH0sIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IDEsIDEsIDIsIDIgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsgMSwgMiB9LCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IDAgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUoc2VsLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlzZWwgPSBuZXcgaW50W10geyAxIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRTYW1lKHNlbCwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0Jc2VsID0gbmV3IGludFtdIHsgMiB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShzZWwsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IDMgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wSW5kZXgoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldFRvcEluZGV4KCkpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0VG9wSW5kZXgoKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmluZGV4T2YoInRleHQzIiksIDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmluZGV4T2YoInRleHQ0IiksIC0xKTsKLQotCWludCBpbmQ7Ci0JdHJ5IHsKLQkJaW5kID0gbGlzdC5pbmRleE9mKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCVN0cmluZ1tdIGl0ZW1zMiA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQyIiB9OyAvL3R3byBpZGVudGljYWwKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5pbmRleE9mKCJ0ZXh0MiIpLCAxKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygtMSwgbGlzdC5pbmRleE9mKCJ0ZXh0MyIsIDQpKTsKLQotCQotCWFzc2VydEVxdWFscygyLCBsaXN0LmluZGV4T2YoInRleHQzIikpOwotCi0JCi0JYXNzZXJ0RXF1YWxzKC0xLCBsaXN0LmluZGV4T2YoInRleHQ0IikpOwotCi0JCi0JdHJ5IHsKLQkJaW5kID0gbGlzdC5pbmRleE9mKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkKLQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5pbmRleE9mKCJ0ZXh0MiIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoLTEsIGxpc3QuaW5kZXhPZigidGV4dDMiLCA0KSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIGxpc3QuaW5kZXhPZigidGV4dDMiLCAyKSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuaW5kZXhPZigidGV4dDIiLCAwKSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuaW5kZXhPZigidGV4dDIiLCAxKSk7Ci0JYXNzZXJ0RXF1YWxzKC0xLCBsaXN0LmluZGV4T2YoInRleHQyIiwgMikpOwotCi0JU3RyaW5nW10gaXRlbXMyID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDIiIH07IC8vdHdvIGlkZW50aWNhbAotCWxpc3Quc2V0SXRlbXMoaXRlbXMyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5pbmRleE9mKCJ0ZXh0MiIsIDIpLCAyKTsKLQotCXRyeSB7Ci0JCSBsaXN0LmluZGV4T2YobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtczIpOwotCS8vCWFzc2VydCgibGlzdC5pbmRleE9mKFwidGV4dDJcIiwgLTEpPT0xIiwgbGlzdC5pbmRleE9mKCJ0ZXh0MiIsIC0xKT09MSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuaW5kZXhPZigidGV4dDIiLCAwKSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuaW5kZXhPZigidGV4dDIiLCAxKSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIGxpc3QuaW5kZXhPZigidGV4dDIiLCAyKSk7Ci0KLQl0cnkgewotCQlsaXN0LmluZGV4T2YobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNTZWxlY3RlZEkoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MiIgfTsgLy90d28gaWRlbnRpY2FsCi0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0VHJ1ZShsaXN0LmlzU2VsZWN0ZWQoMCkpOwotCWFzc2VydFRydWUobGlzdC5pc1NlbGVjdGVkKDEpKTsKLQlhc3NlcnRUcnVlKGxpc3QuaXNTZWxlY3RlZCgyKSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMykpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWlmIChmQ2hlY2tTV1RQb2xpY3kpIHsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuaXNTZWxlY3RlZCgxKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbGlzdC5pc1NlbGVjdGVkKDIpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMykpOwotCX0KLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZSRJKCkgewotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKChpbnRbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGljZXMgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDAiLCAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgNCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAxLCAwLCAxIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAyKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCi0JLy8gaW5kZXggPiBudW1iZXIgb2YgZWxlbWVudHMgaW4gbGlzdAotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IDQsIDF9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygiOmE6IiwgbGlzdC5nZXRJdGVtcygpLCBpdGVtcyk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAzLCAxLCAtMSB9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygiOmE6IiwgbGlzdC5nZXRJdGVtcygpLCBpdGVtcyk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgNCk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAtMSwgLTEgfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoIjpiOiIsIGxpc3QuZ2V0SXRlbXMoKSwgaXRlbXMpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUobmV3IGludFtdIHsgLTIsIC0xIH0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKCI6YzoiLCBsaXN0LmdldEl0ZW1zKCksIGl0ZW1zKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCA0KTsKLQotCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IDEsIDEsIDEgfSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiOmQ6IiwKLQkJbGlzdC5nZXRJdGVtcygpLCBuZXcgU3RyaW5nW10geyAidGV4dDAiLCAidGV4dDIiLCAidGV4dDMiIH0pOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDQpOwotCi0JbGlzdC5yZW1vdmUobmV3IGludFtdIHsgMSwgMyB9KTsKLQlhc3NlcnRFcXVhbHMoIjplOiIsIGxpc3QuZ2V0SXRlbXMoKSwgbmV3IFN0cmluZ1tdIHsgInRleHQwIiwgInRleHQyIiB9KTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQotCXRyeSB7Ci0JCWludFtdIGluZGljZXMgPSBudWxsOwotCQlsaXN0LnJlbW92ZShpbmRpY2VzKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kaWNlcyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmUobmV3IGludFtdIHsgMSwgMyB9KTsKLQlhc3NlcnRFcXVhbHMoIjpmOiIsIGxpc3QuZ2V0SXRlbXMoKSwgbmV3IFN0cmluZ1tdIHsgInRleHQwIiwgInRleHQyIiB9KTsKLQotCQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IDMsIDEgfSk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZzoiLCBsaXN0LmdldEl0ZW1zKCksIG5ldyBTdHJpbmdbXSB7ICJ0ZXh0MCIsICJ0ZXh0MiIgfSk7Ci0KLQkKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQkvLyBpbmRleCA+IG51bWJlciBvZiBlbGVtZW50cyBpbiBsaXN0Ci0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUobmV3IGludFtdIHsgNCwgMX0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9IAotCWFzc2VydEVxdWFscygiOmg6IiwgbGlzdC5nZXRJdGVtcygpLCBpdGVtcyk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAzLCAxLCAtMSB9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfSAKLQlhc3NlcnRFcXVhbHMoIjpoOiIsIGxpc3QuZ2V0SXRlbXMoKSwgaXRlbXMpOwotCi0JCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUobmV3IGludFtdIHsgLTEsIC0xIH0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMoIjppOiIsIGl0ZW1zLCBsaXN0LmdldEl0ZW1zKCkpOwotCi0JCi0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmUobmV3IGludFtdIHsgMSwgMSwgMSB9KTsKLQlhc3NlcnRFcXVhbHMoIjpqOiIsCi0JCW5ldyBTdHJpbmdbXSB7ICJ0ZXh0MCIsICJ0ZXh0MiIsICJ0ZXh0MyIgfSwgbGlzdC5nZXRJdGVtcygpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUFsbCgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiwgInRlc3QyIiB9OwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDQpOwotCi0JbGlzdC5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMCk7Ci0JbGlzdC5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMCk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWxpc3QucmVtb3ZlQWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSSgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiB9OwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDMpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMyk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMyk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMyk7Ci0KLQlsaXN0LnJlbW92ZSgxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbSgxKSwgInRleHQzIik7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMyk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzLCA0KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDMpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMywgMyk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAzKTsKLQotCWxpc3QucmVtb3ZlKDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAyKTsKLQlsaXN0LnJlbW92ZSgwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbSgwKSwgInRleHQzIik7Ci0JbGlzdC5yZW1vdmUoMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDApOwotCQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3QucmVtb3ZlKDEsIDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtKDApLCAidGV4dDEiKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMyk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0gCi0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JbGlzdC5yZW1vdmUoMSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCWFzc2VydFRydWUobGlzdC5nZXRJdGVtKDEpLmVxdWFscygidGV4dDMiKSk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMyk7Ci0KLQlsaXN0LnJlbW92ZSgwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMik7Ci0JbGlzdC5yZW1vdmUoMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW0oMCksICJ0ZXh0MyIpOwotCWxpc3QucmVtb3ZlKDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAwKTsKLQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJSSgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiB9OwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMywgNCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKDMsIDMpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmUoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWFzc2VydEVxdWFscygidGV4dDMiLCBsaXN0LmdldEl0ZW0oMSkpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoLTEsIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdGFydCBpbmRleCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzLCA0KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCWxpc3QucmVtb3ZlKDAsIDIpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKDMsIDMpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmUoMiwgMCk7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMywgNCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzLCAzKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoLTEsIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdGFydCBpbmRleCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JCi0JbGlzdC5yZW1vdmUoMSwgMik7Ci0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWFzc2VydEVxdWFscygidGV4dDEiLCBsaXN0LmdldEl0ZW0oMCkpOwotCi0JCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMiwgMTApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWFzc2VydEVxdWFscygidGV4dDIiLCBsaXN0LmdldEl0ZW0oMSkpOwotCi0JbGlzdC5yZW1vdmUoMiwgMCk7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiLCAidGVzdDIiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgNCk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgoU3RyaW5nKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCA0KTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKCJpdGVtczk4OSIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDQpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDQpOwotCi0JbGlzdC5yZW1vdmUoInRleHQzIik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDMpOwotCi0JbGlzdC5yZW1vdmUoInRleHQyIik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDIpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKChTdHJpbmcpIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgiaXRlbXM5ODkiKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCQotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCWxpc3QucmVtb3ZlKCJ0ZXh0MyIpOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCWxpc3QucmVtb3ZlKCJ0ZXh0MiIpOwotCWFzc2VydEVxdWFscygyLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIGFkZFNlbGVjdGlvbkxpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdCRJKCkgewotCXRyeSB7Ci0JCWxpc3Quc2VsZWN0KChpbnRbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMCwgMiB9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwLCAyIH0pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMSwgMyB9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwLCAxLCAyLCAzIH0pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMSwgMyB9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwLCAxLCAyLCAzIH0pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMSB9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwLCAxLCAyLCAzIH0pOwotCi0JbGlzdC5hZGQoIml0ZW00Iik7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAtMSwgMCwgMSwgMiwgMyB9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwLCAxLCAyLCAzIH0pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IDEsIDIsIDMgfSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiwgMyB9KTsKLQotCWludFtdIGluZCA9IG5ldyBpbnRbMzJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kLmxlbmd0aDsgaSsrKSBpbmRbaV0gPSBpOwotCWxpc3Quc2VsZWN0KGluZCk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCwgMSwgMiwgMywgNCB9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7fSk7Ci0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMSB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEgfSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50W10ge30pOwotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IC0xIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlpdGVtcyA9IGxpc3QuZ2V0SXRlbXMoKTsKLQotCXNlbGVjdCRJX2hlbHBlcihpdGVtcywgMCwgMywgbmV3IGludFtdIHsgMCwgMSwgMiwgMyB9KTsKLQlzZWxlY3QkSV9oZWxwZXIoaXRlbXMsIC0xLCAzLCBuZXcgaW50W10geyAwLCAxLCAyLCAzIH0pOwotCXNlbGVjdCRJX2hlbHBlcihpdGVtcywgLTEsIDMwLCBuZXcgaW50W10geyAwLCAxLCAyLCAzLCA0IH0pOwotCi0JCi0JLyotLS0gU2luZ2xlLXNlbGVjdCAtLS0qLwotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQkKLQl0cnkgewotCQlsaXN0LnNlbGVjdCgoaW50W10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W117IC0xIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IDAgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMSB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEgfSk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAyIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMiB9KTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IDMgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAzIH0pOwotCQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IDQgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyA0IH0pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgNSB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDQgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QobmV3IGludFtdeyAwLCAxLCAyLCAzIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXXsgLTEsIDAsIDEsIDIsIDMgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JaW50W10gc2VsZWN0aW9uID0gbmV3IGludFszMl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHNlbGVjdGlvbltpXSA9IGk7Ci0JbGlzdC5zZWxlY3Qoc2VsZWN0aW9uKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W117IDEsIDEsIDEgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W117fSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0QWxsKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiLCAidGVzdDIiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpLCAwKTsKLQlsaXN0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkNvdW50KCksIDQpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JbGlzdC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEkoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiIsICJpdGVtMyIgfTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQotCWxpc3Quc2VsZWN0KDIpOwotCWFzc2VydEVxdWFscygic2VsZWN0KDIpOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAyIH0pOwotCi0JbGlzdC5zZWxlY3QoMSk7Ci0JYXNzZXJ0U2FtZSgic2VsZWN0KDEpOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxLCAyIH0pOwotCi0JbGlzdC5zZWxlY3QoMyk7Ci0JYXNzZXJ0U2FtZSgKLQkJInNlbGVjdCgzKToiLAotCQlsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiwgMyB9KTsKLQotCWxpc3Quc2VsZWN0KDUpOwotCWFzc2VydFNhbWUoCi0JCSJzZWxlY3QoNSk6IiwKLQkJbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDIsIDMgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QoMCk7Ci0JYXNzZXJ0RXF1YWxzKCJzZWxlY3QoMCk6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0JCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KC0xKTsKLQlhc3NlcnRFcXVhbHMoInNlbGVjdCgtMSk6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QoLTIpOwotCWFzc2VydEVxdWFscygic2VsZWN0KC0yKToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdCg0KTsKLQlhc3NlcnRFcXVhbHMoInNlbGVjdCg0KToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQotCWxpc3Quc2VsZWN0KDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMiB9KTsKLQotCWxpc3Quc2VsZWN0KDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSB9KTsKLQotCWxpc3Quc2VsZWN0KDMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMyB9KTsKLQotCWxpc3Quc2VsZWN0KDUpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMyB9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdCgwKTsKLQlhc3NlcnRFcXVhbHMoInNlbGVjdCgwKToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCB9KTsKLQkKLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QoLTEpOwotCWFzc2VydEVxdWFscygic2VsZWN0KC0xKToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdCgtMik7Ci0JYXNzZXJ0RXF1YWxzKCJzZWxlY3QoLTIpOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KDQpOwotCWFzc2VydEVxdWFscygic2VsZWN0KDQpOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdElJKCkgewotCWxpc3Quc2VsZWN0KDAsIDApOwotCWFzc2VydEVxdWFscygiZW1wdHkgbGlzdCIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZWxlY3QoMCwgMSk7Ci0JYXNzZXJ0RXF1YWxzKCJlbXB0eSBsaXN0IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNlbGVjdCgtMSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCJlbXB0eSBsaXN0IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlpbnQgbnVtYmVyID0gNTsKLQotCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1tudW1iZXJdOwotCWludFtdIGVtcHR5ID0ge307Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9ICJpdGVtIiArIGk7Ci0KLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDEwLCAxLCBlbXB0eSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAzLCAxLCBlbXB0eSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAtMSwgLTEsIGVtcHR5KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDUsIDUsIGVtcHR5KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDQsIDUsIG5ldyBpbnRbXSB7IDQgfSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAtMSwgMCwgbmV3IGludFtdIHsgMCB9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDIsIDQsIG5ldyBpbnRbXSB7IDIsIDMsIDQgfSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAwLCAzLCBuZXcgaW50W10geyAwLCAxLCAyLCAzIH0pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMSwgMSwgbmV3IGludFtdIHsgMSB9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIC0xLCAzMCwgbmV3IGludFtdIHsgMCwgMSwgMiwgMywgNCB9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIC0xLCAzLCBuZXcgaW50W10geyAwLCAxLCAyLCAzIH0pOwotCi0JbGlzdC5zZWxlY3QoMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCi0JbGlzdC5zZWxlY3QoLTEwLCAtOSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQotCWxpc3Quc2VsZWN0KDEwMDAsIDIwMDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkNvdW50KCksIDApOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KDEsIDIpOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDIgfSk7Ci0KLQlsaXN0LnNlbGVjdCgxLCAzKTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxLCAyLCAzIH0pOwotCi0JbGlzdC5zZWxlY3QoMiwgMik7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiwgMyB9KTsKLQotCWxpc3Quc2VsZWN0KDMsIDUpOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQgfSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JbGlzdC5zZWxlY3QoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCJlbXB0eSBsaXN0IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNlbGVjdCgwLCAxKTsKLQlhc3NlcnRFcXVhbHMoImVtcHR5IGxpc3QiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KC0xLCAwKTsKLQlhc3NlcnRFcXVhbHMoImVtcHR5IGxpc3QiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2VsZWN0KDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCB9KTsKLQlsaXN0LnNlbGVjdCgtMTAsIC05KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JbGlzdC5zZWxlY3QoMTAwMCwgMjAwMCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JbGlzdC5zZWxlY3QoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCi0JbGlzdC5zZWxlY3QoMSwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxIH0pOwotCi0JbGlzdC5zZWxlY3QoMiwgMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAyIH0pOwotCi0JbGlzdC5zZWxlY3QoMywgMyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAzIH0pOwotCi0JbGlzdC5zZWxlY3QoNCwgNCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyA0IH0pOwotCi0JbGlzdC5zZWxlY3QoNSwgNSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyA0IH0pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KDUsIDUpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KDEsIDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KDEsIDMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KDMsIDUpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMCwgMCwgbmV3IGludFtdezB9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDEsIDEsIG5ldyBpbnRbXXsxfSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAyLCAyLCBuZXcgaW50W117Mn0pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMywgMywgbmV3IGludFtdezN9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDQsIDQsIG5ldyBpbnRbXXs0fSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCA1LCA1LCBuZXcgaW50W117fSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAxMCwgMSwgbmV3IGludFtde30pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMywgMSwgbmV3IGludFtde30pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgLTEsIC0xLCBuZXcgaW50W117fSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlGb250RGF0YSBmb250RGF0YSA9IGxpc3QuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JaW50IGxpbmVIZWlnaHQ7Ci0JRm9udCBmb250OwotCQotCWZvbnQgPSBuZXcgRm9udChsaXN0LmdldERpc3BsYXkoKSwgZm9udERhdGEuZ2V0TmFtZSgpLCA4LCBmb250RGF0YS5nZXRTdHlsZSgpKTsKLQlsaXN0LnNldEZvbnQoZm9udCk7Ci0JbGluZUhlaWdodCA9IGxpc3QuZ2V0SXRlbUhlaWdodCgpOwotCWxpc3Quc2V0Rm9udChudWxsKTsKLQlmb250LmRpc3Bvc2UoKTsKLQlmb250ID0gbmV3IEZvbnQobGlzdC5nZXREaXNwbGF5KCksIGZvbnREYXRhLmdldE5hbWUoKSwgMTIsIGZvbnREYXRhLmdldFN0eWxlKCkpOwotCWxpc3Quc2V0Rm9udChmb250KTsKLQlhc3NlcnRFcXVhbHMoZm9udCwgbGlzdC5nZXRGb250KCkpOwotCWFzc2VydFRydWUoIml0ZW1IZWlnaHQ9IiArIGxpc3QuZ2V0SXRlbUhlaWdodCgpICsgIiwgbGluZUhlaWdodD0iICsgbGluZUhlaWdodCwgbGlzdC5nZXRJdGVtSGVpZ2h0KCkgPiBsaW5lSGVpZ2h0KTsKLQlsaXN0LnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCQotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAwKTsKLQlpbnRbXSBjYXNlcyA9IHsgLTEwLCAwLCAxMCB9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJdHJ5IHsKLQkJCWxpc3Quc2V0SXRlbShjYXNlc1tpXSwgbnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDApOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJbGlzdC5zZXRJdGVtKGNhc2VzW2ldLCAiIik7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDApOwotCi0JaW50IGNhc2VzMltdID0geyAxMCwgMTUsIDAgfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzMi5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJbGlzdC5zZXRJdGVtKGNhc2VzMltpXSwgImZyZWQiKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMCk7Ci0JfQotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRJdGVtKDEsICJuZXcxIik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJpdGVtMCIsICJuZXcxIiwgIml0ZW0yIiwgIml0ZW0zIiB9LCBsaXN0LmdldEl0ZW1zKCkpOwotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJbGlzdC5zZXRJdGVtKGNhc2VzW2ldLCBudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JfQotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJdHJ5IHsKLQkJCWxpc3Quc2V0SXRlbShjYXNlc1tpXSwgIiIpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMyLmxlbmd0aDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQlsaXN0LnNldEl0ZW0oY2FzZXMyW2ldLCAiZnJlZCIpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCX0KLQkKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldEl0ZW0oMSwgIm5ldzEiKTsKLQlhc3NlcnRFcXVhbHMobmV3IFN0cmluZ1tdIHsgIml0ZW0wIiwgIm5ldzEiLCAiaXRlbTIiLCAiaXRlbTMiIH0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JdHJ5IHsKLQkJbGlzdC5zZXRJdGVtcyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbXMgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gVE9ETyBBbiBTV1RFcnJvciBzaG91bGQgbmV2ZXIgaGFwcGVuIGFuZCBzaG91bGQgbm90Ci0JLy8gYmUgcGFydCBvZiB0aGUgdGVzdCBjYXNlLiAgTGlzdCBzaG91bGQgdGhyb3cgYW4gCi0JLy8gU1dURXhjZXB0aW9uLgotLy8JU3RyaW5nW11bXSBjYXNlcyA9IHsgeyBudWxsIH0sIHsKLS8vCQkJImRzYWRhIiwgbnVsbCwgImRzZGFzZGFzZCIgfQotLy8JfTsKLS8vCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLS8vCQl0cnkgewotLy8JCQlsaXN0LnNldEl0ZW1zKGNhc2VzW2ldKTsKLS8vCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbXMgbm90IGZvdW5kIik7Ci0vLwkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotLy8JCX0KLS8vCX0KLQotCVN0cmluZ1tdW10gaXRlbUFyciA9IHsgewotCQl9LCB7Ci0JCQkiIiB9LCB7Ci0JCQkic2Rhc2QiIH0sIHsKLQkJCSJzZGFzZCIsICIzMjM0MzQiIH0KLQl9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUFyci5sZW5ndGg7IGkrKykgewotCQlsaXN0LnNldEl0ZW1zKGl0ZW1BcnJbaV0pOwotCQlhc3NlcnRFcXVhbHMoaXRlbUFycltpXSwgbGlzdC5nZXRJdGVtcygpKTsKLQl9Ci0KLQl0cnkgewotCQlsaXN0LnNldEl0ZW1zKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQXJyLmxlbmd0aDsgaSsrKSB7Ci0JCWxpc3Quc2V0SXRlbXMoaXRlbUFycltpXSk7Ci0JCWFzc2VydEVxdWFscygiY2FzZToiICsgaSwgaXRlbUFycltpXSwgbGlzdC5nZXRJdGVtcygpKTsKLQl9Ci0KLQkKLQl0cnkgewotCQlsaXN0LnNldEl0ZW1zKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uJEkoKSB7Ci0JaW50IG51bWJlciA9IDg7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJbGlzdC5hZGQoImZyZWQiICsgaSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgWzBdKSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQotCXRyeSB7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKChpbnRbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIE1VTFRJOiBzZXRTZWxlY3Rpb24oKGludFtdKSBudWxsKSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezJ9KTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7Mn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHsyfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIDIpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlcn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezMsIDEsIDUsIDJ9KTsKLQlhc3NlcnRTYW1lKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezMsIDEsIDUsIDJ9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezEsIDIsIDMsIDV9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezEsIDB9KTsKLQlhc3NlcnRTYW1lKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezEsIDB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezAsIDF9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIG51bWJlcn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIG51bWJlcn0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCBudW1iZXJ9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge251bWJlciAtIDF9KTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIG51bWJlciAtIDEpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezB9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAxLCAyLCAzLCA1fSk7Ci0JYXNzZXJ0U2FtZSgiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAxLCAyLCAzLCA1fSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludCBbXSB7MCwgMSwgMiwgMywgNX0pOwotCi0JaW50W10gaW5kaWNlcyA9IG5ldyBpbnQgW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpbmRpY2VzW2ldID0gaTsKLQl9Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaW5kaWNlcyk7Ci0JYXNzZXJ0U2FtZSgiTVVMVEk6IHNldFNlbGVjdGlvbihpbmRpY2VzKSIsIGluZGljZXMsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIsIG51bWJlcn0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIsIG51bWJlcn0pIiwgbmV3IGludFswXSwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIG51bWJlciAtIDF9KTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyIC0gMX0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7bnVtYmVyIC0gMX0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCBudW1iZXIgLSAxfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIG51bWJlciAtIDEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIG51bWJlciwgMX0pOwotCWFzc2VydFNhbWUoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgbnVtYmVyLCAxfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHswLCAxfSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgMCwgbnVtYmVyIC0gMn0pOwotCWFzc2VydFNhbWUoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgMCwgbnVtYmVyIC0gMn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MCwgbnVtYmVyIC0gMiwgbnVtYmVyIC0gMX0pOwotCQotCWxpc3QucmVtb3ZlQWxsKCk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFswXSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgWzBdKSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JdHJ5IHsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oKGludFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbigoaW50W10pIG51bGwpIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MH0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezB9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTF9KTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTF9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTF9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgMH0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAwfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIDB9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCAwfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCAwfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAtMX0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAtMX0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAtMX0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWxpc3QuYWRkKCJmcmVkIiArIGkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbMF0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbMF0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCi0JdHJ5IHsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oKGludFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgU0lOR0xFOiBzZXRTZWxlY3Rpb24oKGludFtdKSBudWxsKSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezJ9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezJ9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezJ9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezJ9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgMik7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlcn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezEsIDB9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezEsIDB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgMSwgMiwgMywgNX0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgMSwgMiwgMywgNX0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnQgW10ge30pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIG51bWJlcn0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIG51bWJlcn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIG51bWJlcn0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgMH0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JaW5kaWNlcyA9IG5ldyBpbnQgW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpbmRpY2VzW2ldID0gaTsKLQl9Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaW5kaWNlcyk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihpbmRpY2VzKSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciwgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIsIG51bWJlcn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIG51bWJlciAtIDF9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIG51bWJlciAtIDF9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIG51bWJlciwgMX0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgbnVtYmVyLCAxfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCAwLCBudW1iZXIgLSAyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCAwLCBudW1iZXIgLSAyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnJlbW92ZUFsbCgpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgWzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgWzBdKSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgWzBdKSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JdHJ5IHsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oKGludFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24oKGludFtdKSBudWxsKSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezB9KTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezB9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTF9KTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMX0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAwfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAwfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgMH0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCAwfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAtMX0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgLTF9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIC0xfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb24kTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JaW50IG51bWJlciA9IDg7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJbGlzdC5hZGQoImZyZWQgIiArIGkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQlpZiAoZkNoZWNrU1dUUG9saWN5KSB7Ci0JCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCX0KLQotCXRyeSB7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKChTdHJpbmdbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAyIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nIFtdIHsiZnJlZCAyIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgMik7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAiICsgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmcgWzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAxIiwgImZyZWQgMCJ9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmcgW10geyJmcmVkIDAiLCAiZnJlZCAxIn0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgLTEiLCAiZnJlZCAiICsgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmcgWzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAiICsgKG51bWJlciAtIDEpLCAiZnJlZCAiICsgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmcgW10geyJmcmVkICIgKyAobnVtYmVyIC0gMSl9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIC0xIiwgImZyZWQgMCJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZyBbXSB7ImZyZWQgMCJ9KTsKLQkKLQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmcgW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9ICJmcmVkICIgKyBpOwotCX0KLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbigpLCBpdGVtcyk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgIiArIG51bWJlciwgImZyZWQgIiArIG51bWJlcn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nIFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgIiArIChudW1iZXIgLSAxKSwgImZyZWQgIiArIChudW1iZXIgLSAxKX0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyJmcmVkICIgKyAobnVtYmVyIC0gMSl9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAwIiwgImZyZWQgIiArIG51bWJlciwgImZyZWQgMSJ9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ImZyZWQgMCIsICJmcmVkIDEifSk7Ci0JCi0JbGlzdC5yZW1vdmVBbGwoKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCXRyeSB7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKChTdHJpbmdbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgMCJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAwIiwgImZyZWQgMCJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJbGlzdC5hZGQoImZyZWQgIiArIGkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQotCXRyeSB7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKChTdHJpbmdbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAyIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyJmcmVkIDIifSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAyKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkICIgKyBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgMSIsICJmcmVkIDAifSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7fSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAtMSIsICJmcmVkICIgKyBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgIiArIChudW1iZXIgLSAxKX0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyJmcmVkICIgKyAobnVtYmVyIC0gMSl9KTsKLQotCWl0ZW1zID0gbmV3IFN0cmluZ1tudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSAiZnJlZCAiICsgaTsKLQl9Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkICIgKyBudW1iZXIsICJmcmVkICIgKyBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgIiArIChudW1iZXIgLSAxKSwgImZyZWQgIiArIChudW1iZXIgLSAxKX0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIDAiLCAiZnJlZCAiICsgbnVtYmVyLCAiZnJlZCAxIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10ge30pOwotCQotCWxpc3QucmVtb3ZlQWxsKCk7Ci0JCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgWzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQl0cnkgewotCQlsaXN0LnNldFNlbGVjdGlvbigoU3RyaW5nW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgMCJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAwIiwgImZyZWQgMCJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSSgpIHsKLQlpbnQgbnVtYmVyID0gODsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWxpc3QuYWRkKCJmcmVkIiArIGkpOwotCX0KLQotCWxpc3Quc2V0U2VsZWN0aW9uKDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsyfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAyKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtNSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgMCk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciAtIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHtudW1iZXIgLSAxfSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5yZW1vdmVBbGwoKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlsaXN0LmFkZCgiZnJlZCIgKyBpKTsKLQl9Ci0KLQlsaXN0LnNldFNlbGVjdGlvbigyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgMik7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTUpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIDApOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIgLSAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7bnVtYmVyIC0gMX0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgbnVtYmVyIC0gMSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5yZW1vdmVBbGwoKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKSB7Ci0JaW50IG51bWJlciA9IDg7Ci0JU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSAiZnJlZCIgKyBpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMSwgMik7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsxLCAyfSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTMsIC0yKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDAsIDEpOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MCwgMX0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0yLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIgLSAyLCBudW1iZXIgLSAxKTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge251bWJlciAtIDIsIG51bWJlciAtIDF9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIgLSAxLCBudW1iZXIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHtudW1iZXIgLSAxfSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTEsIDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHswfSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIgKyAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDAsIDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHswfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAwKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigyLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciAtIDEsIG51bWJlciAtIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHtudW1iZXIgLSAxfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCBudW1iZXIgLSAxKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSwgLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0KLQlsaXN0LnJlbW92ZUFsbCgpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTIsIC0xKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24oMSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCwgLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIDApOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDEsIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsxfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAxKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbig0LCA0KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7NH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgNCk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyIC0gMSwgbnVtYmVyIC0gMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge251bWJlciAtIDF9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIG51bWJlciAtIDEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTMsIC0yKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0yLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciAtIDIsIG51bWJlciAtIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIgLSAxLCBudW1iZXIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyICsgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDIsIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIgLSAxLCBudW1iZXIgLSAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7bnVtYmVyIC0gMX0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgbnVtYmVyIC0gMSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTEsIC0xKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9wSW5kZXhJKCkgewotCWxpc3Quc2V0VG9wSW5kZXgoMyk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0VG9wSW5kZXgoMykgaW4gZW1wdHkgbGlzdCIsIDAsIGxpc3QuZ2V0VG9wSW5kZXgoKSk7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiIsICJpdGVtMyIgfTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCWxpc3Quc2V0VG9wSW5kZXgoaSk7Ci0JCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFRvcEluZGV4KGk9IiArIGkgKyAiKSIsIGksIGxpc3QuZ2V0VG9wSW5kZXgoKSk7Ci0JfQotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0VG9wSW5kZXgoMyk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFRvcEluZGV4KDMpIGluIGVtcHR5IGxpc3QiLCAwLCBsaXN0LmdldFRvcEluZGV4KCkpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQlsaXN0LnNldFRvcEluZGV4KGkpOwotCQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0VG9wSW5kZXgoaT0iICsgaSArICIpIiwgaSwgbGlzdC5nZXRUb3BJbmRleCgpKTsKLQl9Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93U2VsZWN0aW9uKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWxpc3Quc2hvd1NlbGVjdGlvbigpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWxpc3Quc2hvd1NlbGVjdGlvbigpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3QoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0JEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0QWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0SUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvY3VzSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uSW5kaWNlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNTZWxlY3RlZEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZSRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0JEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0SUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb24kSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uJExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wSW5kZXhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2siKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxhYmxlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSIpKSB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0JEkiKSkgdGVzdF9kZXNlbGVjdCRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdEFsbCIpKSB0ZXN0X2Rlc2VsZWN0QWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdEkiKSkgdGVzdF9kZXNlbGVjdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0SUkiKSkgdGVzdF9kZXNlbGVjdElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb2N1c0luZGV4IikpIHRlc3RfZ2V0Rm9jdXNJbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSGVpZ2h0IikpIHRlc3RfZ2V0SXRlbUhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUkiKSkgdGVzdF9nZXRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpKSB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpKSB0ZXN0X2dldFNlbGVjdGlvbkluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzIikpIHRlc3RfZ2V0U2VsZWN0aW9uSW5kaWNlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wSW5kZXgiKSkgdGVzdF9nZXRUb3BJbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJIikpIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNTZWxlY3RlZEkiKSkgdGVzdF9pc1NlbGVjdGVkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlJEkiKSkgdGVzdF9yZW1vdmUkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQWxsIikpIHRlc3RfcmVtb3ZlQWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVJIikpIHRlc3RfcmVtb3ZlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSUkiKSkgdGVzdF9yZW1vdmVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9yZW1vdmVMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdCRJIikpIHRlc3Rfc2VsZWN0JEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEFsbCIpKSB0ZXN0X3NlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0SSIpKSB0ZXN0X3NlbGVjdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdElJIikpIHRlc3Rfc2VsZWN0SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uJEkiKSkgdGVzdF9zZXRTZWxlY3Rpb24kSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uJExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0U2VsZWN0aW9uJExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JIikpIHRlc3Rfc2V0U2VsZWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSUkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9wSW5kZXhJIikpIHRlc3Rfc2V0VG9wSW5kZXhJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93U2VsZWN0aW9uIikpIHRlc3Rfc2hvd1NlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1MaXN0IGxpc3Q7Ci0vKioKLSAqIFRlc3QgaWYgJ2Rlc2VsZWN0KHUsIHYpJyBpcyB0aGUgc2FtZSBhcyAnZm9yIChpPXU7IGk8PXY7ICsraSkgZGVzZWxlY3QoaSk7JwotICovCi1wcm90ZWN0ZWQgdm9pZCBkZXNlbGVjdElJX2hlbHBlcigKLQlTdHJpbmdbXSBpdGVtcywKLQlpbnQgc3RhcnQsCi0JaW50IGVuZCwKLQlpbnRbXSBleHBlY3RlZEluZGljZXMpIHsKLQkJCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCi0JbGlzdC5kZXNlbGVjdChzdGFydCwgZW5kKTsKLQlhc3NlcnRTYW1lKAotCQkiOigiICsgc3RhcnQgKyAiLCAiICsgZW5kICsgIik6IiwKLQkJZXhwZWN0ZWRJbmRpY2VzLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JaWYgKCAwICE9IChsaXN0LmdldFN0eWxlKCkgJiBTV1QuTVVMVEkpICkgewotCQlhc3NlcnRTYW1lKCJzZXRTZWxlY3Rpb24oaXRlbXMpOiIsIGl0ZW1zLCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPD0gZW5kOyArK2kpIHsKLQkJbGlzdC5kZXNlbGVjdChpKTsKLQl9Ci0JYXNzZXJ0U2FtZSgKLQkJIjooIiArIHN0YXJ0ICsgIiwgIiArIGVuZCArICIpOiIsCi0JCWV4cGVjdGVkSW5kaWNlcywgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotfQotLyoqCi0gKiBEaXNwb3NlIG9mIHRoZSBtYWluIGxpc3QgYW5kIGNyZWF0ZSBhIG5ldywgc2luZ2xlLXNlbGVjdGlvbiBvbmUuCi0gKi8KLXByb3RlY3RlZCBMaXN0IHNldFNpbmdsZUxpc3QoKSB7Ci0JbGlzdC5kaXNwb3NlKCk7Ci0JbGlzdCA9IG5ldyBMaXN0KHNoZWxsLCBTV1QuU0lOR0xFKTsKLQlzZXRXaWRnZXQobGlzdCk7Ci0JcmV0dXJuIGxpc3Q7Ci19Ci0vKioKLSAqIFNpbWlsYXIgdG8gZGVzZWxlY3RJSV9oZWxwZXIsIGNoZWNrcyBpZiBzZWxlY3QodSwgdikgaXMgdGhlIHNhbWUgYXMKLSAqIGZvciAoaT11OyBpPD12OyArK2kpIHNlbGVjdChpKQotICovCi1wcm90ZWN0ZWQgdm9pZCBzZWxlY3RJSV9oZWxwZXIoCi0JU3RyaW5nW10gaXRlbXMsCi0JaW50IHN0YXJ0LAotCWludCBlbmQsCi0JaW50W10gZXhwZWN0ZWRJbmRpY2VzKSB7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZWxlY3Qoc3RhcnQsIGVuZCk7Ci0JYXNzZXJ0U2FtZSgKLQkJIjooIiArIHN0YXJ0ICsgIiwgIiArIGVuZCArICIpOiIsCi0JCWV4cGVjdGVkSW5kaWNlcywgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiZGVzZWxlY3RBbGw6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIC8vIDw9IG9uIHB1cnBvc2UKLQkJbGlzdC5zZWxlY3QoaSk7Ci0KLQlhc3NlcnRTYW1lKCI6KCIgKyBzdGFydCArICIsICIgKyBlbmQgKyAiKToiLAotCQlleHBlY3RlZEluZGljZXMsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLX0KLS8qKgotICogU2ltaWxhciB0byBkZXNlbGVjdElJX2hlbHBlciwgY2hlY2tzIGlmIHNlbGVjdChpbnQgW11hcnIpIGdpdmVzIHRoZSBzYW1lCi0gKiByZXN1bHQgYXMgc2V2ZXJhbCBpbmRpdmlkdWFsIHNlbGVjdChpbnQpIGNhbGxzLiBUaGUgaW50W10gdXNlZCBmb3Igc2VsZWN0aW9uCi0gKiB3aWxsIGJlIGZpbGxlZCBhbGwgaW50ZWdlcnMgZnJvbSBzdGFydCB0byBlbmQgaW5jbHVzaXZlLCBpbiBvcmRlci4KLSAqLwotcHJvdGVjdGVkIHZvaWQgc2VsZWN0JElfaGVscGVyKAotCVN0cmluZ1tdIGl0ZW1zLAotCWludCBzdGFydCwKLQlpbnQgZW5kLAotCWludFtdIGV4cGVjdGVkSW5kaWNlcykgewotCWludFtdIHNlbGVjdGlvbiA9IG5ldyBpbnRbZW5kIC0gc3RhcnQgKyAxXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7ICsraSkgewotCQlzZWxlY3Rpb25baV0gPSBpICsgc3RhcnQ7Ci0JfQotCi0JbGlzdC5zZWxlY3Qoc2VsZWN0aW9uKTsKLQotCWFzc2VydFNhbWUoCi0JCSI6KCIgKyBzdGFydCArICIsICIgKyBlbmQgKyAiKToiLAotCQlleHBlY3RlZEluZGljZXMsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoImRlc2VsZWN0QWxsOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSAvLyA8PSBvbiBwdXJwb3NlCi0JCWxpc3Quc2VsZWN0KGkpOwotCi0JYXNzZXJ0U2FtZSgKLQkJIjooIiArIHN0YXJ0ICsgIiwgIiArIGVuZCArICIpOiIsCi0JCWV4cGVjdGVkSW5kaWNlcywgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotfQotCi1wcml2YXRlIHZvaWQgYWRkKCkgewotICAgIGxpc3QuYWRkKCJ0aGlzIik7Ci0gICAgbGlzdC5hZGQoImlzIik7Ci0gICAgbGlzdC5hZGQoIlNXVCIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDI3LCAxMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24gKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX0RPV04sIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDI3LCAxMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RPVUJMRUNMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDI3LCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjAsIDUsIDMwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiZWM3Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGZjMWExLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCW1lbnUgPSBuZXcgTWVudShzaGVsbCk7Ci0Jc2V0V2lkZ2V0KG1lbnUpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0JQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTlVMTCk7Ci0JTWVudSB0ZXN0TWVudSA9IG5ldyBNZW51KGNvbXApOwotCWNvbXAuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zSSgpIHsKLQlNZW51IG5ld01lbnU7Ci0JU2hlbGwgbnVsbFNoZWxsID0gbnVsbDsKLQl0cnkgewotCQluZXdNZW51ID0gbmV3IE1lbnUobnVsbFNoZWxsLCBTV1QuTlVMTCk7Ci0JCW5ld01lbnUuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCW5ld01lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULk5VTEwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoKSB7Ci0JTWVudSBuZXdNZW51OwotCW5ld01lbnUgPSBuZXcgTWVudShtZW51KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpIHsKLQlNZW51IG5ld01lbnU7Ci0JTWVudUl0ZW0gbUl0ZW0gPSBudWxsOwotCXRyeSB7Ci0JCW5ld01lbnUgPSBuZXcgTWVudShtSXRlbSk7Ci0JCW5ld01lbnUuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCW1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMKTsKLQluZXdNZW51ID0gbmV3IE1lbnUobUl0ZW0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCUhlbHBMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBIZWxwTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhlbHBSZXF1ZXN0ZWQoSGVscEV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfTsKLQl9OwotCQotCXRyeSB7Ci0JCW1lbnUuYWRkSGVscExpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRIZWxwTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbWVudS5hZGRIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotCW1lbnUubm90aWZ5TGlzdGVuZXJzKFNXVC5IZWxwLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShsaXN0ZW5lckNhbGxlZCk7Ci0JCi0JdHJ5IHsKLQkJbWVudS5yZW1vdmVIZWxwTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZUhlbHBMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCW1lbnUucmVtb3ZlSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLQltZW51Lm5vdGlmeUxpc3RlbmVycyhTV1QuSGVscCwgbmV3IEV2ZW50KCkpOwotCWFzc2VydEZhbHNlKGxpc3RlbmVyQ2FsbGVkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRNZW51TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlNZW51TGlzdGVuZXIgbWVudUxpc3RlbmVyID0gbmV3IE1lbnVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbWVudVNob3duKE1lbnVFdmVudCBlKSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX07Ci0JCXB1YmxpYyB2b2lkIG1lbnVIaWRkZW4oTWVudUV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfTsKLQl9OwotCi0JdHJ5IHsKLQkJbWVudS5hZGRNZW51TGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZE1lbnVMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQltZW51LmFkZE1lbnVMaXN0ZW5lcihtZW51TGlzdGVuZXIpOwotCW1lbnUubm90aWZ5TGlzdGVuZXJzKFNXVC5TaG93LCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQltZW51Lm5vdGlmeUxpc3RlbmVycyhTV1QuSGlkZSwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoIjpiOiIsIGxpc3RlbmVyQ2FsbGVkKTsKLQkKLQl0cnkgewotCQltZW51LnJlbW92ZU1lbnVMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlTWVudUxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JbWVudS5yZW1vdmVNZW51TGlzdGVuZXIobWVudUxpc3RlbmVyKTsKLQltZW51Lm5vdGlmeUxpc3RlbmVycyhTV1QuU2hvdywgbmV3IEV2ZW50KCkpOwotCWFzc2VydEZhbHNlKGxpc3RlbmVyQ2FsbGVkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZWZhdWx0SXRlbSgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0RGVmYXVsdEl0ZW0gbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RW5hYmxlZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0RW5hYmxlZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCU1lbnVJdGVtIHRpOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCWFzc2VydEVxdWFscyhtZW51LmdldEl0ZW1Db3VudCgpLCBpKTsKLQkgIAl0aSA9IG5ldyBNZW51SXRlbShtZW51LCAwKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUkoKSB7Ci0JTWVudUl0ZW0gbUl0ZW0wID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMKTsKLQlNZW51SXRlbSBtSXRlbTEgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5VTEwpOwotCWFzc2VydEVxdWFscyhtZW51LmdldEl0ZW0oMCksIG1JdGVtMCk7Ci0JYXNzZXJ0RXF1YWxzKG1lbnUuZ2V0SXRlbSgxKSwgbUl0ZW0xKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlNZW51SXRlbVtdIGl0ZW1zID0gbmV3IE1lbnVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAlpdGVtc1tpXSA9IG5ldyBNZW51SXRlbShtZW51LCAwKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCBpdGVtcywgbWVudS5nZXRJdGVtcygpKTsKLQkKLQltZW51LmdldEl0ZW1zKClbMF0uZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygiOmI6IiwgbmV3IE1lbnVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19LCBtZW51LmdldEl0ZW1zKCkpOwotCi0JbWVudS5nZXRJdGVtcygpWzNdLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoIjpjOiIsIG5ldyBNZW51SXRlbVtde2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM119LCBtZW51LmdldEl0ZW1zKCkpOwotCi0JbWVudS5nZXRJdGVtcygpWzFdLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoIjpkOiIsIG5ldyBNZW51SXRlbVtde2l0ZW1zWzFdLCBpdGVtc1szXX0sIG1lbnUuZ2V0SXRlbXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCWFzc2VydEVxdWFscyhtZW51LmdldFBhcmVudCgpLCBzaGVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50SXRlbSgpIHsKLQlNZW51SXRlbSBtSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0FTQ0FERSk7Ci0JTWVudSBuZXdNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCWFzc2VydE51bGwobmV3TWVudS5nZXRQYXJlbnRJdGVtKCkpOwotCW1JdGVtLnNldE1lbnUobmV3TWVudSk7Ci0JYXNzZXJ0RXF1YWxzKG5ld01lbnUuZ2V0UGFyZW50SXRlbSgpLCBtSXRlbSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50TWVudSgpIHsKLQlNZW51SXRlbSBtSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0FTQ0FERSk7Ci0JTWVudSBuZXdNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCWFzc2VydE51bGwobmV3TWVudS5nZXRQYXJlbnRNZW51KCkpOwotCW1JdGVtLnNldE1lbnUobmV3TWVudSk7Ci0JYXNzZXJ0RXF1YWxzKG5ld01lbnUuZ2V0UGFyZW50TWVudSgpLCBtZW51KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaGVsbCgpIHsKLQlhc3NlcnRFcXVhbHMobWVudS5nZXRTaGVsbCgpLCBzaGVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VmlzaWJsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0VmlzaWJsZSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKCkgewotCWludCBudW1iZXIgPSAxMDsKLQlNZW51SXRlbVtdIG1pcyA9IG5ldyBNZW51SXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJbWlzW2ldID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJYXNzZXJ0RXF1YWxzKG1lbnUuaW5kZXhPZihtaXNbaV0pLCBpKTsKLQkJaWYgKGk+MSkKLQkJCWFzc2VydFRydWUobWVudS5pbmRleE9mKG1pc1tpLTFdKSAhPSBpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNFbmFibGVkKCkgewotCS8vIHRlc3RlZCBpbiBzZXRFbmFibGVkIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzVmlzaWJsZSgpIHsKLQkvLyBUaGlzIHRlc3QgY2FuIG5vdCBiZSBydW4gYXMgaXQgY3VycmVudGx5IGlzIHdyaXR0ZW4uICBPbiBXaW5kb3dzLCBpZiBhIAotCS8vIG1lbnUgaGFzIG5vIG1lbnUgaXRlbXMsIGl0IHdpbGwgbm90IGJlY29tZSB2aXNpYmxlLgotCS8vIElmIHdlIGFkZCBtZW51IGl0ZW1zIHRvIHRoZSBtZW51IHRoZW4gYSBzZWNvbmQgcHJvYmxlbSBpcyBlbmNvdW50ZXJlZCAKLQkvLyBiZWNhdXNlIG1lbnUuc2V0VmlzaWJsZSgpIGVudGVycyBpbnRvIGEgbW9kYWwgbG9vcCBhbmQgZXhlY3V0aW9uIG9mIAotCS8vIHRoZSBKVW5pdCB0ZXN0IGNhc2Ugd2lsbCBub3QgY29udGludWUgdW50aWwgdGhlIG1lbnUgaXMgc2VsZWN0ZWQgYW5kIGNsb3NlZC4KLQlpZiAodHJ1ZSkgcmV0dXJuOwotCW1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKG1lbnUuaXNWaXNpYmxlKCkpOwotCi0JLy8gYXBpIG5vdCBpbXBsZW1lbnRlZCB5ZXQKLQlpZiAoZkNoZWNrVmlzaWJpbGl0eSkgewotCQltZW51LnNldFZpc2libGUoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMobWVudS5pc1Zpc2libGUoKSwgZmFsc2UpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIGFkZEhlbHBMaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVNZW51TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIGFkZE1lbnVMaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREZWZhdWx0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpIHsKLQlNZW51SXRlbSBtSXRlbTAgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5VTEwpOwotCU1lbnVJdGVtIG1JdGVtMSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTlVMTCk7Ci0JbWVudS5zZXREZWZhdWx0SXRlbShtSXRlbTApOwotCWFzc2VydEVxdWFscyhtZW51LmdldERlZmF1bHRJdGVtKCksIG1JdGVtMCk7Ci0JYXNzZXJ0VHJ1ZSgiQWZ0ZXIgc2V0RGVmYXVsdEl0ZW0obUl0ZW0wKToiLCBtZW51LmdldERlZmF1bHRJdGVtKCkgIT0gbUl0ZW0xKTsKLQltZW51LnNldERlZmF1bHRJdGVtKG1JdGVtMSk7Ci0JYXNzZXJ0RXF1YWxzKG1lbnUuZ2V0RGVmYXVsdEl0ZW0oKSwgbUl0ZW0xKTsKLQlhc3NlcnRUcnVlKCJBZnRlciBzZXREZWZhdWx0SXRlbShtSXRlbTEpOiIsIG1lbnUuZ2V0RGVmYXVsdEl0ZW0oKSAhPSBtSXRlbTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVuYWJsZWRaKCkgewotCW1lbnUuc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKG1lbnUuZ2V0RW5hYmxlZCgpKTsKLQltZW51LnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydEZhbHNlKG1lbnUuZ2V0RW5hYmxlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMb2NhdGlvbklJKCkgewotCW1lbnUuc2V0TG9jYXRpb24oMCwwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JbWVudS5zZXRMb2NhdGlvbihuZXcgUG9pbnQoMCwwKSk7Ci0JdHJ5IHsKLQkJbWVudS5zZXRMb2NhdGlvbihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbnVsbCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFZpc2libGVaKCkgewotCS8vIFRoaXMgdGVzdCBjYW4gbm90IGJlIHJ1biBhcyBpdCBjdXJyZW50bHkgaXMgd3JpdHRlbi4gIE9uIFdpbmRvd3MsIGlmIGEgCi0JLy8gbWVudSBoYXMgbm8gbWVudSBpdGVtcywgaXQgd2lsbCBub3QgYmVjb21lIHZpc2libGUuCi0JLy8gSWYgd2UgYWRkIG1lbnUgaXRlbXMgdG8gdGhlIG1lbnUgdGhlbiBhIHNlY29uZCBwcm9ibGVtIGlzIGVuY291bnRlcmVkIAotCS8vIGJlY2F1c2UgbWVudS5zZXRWaXNpYmxlKCkgZW50ZXJzIGludG8gYSBtb2RhbCBsb29wIGFuZCBleGVjdXRpb24gb2YgCi0JLy8gdGhlIEpVbml0IHRlc3QgY2FzZSB3aWxsIG5vdCBjb250aW51ZSB1bnRpbCB0aGUgbWVudSBpcyBzZWxlY3RlZCBhbmQgY2xvc2VkLgotCWlmICh0cnVlKSByZXR1cm47Ci0JbWVudS5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUobWVudS5nZXRWaXNpYmxlKCkpOwotCS8vIEFQSSBub3QgaW1wbGVtZW50ZWQgeWV0IAotCWlmIChmQ2hlY2tWaXNpYmlsaXR5KSB7Ci0JCW1lbnUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhtZW51LmdldFZpc2libGUoKSwgZmFsc2UpOwotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTWVudUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREZWZhdWx0SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50TWVudSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFZpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNWaXNpYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZU1lbnVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RGVmYXVsdEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVuYWJsZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMb2NhdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFZpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpKSB0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTWVudUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyIikpIHRlc3RfYWRkTWVudUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREZWZhdWx0SXRlbSIpKSB0ZXN0X2dldERlZmF1bHRJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFbmFibGVkIikpIHRlc3RfZ2V0RW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSSIpKSB0ZXN0X2dldEl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudEl0ZW0iKSkgdGVzdF9nZXRQYXJlbnRJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnRNZW51IikpIHRlc3RfZ2V0UGFyZW50TWVudSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2hlbGwiKSkgdGVzdF9nZXRTaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VmlzaWJsZSIpKSB0ZXN0X2dldFZpc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0VuYWJsZWQiKSkgdGVzdF9pc0VuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzVmlzaWJsZSIpKSB0ZXN0X2lzVmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVNZW51TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNZW51TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldERlZmF1bHRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIikpIHRlc3Rfc2V0RGVmYXVsdEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVuYWJsZWRaIikpIHRlc3Rfc2V0RW5hYmxlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExvY2F0aW9uSUkiKSkgdGVzdF9zZXRMb2NhdGlvbklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFZpc2libGVaIikpIHRlc3Rfc2V0VmlzaWJsZVooKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1NZW51IG1lbnU7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODBiNTZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCW1lbnUgPSBuZXcgTWVudShzaGVsbCk7Ci0JbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgMCk7Ci0Jc2V0V2lkZ2V0KG1lbnVJdGVtKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SSgpIHsKLQlNZW51SXRlbSBtSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTlVMTCk7Ci0JYXNzZXJ0Tm90TnVsbChtSXRlbSk7Ci0JCi0JdHJ5IHsKLQkJbmV3IE1lbnVJdGVtKG51bGwsIFNXVC5OVUxMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCW1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DSEVDSyk7Ci0JYXNzZXJ0VHJ1ZShtSXRlbS5nZXRTdHlsZSgpPT1TV1QuQ0hFQ0spOwotCW1JdGVtLmRpc3Bvc2UoKTsKLQltSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0FTQ0FERSk7Ci0JYXNzZXJ0VHJ1ZShtSXRlbS5nZXRTdHlsZSgpPT1TV1QuQ0FTQ0FERSk7Ci0JbUl0ZW0uZGlzcG9zZSgpOwotCW1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLQlhc3NlcnRUcnVlKG1JdGVtLmdldFN0eWxlKCk9PVNXVC5QVVNIKTsKLQltSXRlbS5kaXNwb3NlKCk7Ci0JbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7Ci0JYXNzZXJ0VHJ1ZShtSXRlbS5nZXRTdHlsZSgpPT1TV1QuU0VQQVJBVE9SKTsKLQltSXRlbS5kaXNwb3NlKCk7Ci0JbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlJBRElPKTsKLQlhc3NlcnRUcnVlKG1JdGVtLmdldFN0eWxlKCk9PVNXVC5SQURJTyk7Ci0JbUl0ZW0uZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJSSgpIHsKLQlNZW51SXRlbSBtSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTlVMTCwgMCk7IC8vY3JlYXRlIGEgbWVudSBpdGVtIGF0IGluZGV4IDAKLQlhc3NlcnROb3ROdWxsKG1JdGVtKTsKLQlhc3NlcnRUcnVlKG1lbnUuZ2V0SXRlbSgwKS5lcXVhbHMobUl0ZW0pKTsKLQltSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTlVMTCwgMSk7Ci0JYXNzZXJ0Tm90TnVsbChtSXRlbSk7Ci0JYXNzZXJ0VHJ1ZShtZW51LmdldEl0ZW0oMSkuZXF1YWxzKG1JdGVtKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQXJtTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCUFybUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEFybUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRBcm1lZChBcm1FdmVudCBlKSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX07Ci0JfTsKLQkKLQl0cnkgewotCQltZW51SXRlbS5hZGRBcm1MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkQXJtTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbWVudUl0ZW0uYWRkQXJtTGlzdGVuZXIobGlzdGVuZXIpOwotCW1lbnVJdGVtLm5vdGlmeUxpc3RlbmVycyhTV1QuQXJtLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShsaXN0ZW5lckNhbGxlZCk7Ci0JCi0JdHJ5IHsKLQkJbWVudUl0ZW0ucmVtb3ZlQXJtTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZUFybUxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JbWVudUl0ZW0ucmVtb3ZlQXJtTGlzdGVuZXIobGlzdGVuZXIpOwotCW1lbnVJdGVtLm5vdGlmeUxpc3RlbmVycyhTV1QuQXJtLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0RmFsc2UobGlzdGVuZXJDYWxsZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCUhlbHBMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBIZWxwTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhlbHBSZXF1ZXN0ZWQoSGVscEV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfTsKLQl9OwotCQotCXRyeSB7Ci0JCW1lbnVJdGVtLmFkZEhlbHBMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkSGVscExpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCW1lbnVJdGVtLmFkZEhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbWVudUl0ZW0ubm90aWZ5TGlzdGVuZXJzKFNXVC5IZWxwLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShsaXN0ZW5lckNhbGxlZCk7Ci0JCi0JdHJ5IHsKLQkJbWVudUl0ZW0ucmVtb3ZlSGVscExpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZW1vdmVIZWxwTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQltZW51SXRlbS5yZW1vdmVIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotCW1lbnVJdGVtLm5vdGlmeUxpc3RlbmVycyhTV1QuSGVscCwgbmV3IEV2ZW50KCkpOwotCWFzc2VydEZhbHNlKGxpc3RlbmVyQ2FsbGVkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfTsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJfTsKLQl9OwotCQotCXRyeSB7Ci0JCW1lbnVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRTZWxlY3Rpb25MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQltZW51SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbWVudUl0ZW0ubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGxpc3RlbmVyQ2FsbGVkKTsKLQkKLQl0cnkgewotCQltZW51SXRlbS5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQltZW51SXRlbS5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbWVudUl0ZW0ubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRGYWxzZShsaXN0ZW5lckNhbGxlZCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWNjZWxlcmF0b3IoKSB7Ci0JbWVudUl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnWCcpOwotCWFzc2VydEVxdWFscyhtZW51SXRlbS5nZXRBY2NlbGVyYXRvcigpLCBTV1QuTU9EMSArICdYJyk7Ci0JbWVudUl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDIgKyAnWScpOwotCWFzc2VydEVxdWFscyhtZW51SXRlbS5nZXRBY2NlbGVyYXRvcigpLCBTV1QuTU9EMiArICdZJyk7Ci0JbWVudUl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDMgKyAnWicpOwotCWFzc2VydEVxdWFscyhtZW51SXRlbS5nZXRBY2NlbGVyYXRvcigpLCBTV1QuTU9EMyArICdaJyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RW5hYmxlZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRFbmFibGVkWigpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVudSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKG1lbnVJdGVtLmdldFBhcmVudCgpLCBtZW51KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0U2VsZWN0aW9uWigpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNFbmFibGVkKCkgewotCW1lbnVJdGVtLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShtZW51SXRlbS5pc0VuYWJsZWQoKSk7Ci0JbWVudUl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKG1lbnVJdGVtLmlzRW5hYmxlZCgpLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQXJtTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRBcm1MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRBY2NlbGVyYXRvckkoKSB7Ci0JbWVudUl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULkNUUkwgKyAnWicpOwotCWFzc2VydEVxdWFscyhtZW51SXRlbS5nZXRBY2NlbGVyYXRvcigpLCBTV1QuQ1RSTCArICdaJyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RW5hYmxlZFooKSB7Ci0JbWVudUl0ZW0uc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKG1lbnVJdGVtLmdldEVuYWJsZWQoKSk7Ci0JbWVudUl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKG1lbnVJdGVtLmdldEVuYWJsZWQoKSwgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQlhc3NlcnROdWxsKG1lbnVJdGVtLmdldEltYWdlKCkpOwotCW1lbnVJdGVtLnNldEltYWdlKGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1swXSwgbWVudUl0ZW0uZ2V0SW1hZ2UoKSk7Ci0JYXNzZXJ0VHJ1ZShtZW51SXRlbS5nZXRJbWFnZSgpICE9IGltYWdlc1sxXSk7Ci0JbWVudUl0ZW0uc2V0SW1hZ2UobnVsbCk7Ci0JYXNzZXJ0TnVsbChtZW51SXRlbS5nZXRJbWFnZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoKSB7Ci0JYXNzZXJ0TnVsbChtZW51SXRlbS5nZXRNZW51KCkpOwotCU1lbnVJdGVtIG1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DQVNDQURFKTsKLQlNZW51IG5ld01lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JbUl0ZW0uc2V0TWVudShuZXdNZW51KTsKLQlhc3NlcnRFcXVhbHMobUl0ZW0uZ2V0TWVudSgpLCBuZXdNZW51KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25aKCkgewotCi0JaW50W10gaXRlbVN0eWxlcyA9IHtTV1QuQ0hFQ0ssIFNXVC5SQURJT307Ci0JZm9yIChpbnQgaT0wOyBpPGl0ZW1TdHlsZXMubGVuZ3RoOyBpKyspCi0JewotCQlNZW51SXRlbSBtSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBpdGVtU3R5bGVzW2ldKTsKLQkJbUl0ZW0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKG1JdGVtLmdldFNlbGVjdGlvbigpLCBmYWxzZSk7Ci0JCW1JdGVtLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShtSXRlbS5nZXRTZWxlY3Rpb24oKSk7Ci0JCW1JdGVtLmRpc3Bvc2UoKTsKLQl9IAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQltZW51SXRlbS5zZXRUZXh0KCJBQkNERUZHIik7Ci0JYXNzZXJ0VHJ1ZShtZW51SXRlbS5nZXRUZXh0KCkuZXF1YWxzKCJBQkNERUZHIikpOwotCXRyeSB7Ci0JCW1lbnVJdGVtLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZEFybUxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCW1lbnVJdGVtLnNldFRleHQoIkFCQ0RFRkciKTsKLQltZW51SXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdBJyk7Ci0JYXNzZXJ0VHJ1ZShtZW51SXRlbS5nZXRUZXh0KCkuc3RhcnRzV2l0aCgiQUJDREVGRyIpKTsKLQltZW51SXRlbS5zZXRBY2NlbGVyYXRvcigwKTsKLQltZW51SXRlbS5zZXRUZXh0KCJBQiZDREVGRyIpOwotCWFzc2VydFRydWUobWVudUl0ZW0uZ2V0VGV4dCgpLmVxdWFscygiQUImQ0RFRkciKSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkQXJtTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBY2NlbGVyYXRvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWVudSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQXJtTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRBY2NlbGVyYXRvckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVuYWJsZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1lbnVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQXJtTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lciIpKSB0ZXN0X2FkZEFybUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpKSB0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFjY2VsZXJhdG9yIikpIHRlc3RfZ2V0QWNjZWxlcmF0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVuYWJsZWQiKSkgdGVzdF9nZXRFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNZW51IikpIHRlc3RfZ2V0TWVudSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW5hYmxlZCIpKSB0ZXN0X2lzRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQXJtTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUFybUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEFjY2VsZXJhdG9ySSIpKSB0ZXN0X3NldEFjY2VsZXJhdG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RW5hYmxlZFoiKSkgdGVzdF9zZXRFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUiKSkgdGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbloiKSkgdGVzdF9zZXRTZWxlY3Rpb25aKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1NZW51IG1lbnU7Ci1NZW51SXRlbSBtZW51SXRlbTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZXNzYWdlQm94LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVzc2FnZUJveC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTczMDY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZXNzYWdlQm94LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3gKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3gKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVzc2FnZUJveCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVzc2FnZUJveChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbWVzc2FnZUJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0RGlhbG9nKG1lc3NhZ2VCb3gpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi0vKioKLSAqIFBvc3NpYmxlIGV4Y2VwdGlvbnM6Ci0gKiAKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHBhcmVudCBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSBwYXJlbnQ8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfU1VCQ0xBU1MgLSBpZiB0aGlzIGNsYXNzIGlzIG5vdCBhbiBhbGxvd2VkIHN1YmNsYXNzPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKXsKLQlNZXNzYWdlQm94IG1iID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwpOwotCXRyeSB7Ci0JCW5ldyBNZXNzYWdlQm94KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRNZXNzYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLS8qKgotICogTWFrZXMgdGhlIGRpYWxvZyB2aXNpYmxlIGFuZCBicmluZ3MgaXQgdG8gdGhlIGZyb250Ci0gKiBvZiB0aGUgZGlzcGxheS4KLSAqCi0gKiBAcmV0dXJuIHRoZSBJRCBvZiB0aGUgYnV0dG9uIHRoYXQgd2FzIHNlbGVjdGVkIHRvIGRpc21pc3MgdGhlCi0gKiAgICAgICAgIG1lc3NhZ2UgYm94IChlLmcuIFNXVC5PSywgU1dULkNBTkNFTCwgZXRjLi4uKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW4oKXsKLQlpZiAoZlRlc3REaWFsb2dPcGVuKQotCQltZXNzYWdlQm94Lm9wZW4oKTsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBkaWFsb2cncyBtZXNzYWdlLCB3aGljaCBpcyBhIGRlc2NyaXB0aW9uIG9mCi0gKiB0aGUgcHVycG9zZSBmb3Igd2hpY2ggaXQgd2FzIG9wZW5lZC4gVGhpcyBtZXNzYWdlIHdpbGwgYmUKLSAqIHZpc2libGUgb24gdGhlIGRpYWxvZyB3aGlsZSBpdCBpcyBvcGVuLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZygpewotCWFzc2VydEVxdWFscyhtZXNzYWdlQm94LmdldE1lc3NhZ2UoKSwgIiIpOwotCVN0cmluZyB0ZXN0U3RyID0gInRlc3Qgc3RyaW5nIjsKLQltZXNzYWdlQm94LnNldE1lc3NhZ2UodGVzdFN0cik7Ci0JYXNzZXJ0RXF1YWxzKG1lc3NhZ2VCb3guZ2V0TWVzc2FnZSgpLCB0ZXN0U3RyKTsKLQltZXNzYWdlQm94LnNldE1lc3NhZ2UoIiIpOwotCWFzc2VydEVxdWFscyhtZXNzYWdlQm94LmdldE1lc3NhZ2UoKSwgIiIpOwotCXRyeSB7Ci0JCW1lc3NhZ2VCb3guc2V0TWVzc2FnZShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lc3NhZ2VCb3goKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWVzc2FnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfb3BlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNZXNzYWdlIikpIHRlc3RfZ2V0TWVzc2FnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfb3BlbiIpKSB0ZXN0X29wZW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLU1lc3NhZ2VCb3ggbWVzc2FnZUJveDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Nb25pdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTg0YWE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Nb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1vbml0b3IKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1vbml0b3IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTW9uaXRvciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQkKLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01vbml0b3IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JbW9uaXRvcnMgPSBkaXNwbGF5LmdldE1vbml0b3JzKCk7Ci0JcHJpbWFyeSA9IGRpc3BsYXkuZ2V0UHJpbWFyeU1vbml0b3IoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IG1vbml0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChwcmltYXJ5LmVxdWFscyhtb25pdG9yc1tpXSkpIGJyZWFrOwotCX0KLQlpZiAoaSA9PSBtb25pdG9ycy5sZW5ndGgpIGZhaWwoKTsKLQlmb3IgKGkgPSAwOyBpICA8IG1vbml0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCU1vbml0b3IgdGVzdCA9IG1vbml0b3JzW2ldOwotCQlmb3IgKGludCBqID0gMDsgaiA8IG1vbml0b3JzLmxlbmd0aDsgaisrKSB7Ci0JCQlpZiAodGVzdC5lcXVhbHMobW9uaXRvcnNbal0pKSB7Ci0JCQkJaWYgKGkgIT0gaikgZmFpbCgiTW9uaXRvcnMgIitpKyIgYW5kICIraisiIHNob3VsZCBub3QgYmUgZXF1YWwiKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IHByaW1hcnkuZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0Tm90TnVsbChib3VuZHMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJYm91bmRzID0gbW9uaXRvcnNbaV0uZ2V0Qm91bmRzKCk7Ci0JCWFzc2VydE5vdE51bGwoYm91bmRzKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xpZW50QXJlYSgpIHsKLQlSZWN0YW5nbGUgYm91bmRzID0gcHJpbWFyeS5nZXRDbGllbnRBcmVhKCk7Ci0JYXNzZXJ0Tm90TnVsbChib3VuZHMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJYm91bmRzID0gbW9uaXRvcnNbaV0uZ2V0Q2xpZW50QXJlYSgpOwotCQlhc3NlcnROb3ROdWxsKGJvdW5kcyk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCWZvciAoaW50IGkgPSAwOyBpIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKHByaW1hcnkuZXF1YWxzKG1vbml0b3JzW2ldKSkgewotCQkJYXNzZXJ0VHJ1ZShwcmltYXJ5Lmhhc2hDb2RlKCkgPT0gbW9uaXRvcnNbaV0uaGFzaENvZGUoKSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01vbml0b3IoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDbGllbnRBcmVhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpZW50QXJlYSIpKSB0ZXN0X2dldENsaWVudEFyZWEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLX0KLQotLyogY3VzdG9tICovCi1EaXNwbGF5IGRpc3BsYXkgPSBudWxsOwotTW9uaXRvcltdIG1vbml0b3JzID0gbnVsbDsKLU1vbml0b3IgcHJpbWFyeSA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfUHJvZ3Jlc3NCYXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Qcm9ncmVzc0Jhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDBiM2UxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Qcm9ncmVzc0Jhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Qcm9ncmVzc0JhcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuUHJvZ3Jlc3NCYXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfUHJvZ3Jlc3NCYXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Qcm9ncmVzc0JhcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JcHJvZ3Jlc3NCYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoc2hlbGwsIDApOwotCXNldFdpZGdldChwcm9ncmVzc0Jhcik7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQlwcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0JhcihudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOyAvL3Nob3VsZCBuZXZlciBnZXQgaGVyZQotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9IHswLCBTV1QuSE9SSVpPTlRBTCwgU1dULlZFUlRJQ0FMfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQlwcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0JhcihzaGVsbCwgY2FzZXNbaV0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1heGltdW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1heGltdW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNaW5pbXVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRNaW5pbXVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTZWxlY3Rpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb2N1cygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9jdXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNYXhpbXVtSSgpIHsKLQotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRNYXhpbXVtVmFsdWVzKCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlwcm9ncmVzc0Jhci5zZXRNYXhpbXVtKGludEFycmF5WzBdKTsKLQkJcmVwb3J0KCJzZXRNYXhpbXVtIiwgaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5pbXVtSSgpIHsKLQotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRNaW5pbXVtVmFsdWVzKCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlwcm9ncmVzc0Jhci5zZXRNaW5pbXVtKGludEFycmF5WzBdKTsKLQkJcmVwb3J0KCJzZXRNaW5pbXVtIiwgaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCkgewotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRTZWxlY3Rpb25WYWx1ZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24oaW50QXJyYXlbMF0pOwotCQlyZXBvcnQoInNldFNlbGVjdGlvbiIsIGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdKTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfUHJvZ3Jlc3NCYXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1heGltdW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1pbmltdW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9jdXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1heGltdW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5pbXVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWF4aW11bSIpKSB0ZXN0X2dldE1heGltdW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1pbmltdW0iKSkgdGVzdF9nZXRNaW5pbXVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvY3VzIikpIHRlc3Rfc2V0Rm9jdXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1heGltdW1JIikpIHRlc3Rfc2V0TWF4aW11bUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbmltdW1JIikpIHRlc3Rfc2V0TWluaW11bUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1Qcm9ncmVzc0JhciBwcm9ncmVzc0JhcjsKLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCByZXBvcnQoU3RyaW5nIGNhbGwsIGludCBzZXQsIGludCBtaW5FeHBlY3RlZCwgaW50IG1heEV4cGVjdGVkLCBpbnQgc2VsZWN0aW9uRXhwZWN0ZWQpIHsKLQkvLyBVbmNvbW1lbnQgdGhlc2UgbGluZXMgYW5kIGNvbW1lbnQgb3V0IGNhbGwgdG8gY2hlY2soKSBpZiB5b3Ugd2FudCB0aGUgdGVzdCB0byByZXBvcnQgYWxsIGVycm9ycyB3aXRob3V0Ci0JLy8gc3RvcHBpbmcuCi0JCi0JLy9pZiAocHJvZ3Jlc3NCYXIuZ2V0TWluaW11bSgpICE9IG1pbkV4cGVjdGVkKQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIigiICsgc2V0ICsgIik6IE1pbmltdW0gRXhwZWN0ZWQ6ICIgKyBtaW5FeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHByb2dyZXNzQmFyLmdldE1pbmltdW0oKSk7Ci0JLy9pZiAocHJvZ3Jlc3NCYXIuZ2V0TWF4aW11bSgpICE9IG1heEV4cGVjdGVkKQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIigiICsgc2V0ICsgIik6IE1heGltdW0gRXhwZWN0ZWQ6ICIgKyBtYXhFeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHByb2dyZXNzQmFyLmdldE1heGltdW0oKSk7Ci0JLy9pZiAocHJvZ3Jlc3NCYXIuZ2V0U2VsZWN0aW9uKCkgIT0gc2VsZWN0aW9uRXhwZWN0ZWQpCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiKCIgKyBzZXQgKyAiKTogU2VsZWN0aW9uIEV4cGVjdGVkOiAiICsgc2VsZWN0aW9uRXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyBwcm9ncmVzc0Jhci5nZXRTZWxlY3Rpb24oKSk7Ci0KLQljaGVjayhtaW5FeHBlY3RlZCwgbWF4RXhwZWN0ZWQsIHNlbGVjdGlvbkV4cGVjdGVkKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBjaGVjayhpbnQgbWluRXhwZWN0ZWQsIGludCBtYXhFeHBlY3RlZCwgaW50IHNlbGVjdGlvbkV4cGVjdGVkKSB7Ci0JYXNzZXJ0RXF1YWxzKHByb2dyZXNzQmFyLmdldE1heGltdW0oKSwgbWF4RXhwZWN0ZWQpOwotCWFzc2VydEVxdWFscyhwcm9ncmVzc0Jhci5nZXRNaW5pbXVtKCksIG1pbkV4cGVjdGVkKTsKLQlhc3NlcnRFcXVhbHMocHJvZ3Jlc3NCYXIuZ2V0U2VsZWN0aW9uKCksIHNlbGVjdGlvbkV4cGVjdGVkKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRNaW5pbXVtVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDUwLCB9LAotey0xNCwgMTAsIDEwMCwgNTAsIH0sCi17LTEzLCAxMCwgMTAwLCA1MCwgfSwKLXstMTIsIDEwLCAxMDAsIDUwLCB9LAotey0xMSwgMTAsIDEwMCwgNTAsIH0sCi17LTEwLCAxMCwgMTAwLCA1MCwgfSwKLXstOSwgMTAsIDEwMCwgNTAsIH0sCi17LTgsIDEwLCAxMDAsIDUwLCB9LAotey03LCAxMCwgMTAwLCA1MCwgfSwKLXstNiwgMTAsIDEwMCwgNTAsIH0sCi17LTUsIDEwLCAxMDAsIDUwLCB9LAotey00LCAxMCwgMTAwLCA1MCwgfSwKLXstMywgMTAsIDEwMCwgNTAsIH0sCi17LTIsIDEwLCAxMDAsIDUwLCB9LAotey0xLCAxMCwgMTAwLCA1MCwgfSwKLXswLCAwLCAxMDAsIDUwLCB9LAotezEsIDEsIDEwMCwgNTAsIH0sCi17MiwgMiwgMTAwLCA1MCwgfSwKLXszLCAzLCAxMDAsIDUwLCB9LAotezQsIDQsIDEwMCwgNTAsIH0sCi17NSwgNSwgMTAwLCA1MCwgfSwKLXs2LCA2LCAxMDAsIDUwLCB9LAotezcsIDcsIDEwMCwgNTAsIH0sCi17OCwgOCwgMTAwLCA1MCwgfSwKLXs5LCA5LCAxMDAsIDUwLCB9LAotezEwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMSwgMTEsIDEwMCwgNTAsIH0sCi17MTIsIDEyLCAxMDAsIDUwLCB9LAotezEzLCAxMywgMTAwLCA1MCwgfSwKLXsxNCwgMTQsIDEwMCwgNTAsIH0sCi17MTUsIDE1LCAxMDAsIDUwLCB9LAotezE2LCAxNiwgMTAwLCA1MCwgfSwKLXsxNywgMTcsIDEwMCwgNTAsIH0sCi17MTgsIDE4LCAxMDAsIDUwLCB9LAotezE5LCAxOSwgMTAwLCA1MCwgfSwKLXsyMCwgMjAsIDEwMCwgNTAsIH0sCi17MjEsIDIxLCAxMDAsIDUwLCB9LAotezIyLCAyMiwgMTAwLCA1MCwgfSwKLXsyMywgMjMsIDEwMCwgNTAsIH0sCi17MjQsIDI0LCAxMDAsIDUwLCB9LAotezI1LCAyNSwgMTAwLCA1MCwgfSwKLXsyNiwgMjYsIDEwMCwgNTAsIH0sCi17MjcsIDI3LCAxMDAsIDUwLCB9LAotezI4LCAyOCwgMTAwLCA1MCwgfSwKLXsyOSwgMjksIDEwMCwgNTAsIH0sCi17MzAsIDMwLCAxMDAsIDUwLCB9LAotezMxLCAzMSwgMTAwLCA1MCwgfSwKLXszMiwgMzIsIDEwMCwgNTAsIH0sCi17MzMsIDMzLCAxMDAsIDUwLCB9LAotezM0LCAzNCwgMTAwLCA1MCwgfSwKLXszNSwgMzUsIDEwMCwgNTAsIH0sCi17MzYsIDM2LCAxMDAsIDUwLCB9LAotezM3LCAzNywgMTAwLCA1MCwgfSwKLXszOCwgMzgsIDEwMCwgNTAsIH0sCi17MzksIDM5LCAxMDAsIDUwLCB9LAotezQwLCA0MCwgMTAwLCA1MCwgfSwKLXs0MSwgNDEsIDEwMCwgNTAsIH0sCi17NDIsIDQyLCAxMDAsIDUwLCB9LAotezQzLCA0MywgMTAwLCA1MCwgfSwKLXs0NCwgNDQsIDEwMCwgNTAsIH0sCi17NDUsIDQ1LCAxMDAsIDUwLCB9LAotezQ2LCA0NiwgMTAwLCA1MCwgfSwKLXs0NywgNDcsIDEwMCwgNTAsIH0sCi17NDgsIDQ4LCAxMDAsIDUwLCB9LAotezQ5LCA0OSwgMTAwLCA1MCwgfSwKLXs1MCwgNTAsIDEwMCwgNTAsIH0sCi17NTEsIDUxLCAxMDAsIDUxLCB9LAotezUyLCA1MiwgMTAwLCA1MiwgfSwKLXs1MywgNTMsIDEwMCwgNTMsIH0sCi17NTQsIDU0LCAxMDAsIDU0LCB9LAotezU1LCA1NSwgMTAwLCA1NSwgfSwKLXs1NiwgNTYsIDEwMCwgNTYsIH0sCi17NTcsIDU3LCAxMDAsIDU3LCB9LAotezU4LCA1OCwgMTAwLCA1OCwgfSwKLXs1OSwgNTksIDEwMCwgNTksIH0sCi17NjAsIDYwLCAxMDAsIDYwLCB9LAotezYxLCA2MSwgMTAwLCA2MSwgfSwKLXs2MiwgNjIsIDEwMCwgNjIsIH0sCi17NjMsIDYzLCAxMDAsIDYzLCB9LAotezY0LCA2NCwgMTAwLCA2NCwgfSwKLXs2NSwgNjUsIDEwMCwgNjUsIH0sCi17NjYsIDY2LCAxMDAsIDY2LCB9LAotezY3LCA2NywgMTAwLCA2NywgfSwKLXs2OCwgNjgsIDEwMCwgNjgsIH0sCi17NjksIDY5LCAxMDAsIDY5LCB9LAotezcwLCA3MCwgMTAwLCA3MCwgfSwKLXs3MSwgNzEsIDEwMCwgNzEsIH0sCi17NzIsIDcyLCAxMDAsIDcyLCB9LAotezczLCA3MywgMTAwLCA3MywgfSwKLXs3NCwgNzQsIDEwMCwgNzQsIH0sCi17NzUsIDc1LCAxMDAsIDc1LCB9LAotezc2LCA3NiwgMTAwLCA3NiwgfSwKLXs3NywgNzcsIDEwMCwgNzcsIH0sCi17NzgsIDc4LCAxMDAsIDc4LCB9LAotezc5LCA3OSwgMTAwLCA3OSwgfSwKLXs4MCwgODAsIDEwMCwgODAsIH0sCi17ODEsIDgxLCAxMDAsIDgxLCB9LAotezgyLCA4MiwgMTAwLCA4MiwgfSwKLXs4MywgODMsIDEwMCwgODMsIH0sCi17ODQsIDg0LCAxMDAsIDg0LCB9LAotezg1LCA4NSwgMTAwLCA4NSwgfSwKLXs4NiwgODYsIDEwMCwgODYsIH0sCi17ODcsIDg3LCAxMDAsIDg3LCB9LAotezg4LCA4OCwgMTAwLCA4OCwgfSwKLXs4OSwgODksIDEwMCwgODksIH0sCi17OTAsIDkwLCAxMDAsIDkwLCB9LAotezkxLCA5MSwgMTAwLCA5MSwgfSwKLXs5MiwgOTIsIDEwMCwgOTIsIH0sCi17OTMsIDkzLCAxMDAsIDkzLCB9LAotezk0LCA5NCwgMTAwLCA5NCwgfSwKLXs5NSwgOTUsIDEwMCwgOTUsIH0sCi17OTYsIDk2LCAxMDAsIDk2LCB9LAotezk3LCA5NywgMTAwLCA5NywgfSwKLXs5OCwgOTgsIDEwMCwgOTgsIH0sCi17OTksIDk5LCAxMDAsIDk5LCB9LAotezEwMCwgMTAsIDEwMCwgNTAsIH0sCi17MTAxLCAxMCwgMTAwLCA1MCwgfSwKLXsxMDIsIDEwLCAxMDAsIDUwLCB9LAotezEwMywgMTAsIDEwMCwgNTAsIH0sCi17MTA0LCAxMCwgMTAwLCA1MCwgfSwKLXsxMDUsIDEwLCAxMDAsIDUwLCB9LAotezEwNiwgMTAsIDEwMCwgNTAsIH0sCi17MTA3LCAxMCwgMTAwLCA1MCwgfSwKLXsxMDgsIDEwLCAxMDAsIDUwLCB9LAotezEwOSwgMTAsIDEwMCwgNTAsIH0sCi17MTEwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMTEsIDEwLCAxMDAsIDUwLCB9LAotezExMiwgMTAsIDEwMCwgNTAsIH0sCi17MTEzLCAxMCwgMTAwLCA1MCwgfSwKLXsxMTQsIDEwLCAxMDAsIDUwLCB9LAotezExNSwgMTAsIDEwMCwgNTAsIH0sCi17MTE2LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTcsIDEwLCAxMDAsIDUwLCB9LAotezExOCwgMTAsIDEwMCwgNTAsIH0sCi17MTE5LCAxMCwgMTAwLCA1MCwgfSwKLXsxMjAsIDEwLCAxMDAsIDUwLCB9LAotezEyMSwgMTAsIDEwMCwgNTAsIH0sCi17MTIyLCAxMCwgMTAwLCA1MCwgfSwKLXsxMjMsIDEwLCAxMDAsIDUwLCB9LAotezEyNCwgMTAsIDEwMCwgNTAsIH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldE1heGltdW1WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgfSwKLXstMTMsIDEwLCAxMDAsIDUwLCB9LAotey0xMiwgMTAsIDEwMCwgNTAsIH0sCi17LTExLCAxMCwgMTAwLCA1MCwgfSwKLXstMTAsIDEwLCAxMDAsIDUwLCB9LAotey05LCAxMCwgMTAwLCA1MCwgfSwKLXstOCwgMTAsIDEwMCwgNTAsIH0sCi17LTcsIDEwLCAxMDAsIDUwLCB9LAotey02LCAxMCwgMTAwLCA1MCwgfSwKLXstNSwgMTAsIDEwMCwgNTAsIH0sCi17LTQsIDEwLCAxMDAsIDUwLCB9LAotey0zLCAxMCwgMTAwLCA1MCwgfSwKLXstMiwgMTAsIDEwMCwgNTAsIH0sCi17LTEsIDEwLCAxMDAsIDUwLCB9LAotezAsIDEwLCAxMDAsIDUwLCB9LAotezEsIDEwLCAxMDAsIDUwLCB9LAotezIsIDEwLCAxMDAsIDUwLCB9LAotezMsIDEwLCAxMDAsIDUwLCB9LAotezQsIDEwLCAxMDAsIDUwLCB9LAotezUsIDEwLCAxMDAsIDUwLCB9LAotezYsIDEwLCAxMDAsIDUwLCB9LAotezcsIDEwLCAxMDAsIDUwLCB9LAotezgsIDEwLCAxMDAsIDUwLCB9LAotezksIDEwLCAxMDAsIDUwLCB9LAotezEwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMSwgMTAsIDExLCAxMSwgfSwKLXsxMiwgMTAsIDEyLCAxMiwgfSwKLXsxMywgMTAsIDEzLCAxMywgfSwKLXsxNCwgMTAsIDE0LCAxNCwgfSwKLXsxNSwgMTAsIDE1LCAxNSwgfSwKLXsxNiwgMTAsIDE2LCAxNiwgfSwKLXsxNywgMTAsIDE3LCAxNywgfSwKLXsxOCwgMTAsIDE4LCAxOCwgfSwKLXsxOSwgMTAsIDE5LCAxOSwgfSwKLXsyMCwgMTAsIDIwLCAyMCwgfSwKLXsyMSwgMTAsIDIxLCAyMSwgfSwKLXsyMiwgMTAsIDIyLCAyMiwgfSwKLXsyMywgMTAsIDIzLCAyMywgfSwKLXsyNCwgMTAsIDI0LCAyNCwgfSwKLXsyNSwgMTAsIDI1LCAyNSwgfSwKLXsyNiwgMTAsIDI2LCAyNiwgfSwKLXsyNywgMTAsIDI3LCAyNywgfSwKLXsyOCwgMTAsIDI4LCAyOCwgfSwKLXsyOSwgMTAsIDI5LCAyOSwgfSwKLXszMCwgMTAsIDMwLCAzMCwgfSwKLXszMSwgMTAsIDMxLCAzMSwgfSwKLXszMiwgMTAsIDMyLCAzMiwgfSwKLXszMywgMTAsIDMzLCAzMywgfSwKLXszNCwgMTAsIDM0LCAzNCwgfSwKLXszNSwgMTAsIDM1LCAzNSwgfSwKLXszNiwgMTAsIDM2LCAzNiwgfSwKLXszNywgMTAsIDM3LCAzNywgfSwKLXszOCwgMTAsIDM4LCAzOCwgfSwKLXszOSwgMTAsIDM5LCAzOSwgfSwKLXs0MCwgMTAsIDQwLCA0MCwgfSwKLXs0MSwgMTAsIDQxLCA0MSwgfSwKLXs0MiwgMTAsIDQyLCA0MiwgfSwKLXs0MywgMTAsIDQzLCA0MywgfSwKLXs0NCwgMTAsIDQ0LCA0NCwgfSwKLXs0NSwgMTAsIDQ1LCA0NSwgfSwKLXs0NiwgMTAsIDQ2LCA0NiwgfSwKLXs0NywgMTAsIDQ3LCA0NywgfSwKLXs0OCwgMTAsIDQ4LCA0OCwgfSwKLXs0OSwgMTAsIDQ5LCA0OSwgfSwKLXs1MCwgMTAsIDUwLCA1MCwgfSwKLXs1MSwgMTAsIDUxLCA1MCwgfSwKLXs1MiwgMTAsIDUyLCA1MCwgfSwKLXs1MywgMTAsIDUzLCA1MCwgfSwKLXs1NCwgMTAsIDU0LCA1MCwgfSwKLXs1NSwgMTAsIDU1LCA1MCwgfSwKLXs1NiwgMTAsIDU2LCA1MCwgfSwKLXs1NywgMTAsIDU3LCA1MCwgfSwKLXs1OCwgMTAsIDU4LCA1MCwgfSwKLXs1OSwgMTAsIDU5LCA1MCwgfSwKLXs2MCwgMTAsIDYwLCA1MCwgfSwKLXs2MSwgMTAsIDYxLCA1MCwgfSwKLXs2MiwgMTAsIDYyLCA1MCwgfSwKLXs2MywgMTAsIDYzLCA1MCwgfSwKLXs2NCwgMTAsIDY0LCA1MCwgfSwKLXs2NSwgMTAsIDY1LCA1MCwgfSwKLXs2NiwgMTAsIDY2LCA1MCwgfSwKLXs2NywgMTAsIDY3LCA1MCwgfSwKLXs2OCwgMTAsIDY4LCA1MCwgfSwKLXs2OSwgMTAsIDY5LCA1MCwgfSwKLXs3MCwgMTAsIDcwLCA1MCwgfSwKLXs3MSwgMTAsIDcxLCA1MCwgfSwKLXs3MiwgMTAsIDcyLCA1MCwgfSwKLXs3MywgMTAsIDczLCA1MCwgfSwKLXs3NCwgMTAsIDc0LCA1MCwgfSwKLXs3NSwgMTAsIDc1LCA1MCwgfSwKLXs3NiwgMTAsIDc2LCA1MCwgfSwKLXs3NywgMTAsIDc3LCA1MCwgfSwKLXs3OCwgMTAsIDc4LCA1MCwgfSwKLXs3OSwgMTAsIDc5LCA1MCwgfSwKLXs4MCwgMTAsIDgwLCA1MCwgfSwKLXs4MSwgMTAsIDgxLCA1MCwgfSwKLXs4MiwgMTAsIDgyLCA1MCwgfSwKLXs4MywgMTAsIDgzLCA1MCwgfSwKLXs4NCwgMTAsIDg0LCA1MCwgfSwKLXs4NSwgMTAsIDg1LCA1MCwgfSwKLXs4NiwgMTAsIDg2LCA1MCwgfSwKLXs4NywgMTAsIDg3LCA1MCwgfSwKLXs4OCwgMTAsIDg4LCA1MCwgfSwKLXs4OSwgMTAsIDg5LCA1MCwgfSwKLXs5MCwgMTAsIDkwLCA1MCwgfSwKLXs5MSwgMTAsIDkxLCA1MCwgfSwKLXs5MiwgMTAsIDkyLCA1MCwgfSwKLXs5MywgMTAsIDkzLCA1MCwgfSwKLXs5NCwgMTAsIDk0LCA1MCwgfSwKLXs5NSwgMTAsIDk1LCA1MCwgfSwKLXs5NiwgMTAsIDk2LCA1MCwgfSwKLXs5NywgMTAsIDk3LCA1MCwgfSwKLXs5OCwgMTAsIDk4LCA1MCwgfSwKLXs5OSwgMTAsIDk5LCA1MCwgfSwKLXsxMDAsIDEwLCAxMDAsIDUwLCB9LAotezEwMSwgMTAsIDEwMSwgNTAsIH0sCi17MTAyLCAxMCwgMTAyLCA1MCwgfSwKLXsxMDMsIDEwLCAxMDMsIDUwLCB9LAotezEwNCwgMTAsIDEwNCwgNTAsIH0sCi17MTA1LCAxMCwgMTA1LCA1MCwgfSwKLXsxMDYsIDEwLCAxMDYsIDUwLCB9LAotezEwNywgMTAsIDEwNywgNTAsIH0sCi17MTA4LCAxMCwgMTA4LCA1MCwgfSwKLXsxMDksIDEwLCAxMDksIDUwLCB9LAotezExMCwgMTAsIDExMCwgNTAsIH0sCi17MTExLCAxMCwgMTExLCA1MCwgfSwKLXsxMTIsIDEwLCAxMTIsIDUwLCB9LAotezExMywgMTAsIDExMywgNTAsIH0sCi17MTE0LCAxMCwgMTE0LCA1MCwgfSwKLXsxMTUsIDEwLCAxMTUsIDUwLCB9LAotezExNiwgMTAsIDExNiwgNTAsIH0sCi17MTE3LCAxMCwgMTE3LCA1MCwgfSwKLXsxMTgsIDEwLCAxMTgsIDUwLCB9LAotezExOSwgMTAsIDExOSwgNTAsIH0sCi17MTIwLCAxMCwgMTIwLCA1MCwgfSwKLXsxMjEsIDEwLCAxMjEsIDUwLCB9LAotezEyMiwgMTAsIDEyMiwgNTAsIH0sCi17MTIzLCAxMCwgMTIzLCA1MCwgfSwKLXsxMjQsIDEwLCAxMjQsIDUwLCB9LAotfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBzZXREZWZhdWx0cygpIHsKLQlwcm9ncmVzc0Jhci5zZXRNYXhpbXVtKDEwMCk7Ci0JcHJvZ3Jlc3NCYXIuc2V0TWluaW11bSgxMCk7Ci0JcHJvZ3Jlc3NCYXIuc2V0U2VsZWN0aW9uKDUwKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRTZWxlY3Rpb25WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgMTAsIH0sCi17LTE0LCAxMCwgMTAwLCAxMCwgfSwKLXstMTMsIDEwLCAxMDAsIDEwLCB9LAotey0xMiwgMTAsIDEwMCwgMTAsIH0sCi17LTExLCAxMCwgMTAwLCAxMCwgfSwKLXstMTAsIDEwLCAxMDAsIDEwLCB9LAotey05LCAxMCwgMTAwLCAxMCwgfSwKLXstOCwgMTAsIDEwMCwgMTAsIH0sCi17LTcsIDEwLCAxMDAsIDEwLCB9LAotey02LCAxMCwgMTAwLCAxMCwgfSwKLXstNSwgMTAsIDEwMCwgMTAsIH0sCi17LTQsIDEwLCAxMDAsIDEwLCB9LAotey0zLCAxMCwgMTAwLCAxMCwgfSwKLXstMiwgMTAsIDEwMCwgMTAsIH0sCi17LTEsIDEwLCAxMDAsIDEwLCB9LAotezAsIDEwLCAxMDAsIDEwLCB9LAotezEsIDEwLCAxMDAsIDEwLCB9LAotezIsIDEwLCAxMDAsIDEwLCB9LAotezMsIDEwLCAxMDAsIDEwLCB9LAotezQsIDEwLCAxMDAsIDEwLCB9LAotezUsIDEwLCAxMDAsIDEwLCB9LAotezYsIDEwLCAxMDAsIDEwLCB9LAotezcsIDEwLCAxMDAsIDEwLCB9LAotezgsIDEwLCAxMDAsIDEwLCB9LAotezksIDEwLCAxMDAsIDEwLCB9LAotezEwLCAxMCwgMTAwLCAxMCwgfSwKLXsxMSwgMTAsIDEwMCwgMTEsIH0sCi17MTIsIDEwLCAxMDAsIDEyLCB9LAotezEzLCAxMCwgMTAwLCAxMywgfSwKLXsxNCwgMTAsIDEwMCwgMTQsIH0sCi17MTUsIDEwLCAxMDAsIDE1LCB9LAotezE2LCAxMCwgMTAwLCAxNiwgfSwKLXsxNywgMTAsIDEwMCwgMTcsIH0sCi17MTgsIDEwLCAxMDAsIDE4LCB9LAotezE5LCAxMCwgMTAwLCAxOSwgfSwKLXsyMCwgMTAsIDEwMCwgMjAsIH0sCi17MjEsIDEwLCAxMDAsIDIxLCB9LAotezIyLCAxMCwgMTAwLCAyMiwgfSwKLXsyMywgMTAsIDEwMCwgMjMsIH0sCi17MjQsIDEwLCAxMDAsIDI0LCB9LAotezI1LCAxMCwgMTAwLCAyNSwgfSwKLXsyNiwgMTAsIDEwMCwgMjYsIH0sCi17MjcsIDEwLCAxMDAsIDI3LCB9LAotezI4LCAxMCwgMTAwLCAyOCwgfSwKLXsyOSwgMTAsIDEwMCwgMjksIH0sCi17MzAsIDEwLCAxMDAsIDMwLCB9LAotezMxLCAxMCwgMTAwLCAzMSwgfSwKLXszMiwgMTAsIDEwMCwgMzIsIH0sCi17MzMsIDEwLCAxMDAsIDMzLCB9LAotezM0LCAxMCwgMTAwLCAzNCwgfSwKLXszNSwgMTAsIDEwMCwgMzUsIH0sCi17MzYsIDEwLCAxMDAsIDM2LCB9LAotezM3LCAxMCwgMTAwLCAzNywgfSwKLXszOCwgMTAsIDEwMCwgMzgsIH0sCi17MzksIDEwLCAxMDAsIDM5LCB9LAotezQwLCAxMCwgMTAwLCA0MCwgfSwKLXs0MSwgMTAsIDEwMCwgNDEsIH0sCi17NDIsIDEwLCAxMDAsIDQyLCB9LAotezQzLCAxMCwgMTAwLCA0MywgfSwKLXs0NCwgMTAsIDEwMCwgNDQsIH0sCi17NDUsIDEwLCAxMDAsIDQ1LCB9LAotezQ2LCAxMCwgMTAwLCA0NiwgfSwKLXs0NywgMTAsIDEwMCwgNDcsIH0sCi17NDgsIDEwLCAxMDAsIDQ4LCB9LAotezQ5LCAxMCwgMTAwLCA0OSwgfSwKLXs1MCwgMTAsIDEwMCwgNTAsIH0sCi17NTEsIDEwLCAxMDAsIDUxLCB9LAotezUyLCAxMCwgMTAwLCA1MiwgfSwKLXs1MywgMTAsIDEwMCwgNTMsIH0sCi17NTQsIDEwLCAxMDAsIDU0LCB9LAotezU1LCAxMCwgMTAwLCA1NSwgfSwKLXs1NiwgMTAsIDEwMCwgNTYsIH0sCi17NTcsIDEwLCAxMDAsIDU3LCB9LAotezU4LCAxMCwgMTAwLCA1OCwgfSwKLXs1OSwgMTAsIDEwMCwgNTksIH0sCi17NjAsIDEwLCAxMDAsIDYwLCB9LAotezYxLCAxMCwgMTAwLCA2MSwgfSwKLXs2MiwgMTAsIDEwMCwgNjIsIH0sCi17NjMsIDEwLCAxMDAsIDYzLCB9LAotezY0LCAxMCwgMTAwLCA2NCwgfSwKLXs2NSwgMTAsIDEwMCwgNjUsIH0sCi17NjYsIDEwLCAxMDAsIDY2LCB9LAotezY3LCAxMCwgMTAwLCA2NywgfSwKLXs2OCwgMTAsIDEwMCwgNjgsIH0sCi17NjksIDEwLCAxMDAsIDY5LCB9LAotezcwLCAxMCwgMTAwLCA3MCwgfSwKLXs3MSwgMTAsIDEwMCwgNzEsIH0sCi17NzIsIDEwLCAxMDAsIDcyLCB9LAotezczLCAxMCwgMTAwLCA3MywgfSwKLXs3NCwgMTAsIDEwMCwgNzQsIH0sCi17NzUsIDEwLCAxMDAsIDc1LCB9LAotezc2LCAxMCwgMTAwLCA3NiwgfSwKLXs3NywgMTAsIDEwMCwgNzcsIH0sCi17NzgsIDEwLCAxMDAsIDc4LCB9LAotezc5LCAxMCwgMTAwLCA3OSwgfSwKLXs4MCwgMTAsIDEwMCwgODAsIH0sCi17ODEsIDEwLCAxMDAsIDgxLCB9LAotezgyLCAxMCwgMTAwLCA4MiwgfSwKLXs4MywgMTAsIDEwMCwgODMsIH0sCi17ODQsIDEwLCAxMDAsIDg0LCB9LAotezg1LCAxMCwgMTAwLCA4NSwgfSwKLXs4NiwgMTAsIDEwMCwgODYsIH0sCi17ODcsIDEwLCAxMDAsIDg3LCB9LAotezg4LCAxMCwgMTAwLCA4OCwgfSwKLXs4OSwgMTAsIDEwMCwgODksIH0sCi17OTAsIDEwLCAxMDAsIDkwLCB9LAotezkxLCAxMCwgMTAwLCA5MSwgfSwKLXs5MiwgMTAsIDEwMCwgOTIsIH0sCi17OTMsIDEwLCAxMDAsIDkzLCB9LAotezk0LCAxMCwgMTAwLCA5NCwgfSwKLXs5NSwgMTAsIDEwMCwgOTUsIH0sCi17OTYsIDEwLCAxMDAsIDk2LCB9LAotezk3LCAxMCwgMTAwLCA5NywgfSwKLXs5OCwgMTAsIDEwMCwgOTgsIH0sCi17OTksIDEwLCAxMDAsIDk5LCB9LAotezEwMCwgMTAsIDEwMCwgMTAwLCB9LAotezEwMSwgMTAsIDEwMCwgMTAwLCB9LAotezEwMiwgMTAsIDEwMCwgMTAwLCB9LAotezEwMywgMTAsIDEwMCwgMTAwLCB9LAotezEwNCwgMTAsIDEwMCwgMTAwLCB9LAotezEwNSwgMTAsIDEwMCwgMTAwLCB9LAotezEwNiwgMTAsIDEwMCwgMTAwLCB9LAotezEwNywgMTAsIDEwMCwgMTAwLCB9LAotezEwOCwgMTAsIDEwMCwgMTAwLCB9LAotezEwOSwgMTAsIDEwMCwgMTAwLCB9LAotezExMCwgMTAsIDEwMCwgMTAwLCB9LAotezExMSwgMTAsIDEwMCwgMTAwLCB9LAotezExMiwgMTAsIDEwMCwgMTAwLCB9LAotezExMywgMTAsIDEwMCwgMTAwLCB9LAotezExNCwgMTAsIDEwMCwgMTAwLCB9LAotezExNSwgMTAsIDEwMCwgMTAwLCB9LAotezExNiwgMTAsIDEwMCwgMTAwLCB9LAotezExNywgMTAsIDEwMCwgMTAwLCB9LAotezExOCwgMTAsIDEwMCwgMTAwLCB9LAotezExOSwgMTAsIDEwMCwgMTAwLCB9LAotezEyMCwgMTAsIDEwMCwgMTAwLCB9LAotezEyMSwgMTAsIDEwMCwgMTAwLCB9LAotezEyMiwgMTAsIDEwMCwgMTAwLCB9LAotezEyMywgMTAsIDEwMCwgMTAwLCB9LAotezEyNCwgMTAsIDEwMCwgMTAwLCB9LAotfTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDIwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2FzaC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Nhc2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmNTFhNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2FzaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TYXNoCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TYXNoCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Nhc2ggZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TYXNoKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlzYXNoID0gbmV3IFNhc2goc2hlbGwsIDApOwotCXNldFdpZGdldChzYXNoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCXNhc2ggPSBuZXcgU2FzaChudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOyAvL3Nob3VsZCBuZXZlciBnZXQgaGVyZQotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9IHswLCBTV1QuSE9SSVpPTlRBTCwgU1dULlZFUlRJQ0FMfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQlzYXNoID0gbmV3IFNhc2goc2hlbGwsIGNhc2VzW2ldKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0JLy8gb3ZlcnJpZGRlbiBmcm9tIENvbnRyb2wgYmVjYXVzZSBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlCi0JLy8gdG8gc2V0IHRoZSBmb250IG9mIGEgU2FzaC4KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TYXNoKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1TYXNoIHNhc2g7Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVTYXNoKCkgewotICAgIHRlYXJEb3duKCk7Ci0gICAgc3VwZXIuc2V0VXAoKTsKLSAgICBCdXR0b24gYjEgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0gICAgU2FzaCBzYXNoID0gbmV3IFNhc2goc2hlbGwsIFNXVC5WRVJUSUNBTCk7Ci0gICAgQnV0dG9uIGIyID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotICAgIHNldFdpZGdldChzYXNoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBjcmVhdGVTYXNoKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGNyZWF0ZVNhc2goKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIDUsIDIwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCkgewotICAgIGNyZWF0ZVNhc2goKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIDUsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY2FsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NjYWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNDEyNDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NjYWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2NhbGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjYWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NjYWxlIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2NhbGUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXNjYWxlID0gbmV3IFNjYWxlKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQoc2NhbGUpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJc2NhbGUgPSBuZXcgU2NhbGUobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiBvY2N1cnJlZCIpOyAvL3Nob3VsZCBuZXZlciBnZXQgaGVyZQotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9IHswLCBTV1QuSE9SSVpPTlRBTCwgU1dULlZFUlRJQ0FMfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQlzY2FsZSA9IG5ldyBTY2FsZShzaGVsbCwgY2FzZXNbaV0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbmNyZW1lbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEluY3JlbWVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1heGltdW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1heGltdW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNaW5pbXVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRNaW5pbXVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFnZUluY3JlbWVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UGFnZUluY3JlbWVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEluY3JlbWVudEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEluY3JlbWVudEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNYXhpbXVtSSgpIHsKLQotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRNYXhpbXVtVmFsdWVzKCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlzY2FsZS5zZXRNYXhpbXVtKGludEFycmF5WzBdKTsKLQkJcmVwb3J0KCJzZXRNYXhpbXVtIiwgaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5pbXVtSSgpIHsKLQotCi0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldE1pbmltdW1WYWx1ZXMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNjYWxlLnNldE1pbmltdW0oaW50QXJyYXlbMF0pOwotCQlyZXBvcnQoInNldE1pbmltdW0iLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFBhZ2VJbmNyZW1lbnRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRQYWdlSW5jcmVtZW50SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkkoKSB7Ci0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldFNlbGVjdGlvblZhbHVlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNjYWxlLnNldFNlbGVjdGlvbihpbnRBcnJheVswXSk7Ci0JCXJlcG9ydCgic2V0U2VsZWN0aW9uIiwgaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10pOwotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY2FsZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW5jcmVtZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNYXhpbXVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNaW5pbXVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYWdlSW5jcmVtZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEluY3JlbWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1heGltdW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5pbXVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UGFnZUluY3JlbWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfVHJvdWdoU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9UaHVtYlNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEluY3JlbWVudCIpKSB0ZXN0X2dldEluY3JlbWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWF4aW11bSIpKSB0ZXN0X2dldE1heGltdW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1pbmltdW0iKSkgdGVzdF9nZXRNaW5pbXVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYWdlSW5jcmVtZW50IikpIHRlc3RfZ2V0UGFnZUluY3JlbWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW5jcmVtZW50SSIpKSB0ZXN0X3NldEluY3JlbWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1heGltdW1JIikpIHRlc3Rfc2V0TWF4aW11bUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbmltdW1JIikpIHRlc3Rfc2V0TWluaW11bUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFBhZ2VJbmNyZW1lbnRJIikpIHRlc3Rfc2V0UGFnZUluY3JlbWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfVGh1bWJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9UaHVtYlNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCS8vIG92ZXJyaWRkZW4gZnJvbSBDb250cm9sIGJlY2F1c2UgaXQgZG9lcyBub3QgbWFrZSBzZW5zZQotCS8vIHRvIHNldCB0aGUgZm9udCBvZiBhIFNjYWxlLgotfQotCi1TY2FsZSBzY2FsZTsKLQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHJlcG9ydChTdHJpbmcgY2FsbCwgaW50IHNldCwgaW50IG1pbkV4cGVjdGVkLCBpbnQgbWF4RXhwZWN0ZWQsIGludCBzZWxlY3Rpb25FeHBlY3RlZCkgewotCSAvL1VuY29tbWVudCB0aGVzZSBsaW5lcyBhbmQgY29tbWVudCBvdXQgY2FsbCB0byBjaGVjaygpIGlmIHlvdSB3YW50IHRoZSB0ZXN0IHRvIHJlcG9ydCBhbGwgZXJyb3JzIHdpdGhvdXQKLQkgLy9zdG9wcGluZy4KLQkKLQkvL2lmICh0cmFja0Jhci5nZXRNaW5pbXVtKCkgIT0gbWluRXhwZWN0ZWQpCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiKCIgKyBzZXQgKyAiKTogTWluaW11bSBFeHBlY3RlZDogIiArIG1pbkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgdHJhY2tCYXIuZ2V0TWluaW11bSgpKTsKLQkvL2lmICh0cmFja0Jhci5nZXRNYXhpbXVtKCkgIT0gbWF4RXhwZWN0ZWQpCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiKCIgKyBzZXQgKyAiKTogTWF4aW11bSBFeHBlY3RlZDogIiArIG1heEV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgdHJhY2tCYXIuZ2V0TWF4aW11bSgpKTsKLQkvL2lmICh0cmFja0Jhci5nZXRTZWxlY3Rpb24oKSAhPSBzZWxlY3Rpb25FeHBlY3RlZCkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIoIiArIHNldCArICIpOiBTZWxlY3Rpb24gRXhwZWN0ZWQ6ICIgKyBzZWxlY3Rpb25FeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHRyYWNrQmFyLmdldFNlbGVjdGlvbigpKTsKLQljaGVjayhtaW5FeHBlY3RlZCwgbWF4RXhwZWN0ZWQsIHNlbGVjdGlvbkV4cGVjdGVkKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBjaGVjayhpbnQgbWluRXhwZWN0ZWQsIGludCBtYXhFeHBlY3RlZCwgaW50IHNlbGVjdGlvbkV4cGVjdGVkKSB7Ci0JYXNzZXJ0RXF1YWxzKHNjYWxlLmdldE1heGltdW0oKSwgbWF4RXhwZWN0ZWQpOwotCWFzc2VydEVxdWFscyhzY2FsZS5nZXRNaW5pbXVtKCksIG1pbkV4cGVjdGVkKTsKLQlhc3NlcnRFcXVhbHMoc2NhbGUuZ2V0U2VsZWN0aW9uKCksIHNlbGVjdGlvbkV4cGVjdGVkKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRNaW5pbXVtVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDUwLCB9LAotey0xNCwgMTAsIDEwMCwgNTAsIH0sCi17LTEzLCAxMCwgMTAwLCA1MCwgfSwKLXstMTIsIDEwLCAxMDAsIDUwLCB9LAotey0xMSwgMTAsIDEwMCwgNTAsIH0sCi17LTEwLCAxMCwgMTAwLCA1MCwgfSwKLXstOSwgMTAsIDEwMCwgNTAsIH0sCi17LTgsIDEwLCAxMDAsIDUwLCB9LAotey03LCAxMCwgMTAwLCA1MCwgfSwKLXstNiwgMTAsIDEwMCwgNTAsIH0sCi17LTUsIDEwLCAxMDAsIDUwLCB9LAotey00LCAxMCwgMTAwLCA1MCwgfSwKLXstMywgMTAsIDEwMCwgNTAsIH0sCi17LTIsIDEwLCAxMDAsIDUwLCB9LAotey0xLCAxMCwgMTAwLCA1MCwgfSwKLXswLCAwLCAxMDAsIDUwLCB9LAotezEsIDEsIDEwMCwgNTAsIH0sCi17MiwgMiwgMTAwLCA1MCwgfSwKLXszLCAzLCAxMDAsIDUwLCB9LAotezQsIDQsIDEwMCwgNTAsIH0sCi17NSwgNSwgMTAwLCA1MCwgfSwKLXs2LCA2LCAxMDAsIDUwLCB9LAotezcsIDcsIDEwMCwgNTAsIH0sCi17OCwgOCwgMTAwLCA1MCwgfSwKLXs5LCA5LCAxMDAsIDUwLCB9LAotezEwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMSwgMTEsIDEwMCwgNTAsIH0sCi17MTIsIDEyLCAxMDAsIDUwLCB9LAotezEzLCAxMywgMTAwLCA1MCwgfSwKLXsxNCwgMTQsIDEwMCwgNTAsIH0sCi17MTUsIDE1LCAxMDAsIDUwLCB9LAotezE2LCAxNiwgMTAwLCA1MCwgfSwKLXsxNywgMTcsIDEwMCwgNTAsIH0sCi17MTgsIDE4LCAxMDAsIDUwLCB9LAotezE5LCAxOSwgMTAwLCA1MCwgfSwKLXsyMCwgMjAsIDEwMCwgNTAsIH0sCi17MjEsIDIxLCAxMDAsIDUwLCB9LAotezIyLCAyMiwgMTAwLCA1MCwgfSwKLXsyMywgMjMsIDEwMCwgNTAsIH0sCi17MjQsIDI0LCAxMDAsIDUwLCB9LAotezI1LCAyNSwgMTAwLCA1MCwgfSwKLXsyNiwgMjYsIDEwMCwgNTAsIH0sCi17MjcsIDI3LCAxMDAsIDUwLCB9LAotezI4LCAyOCwgMTAwLCA1MCwgfSwKLXsyOSwgMjksIDEwMCwgNTAsIH0sCi17MzAsIDMwLCAxMDAsIDUwLCB9LAotezMxLCAzMSwgMTAwLCA1MCwgfSwKLXszMiwgMzIsIDEwMCwgNTAsIH0sCi17MzMsIDMzLCAxMDAsIDUwLCB9LAotezM0LCAzNCwgMTAwLCA1MCwgfSwKLXszNSwgMzUsIDEwMCwgNTAsIH0sCi17MzYsIDM2LCAxMDAsIDUwLCB9LAotezM3LCAzNywgMTAwLCA1MCwgfSwKLXszOCwgMzgsIDEwMCwgNTAsIH0sCi17MzksIDM5LCAxMDAsIDUwLCB9LAotezQwLCA0MCwgMTAwLCA1MCwgfSwKLXs0MSwgNDEsIDEwMCwgNTAsIH0sCi17NDIsIDQyLCAxMDAsIDUwLCB9LAotezQzLCA0MywgMTAwLCA1MCwgfSwKLXs0NCwgNDQsIDEwMCwgNTAsIH0sCi17NDUsIDQ1LCAxMDAsIDUwLCB9LAotezQ2LCA0NiwgMTAwLCA1MCwgfSwKLXs0NywgNDcsIDEwMCwgNTAsIH0sCi17NDgsIDQ4LCAxMDAsIDUwLCB9LAotezQ5LCA0OSwgMTAwLCA1MCwgfSwKLXs1MCwgNTAsIDEwMCwgNTAsIH0sCi17NTEsIDUxLCAxMDAsIDUxLCB9LAotezUyLCA1MiwgMTAwLCA1MiwgfSwKLXs1MywgNTMsIDEwMCwgNTMsIH0sCi17NTQsIDU0LCAxMDAsIDU0LCB9LAotezU1LCA1NSwgMTAwLCA1NSwgfSwKLXs1NiwgNTYsIDEwMCwgNTYsIH0sCi17NTcsIDU3LCAxMDAsIDU3LCB9LAotezU4LCA1OCwgMTAwLCA1OCwgfSwKLXs1OSwgNTksIDEwMCwgNTksIH0sCi17NjAsIDYwLCAxMDAsIDYwLCB9LAotezYxLCA2MSwgMTAwLCA2MSwgfSwKLXs2MiwgNjIsIDEwMCwgNjIsIH0sCi17NjMsIDYzLCAxMDAsIDYzLCB9LAotezY0LCA2NCwgMTAwLCA2NCwgfSwKLXs2NSwgNjUsIDEwMCwgNjUsIH0sCi17NjYsIDY2LCAxMDAsIDY2LCB9LAotezY3LCA2NywgMTAwLCA2NywgfSwKLXs2OCwgNjgsIDEwMCwgNjgsIH0sCi17NjksIDY5LCAxMDAsIDY5LCB9LAotezcwLCA3MCwgMTAwLCA3MCwgfSwKLXs3MSwgNzEsIDEwMCwgNzEsIH0sCi17NzIsIDcyLCAxMDAsIDcyLCB9LAotezczLCA3MywgMTAwLCA3MywgfSwKLXs3NCwgNzQsIDEwMCwgNzQsIH0sCi17NzUsIDc1LCAxMDAsIDc1LCB9LAotezc2LCA3NiwgMTAwLCA3NiwgfSwKLXs3NywgNzcsIDEwMCwgNzcsIH0sCi17NzgsIDc4LCAxMDAsIDc4LCB9LAotezc5LCA3OSwgMTAwLCA3OSwgfSwKLXs4MCwgODAsIDEwMCwgODAsIH0sCi17ODEsIDgxLCAxMDAsIDgxLCB9LAotezgyLCA4MiwgMTAwLCA4MiwgfSwKLXs4MywgODMsIDEwMCwgODMsIH0sCi17ODQsIDg0LCAxMDAsIDg0LCB9LAotezg1LCA4NSwgMTAwLCA4NSwgfSwKLXs4NiwgODYsIDEwMCwgODYsIH0sCi17ODcsIDg3LCAxMDAsIDg3LCB9LAotezg4LCA4OCwgMTAwLCA4OCwgfSwKLXs4OSwgODksIDEwMCwgODksIH0sCi17OTAsIDkwLCAxMDAsIDkwLCB9LAotezkxLCA5MSwgMTAwLCA5MSwgfSwKLXs5MiwgOTIsIDEwMCwgOTIsIH0sCi17OTMsIDkzLCAxMDAsIDkzLCB9LAotezk0LCA5NCwgMTAwLCA5NCwgfSwKLXs5NSwgOTUsIDEwMCwgOTUsIH0sCi17OTYsIDk2LCAxMDAsIDk2LCB9LAotezk3LCA5NywgMTAwLCA5NywgfSwKLXs5OCwgOTgsIDEwMCwgOTgsIH0sCi17OTksIDk5LCAxMDAsIDk5LCB9LAotezEwMCwgMTAsIDEwMCwgNTAsIH0sCi17MTAxLCAxMCwgMTAwLCA1MCwgfSwKLXsxMDIsIDEwLCAxMDAsIDUwLCB9LAotezEwMywgMTAsIDEwMCwgNTAsIH0sCi17MTA0LCAxMCwgMTAwLCA1MCwgfSwKLXsxMDUsIDEwLCAxMDAsIDUwLCB9LAotezEwNiwgMTAsIDEwMCwgNTAsIH0sCi17MTA3LCAxMCwgMTAwLCA1MCwgfSwKLXsxMDgsIDEwLCAxMDAsIDUwLCB9LAotezEwOSwgMTAsIDEwMCwgNTAsIH0sCi17MTEwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMTEsIDEwLCAxMDAsIDUwLCB9LAotezExMiwgMTAsIDEwMCwgNTAsIH0sCi17MTEzLCAxMCwgMTAwLCA1MCwgfSwKLXsxMTQsIDEwLCAxMDAsIDUwLCB9LAotezExNSwgMTAsIDEwMCwgNTAsIH0sCi17MTE2LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTcsIDEwLCAxMDAsIDUwLCB9LAotezExOCwgMTAsIDEwMCwgNTAsIH0sCi17MTE5LCAxMCwgMTAwLCA1MCwgfSwKLXsxMjAsIDEwLCAxMDAsIDUwLCB9LAotezEyMSwgMTAsIDEwMCwgNTAsIH0sCi17MTIyLCAxMCwgMTAwLCA1MCwgfSwKLXsxMjMsIDEwLCAxMDAsIDUwLCB9LAotezEyNCwgMTAsIDEwMCwgNTAsIH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldE1heGltdW1WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgfSwKLXstMTMsIDEwLCAxMDAsIDUwLCB9LAotey0xMiwgMTAsIDEwMCwgNTAsIH0sCi17LTExLCAxMCwgMTAwLCA1MCwgfSwKLXstMTAsIDEwLCAxMDAsIDUwLCB9LAotey05LCAxMCwgMTAwLCA1MCwgfSwKLXstOCwgMTAsIDEwMCwgNTAsIH0sCi17LTcsIDEwLCAxMDAsIDUwLCB9LAotey02LCAxMCwgMTAwLCA1MCwgfSwKLXstNSwgMTAsIDEwMCwgNTAsIH0sCi17LTQsIDEwLCAxMDAsIDUwLCB9LAotey0zLCAxMCwgMTAwLCA1MCwgfSwKLXstMiwgMTAsIDEwMCwgNTAsIH0sCi17LTEsIDEwLCAxMDAsIDUwLCB9LAotezAsIDEwLCAxMDAsIDUwLCB9LAotezEsIDEwLCAxMDAsIDUwLCB9LAotezIsIDEwLCAxMDAsIDUwLCB9LAotezMsIDEwLCAxMDAsIDUwLCB9LAotezQsIDEwLCAxMDAsIDUwLCB9LAotezUsIDEwLCAxMDAsIDUwLCB9LAotezYsIDEwLCAxMDAsIDUwLCB9LAotezcsIDEwLCAxMDAsIDUwLCB9LAotezgsIDEwLCAxMDAsIDUwLCB9LAotezksIDEwLCAxMDAsIDUwLCB9LAotezEwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMSwgMTAsIDExLCAxMSwgfSwKLXsxMiwgMTAsIDEyLCAxMiwgfSwKLXsxMywgMTAsIDEzLCAxMywgfSwKLXsxNCwgMTAsIDE0LCAxNCwgfSwKLXsxNSwgMTAsIDE1LCAxNSwgfSwKLXsxNiwgMTAsIDE2LCAxNiwgfSwKLXsxNywgMTAsIDE3LCAxNywgfSwKLXsxOCwgMTAsIDE4LCAxOCwgfSwKLXsxOSwgMTAsIDE5LCAxOSwgfSwKLXsyMCwgMTAsIDIwLCAyMCwgfSwKLXsyMSwgMTAsIDIxLCAyMSwgfSwKLXsyMiwgMTAsIDIyLCAyMiwgfSwKLXsyMywgMTAsIDIzLCAyMywgfSwKLXsyNCwgMTAsIDI0LCAyNCwgfSwKLXsyNSwgMTAsIDI1LCAyNSwgfSwKLXsyNiwgMTAsIDI2LCAyNiwgfSwKLXsyNywgMTAsIDI3LCAyNywgfSwKLXsyOCwgMTAsIDI4LCAyOCwgfSwKLXsyOSwgMTAsIDI5LCAyOSwgfSwKLXszMCwgMTAsIDMwLCAzMCwgfSwKLXszMSwgMTAsIDMxLCAzMSwgfSwKLXszMiwgMTAsIDMyLCAzMiwgfSwKLXszMywgMTAsIDMzLCAzMywgfSwKLXszNCwgMTAsIDM0LCAzNCwgfSwKLXszNSwgMTAsIDM1LCAzNSwgfSwKLXszNiwgMTAsIDM2LCAzNiwgfSwKLXszNywgMTAsIDM3LCAzNywgfSwKLXszOCwgMTAsIDM4LCAzOCwgfSwKLXszOSwgMTAsIDM5LCAzOSwgfSwKLXs0MCwgMTAsIDQwLCA0MCwgfSwKLXs0MSwgMTAsIDQxLCA0MSwgfSwKLXs0MiwgMTAsIDQyLCA0MiwgfSwKLXs0MywgMTAsIDQzLCA0MywgfSwKLXs0NCwgMTAsIDQ0LCA0NCwgfSwKLXs0NSwgMTAsIDQ1LCA0NSwgfSwKLXs0NiwgMTAsIDQ2LCA0NiwgfSwKLXs0NywgMTAsIDQ3LCA0NywgfSwKLXs0OCwgMTAsIDQ4LCA0OCwgfSwKLXs0OSwgMTAsIDQ5LCA0OSwgfSwKLXs1MCwgMTAsIDUwLCA1MCwgfSwKLXs1MSwgMTAsIDUxLCA1MCwgfSwKLXs1MiwgMTAsIDUyLCA1MCwgfSwKLXs1MywgMTAsIDUzLCA1MCwgfSwKLXs1NCwgMTAsIDU0LCA1MCwgfSwKLXs1NSwgMTAsIDU1LCA1MCwgfSwKLXs1NiwgMTAsIDU2LCA1MCwgfSwKLXs1NywgMTAsIDU3LCA1MCwgfSwKLXs1OCwgMTAsIDU4LCA1MCwgfSwKLXs1OSwgMTAsIDU5LCA1MCwgfSwKLXs2MCwgMTAsIDYwLCA1MCwgfSwKLXs2MSwgMTAsIDYxLCA1MCwgfSwKLXs2MiwgMTAsIDYyLCA1MCwgfSwKLXs2MywgMTAsIDYzLCA1MCwgfSwKLXs2NCwgMTAsIDY0LCA1MCwgfSwKLXs2NSwgMTAsIDY1LCA1MCwgfSwKLXs2NiwgMTAsIDY2LCA1MCwgfSwKLXs2NywgMTAsIDY3LCA1MCwgfSwKLXs2OCwgMTAsIDY4LCA1MCwgfSwKLXs2OSwgMTAsIDY5LCA1MCwgfSwKLXs3MCwgMTAsIDcwLCA1MCwgfSwKLXs3MSwgMTAsIDcxLCA1MCwgfSwKLXs3MiwgMTAsIDcyLCA1MCwgfSwKLXs3MywgMTAsIDczLCA1MCwgfSwKLXs3NCwgMTAsIDc0LCA1MCwgfSwKLXs3NSwgMTAsIDc1LCA1MCwgfSwKLXs3NiwgMTAsIDc2LCA1MCwgfSwKLXs3NywgMTAsIDc3LCA1MCwgfSwKLXs3OCwgMTAsIDc4LCA1MCwgfSwKLXs3OSwgMTAsIDc5LCA1MCwgfSwKLXs4MCwgMTAsIDgwLCA1MCwgfSwKLXs4MSwgMTAsIDgxLCA1MCwgfSwKLXs4MiwgMTAsIDgyLCA1MCwgfSwKLXs4MywgMTAsIDgzLCA1MCwgfSwKLXs4NCwgMTAsIDg0LCA1MCwgfSwKLXs4NSwgMTAsIDg1LCA1MCwgfSwKLXs4NiwgMTAsIDg2LCA1MCwgfSwKLXs4NywgMTAsIDg3LCA1MCwgfSwKLXs4OCwgMTAsIDg4LCA1MCwgfSwKLXs4OSwgMTAsIDg5LCA1MCwgfSwKLXs5MCwgMTAsIDkwLCA1MCwgfSwKLXs5MSwgMTAsIDkxLCA1MCwgfSwKLXs5MiwgMTAsIDkyLCA1MCwgfSwKLXs5MywgMTAsIDkzLCA1MCwgfSwKLXs5NCwgMTAsIDk0LCA1MCwgfSwKLXs5NSwgMTAsIDk1LCA1MCwgfSwKLXs5NiwgMTAsIDk2LCA1MCwgfSwKLXs5NywgMTAsIDk3LCA1MCwgfSwKLXs5OCwgMTAsIDk4LCA1MCwgfSwKLXs5OSwgMTAsIDk5LCA1MCwgfSwKLXsxMDAsIDEwLCAxMDAsIDUwLCB9LAotezEwMSwgMTAsIDEwMSwgNTAsIH0sCi17MTAyLCAxMCwgMTAyLCA1MCwgfSwKLXsxMDMsIDEwLCAxMDMsIDUwLCB9LAotezEwNCwgMTAsIDEwNCwgNTAsIH0sCi17MTA1LCAxMCwgMTA1LCA1MCwgfSwKLXsxMDYsIDEwLCAxMDYsIDUwLCB9LAotezEwNywgMTAsIDEwNywgNTAsIH0sCi17MTA4LCAxMCwgMTA4LCA1MCwgfSwKLXsxMDksIDEwLCAxMDksIDUwLCB9LAotezExMCwgMTAsIDExMCwgNTAsIH0sCi17MTExLCAxMCwgMTExLCA1MCwgfSwKLXsxMTIsIDEwLCAxMTIsIDUwLCB9LAotezExMywgMTAsIDExMywgNTAsIH0sCi17MTE0LCAxMCwgMTE0LCA1MCwgfSwKLXsxMTUsIDEwLCAxMTUsIDUwLCB9LAotezExNiwgMTAsIDExNiwgNTAsIH0sCi17MTE3LCAxMCwgMTE3LCA1MCwgfSwKLXsxMTgsIDEwLCAxMTgsIDUwLCB9LAotezExOSwgMTAsIDExOSwgNTAsIH0sCi17MTIwLCAxMCwgMTIwLCA1MCwgfSwKLXsxMjEsIDEwLCAxMjEsIDUwLCB9LAotezEyMiwgMTAsIDEyMiwgNTAsIH0sCi17MTIzLCAxMCwgMTIzLCA1MCwgfSwKLXsxMjQsIDEwLCAxMjQsIDUwLCB9LAotfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBzZXREZWZhdWx0cygpIHsKLQlzY2FsZS5zZXRNYXhpbXVtKDEwMCk7Ci0Jc2NhbGUuc2V0TWluaW11bSgxMCk7Ci0Jc2NhbGUuc2V0U2VsZWN0aW9uKDUwKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRTZWxlY3Rpb25WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgMTAsIH0sCi17LTE0LCAxMCwgMTAwLCAxMCwgfSwKLXstMTMsIDEwLCAxMDAsIDEwLCB9LAotey0xMiwgMTAsIDEwMCwgMTAsIH0sCi17LTExLCAxMCwgMTAwLCAxMCwgfSwKLXstMTAsIDEwLCAxMDAsIDEwLCB9LAotey05LCAxMCwgMTAwLCAxMCwgfSwKLXstOCwgMTAsIDEwMCwgMTAsIH0sCi17LTcsIDEwLCAxMDAsIDEwLCB9LAotey02LCAxMCwgMTAwLCAxMCwgfSwKLXstNSwgMTAsIDEwMCwgMTAsIH0sCi17LTQsIDEwLCAxMDAsIDEwLCB9LAotey0zLCAxMCwgMTAwLCAxMCwgfSwKLXstMiwgMTAsIDEwMCwgMTAsIH0sCi17LTEsIDEwLCAxMDAsIDEwLCB9LAotezAsIDEwLCAxMDAsIDEwLCB9LAotezEsIDEwLCAxMDAsIDEwLCB9LAotezIsIDEwLCAxMDAsIDEwLCB9LAotezMsIDEwLCAxMDAsIDEwLCB9LAotezQsIDEwLCAxMDAsIDEwLCB9LAotezUsIDEwLCAxMDAsIDEwLCB9LAotezYsIDEwLCAxMDAsIDEwLCB9LAotezcsIDEwLCAxMDAsIDEwLCB9LAotezgsIDEwLCAxMDAsIDEwLCB9LAotezksIDEwLCAxMDAsIDEwLCB9LAotezEwLCAxMCwgMTAwLCAxMCwgfSwKLXsxMSwgMTAsIDEwMCwgMTEsIH0sCi17MTIsIDEwLCAxMDAsIDEyLCB9LAotezEzLCAxMCwgMTAwLCAxMywgfSwKLXsxNCwgMTAsIDEwMCwgMTQsIH0sCi17MTUsIDEwLCAxMDAsIDE1LCB9LAotezE2LCAxMCwgMTAwLCAxNiwgfSwKLXsxNywgMTAsIDEwMCwgMTcsIH0sCi17MTgsIDEwLCAxMDAsIDE4LCB9LAotezE5LCAxMCwgMTAwLCAxOSwgfSwKLXsyMCwgMTAsIDEwMCwgMjAsIH0sCi17MjEsIDEwLCAxMDAsIDIxLCB9LAotezIyLCAxMCwgMTAwLCAyMiwgfSwKLXsyMywgMTAsIDEwMCwgMjMsIH0sCi17MjQsIDEwLCAxMDAsIDI0LCB9LAotezI1LCAxMCwgMTAwLCAyNSwgfSwKLXsyNiwgMTAsIDEwMCwgMjYsIH0sCi17MjcsIDEwLCAxMDAsIDI3LCB9LAotezI4LCAxMCwgMTAwLCAyOCwgfSwKLXsyOSwgMTAsIDEwMCwgMjksIH0sCi17MzAsIDEwLCAxMDAsIDMwLCB9LAotezMxLCAxMCwgMTAwLCAzMSwgfSwKLXszMiwgMTAsIDEwMCwgMzIsIH0sCi17MzMsIDEwLCAxMDAsIDMzLCB9LAotezM0LCAxMCwgMTAwLCAzNCwgfSwKLXszNSwgMTAsIDEwMCwgMzUsIH0sCi17MzYsIDEwLCAxMDAsIDM2LCB9LAotezM3LCAxMCwgMTAwLCAzNywgfSwKLXszOCwgMTAsIDEwMCwgMzgsIH0sCi17MzksIDEwLCAxMDAsIDM5LCB9LAotezQwLCAxMCwgMTAwLCA0MCwgfSwKLXs0MSwgMTAsIDEwMCwgNDEsIH0sCi17NDIsIDEwLCAxMDAsIDQyLCB9LAotezQzLCAxMCwgMTAwLCA0MywgfSwKLXs0NCwgMTAsIDEwMCwgNDQsIH0sCi17NDUsIDEwLCAxMDAsIDQ1LCB9LAotezQ2LCAxMCwgMTAwLCA0NiwgfSwKLXs0NywgMTAsIDEwMCwgNDcsIH0sCi17NDgsIDEwLCAxMDAsIDQ4LCB9LAotezQ5LCAxMCwgMTAwLCA0OSwgfSwKLXs1MCwgMTAsIDEwMCwgNTAsIH0sCi17NTEsIDEwLCAxMDAsIDUxLCB9LAotezUyLCAxMCwgMTAwLCA1MiwgfSwKLXs1MywgMTAsIDEwMCwgNTMsIH0sCi17NTQsIDEwLCAxMDAsIDU0LCB9LAotezU1LCAxMCwgMTAwLCA1NSwgfSwKLXs1NiwgMTAsIDEwMCwgNTYsIH0sCi17NTcsIDEwLCAxMDAsIDU3LCB9LAotezU4LCAxMCwgMTAwLCA1OCwgfSwKLXs1OSwgMTAsIDEwMCwgNTksIH0sCi17NjAsIDEwLCAxMDAsIDYwLCB9LAotezYxLCAxMCwgMTAwLCA2MSwgfSwKLXs2MiwgMTAsIDEwMCwgNjIsIH0sCi17NjMsIDEwLCAxMDAsIDYzLCB9LAotezY0LCAxMCwgMTAwLCA2NCwgfSwKLXs2NSwgMTAsIDEwMCwgNjUsIH0sCi17NjYsIDEwLCAxMDAsIDY2LCB9LAotezY3LCAxMCwgMTAwLCA2NywgfSwKLXs2OCwgMTAsIDEwMCwgNjgsIH0sCi17NjksIDEwLCAxMDAsIDY5LCB9LAotezcwLCAxMCwgMTAwLCA3MCwgfSwKLXs3MSwgMTAsIDEwMCwgNzEsIH0sCi17NzIsIDEwLCAxMDAsIDcyLCB9LAotezczLCAxMCwgMTAwLCA3MywgfSwKLXs3NCwgMTAsIDEwMCwgNzQsIH0sCi17NzUsIDEwLCAxMDAsIDc1LCB9LAotezc2LCAxMCwgMTAwLCA3NiwgfSwKLXs3NywgMTAsIDEwMCwgNzcsIH0sCi17NzgsIDEwLCAxMDAsIDc4LCB9LAotezc5LCAxMCwgMTAwLCA3OSwgfSwKLXs4MCwgMTAsIDEwMCwgODAsIH0sCi17ODEsIDEwLCAxMDAsIDgxLCB9LAotezgyLCAxMCwgMTAwLCA4MiwgfSwKLXs4MywgMTAsIDEwMCwgODMsIH0sCi17ODQsIDEwLCAxMDAsIDg0LCB9LAotezg1LCAxMCwgMTAwLCA4NSwgfSwKLXs4NiwgMTAsIDEwMCwgODYsIH0sCi17ODcsIDEwLCAxMDAsIDg3LCB9LAotezg4LCAxMCwgMTAwLCA4OCwgfSwKLXs4OSwgMTAsIDEwMCwgODksIH0sCi17OTAsIDEwLCAxMDAsIDkwLCB9LAotezkxLCAxMCwgMTAwLCA5MSwgfSwKLXs5MiwgMTAsIDEwMCwgOTIsIH0sCi17OTMsIDEwLCAxMDAsIDkzLCB9LAotezk0LCAxMCwgMTAwLCA5NCwgfSwKLXs5NSwgMTAsIDEwMCwgOTUsIH0sCi17OTYsIDEwLCAxMDAsIDk2LCB9LAotezk3LCAxMCwgMTAwLCA5NywgfSwKLXs5OCwgMTAsIDEwMCwgOTgsIH0sCi17OTksIDEwLCAxMDAsIDk5LCB9LAotezEwMCwgMTAsIDEwMCwgMTAwLCB9LAotezEwMSwgMTAsIDEwMCwgMTAwLCB9LAotezEwMiwgMTAsIDEwMCwgMTAwLCB9LAotezEwMywgMTAsIDEwMCwgMTAwLCB9LAotezEwNCwgMTAsIDEwMCwgMTAwLCB9LAotezEwNSwgMTAsIDEwMCwgMTAwLCB9LAotezEwNiwgMTAsIDEwMCwgMTAwLCB9LAotezEwNywgMTAsIDEwMCwgMTAwLCB9LAotezEwOCwgMTAsIDEwMCwgMTAwLCB9LAotezEwOSwgMTAsIDEwMCwgMTAwLCB9LAotezExMCwgMTAsIDEwMCwgMTAwLCB9LAotezExMSwgMTAsIDEwMCwgMTAwLCB9LAotezExMiwgMTAsIDEwMCwgMTAwLCB9LAotezExMywgMTAsIDEwMCwgMTAwLCB9LAotezExNCwgMTAsIDEwMCwgMTAwLCB9LAotezExNSwgMTAsIDEwMCwgMTAwLCB9LAotezExNiwgMTAsIDEwMCwgMTAwLCB9LAotezExNywgMTAsIDEwMCwgMTAwLCB9LAotezExOCwgMTAsIDEwMCwgMTAwLCB9LAotezExOSwgMTAsIDEwMCwgMTAwLCB9LAotezEyMCwgMTAsIDEwMCwgMTAwLCB9LAotezEyMSwgMTAsIDEwMCwgMTAwLCB9LAotezEyMiwgMTAsIDEwMCwgMTAwLCB9LAotezEyMywgMTAsIDEwMCwgMTAwLCB9LAotezEyNCwgMTAsIDEwMCwgMTAwLCB9LAotfTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24gKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX1JJR0hULCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9UaHVtYlNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg5LCAxMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Ucm91Z2hTZWxlY3Rpb24gKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjcsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjcsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg5LCA1LCAzMCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbEJhci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbEJhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWEwNDU5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbEJhcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbEJhciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsQmFyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuSF9TQ1JPTEwpOwotCXNjcm9sbEJhciA9IGNhbnZhcy5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JY2FudmFzLnNldFNpemUoMTAwLDEwMCk7Ci0Jc2V0V2lkZ2V0KHNjcm9sbEJhcik7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLXByb3RlY3RlZCBTdHJpbmcgdmFsdWVTdHJpbmcoaW50W10gaW50QXJyYXkpIHsKLQlyZXR1cm4gIiAoIitpbnRBcnJheVsxXSsiLCIraW50QXJyYXlbMl0rIiwiK2ludEFycmF5WzNdKyIsIitpbnRBcnJheVs0XSsiKSI7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQl0cnkgewotCQlzY3JvbGxCYXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlzY3JvbGxCYXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCXNjcm9sbEJhci5zZXRTZWxlY3Rpb24oMTAwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0Jc2Nyb2xsQmFyLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0cnkgewotCQlzY3JvbGxCYXIucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCS8vIHRlc3RlZCBpbiB0ZWFyRG93bgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVuYWJsZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0RW5hYmxlZCgpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEluY3JlbWVudCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRJbmNyZW1lbnQoKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNYXhpbXVtKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldE1heGltdW0oKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNaW5pbXVtKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldE1pbmltdW0oKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYWdlSW5jcmVtZW50KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFBhZ2VJbmNyZW1lbnQoKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKGNhbnZhcywgc2Nyb2xsQmFyLmdldFBhcmVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0U2VsZWN0aW9uKCkgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2l6ZSgpIHsKLQlhc3NlcnRUcnVlKHNjcm9sbEJhci5nZXRTaXplKCkueCA+IDApOwotCWFzc2VydFRydWUoc2Nyb2xsQmFyLmdldFNpemUoKS55ID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGh1bWIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VGh1bWIoKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRWaXNpYmxlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFZpc2libGUoKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0VuYWJsZWQoKSB7Ci0Jc2Nyb2xsQmFyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShzY3JvbGxCYXIuaXNFbmFibGVkKCkpOwotCi0Jc2Nyb2xsQmFyLnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIXNjcm9sbEJhci5pc0VuYWJsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNWaXNpYmxlKCkgewotCXNjcm9sbEJhci5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoc2Nyb2xsQmFyLmlzVmlzaWJsZSgpKTsgCi0Jc2Nyb2xsQmFyLnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydFRydWUoIXNjcm9sbEJhci5pc1Zpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkU2VsZWN0aW9uTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RW5hYmxlZFooKSB7Ci0Jc2Nyb2xsQmFyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShzY3JvbGxCYXIuZ2V0RW5hYmxlZCgpKTsKLQotCXNjcm9sbEJhci5zZXRFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFzY3JvbGxCYXIuZ2V0RW5hYmxlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbmNyZW1lbnRJKCkgewotCWludFtdIGNhc2VzID0gezEsIDEwLCAxMDAwMH07Ci0JZm9yIChpbnQgaT0wOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JewotCQlzY3JvbGxCYXIuc2V0SW5jcmVtZW50KGNhc2VzW2ldKTsKLQkJYXNzZXJ0RXF1YWxzKGNhc2VzW2ldLCBzY3JvbGxCYXIuZ2V0SW5jcmVtZW50KCkpOwotCX0gCi0KLQlzY3JvbGxCYXIuc2V0SW5jcmVtZW50KDI1KTsKLQlzY3JvbGxCYXIuc2V0SW5jcmVtZW50KDApOyAvLyBzZXR0aW5nIHRvIDAgZmFpbHMgc2lsZW50bHkKLQlhc3NlcnRFcXVhbHMoMjUsIHNjcm9sbEJhci5nZXRJbmNyZW1lbnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWF4aW11bUkoKXsKLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0TWF4aW11bVZhbHVlcygpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2Nyb2xsQmFyLnNldE1heGltdW0oaW50QXJyYXlbMF0pOwotCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSB2YWx1ZVN0cmluZyhpbnRBcnJheSk7Ci0JCXJlcG9ydCgic2V0TWF4ICIraW50QXJyYXlbMF0rIHZhbHVlU3RyaW5nLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSwgaW50QXJyYXlbNF0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5pbXVtSSgpewotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRNaW5pbXVtVmFsdWVzKCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlzY3JvbGxCYXIuc2V0TWluaW11bShpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRNaW4gIitpbnRBcnJheVswXSt2YWx1ZVN0cmluZywgaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10sIGludEFycmF5WzRdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UGFnZUluY3JlbWVudEkoKXsKLQlpbnRbXSBjYXNlcyA9IHsxLCAxMCwgMTAwMDB9OwotCWZvciAoaW50IGk9MDsgaTxjYXNlcy5sZW5ndGg7IGkrKykKLQl7Ci0JCXNjcm9sbEJhci5zZXRQYWdlSW5jcmVtZW50KGNhc2VzW2ldKTsKLQkJYXNzZXJ0RXF1YWxzKHNjcm9sbEJhci5nZXRQYWdlSW5jcmVtZW50KCksIGNhc2VzW2ldKTsKLQl9IAotCi0Jc2Nyb2xsQmFyLnNldFBhZ2VJbmNyZW1lbnQoMjUpOwotCXNjcm9sbEJhci5zZXRQYWdlSW5jcmVtZW50KDApOyAvLyBzZXR0aW5nIHRvIDAgZmFpbHMgc2lsZW50bHkKLQlhc3NlcnRFcXVhbHMoMjUsIHNjcm9sbEJhci5nZXRQYWdlSW5jcmVtZW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkkoKXsKLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0U2VsZWN0aW9uVmFsdWVzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2Nyb2xsQmFyLnNldFNlbGVjdGlvbihpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRTZWwgIitpbnRBcnJheVswXSt2YWx1ZVN0cmluZyxpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSwgaW50QXJyYXlbNF0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUaHVtYkkoKXsKLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0VGh1bWJWYWx1ZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlzY3JvbGxCYXIuc2V0VGh1bWIoaW50QXJyYXlbMF0pOwotCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSB2YWx1ZVN0cmluZyhpbnRBcnJheSk7Ci0JCXJlcG9ydCgic2V0VGhtYiAiK2ludEFycmF5WzBdK3ZhbHVlU3RyaW5nLGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdLCBpbnRBcnJheVs0XSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFZhbHVlc0lJSUlJSSgpIHsKLQlzY3JvbGxCYXIuc2V0VmFsdWVzKDEwLCAxMCwgNTAsIDIsIDUsIDEwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCkgPT0gMTApOwotCWFzc2VydFRydWUoIjpiOiIsIHNjcm9sbEJhci5nZXRNaW5pbXVtKCkgPT0gMTApOwotCWFzc2VydFRydWUoIjpjOiIsIHNjcm9sbEJhci5nZXRNYXhpbXVtKCkgPT0gNTApOwotCWFzc2VydFRydWUoIjpkOiIsIHNjcm9sbEJhci5nZXRUaHVtYigpID09IDIpOwotCWFzc2VydFRydWUoIjplOiIsIHNjcm9sbEJhci5nZXRJbmNyZW1lbnQoKSA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBzY3JvbGxCYXIuZ2V0UGFnZUluY3JlbWVudCgpID09IDEwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRWaXNpYmxlWigpIHsKLQlzY3JvbGxCYXIuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKHNjcm9sbEJhci5nZXRWaXNpYmxlKCkpOwotCi0Jc2Nyb2xsQmFyLnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydFRydWUoIXNjcm9sbEJhci5nZXRWaXNpYmxlKCkpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbEJhcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbmNyZW1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1heGltdW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1pbmltdW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhZ2VJbmNyZW1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaXplIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUaHVtYiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1Zpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVuYWJsZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbmNyZW1lbnRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNYXhpbXVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluaW11bUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFBhZ2VJbmNyZW1lbnRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUaHVtYkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFZhbHVlc0lJSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVuYWJsZWQiKSkgdGVzdF9nZXRFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbmNyZW1lbnQiKSkgdGVzdF9nZXRJbmNyZW1lbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1heGltdW0iKSkgdGVzdF9nZXRNYXhpbXVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNaW5pbXVtIikpIHRlc3RfZ2V0TWluaW11bSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFnZUluY3JlbWVudCIpKSB0ZXN0X2dldFBhZ2VJbmNyZW1lbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaXplIikpIHRlc3RfZ2V0U2l6ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGh1bWIiKSkgdGVzdF9nZXRUaHVtYigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VmlzaWJsZSIpKSB0ZXN0X2dldFZpc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW5hYmxlZCIpKSB0ZXN0X2lzRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNWaXNpYmxlIikpIHRlc3RfaXNWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RW5hYmxlZFoiKSkgdGVzdF9zZXRFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW5jcmVtZW50SSIpKSB0ZXN0X3NldEluY3JlbWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1heGltdW1JIikpIHRlc3Rfc2V0TWF4aW11bUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbmltdW1JIikpIHRlc3Rfc2V0TWluaW11bUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFBhZ2VJbmNyZW1lbnRJIikpIHRlc3Rfc2V0UGFnZUluY3JlbWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUaHVtYkkiKSkgdGVzdF9zZXRUaHVtYkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFZhbHVlc0lJSUlJSSIpKSB0ZXN0X3NldFZhbHVlc0lJSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmlzaWJsZVoiKSkgdGVzdF9zZXRWaXNpYmxlWigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLVNjcm9sbEJhciBzY3JvbGxCYXI7Ci1DYW52YXMgY2FudmFzOwotCi0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgcmVwb3J0KFN0cmluZyBjYWxsLCBpbnQgc2V0LCBpbnQgbWluRXhwZWN0ZWQsIGludCBtYXhFeHBlY3RlZCwgaW50IHNlbGVjdGlvbkV4cGVjdGVkLCBpbnQgdGh1bWJFeHBlY3RlZCkgewotCS8vIFVuY29tbWVudCB0aGVzZSBsaW5lcyBhbmQgY29tbWVudCBvdXQgY2FsbCB0byBjaGVjaygpIGlmIHlvdSB3YW50IHRoZSB0ZXN0IHRvIHJlcG9ydCBhbGwgZXJyb3JzIHdpdGhvdXQKLQkvLyBzdG9wcGluZy4KLS8vCWlmIChzY3JvbGxCYXIuZ2V0TWluaW11bSgpICE9IG1pbkV4cGVjdGVkKSB7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiIDogTWluaW11bSBFeHBlY3RlZDogIiArIG1pbkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgc2Nyb2xsQmFyLmdldE1pbmltdW0oKSk7Ci0vLwl9Ci0vLwlpZiAoc2Nyb2xsQmFyLmdldE1heGltdW0oKSAhPSBtYXhFeHBlY3RlZCl7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiIDogTWF4aW11bSBFeHBlY3RlZDogIiArIG1heEV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgc2Nyb2xsQmFyLmdldE1heGltdW0oKSk7Ci0vLwl9Ci0vLwlpZiAoc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpICE9IHNlbGVjdGlvbkV4cGVjdGVkKSB7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiIDogU2VsZWN0aW9uIEV4cGVjdGVkOiAiICsgc2VsZWN0aW9uRXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyBzY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCkpOwotLy8JfQotLy8JaWYgKHNjcm9sbEJhci5nZXRUaHVtYigpICE9IHRodW1iRXhwZWN0ZWQpIHsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIgOiBUaHVtYiBFeHBlY3RlZDogIiArIHRodW1iRXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyBzY3JvbGxCYXIuZ2V0VGh1bWIoKSk7Ci0vLwl9Ci0JY2hlY2soY2FsbCwgbWluRXhwZWN0ZWQsIG1heEV4cGVjdGVkLCBzZWxlY3Rpb25FeHBlY3RlZCwgdGh1bWJFeHBlY3RlZCk7Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgY2hlY2soU3RyaW5nIGNhbGwsIGludCBtaW5FeHBlY3RlZCwgaW50IG1heEV4cGVjdGVkLCBpbnQgc2VsZWN0aW9uRXhwZWN0ZWQsIGludCB0aHVtYkV4cGVjdGVkKSB7Ci0JYXNzZXJ0RXF1YWxzKGNhbGwrIiBtYXggIiwgbWF4RXhwZWN0ZWQsIHNjcm9sbEJhci5nZXRNYXhpbXVtKCkpOwotCWFzc2VydEVxdWFscyhjYWxsKyIgbWluICIsIG1pbkV4cGVjdGVkLCBzY3JvbGxCYXIuZ2V0TWluaW11bSgpKTsKLQlhc3NlcnRFcXVhbHMoY2FsbCsiIHNlbCAiLCBzZWxlY3Rpb25FeHBlY3RlZCwgc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpKTsKLQlhc3NlcnRFcXVhbHMoY2FsbCsiIHRobWIgIiwgdGh1bWJFeHBlY3RlZCwgc2Nyb2xsQmFyLmdldFRodW1iKCkpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldFRodW1iVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTExLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNywgMTAsIDEwMCwgNTAsIDEwfSwKLXstNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXswLCAxMCwgMTAwLCA1MCwgMTB9LAotezEsIDEwLCAxMDAsIDUwLCAxfSwKLXsyLCAxMCwgMTAwLCA1MCwgMn0sCi17MywgMTAsIDEwMCwgNTAsIDN9LAotezQsIDEwLCAxMDAsIDUwLCA0fSwKLXs1LCAxMCwgMTAwLCA1MCwgNX0sCi17NiwgMTAsIDEwMCwgNTAsIDZ9LAotezcsIDEwLCAxMDAsIDUwLCA3fSwKLXs4LCAxMCwgMTAwLCA1MCwgOH0sCi17OSwgMTAsIDEwMCwgNTAsIDl9LAotezEwLCAxMCwgMTAwLCA1MCwgMTB9LAotezExLCAxMCwgMTAwLCA1MCwgMTF9LAotezEyLCAxMCwgMTAwLCA1MCwgMTJ9LAotezEzLCAxMCwgMTAwLCA1MCwgMTN9LAotezE0LCAxMCwgMTAwLCA1MCwgMTR9LAotezE1LCAxMCwgMTAwLCA1MCwgMTV9LAotezE2LCAxMCwgMTAwLCA1MCwgMTZ9LAotezE3LCAxMCwgMTAwLCA1MCwgMTd9LAotezE4LCAxMCwgMTAwLCA1MCwgMTh9LAotezE5LCAxMCwgMTAwLCA1MCwgMTl9LAotezIwLCAxMCwgMTAwLCA1MCwgMjB9LAotezIxLCAxMCwgMTAwLCA1MCwgMjF9LAotezIyLCAxMCwgMTAwLCA1MCwgMjJ9LAotezIzLCAxMCwgMTAwLCA1MCwgMjN9LAotezI0LCAxMCwgMTAwLCA1MCwgMjR9LAotezI1LCAxMCwgMTAwLCA1MCwgMjV9LAotezI2LCAxMCwgMTAwLCA1MCwgMjZ9LAotezI3LCAxMCwgMTAwLCA1MCwgMjd9LAotezI4LCAxMCwgMTAwLCA1MCwgMjh9LAotezI5LCAxMCwgMTAwLCA1MCwgMjl9LAotezMwLCAxMCwgMTAwLCA1MCwgMzB9LAotezMxLCAxMCwgMTAwLCA1MCwgMzF9LAotezMyLCAxMCwgMTAwLCA1MCwgMzJ9LAotezMzLCAxMCwgMTAwLCA1MCwgMzN9LAotezM0LCAxMCwgMTAwLCA1MCwgMzR9LAotezM1LCAxMCwgMTAwLCA1MCwgMzV9LAotezM2LCAxMCwgMTAwLCA1MCwgMzZ9LAotezM3LCAxMCwgMTAwLCA1MCwgMzd9LAotezM4LCAxMCwgMTAwLCA1MCwgMzh9LAotezM5LCAxMCwgMTAwLCA1MCwgMzl9LAotezQwLCAxMCwgMTAwLCA1MCwgNDB9LAotezQxLCAxMCwgMTAwLCA1MCwgNDF9LAotezQyLCAxMCwgMTAwLCA1MCwgNDJ9LAotezQzLCAxMCwgMTAwLCA1MCwgNDN9LAotezQ0LCAxMCwgMTAwLCA1MCwgNDR9LAotezQ1LCAxMCwgMTAwLCA1MCwgNDV9LAotezQ2LCAxMCwgMTAwLCA1MCwgNDZ9LAotezQ3LCAxMCwgMTAwLCA1MCwgNDd9LAotezQ4LCAxMCwgMTAwLCA1MCwgNDh9LAotezQ5LCAxMCwgMTAwLCA1MCwgNDl9LAotezUwLCAxMCwgMTAwLCA1MCwgNTB9LAotezUxLCAxMCwgMTAwLCA0OSwgNTF9LAotezUyLCAxMCwgMTAwLCA0OCwgNTJ9LAotezUzLCAxMCwgMTAwLCA0NywgNTN9LAotezU0LCAxMCwgMTAwLCA0NiwgNTR9LAotezU1LCAxMCwgMTAwLCA0NSwgNTV9LAotezU2LCAxMCwgMTAwLCA0NCwgNTZ9LAotezU3LCAxMCwgMTAwLCA0MywgNTd9LAotezU4LCAxMCwgMTAwLCA0MiwgNTh9LAotezU5LCAxMCwgMTAwLCA0MSwgNTl9LAotezYwLCAxMCwgMTAwLCA0MCwgNjB9LAotezYxLCAxMCwgMTAwLCAzOSwgNjF9LAotezYyLCAxMCwgMTAwLCAzOCwgNjJ9LAotezYzLCAxMCwgMTAwLCAzNywgNjN9LAotezY0LCAxMCwgMTAwLCAzNiwgNjR9LAotezY1LCAxMCwgMTAwLCAzNSwgNjV9LAotezY2LCAxMCwgMTAwLCAzNCwgNjZ9LAotezY3LCAxMCwgMTAwLCAzMywgNjd9LAotezY4LCAxMCwgMTAwLCAzMiwgNjh9LAotezY5LCAxMCwgMTAwLCAzMSwgNjl9LAotezcwLCAxMCwgMTAwLCAzMCwgNzB9LAotezcxLCAxMCwgMTAwLCAyOSwgNzF9LAotezcyLCAxMCwgMTAwLCAyOCwgNzJ9LAotezczLCAxMCwgMTAwLCAyNywgNzN9LAotezc0LCAxMCwgMTAwLCAyNiwgNzR9LAotezc1LCAxMCwgMTAwLCAyNSwgNzV9LAotezc2LCAxMCwgMTAwLCAyNCwgNzZ9LAotezc3LCAxMCwgMTAwLCAyMywgNzd9LAotezc4LCAxMCwgMTAwLCAyMiwgNzh9LAotezc5LCAxMCwgMTAwLCAyMSwgNzl9LAotezgwLCAxMCwgMTAwLCAyMCwgODB9LAotezgxLCAxMCwgMTAwLCAxOSwgODF9LAotezgyLCAxMCwgMTAwLCAxOCwgODJ9LAotezgzLCAxMCwgMTAwLCAxNywgODN9LAotezg0LCAxMCwgMTAwLCAxNiwgODR9LAotezg1LCAxMCwgMTAwLCAxNSwgODV9LAotezg2LCAxMCwgMTAwLCAxNCwgODZ9LAotezg3LCAxMCwgMTAwLCAxMywgODd9LAotezg4LCAxMCwgMTAwLCAxMiwgODh9LAotezg5LCAxMCwgMTAwLCAxMSwgODl9LAotezkwLCAxMCwgMTAwLCAxMCwgOTB9LAotezkxLCAxMCwgMTAwLCAxMCwgOTB9LAotezkyLCAxMCwgMTAwLCAxMCwgOTB9LAotezkzLCAxMCwgMTAwLCAxMCwgOTB9LAotezk0LCAxMCwgMTAwLCAxMCwgOTB9LAotezk1LCAxMCwgMTAwLCAxMCwgOTB9LAotezk2LCAxMCwgMTAwLCAxMCwgOTB9LAotezk3LCAxMCwgMTAwLCAxMCwgOTB9LAotezk4LCAxMCwgMTAwLCAxMCwgOTB9LAotezk5LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwMCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDEsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTAyLCAxMCwgMTAwLCAxMCwgOTB9LAotezEwMywgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDQsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA1LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwNiwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDcsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA4LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwOSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTAsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTExLCAxMCwgMTAwLCAxMCwgOTB9LAotezExMiwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTMsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE0LCAxMCwgMTAwLCAxMCwgOTB9LAotezExNSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTYsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE3LCAxMCwgMTAwLCAxMCwgOTB9LAotezExOCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTksIDEwLCAxMDAsIDEwLCA5MH0sCi17MTIwLCAxMCwgMTAwLCAxMCwgOTB9LAotezEyMSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMjIsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTIzLCAxMCwgMTAwLCAxMCwgOTB9LAotezEyNCwgMTAsIDEwMCwgMTAsIDkwfSwKLX07Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0TWluaW11bVZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEyLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTksIDEwLCAxMDAsIDUwLCAxMH0sCi17LTgsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTcsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTYsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MCwgMCwgMTAwLCA1MCwgMTB9LAotezEsIDEsIDEwMCwgNTAsIDEwfSwKLXsyLCAyLCAxMDAsIDUwLCAxMH0sCi17MywgMywgMTAwLCA1MCwgMTB9LAotezQsIDQsIDEwMCwgNTAsIDEwfSwKLXs1LCA1LCAxMDAsIDUwLCAxMH0sCi17NiwgNiwgMTAwLCA1MCwgMTB9LAotezcsIDcsIDEwMCwgNTAsIDEwfSwKLXs4LCA4LCAxMDAsIDUwLCAxMH0sCi17OSwgOSwgMTAwLCA1MCwgMTB9LAotezEwLCAxMCwgMTAwLCA1MCwgMTB9LAotezExLCAxMSwgMTAwLCA1MCwgMTB9LAotezEyLCAxMiwgMTAwLCA1MCwgMTB9LAotezEzLCAxMywgMTAwLCA1MCwgMTB9LAotezE0LCAxNCwgMTAwLCA1MCwgMTB9LAotezE1LCAxNSwgMTAwLCA1MCwgMTB9LAotezE2LCAxNiwgMTAwLCA1MCwgMTB9LAotezE3LCAxNywgMTAwLCA1MCwgMTB9LAotezE4LCAxOCwgMTAwLCA1MCwgMTB9LAotezE5LCAxOSwgMTAwLCA1MCwgMTB9LAotezIwLCAyMCwgMTAwLCA1MCwgMTB9LAotezIxLCAyMSwgMTAwLCA1MCwgMTB9LAotezIyLCAyMiwgMTAwLCA1MCwgMTB9LAotezIzLCAyMywgMTAwLCA1MCwgMTB9LAotezI0LCAyNCwgMTAwLCA1MCwgMTB9LAotezI1LCAyNSwgMTAwLCA1MCwgMTB9LAotezI2LCAyNiwgMTAwLCA1MCwgMTB9LAotezI3LCAyNywgMTAwLCA1MCwgMTB9LAotezI4LCAyOCwgMTAwLCA1MCwgMTB9LAotezI5LCAyOSwgMTAwLCA1MCwgMTB9LAotezMwLCAzMCwgMTAwLCA1MCwgMTB9LAotezMxLCAzMSwgMTAwLCA1MCwgMTB9LAotezMyLCAzMiwgMTAwLCA1MCwgMTB9LAotezMzLCAzMywgMTAwLCA1MCwgMTB9LAotezM0LCAzNCwgMTAwLCA1MCwgMTB9LAotezM1LCAzNSwgMTAwLCA1MCwgMTB9LAotezM2LCAzNiwgMTAwLCA1MCwgMTB9LAotezM3LCAzNywgMTAwLCA1MCwgMTB9LAotezM4LCAzOCwgMTAwLCA1MCwgMTB9LAotezM5LCAzOSwgMTAwLCA1MCwgMTB9LAotezQwLCA0MCwgMTAwLCA1MCwgMTB9LAotezQxLCA0MSwgMTAwLCA1MCwgMTB9LAotezQyLCA0MiwgMTAwLCA1MCwgMTB9LAotezQzLCA0MywgMTAwLCA1MCwgMTB9LAotezQ0LCA0NCwgMTAwLCA1MCwgMTB9LAotezQ1LCA0NSwgMTAwLCA1MCwgMTB9LAotezQ2LCA0NiwgMTAwLCA1MCwgMTB9LAotezQ3LCA0NywgMTAwLCA1MCwgMTB9LAotezQ4LCA0OCwgMTAwLCA1MCwgMTB9LAotezQ5LCA0OSwgMTAwLCA1MCwgMTB9LAotezUwLCA1MCwgMTAwLCA1MCwgMTB9LAotezUxLCA1MSwgMTAwLCA1MSwgMTB9LAotezUyLCA1MiwgMTAwLCA1MiwgMTB9LAotezUzLCA1MywgMTAwLCA1MywgMTB9LAotezU0LCA1NCwgMTAwLCA1NCwgMTB9LAotezU1LCA1NSwgMTAwLCA1NSwgMTB9LAotezU2LCA1NiwgMTAwLCA1NiwgMTB9LAotezU3LCA1NywgMTAwLCA1NywgMTB9LAotezU4LCA1OCwgMTAwLCA1OCwgMTB9LAotezU5LCA1OSwgMTAwLCA1OSwgMTB9LAotezYwLCA2MCwgMTAwLCA2MCwgMTB9LAotezYxLCA2MSwgMTAwLCA2MSwgMTB9LAotezYyLCA2MiwgMTAwLCA2MiwgMTB9LAotezYzLCA2MywgMTAwLCA2MywgMTB9LAotezY0LCA2NCwgMTAwLCA2NCwgMTB9LAotezY1LCA2NSwgMTAwLCA2NSwgMTB9LAotezY2LCA2NiwgMTAwLCA2NiwgMTB9LAotezY3LCA2NywgMTAwLCA2NywgMTB9LAotezY4LCA2OCwgMTAwLCA2OCwgMTB9LAotezY5LCA2OSwgMTAwLCA2OSwgMTB9LAotezcwLCA3MCwgMTAwLCA3MCwgMTB9LAotezcxLCA3MSwgMTAwLCA3MSwgMTB9LAotezcyLCA3MiwgMTAwLCA3MiwgMTB9LAotezczLCA3MywgMTAwLCA3MywgMTB9LAotezc0LCA3NCwgMTAwLCA3NCwgMTB9LAotezc1LCA3NSwgMTAwLCA3NSwgMTB9LAotezc2LCA3NiwgMTAwLCA3NiwgMTB9LAotezc3LCA3NywgMTAwLCA3NywgMTB9LAotezc4LCA3OCwgMTAwLCA3OCwgMTB9LAotezc5LCA3OSwgMTAwLCA3OSwgMTB9LAotezgwLCA4MCwgMTAwLCA4MCwgMTB9LAotezgxLCA4MSwgMTAwLCA4MSwgMTB9LAotezgyLCA4MiwgMTAwLCA4MiwgMTB9LAotezgzLCA4MywgMTAwLCA4MywgMTB9LAotezg0LCA4NCwgMTAwLCA4NCwgMTB9LAotezg1LCA4NSwgMTAwLCA4NSwgMTB9LAotezg2LCA4NiwgMTAwLCA4NiwgMTB9LAotezg3LCA4NywgMTAwLCA4NywgMTB9LAotezg4LCA4OCwgMTAwLCA4OCwgMTB9LAotezg5LCA4OSwgMTAwLCA4OSwgMTB9LAotezkwLCA5MCwgMTAwLCA5MCwgMTB9LAotezkxLCA5MSwgMTAwLCA5MSwgOX0sCi17OTIsIDkyLCAxMDAsIDkyLCA4fSwKLXs5MywgOTMsIDEwMCwgOTMsIDd9LAotezk0LCA5NCwgMTAwLCA5NCwgNn0sCi17OTUsIDk1LCAxMDAsIDk1LCA1fSwKLXs5NiwgOTYsIDEwMCwgOTYsIDR9LAotezk3LCA5NywgMTAwLCA5NywgM30sCi17OTgsIDk4LCAxMDAsIDk4LCAyfSwKLXs5OSwgOTksIDEwMCwgOTksIDF9LAotezEwMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTAyLCAxMCwgMTAwLCA1MCwgMTB9LAotezEwMywgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDQsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA1LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDcsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA4LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTExLCAxMCwgMTAwLCA1MCwgMTB9LAotezExMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE0LCAxMCwgMTAwLCA1MCwgMTB9LAotezExNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTYsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE3LCAxMCwgMTAwLCA1MCwgMTB9LAotezExOCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTksIDEwLCAxMDAsIDUwLCAxMH0sCi17MTIwLCAxMCwgMTAwLCA1MCwgMTB9LAotezEyMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMjIsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTIzLCAxMCwgMTAwLCA1MCwgMTB9LAotezEyNCwgMTAsIDEwMCwgNTAsIDEwfSwKLX07Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0TWF4aW11bVZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEyLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTksIDEwLCAxMDAsIDUwLCAxMH0sCi17LTgsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTcsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTYsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxLCAxMCwgMTAwLCA1MCwgMTB9LAotezIsIDEwLCAxMDAsIDUwLCAxMH0sCi17MywgMTAsIDEwMCwgNTAsIDEwfSwKLXs0LCAxMCwgMTAwLCA1MCwgMTB9LAotezUsIDEwLCAxMDAsIDUwLCAxMH0sCi17NiwgMTAsIDEwMCwgNTAsIDEwfSwKLXs3LCAxMCwgMTAwLCA1MCwgMTB9LAotezgsIDEwLCAxMDAsIDUwLCAxMH0sCi17OSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMSwgMTAsIDExLCAxMCwgMX0sCi17MTIsIDEwLCAxMiwgMTAsIDJ9LAotezEzLCAxMCwgMTMsIDEwLCAzfSwKLXsxNCwgMTAsIDE0LCAxMCwgNH0sCi17MTUsIDEwLCAxNSwgMTAsIDV9LAotezE2LCAxMCwgMTYsIDEwLCA2fSwKLXsxNywgMTAsIDE3LCAxMCwgN30sCi17MTgsIDEwLCAxOCwgMTAsIDh9LAotezE5LCAxMCwgMTksIDEwLCA5fSwKLXsyMCwgMTAsIDIwLCAxMCwgMTB9LAotezIxLCAxMCwgMjEsIDExLCAxMH0sCi17MjIsIDEwLCAyMiwgMTIsIDEwfSwKLXsyMywgMTAsIDIzLCAxMywgMTB9LAotezI0LCAxMCwgMjQsIDE0LCAxMH0sCi17MjUsIDEwLCAyNSwgMTUsIDEwfSwKLXsyNiwgMTAsIDI2LCAxNiwgMTB9LAotezI3LCAxMCwgMjcsIDE3LCAxMH0sCi17MjgsIDEwLCAyOCwgMTgsIDEwfSwKLXsyOSwgMTAsIDI5LCAxOSwgMTB9LAotezMwLCAxMCwgMzAsIDIwLCAxMH0sCi17MzEsIDEwLCAzMSwgMjEsIDEwfSwKLXszMiwgMTAsIDMyLCAyMiwgMTB9LAotezMzLCAxMCwgMzMsIDIzLCAxMH0sCi17MzQsIDEwLCAzNCwgMjQsIDEwfSwKLXszNSwgMTAsIDM1LCAyNSwgMTB9LAotezM2LCAxMCwgMzYsIDI2LCAxMH0sCi17MzcsIDEwLCAzNywgMjcsIDEwfSwKLXszOCwgMTAsIDM4LCAyOCwgMTB9LAotezM5LCAxMCwgMzksIDI5LCAxMH0sCi17NDAsIDEwLCA0MCwgMzAsIDEwfSwKLXs0MSwgMTAsIDQxLCAzMSwgMTB9LAotezQyLCAxMCwgNDIsIDMyLCAxMH0sCi17NDMsIDEwLCA0MywgMzMsIDEwfSwKLXs0NCwgMTAsIDQ0LCAzNCwgMTB9LAotezQ1LCAxMCwgNDUsIDM1LCAxMH0sCi17NDYsIDEwLCA0NiwgMzYsIDEwfSwKLXs0NywgMTAsIDQ3LCAzNywgMTB9LAotezQ4LCAxMCwgNDgsIDM4LCAxMH0sCi17NDksIDEwLCA0OSwgMzksIDEwfSwKLXs1MCwgMTAsIDUwLCA0MCwgMTB9LAotezUxLCAxMCwgNTEsIDQxLCAxMH0sCi17NTIsIDEwLCA1MiwgNDIsIDEwfSwKLXs1MywgMTAsIDUzLCA0MywgMTB9LAotezU0LCAxMCwgNTQsIDQ0LCAxMH0sCi17NTUsIDEwLCA1NSwgNDUsIDEwfSwKLXs1NiwgMTAsIDU2LCA0NiwgMTB9LAotezU3LCAxMCwgNTcsIDQ3LCAxMH0sCi17NTgsIDEwLCA1OCwgNDgsIDEwfSwKLXs1OSwgMTAsIDU5LCA0OSwgMTB9LAotezYwLCAxMCwgNjAsIDUwLCAxMH0sCi17NjEsIDEwLCA2MSwgNTAsIDEwfSwKLXs2MiwgMTAsIDYyLCA1MCwgMTB9LAotezYzLCAxMCwgNjMsIDUwLCAxMH0sCi17NjQsIDEwLCA2NCwgNTAsIDEwfSwKLXs2NSwgMTAsIDY1LCA1MCwgMTB9LAotezY2LCAxMCwgNjYsIDUwLCAxMH0sCi17NjcsIDEwLCA2NywgNTAsIDEwfSwKLXs2OCwgMTAsIDY4LCA1MCwgMTB9LAotezY5LCAxMCwgNjksIDUwLCAxMH0sCi17NzAsIDEwLCA3MCwgNTAsIDEwfSwKLXs3MSwgMTAsIDcxLCA1MCwgMTB9LAotezcyLCAxMCwgNzIsIDUwLCAxMH0sCi17NzMsIDEwLCA3MywgNTAsIDEwfSwKLXs3NCwgMTAsIDc0LCA1MCwgMTB9LAotezc1LCAxMCwgNzUsIDUwLCAxMH0sCi17NzYsIDEwLCA3NiwgNTAsIDEwfSwKLXs3NywgMTAsIDc3LCA1MCwgMTB9LAotezc4LCAxMCwgNzgsIDUwLCAxMH0sCi17NzksIDEwLCA3OSwgNTAsIDEwfSwKLXs4MCwgMTAsIDgwLCA1MCwgMTB9LAotezgxLCAxMCwgODEsIDUwLCAxMH0sCi17ODIsIDEwLCA4MiwgNTAsIDEwfSwKLXs4MywgMTAsIDgzLCA1MCwgMTB9LAotezg0LCAxMCwgODQsIDUwLCAxMH0sCi17ODUsIDEwLCA4NSwgNTAsIDEwfSwKLXs4NiwgMTAsIDg2LCA1MCwgMTB9LAotezg3LCAxMCwgODcsIDUwLCAxMH0sCi17ODgsIDEwLCA4OCwgNTAsIDEwfSwKLXs4OSwgMTAsIDg5LCA1MCwgMTB9LAotezkwLCAxMCwgOTAsIDUwLCAxMH0sCi17OTEsIDEwLCA5MSwgNTAsIDEwfSwKLXs5MiwgMTAsIDkyLCA1MCwgMTB9LAotezkzLCAxMCwgOTMsIDUwLCAxMH0sCi17OTQsIDEwLCA5NCwgNTAsIDEwfSwKLXs5NSwgMTAsIDk1LCA1MCwgMTB9LAotezk2LCAxMCwgOTYsIDUwLCAxMH0sCi17OTcsIDEwLCA5NywgNTAsIDEwfSwKLXs5OCwgMTAsIDk4LCA1MCwgMTB9LAotezk5LCAxMCwgOTksIDUwLCAxMH0sCi17MTAwLCAxMCwgMTAwLCA1MCwgMTB9LAotezEwMSwgMTAsIDEwMSwgNTAsIDEwfSwKLXsxMDIsIDEwLCAxMDIsIDUwLCAxMH0sCi17MTAzLCAxMCwgMTAzLCA1MCwgMTB9LAotezEwNCwgMTAsIDEwNCwgNTAsIDEwfSwKLXsxMDUsIDEwLCAxMDUsIDUwLCAxMH0sCi17MTA2LCAxMCwgMTA2LCA1MCwgMTB9LAotezEwNywgMTAsIDEwNywgNTAsIDEwfSwKLXsxMDgsIDEwLCAxMDgsIDUwLCAxMH0sCi17MTA5LCAxMCwgMTA5LCA1MCwgMTB9LAotezExMCwgMTAsIDExMCwgNTAsIDEwfSwKLXsxMTEsIDEwLCAxMTEsIDUwLCAxMH0sCi17MTEyLCAxMCwgMTEyLCA1MCwgMTB9LAotezExMywgMTAsIDExMywgNTAsIDEwfSwKLXsxMTQsIDEwLCAxMTQsIDUwLCAxMH0sCi17MTE1LCAxMCwgMTE1LCA1MCwgMTB9LAotezExNiwgMTAsIDExNiwgNTAsIDEwfSwKLXsxMTcsIDEwLCAxMTcsIDUwLCAxMH0sCi17MTE4LCAxMCwgMTE4LCA1MCwgMTB9LAotezExOSwgMTAsIDExOSwgNTAsIDEwfSwKLXsxMjAsIDEwLCAxMjAsIDUwLCAxMH0sCi17MTIxLCAxMCwgMTIxLCA1MCwgMTB9LAotezEyMiwgMTAsIDEyMiwgNTAsIDEwfSwKLXsxMjMsIDEwLCAxMjMsIDUwLCAxMH0sCi17MTI0LCAxMCwgMTI0LCA1MCwgMTB9LAotfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBzZXREZWZhdWx0cygpIHsKLQlzY3JvbGxCYXIuc2V0TWF4aW11bSgxMDApOwotCXNjcm9sbEJhci5zZXRNaW5pbXVtKDEwKTsKLQlzY3JvbGxCYXIuc2V0VGh1bWIoMTApOwotCXNjcm9sbEJhci5zZXRTZWxlY3Rpb24oNTApOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldFNlbGVjdGlvblZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCAxMCwgMTB9LAotey0xNCwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMTMsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTEyLCAxMCwgMTAwLCAxMCwgMTB9LAotey0xMSwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMTAsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTksIDEwLCAxMDAsIDEwLCAxMH0sCi17LTgsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTcsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTYsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTUsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTQsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTMsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTIsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTEsIDEwLCAxMDAsIDEwLCAxMH0sCi17MCwgMTAsIDEwMCwgMTAsIDEwfSwKLXsxLCAxMCwgMTAwLCAxMCwgMTB9LAotezIsIDEwLCAxMDAsIDEwLCAxMH0sCi17MywgMTAsIDEwMCwgMTAsIDEwfSwKLXs0LCAxMCwgMTAwLCAxMCwgMTB9LAotezUsIDEwLCAxMDAsIDEwLCAxMH0sCi17NiwgMTAsIDEwMCwgMTAsIDEwfSwKLXs3LCAxMCwgMTAwLCAxMCwgMTB9LAotezgsIDEwLCAxMDAsIDEwLCAxMH0sCi17OSwgMTAsIDEwMCwgMTAsIDEwfSwKLXsxMCwgMTAsIDEwMCwgMTAsIDEwfSwKLXsxMSwgMTAsIDEwMCwgMTEsIDEwfSwKLXsxMiwgMTAsIDEwMCwgMTIsIDEwfSwKLXsxMywgMTAsIDEwMCwgMTMsIDEwfSwKLXsxNCwgMTAsIDEwMCwgMTQsIDEwfSwKLXsxNSwgMTAsIDEwMCwgMTUsIDEwfSwKLXsxNiwgMTAsIDEwMCwgMTYsIDEwfSwKLXsxNywgMTAsIDEwMCwgMTcsIDEwfSwKLXsxOCwgMTAsIDEwMCwgMTgsIDEwfSwKLXsxOSwgMTAsIDEwMCwgMTksIDEwfSwKLXsyMCwgMTAsIDEwMCwgMjAsIDEwfSwKLXsyMSwgMTAsIDEwMCwgMjEsIDEwfSwKLXsyMiwgMTAsIDEwMCwgMjIsIDEwfSwKLXsyMywgMTAsIDEwMCwgMjMsIDEwfSwKLXsyNCwgMTAsIDEwMCwgMjQsIDEwfSwKLXsyNSwgMTAsIDEwMCwgMjUsIDEwfSwKLXsyNiwgMTAsIDEwMCwgMjYsIDEwfSwKLXsyNywgMTAsIDEwMCwgMjcsIDEwfSwKLXsyOCwgMTAsIDEwMCwgMjgsIDEwfSwKLXsyOSwgMTAsIDEwMCwgMjksIDEwfSwKLXszMCwgMTAsIDEwMCwgMzAsIDEwfSwKLXszMSwgMTAsIDEwMCwgMzEsIDEwfSwKLXszMiwgMTAsIDEwMCwgMzIsIDEwfSwKLXszMywgMTAsIDEwMCwgMzMsIDEwfSwKLXszNCwgMTAsIDEwMCwgMzQsIDEwfSwKLXszNSwgMTAsIDEwMCwgMzUsIDEwfSwKLXszNiwgMTAsIDEwMCwgMzYsIDEwfSwKLXszNywgMTAsIDEwMCwgMzcsIDEwfSwKLXszOCwgMTAsIDEwMCwgMzgsIDEwfSwKLXszOSwgMTAsIDEwMCwgMzksIDEwfSwKLXs0MCwgMTAsIDEwMCwgNDAsIDEwfSwKLXs0MSwgMTAsIDEwMCwgNDEsIDEwfSwKLXs0MiwgMTAsIDEwMCwgNDIsIDEwfSwKLXs0MywgMTAsIDEwMCwgNDMsIDEwfSwKLXs0NCwgMTAsIDEwMCwgNDQsIDEwfSwKLXs0NSwgMTAsIDEwMCwgNDUsIDEwfSwKLXs0NiwgMTAsIDEwMCwgNDYsIDEwfSwKLXs0NywgMTAsIDEwMCwgNDcsIDEwfSwKLXs0OCwgMTAsIDEwMCwgNDgsIDEwfSwKLXs0OSwgMTAsIDEwMCwgNDksIDEwfSwKLXs1MCwgMTAsIDEwMCwgNTAsIDEwfSwKLXs1MSwgMTAsIDEwMCwgNTEsIDEwfSwKLXs1MiwgMTAsIDEwMCwgNTIsIDEwfSwKLXs1MywgMTAsIDEwMCwgNTMsIDEwfSwKLXs1NCwgMTAsIDEwMCwgNTQsIDEwfSwKLXs1NSwgMTAsIDEwMCwgNTUsIDEwfSwKLXs1NiwgMTAsIDEwMCwgNTYsIDEwfSwKLXs1NywgMTAsIDEwMCwgNTcsIDEwfSwKLXs1OCwgMTAsIDEwMCwgNTgsIDEwfSwKLXs1OSwgMTAsIDEwMCwgNTksIDEwfSwKLXs2MCwgMTAsIDEwMCwgNjAsIDEwfSwKLXs2MSwgMTAsIDEwMCwgNjEsIDEwfSwKLXs2MiwgMTAsIDEwMCwgNjIsIDEwfSwKLXs2MywgMTAsIDEwMCwgNjMsIDEwfSwKLXs2NCwgMTAsIDEwMCwgNjQsIDEwfSwKLXs2NSwgMTAsIDEwMCwgNjUsIDEwfSwKLXs2NiwgMTAsIDEwMCwgNjYsIDEwfSwKLXs2NywgMTAsIDEwMCwgNjcsIDEwfSwKLXs2OCwgMTAsIDEwMCwgNjgsIDEwfSwKLXs2OSwgMTAsIDEwMCwgNjksIDEwfSwKLXs3MCwgMTAsIDEwMCwgNzAsIDEwfSwKLXs3MSwgMTAsIDEwMCwgNzEsIDEwfSwKLXs3MiwgMTAsIDEwMCwgNzIsIDEwfSwKLXs3MywgMTAsIDEwMCwgNzMsIDEwfSwKLXs3NCwgMTAsIDEwMCwgNzQsIDEwfSwKLXs3NSwgMTAsIDEwMCwgNzUsIDEwfSwKLXs3NiwgMTAsIDEwMCwgNzYsIDEwfSwKLXs3NywgMTAsIDEwMCwgNzcsIDEwfSwKLXs3OCwgMTAsIDEwMCwgNzgsIDEwfSwKLXs3OSwgMTAsIDEwMCwgNzksIDEwfSwKLXs4MCwgMTAsIDEwMCwgODAsIDEwfSwKLXs4MSwgMTAsIDEwMCwgODEsIDEwfSwKLXs4MiwgMTAsIDEwMCwgODIsIDEwfSwKLXs4MywgMTAsIDEwMCwgODMsIDEwfSwKLXs4NCwgMTAsIDEwMCwgODQsIDEwfSwKLXs4NSwgMTAsIDEwMCwgODUsIDEwfSwKLXs4NiwgMTAsIDEwMCwgODYsIDEwfSwKLXs4NywgMTAsIDEwMCwgODcsIDEwfSwKLXs4OCwgMTAsIDEwMCwgODgsIDEwfSwKLXs4OSwgMTAsIDEwMCwgODksIDEwfSwKLXs5MCwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5MSwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5MiwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5MywgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NCwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NSwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NiwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NywgMTAsIDEwMCwgOTAsIDEwfSwKLXs5OCwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5OSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDAsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTAxLCAxMCwgMTAwLCA5MCwgMTB9LAotezEwMiwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDMsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA0LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwNSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDYsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA3LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwOCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDksIDEwLCAxMDAsIDkwLCAxMH0sCi17MTEwLCAxMCwgMTAwLCA5MCwgMTB9LAotezExMSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTIsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTEzLCAxMCwgMTAwLCA5MCwgMTB9LAotezExNCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTUsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE2LCAxMCwgMTAwLCA5MCwgMTB9LAotezExNywgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTgsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE5LCAxMCwgMTAwLCA5MCwgMTB9LAotezEyMCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMjEsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTIyLCAxMCwgMTAwLCA5MCwgMTB9LAotezEyMywgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMjQsIDEwLCAxMDAsIDkwLCAxMH0sCi19OwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZWIyZTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY3JvbGxhYmxlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY3JvbGxhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQkvLyBhYnN0cmFjdCBjbGFzcwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpIHsKLQlzY3JvbGxhYmxlLmNvbXB1dGVUcmltKDAsIDAsIDAsIDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0Jc2Nyb2xsYWJsZS5nZXRDbGllbnRBcmVhKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SG9yaXpvbnRhbEJhcigpIHsKLQlTY3JvbGxCYXIgaGJhciA9IHNjcm9sbGFibGUuZ2V0SG9yaXpvbnRhbEJhcigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFZlcnRpY2FsQmFyKCkgewotCVNjcm9sbEJhciB2YmFyID0gc2Nyb2xsYWJsZS5nZXRWZXJ0aWNhbEJhcigpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlVHJpbUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaWVudEFyZWEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhvcml6b250YWxCYXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFZlcnRpY2FsQmFyIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlVHJpbUlJSUkiKSkgdGVzdF9jb21wdXRlVHJpbUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIb3Jpem9udGFsQmFyIikpIHRlc3RfZ2V0SG9yaXpvbnRhbEJhcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VmVydGljYWxCYXIiKSkgdGVzdF9nZXRWZXJ0aWNhbEJhcigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLQlTY3JvbGxhYmxlIHNjcm9sbGFibGU7Ci0KLXByb3RlY3RlZCB2b2lkIHNldFdpZGdldChXaWRnZXQgdykgewotCXNjcm9sbGFibGUgPSAoU2Nyb2xsYWJsZSl3OwotCXN1cGVyLnNldFdpZGdldCh3KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4N2RiZGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRlc3RTaGVsbCA9IG5ldyBTaGVsbChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldChzaGVsbCk7Ci0JYXNzZXJ0VHJ1ZSh0ZXN0U2hlbGwuZ2V0UGFyZW50KCkgPT0gc2hlbGwpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCVNoZWxsIG5ld1NoZWxsID0gbmV3IFNoZWxsKCk7Ci0JYXNzZXJ0Tm90TnVsbCgiYTogIiwgbmV3U2hlbGwuZ2V0RGlzcGxheSgpKTsKLQluZXdTaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewotCS8qIHRoaXMgc2hvdWxkIHRlc3QgdmFyaW91cyBjb21iaW5hdGlvbnMgb2YgU1RZTEUgYml0cywgZm9yIG5vdyBqdXN0IHRlc3QgaW5kaXZpZHVhbCBiaXRzICovCi0JaW50W10gY2FzZXMgPSB7U1dULk5PX1RSSU0sIFNXVC5SRVNJWkUsIFNXVC5USVRMRSwgU1dULkNMT1NFLCBTV1QuTUVOVSwgU1dULk1JTiwgU1dULkJPUkRFUiwgCi0JCQkJICAgU1dULkNMSVBfQ0hJTERSRU4sIFNXVC5DTElQX1NJQkxJTkdTLCBTV1QuT05fVE9QLCBTV1QuRkxBVCwgU1dULlNNT09USH07Ci0JU2hlbGwgbmV3U2hlbGw7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQluZXdTaGVsbCA9IG5ldyBTaGVsbChjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoImEgIiAraSwgbmV3U2hlbGwuZ2V0RGlzcGxheSgpID09IHNoZWxsLmdldERpc3BsYXkoKSk7Ci0JCW5ld1NoZWxsLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0JU2hlbGwgbmV3U2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JYXNzZXJ0VHJ1ZSgiYTogIiwgbmV3U2hlbGwuZ2V0RGlzcGxheSgpID09IGRpc3BsYXkpOwotCW5ld1NoZWxsLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSgpIHsKLQlpbnRbXSBjYXNlcyA9IHtTV1QuTk9fVFJJTSwgU1dULlJFU0laRSwgU1dULlRJVExFLCBTV1QuQ0xPU0UsIFNXVC5NRU5VLCBTV1QuTUlOLCBTV1QuQk9SREVSLCAKLQkJCQkgICBTV1QuQ0xJUF9DSElMRFJFTiwgU1dULkNMSVBfU0lCTElOR1MsIFNXVC5PTl9UT1AsIFNXVC5GTEFULCBTV1QuU01PT1RIfTsKLQlTaGVsbCBuZXdTaGVsbDsKLQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQluZXdTaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoImEgIiAraSwgbmV3U2hlbGwuZ2V0RGlzcGxheSgpID09IHNoZWxsLmdldERpc3BsYXkoKSk7Ci0JCW5ld1NoZWxsLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKSB7Ci0JU2hlbGwgbmV3U2hlbGwgPSBuZXcgU2hlbGwoc2hlbGwpOwotCWFzc2VydFRydWUoImE6ICIsIG5ld1NoZWxsLmdldFBhcmVudCgpID09IHNoZWxsKTsKLQluZXdTaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCkgewotCS8qIHRoaXMgc2hvdWxkIHRlc3QgdmFyaW91cyBjb21iaW5hdGlvbnMgb2YgU1RZTEUgYml0cywgZm9yIG5vdyBqdXN0IHRlc3QgaW5kaXZpZHVhbCBiaXRzICovCi0JaW50W10gY2FzZXMgPSB7U1dULk5PX1RSSU0sIFNXVC5SRVNJWkUsIFNXVC5USVRMRSwgU1dULkNMT1NFLCBTV1QuTUVOVSwgU1dULk1JTiwgU1dULkJPUkRFUiwgCi0JCQkJICAgU1dULkNMSVBfQ0hJTERSRU4sIFNXVC5DTElQX1NJQkxJTkdTLCBTV1QuT05fVE9QLCBTV1QuRkxBVCwgU1dULlNNT09USH07Ci0JU2hlbGwgbmV3U2hlbGw7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQluZXdTaGVsbCA9IG5ldyBTaGVsbChzaGVsbCwgY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCJhICIgK2ksIG5ld1NoZWxsLmdldFBhcmVudCgpID09IHNoZWxsKTsKLQkJbmV3U2hlbGwuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTaGVsbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JU2hlbGxMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTaGVsbExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzaGVsbEFjdGl2YXRlZChTaGVsbEV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzaGVsbENsb3NlZChTaGVsbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBzaGVsbERlYWN0aXZhdGVkKFNoZWxsRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHNoZWxsRGVpY29uaWZpZWQoU2hlbGxFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2hlbGxJY29uaWZpZWQoU2hlbGxFdmVudCBlKSB7Ci0JCX0KLQl9OwotCXRyeSB7Ci0JCXNoZWxsLmFkZFNoZWxsTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyKGxpc3RlbmVyKTsKLQlzaGVsbC5mb3JjZUFjdGl2ZSgpOwotCS8qIGNhbid0IGFzc3VtZSBsaXN0ZW5lciBpcyBzeW5jaHJvbm91c2x5IGNhbGxlZCB3aGVuIGZvcmNlQWN0aXZlIHJldHVybmVkICovCi0JLyogYXNzZXJ0VHJ1ZSgiOmE6IiwgbGlzdGVuZXJDYWxsZWQgPT0gdHJ1ZSk7ICovCi0JCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlzaGVsbC5yZW1vdmVTaGVsbExpc3RlbmVyKGxpc3RlbmVyKTsKLQlzaGVsbC5mb3JjZUFjdGl2ZSgpOwotCS8qIGNhbid0IGFzc3VtZSBsaXN0ZW5lciBpcyBzeW5jaHJvbm91c2x5IGNhbGxlZCB3aGVuIGZvcmNlQWN0aXZlIHJldHVybmVkICovCi0JLyogYXNzZXJ0VHJ1ZSgiOmI6IiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOyAqLwotCXRyeSB7Ci0JCXNoZWxsLnJlbW92ZVNoZWxsTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKLQotCS8vIGJvZ3VzIGxpbmUgdGhhdCAnZW5hYmxlZCcgZ3BmcwotCS8vCVNoZWxsIG5ld1NoZWxsID0gbmV3IFNoZWxsKCk7Ci0JdGVzdFNoZWxsLnNldEJvdW5kcygyMCwzMCwyMDAsIDIwMCk7Ci0JdGVzdFNoZWxsLm9wZW4oKTsKLQl0ZXN0U2hlbGwuY2xvc2UoKTsKLQlzaGVsbC5zZXRCb3VuZHMoMjAsMzAsMjAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCVNoZWxsIG5ld1NoZWxsID0gbmV3IFNoZWxsKCk7Ci0JbmV3U2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZvcmNlQWN0aXZlKCkgewotCXNoZWxsLmZvcmNlQWN0aXZlKCk7Ci0JLyogY2FuJ3QgYXNzdW1lIGxpc3RlbmVyIGlzIHN5bmNocm9ub3VzbHkgY2FsbGVkIHdoZW4gZm9yY2VBY3RpdmUgcmV0dXJuZWQgKi8KLQkvKiBhc3NlcnRUcnVlKCI6YToiLCBzaGVsbC5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSA9PSBzaGVsbCk7ICovCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEJvdW5kc0lJSUkgYW5kIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFbmFibGVkKCkgewotCWFzc2VydFRydWUoIjphMDoiLCBzaGVsbC5nZXRFbmFibGVkKCkpOwotCXNoZWxsLnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIjphOiIsICFzaGVsbC5nZXRFbmFibGVkKCkpOwotCXNoZWxsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc2hlbGwuZ2V0RW5hYmxlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWVJbnB1dE1vZGUoKSB7Ci0JaW50IG1vZGUgPSBzaGVsbC5nZXRJbWVJbnB1dE1vZGUoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBtb2RlID49IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExvY2F0aW9uKCkgewotCXNoZWxsLnNldExvY2F0aW9uKDEwLDE1KTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzaGVsbC5nZXRMb2NhdGlvbigpLnggPT0gMTApOwotCWFzc2VydFRydWUoIjpiOiIsIHNoZWxsLmdldExvY2F0aW9uKCkueSA9PSAxNSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVnaW9uKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFJlZ2lvbigpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2hlbGwoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2hlbGwuZ2V0U2hlbGwoKT09c2hlbGwpOwotCVNoZWxsIHNoZWxsXzEgPSBuZXcgU2hlbGwoc2hlbGwpOwotCWFzc2VydFRydWUoIjpiOiIsIHNoZWxsXzEuZ2V0U2hlbGwoKT09IHNoZWxsXzEpOwotCXNoZWxsXzEuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNoZWxscygpIHsKLQlpbnQgbnVtID0gc2hlbGwuZ2V0U2hlbGxzKCkubGVuZ3RoOwotCWFzc2VydFRydWUoIjphOiIsIG51bSA9PSAxKTsKLQlTaGVsbCBzaGVsbF8xID0gbmV3IFNoZWxsKHNoZWxsKTsKLQludW0gPSBzaGVsbC5nZXRTaGVsbHMoKS5sZW5ndGg7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbnVtID09IDIpOwotCXNoZWxsXzEuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRW5hYmxlZCgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCBzaGVsbC5pc0VuYWJsZWQoKSk7Ci0Jc2hlbGwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgIXNoZWxsLmlzRW5hYmxlZCgpKTsKLQlpZiAoZkNoZWNrQm9ndXNUZXN0Q2FzZXMpCi0JCWFzc2VydFRydWUoIjpiMToiLCAhdGVzdFNoZWxsLmlzRW5hYmxlZCgpKTsKLQlzaGVsbC5zZXRFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUoIjpjOiIsIHNoZWxsLmlzRW5hYmxlZCgpKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXN0U2hlbGwuaXNFbmFibGVkKCkpOwotCXRlc3RTaGVsbC5zZXRFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCAhdGVzdFNoZWxsLmlzRW5hYmxlZCgpKTsKLQl0ZXN0U2hlbGwuc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXN0U2hlbGwuaXNFbmFibGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW4oKSB7Ci0Jc2hlbGwub3BlbigpOwotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2hlbGxMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHJlbW92ZVNoZWxsTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWN0aXZlKCkgewotCS8qIENyZWF0ZSBzaGVsbDIgYW5kIG1ha2UgaXQgYWN0aXZlLiAqLwotCVNoZWxsIHNoZWxsMiA9IG5ldyBTaGVsbCgpOwotCXNoZWxsMi5vcGVuKCk7Ci0JCi0JLyogVGVzdCBzZXRBY3RpdmUgZm9yIHZpc2libGUgc2hlbGwuICovCi0Jc2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQlzaGVsbC5zZXRBY3RpdmUoKTsKLQlhc3NlcnRUcnVlKCJ2aXNpYmxlIHNoZWxsIHdhcyBub3QgbWFkZSBhY3RpdmUiLCBzaGVsbC5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSA9PSBzaGVsbCk7Ci0JCi0JLyogVGVzdCBzZXRBY3RpdmUgZm9yIHZpc2libGUgZGlhbG9nIHNoZWxsLiAqLwotCXNoZWxsMi5zZXRBY3RpdmUoKTsKLQl0ZXN0U2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQl0ZXN0U2hlbGwuc2V0QWN0aXZlKCk7Ci0JYXNzZXJ0VHJ1ZSgidmlzaWJsZSBkaWFsb2cgc2hlbGwgd2FzIG5vdCBtYWRlIGFjdGl2ZSIsIHRlc3RTaGVsbC5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSA9PSB0ZXN0U2hlbGwpOwotCQotCS8qIFRlc3Qgc2V0QWN0aXZlIGZvciBub24tdmlzaWJsZSBzaGVsbC4gKi8KLQlzaGVsbDIuc2V0QWN0aXZlKCk7Ci0Jc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0Jc2hlbGwuc2V0QWN0aXZlKCk7Ci0JYXNzZXJ0VHJ1ZSgibm9uLXZpc2libGUgc2hlbGwgd2FzIG1hZGUgYWN0aXZlIiwgc2hlbGwuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCkgIT0gc2hlbGwpOwotCi0JLyogVGVzdCBzZXRBY3RpdmUgZm9yIG5vbi12aXNpYmxlIGRpYWxvZyBzaGVsbC4gKi8KLQlzaGVsbDIuc2V0QWN0aXZlKCk7Ci0JdGVzdFNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCXRlc3RTaGVsbC5zZXRBY3RpdmUoKTsKLQlhc3NlcnRUcnVlKCJub24tdmlzaWJsZSBkaWFsb2cgc2hlbGwgd2FzIG1hZGUgYWN0aXZlIiwgdGVzdFNoZWxsLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpICE9IHRlc3RTaGVsbCk7Ci0JCi0Jc2hlbGwyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFbmFibGVkWigpIHsKLQkvLyB0ZXN0ZWQgaW4gZ2V0RW5hYmxlZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWVJbnB1dE1vZGVJKCkgewotCXNoZWxsLnNldEltZUlucHV0TW9kZShTV1QuTk9ORSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2hlbGwuZ2V0SW1lSW5wdXRNb2RlKCkgPT0gU1dULk5PTkUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFJlZ2lvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRSZWdpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFZpc2libGVaKCkgewotCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjphOiIsICFzaGVsbC5pc1Zpc2libGUoKSk7Ci0Jc2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzaGVsbC5pc1Zpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JLy90aGVzZSBtdXN0IGJlIHJ1biBiZWZvcmUgdGhlIHNoZWxsIHRlc3RzIGJlY2F1c2Ugb2YgcHIgNzk1MDQKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0ljb25pZnkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0Nsb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9PcGVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnMubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCQotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNoZWxsTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZm9yY2VBY3RpdmUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1lSW5wdXRNb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMb2NhdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UmVnaW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2hlbGxzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0VuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X29wZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNoZWxsTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRBY3RpdmUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVuYWJsZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWVJbnB1dE1vZGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRSZWdpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckkiKSkgdGVzdF9Db25zdHJ1Y3RvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNoZWxsTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyIikpIHRlc3RfYWRkU2hlbGxMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Nsb3NlIikpIHRlc3RfY2xvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mb3JjZUFjdGl2ZSIpKSB0ZXN0X2ZvcmNlQWN0aXZlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVuYWJsZWQiKSkgdGVzdF9nZXRFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWVJbnB1dE1vZGUiKSkgdGVzdF9nZXRJbWVJbnB1dE1vZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExvY2F0aW9uIikpIHRlc3RfZ2V0TG9jYXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJlZ2lvbiIpKSB0ZXN0X2dldFJlZ2lvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2hlbGwiKSkgdGVzdF9nZXRTaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2hlbGxzIikpIHRlc3RfZ2V0U2hlbGxzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0VuYWJsZWQiKSkgdGVzdF9pc0VuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW4iKSkgdGVzdF9vcGVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTaGVsbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNoZWxsTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRBY3RpdmUiKSkgdGVzdF9zZXRBY3RpdmUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVuYWJsZWRaIikpIHRlc3Rfc2V0RW5hYmxlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltZUlucHV0TW9kZUkiKSkgdGVzdF9zZXRJbWVJbnB1dE1vZGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSZWdpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpKSB0ZXN0X3NldFJlZ2lvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRWaXNpYmxlWiIpKSB0ZXN0X3NldFZpc2libGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkiKSkgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0ljb25pZnkiKSkgdGVzdF9jb25zaXN0ZW5jeV9JY29uaWZ5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9DbG9zZSIpKSB0ZXN0X2NvbnNpc3RlbmN5X0Nsb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EaXNwb3NlIikpIHRlc3RfY29uc2lzdGVuY3lfRGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfT3BlbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X09wZW4oKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCAoKSB7Ci0JLy8gb3ZlcnJpZGluZyBDb250cm9sLnRlc3RfZ2V0UGFyZW50Ci0JYXNzZXJ0VHJ1ZShzaGVsbC5nZXRQYXJlbnQoKT09bnVsbCk7Ci0JYXNzZXJ0VHJ1ZSh0ZXN0U2hlbGwuZ2V0UGFyZW50KCkgPT0gc2hlbGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0eWxlKCkgewotCS8vIG92ZXJyaWRpbmcgV2lkZ2V0LnRlc3RfZ2V0U3R5bGUKLQlhc3NlcnRUcnVlKCJ0ZXN0U2hlbGwgbm90IG1vZGVsZXNzIiwgKHRlc3RTaGVsbC5nZXRTdHlsZSAoKSAmIFNXVC5NT0RFTEVTUykgPT0gU1dULk1PREVMRVNTKTsKLQlpbnRbXSBjYXNlcyA9IHtTV1QuTU9ERUxFU1MsIFNXVC5QUklNQVJZX01PREFMLCBTV1QuQVBQTElDQVRJT05fTU9EQUwsIFNXVC5TWVNURU1fTU9EQUx9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJU2hlbGwgdGVzdFNoZWxsMiA9IG5ldyBTaGVsbChzaGVsbCwgY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCJzaGVsbCAiICsgaSwgKHRlc3RTaGVsbDIuZ2V0U3R5bGUgKCkgJiBjYXNlc1tpXSkgPT0gY2FzZXNbaV0pOwotCQl0ZXN0U2hlbGwyLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNWaXNpYmxlKCkgewotCS8vIG92ZXJyaWRpbmcgQ29udHJvbC50ZXN0X2lzVmlzaWJsZQotCXRlc3RTaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUodGVzdFNoZWxsLmlzVmlzaWJsZSgpKTsKLQlzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoc2hlbGwuaXNWaXNpYmxlKCkpOwotCi0JdGVzdFNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0Jc2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCJzaGVsbC5pc1Zpc2libGUoKSBhOiIsIHNoZWxsLmlzVmlzaWJsZSgpKTsKLQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCJzaGVsbC5pc1Zpc2libGUoKSBiOiIsICFzaGVsbC5pc1Zpc2libGUoKSk7Ci0JaWYgKGZDaGVja0JvZ3VzVGVzdENhc2VzKQotCQlhc3NlcnRUcnVlKCJ0ZXN0U2hlbGwuaXNWaXNpYmxlKCkgYzoiLCAhdGVzdFNoZWxsLmlzVmlzaWJsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCb3VuZHNJSUlJKCkgewotCS8vIG92ZXJyaWRkZW4gZnJvbSBDb250cm9sIGJlY2F1c2UgU2hlbGxzIGhhdmUgYSBtaW5pbXVtIHNpemUKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQkvLyBvdmVycmlkZGVuIGZyb20gQ29udHJvbCBiZWNhdXNlIFNoZWxscyBoYXZlIGEgbWluaW11bSBzaXplCi0vLwkvKiB3aW5kb3dzICovCi0vLwkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtaW5pbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA8IDExMiBvciBwMS55IDwgMjcgKi8KLS8vCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1heGltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54ID4gMTI5MiBvciBwMS55ID4gMTAzNiAqLwotLy8JaWYgKFN3dEp1bml0LmlzV2luZG93cykgewotLy8JCVBvaW50IHAxID0gbmV3IFBvaW50KDExMiwgMjcpOwotLy8JCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoMjAsIDMwLCBwMS54LCBwMS55KTsKLS8vCQlSZWN0YW5nbGUgcjI7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMTsgaSsrKSB7Ci0vLwkJCXRlc3RTaGVsbC5zZXRCb3VuZHMocjEpOwotLy8JCQlyMiA9IHRlc3RTaGVsbC5nZXRCb3VuZHMoKTsKLS8vCQkJYXNzZXJ0KCJjaGlsZCBzaGVsbCBpdGVyYXRpb24gIiArIGkgKyAiIHNldD0iICsgcjEgKyAiIGdldD0iICsgcjIsIHIxLmVxdWFscyhyMikpOwotLy8JCQlyMS53aWR0aCArPSAxMDA7Ci0vLwkJCXIxLmhlaWdodCArPSAxMDA7Ci0vLwkJfQotLy8JCXIxID0gbmV3IFJlY3RhbmdsZSgyMCwgMzAsIHAxLngsIHAxLnkpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgMTE7IGkrKykgewotLy8JCQlzaGVsbC5zZXRCb3VuZHMocjEpOwotLy8JCQlyMiA9IHNoZWxsLmdldEJvdW5kcygpOwotLy8JCQlhc3NlcnQoInBhcmVudCBzaGVsbCBpdGVyYXRpb24gIiArIGkgKyAiIHNldD0iICsgcjEgKyAiIGdldD0iICsgcjIsIHIxLmVxdWFscyhyMikpOwotLy8JCQlyMS53aWR0aCArPSAxMDA7Ci0vLwkJCXIxLmhlaWdodCArPSAxMDA7Ci0vLwkJfQotLy8JfQotLy8JLyogbW90aWYgKi8KLS8vCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1pbmltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54IDwgMTEyIG9yIHAxLnkgPCAyNyAqLwotLy8JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWF4aW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPiAxMjkyIG9yIHAxLnkgPiAxMDM2ICovCi0vLwlpZiAoU3d0SnVuaXQuaXNNb3RpZikgewotLy8JCVBvaW50IHAxID0gbmV3IFBvaW50KDE1LDM1KTsKLS8vCQlSZWN0YW5nbGUgcjEgPSBuZXcgUmVjdGFuZ2xlKDIwLCAzMCwgcDEueCwgcDEueSk7Ci0vLwkJUmVjdGFuZ2xlIHIyOwotLy8JCQotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgMTU7IGkrKykgewotLy8JCQl0ZXN0U2hlbGwuc2V0Qm91bmRzKHIxKTsKLS8vCQkJcjIgPSB0ZXN0U2hlbGwuZ2V0Qm91bmRzKCk7Ci0vLwkJCWFzc2VydCgiY2hpbGQgc2hlbGwgaXRlcmF0aW9uICIgKyBpICsgIiBzZXQ9IiArIHIxICsgIiBnZXQ9IiArIHIyLCByMS5lcXVhbHMocjIpKTsKLS8vCQkJcjEud2lkdGggKz0gMTAwOwotLy8JCQlyMS5oZWlnaHQgKz0gMTAwOwotLy8JCX0KLS8vCQlyMSA9IG5ldyBSZWN0YW5nbGUoNTAsIDUwLCBwMS54LCBwMS55KTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IDExOyBpKyspIHsKLS8vCQkJc2hlbGwuc2V0Qm91bmRzKHIxKTsKLS8vCQkJcjIgPSBzaGVsbC5nZXRCb3VuZHMoKTsKLS8vCQkJYXNzZXJ0KCJwYXJlbnQgc2hlbGwgaXRlcmF0aW9uICIgKyBpICsgIiBzZXQ9IiArIHIxICsgIiBnZXQ9IiArIHIyLCByMS5lcXVhbHMocjIpKTsKLS8vCQkJcjEud2lkdGggKz0gMTAwOwotLy8JCQlyMS5oZWlnaHQgKz0gMTAwOwotLy8JCX0KLS8vCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVnaW9uKCkgewotCVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKCk7Ci0JcmVnaW9uLmFkZChuZXcgUmVjdGFuZ2xlKDEwLCAyMCwgMTAwLCAyMDApKTsKLQkvLyB0ZXN0IHNoZWxsIHdpdGhvdXQgc3R5bGUgU1dULk5PX1RSSU0KLQlhc3NlcnRUcnVlKCI6YToiLCBzaGVsbC5nZXRSZWdpb24oKSA9PSBudWxsKTsKLQlzaGVsbC5zZXRSZWdpb24ocmVnaW9uKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzaGVsbC5nZXRSZWdpb24oKSA9PSBudWxsKTsKLQlzaGVsbC5zZXRSZWdpb24obnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc2hlbGwuZ2V0UmVnaW9uKCkgPT0gbnVsbCk7Ci0JLy8gdGVzdCBzaGVsbCB3aXRoIHN0eWxlIFNXVC5OT19UUklNCi0JRGlzcGxheSBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSgpOwotCVNoZWxsIHNoZWxsMiA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc2hlbGwyLmdldFJlZ2lvbigpID09IG51bGwpOwotCXNoZWxsMi5zZXRSZWdpb24ocmVnaW9uKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBzaGVsbDIuZ2V0UmVnaW9uKCkuaGFuZGxlID09IHJlZ2lvbi5oYW5kbGUpOwotCXJlZ2lvbi5kaXNwb3NlKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6Iiwgc2hlbGwyLmdldFJlZ2lvbigpLmlzRGlzcG9zZWQoKSk7Ci0Jc2hlbGwyLnNldFJlZ2lvbihudWxsKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCBzaGVsbDIuZ2V0UmVnaW9uKCkgPT0gbnVsbCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVJSSgpIHsKLQkvKiB3aW5kb3dzICovCi0JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWluaW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPCAxMTIgb3IgcDEueSA8IDI3ICovCi0JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWF4aW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPiAxMjkyIG9yIHAxLnkgPiAxMDM2ICovCi0JaWYgKFN3dEp1bml0LmlzV2luZG93cykgewotCQlQb2ludCBuZXdTaXplID0gbmV3IFBvaW50KDExMiwgMjcpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCXRlc3RTaGVsbC5zZXRTaXplKG5ld1NpemUueCwgbmV3U2l6ZS55KTsKLQkJCWFzc2VydEVxdWFscyhuZXdTaXplLCB0ZXN0U2hlbGwuZ2V0U2l6ZSgpKTsKLQkJCW5ld1NpemUueCArPSAxMDA7Ci0JCQluZXdTaXplLnkgKz0gMTAwOwotCQl9Ci0JCW5ld1NpemUgPSBuZXcgUG9pbnQoMTI5MiwgMTAzNik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJdGVzdFNoZWxsLnNldFNpemUobmV3U2l6ZS54LCBuZXdTaXplLnkpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld1NpemUsIHRlc3RTaGVsbC5nZXRTaXplKCkpOwotCQkJbmV3U2l6ZS54IC09IDEwMDsKLQkJCW5ld1NpemUueSAtPSAxMDA7Ci0JCX0KLQl9Ci0JCi0JLyogbW90aWYgKi8KLQkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtaW5pbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA8ID8/IG9yIHAxLnkgPCA/PyAqLwotCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1heGltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54ID4gPz8gb3IgcDEueSA+ID8/ICovCi0JaWYgKFN3dEp1bml0LmlzTW90aWYpIHsKLQkJUG9pbnQgbmV3U2l6ZSA9IG5ldyBQb2ludCgyLCAyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQl0ZXN0U2hlbGwuc2V0U2l6ZShuZXdTaXplLngsIG5ld1NpemUueSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3U2l6ZSwgdGVzdFNoZWxsLmdldFNpemUoKSk7Ci0JCQluZXdTaXplLnggKz0gMTAwOwotCQkJbmV3U2l6ZS55ICs9IDEwMDsKLQkJfQotCQluZXdTaXplID0gbmV3IFBvaW50KDE2MDAsIDE2MDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCXRlc3RTaGVsbC5zZXRTaXplKG5ld1NpemUueCwgbmV3U2l6ZS55KTsKLQkJCWFzc2VydEVxdWFscyhuZXdTaXplLCB0ZXN0U2hlbGwuZ2V0U2l6ZSgpKTsKLQkJCW5ld1NpemUueCAtPSAxMDA7Ci0JCQluZXdTaXplLnkgLT0gMTAwOwotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCS8qIHdpbmRvd3MgKi8KLQkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtaW5pbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA8IDExMiBvciBwMS55IDwgMjcgKi8KLQkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtYXhpbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA+IDEyOTIgb3IgcDEueSA+IDEwMzYgKi8KLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCVBvaW50IG5ld1NpemUgPSBuZXcgUG9pbnQoMTEyLCAyNyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJdGVzdFNoZWxsLnNldFNpemUobmV3U2l6ZSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3U2l6ZSwgdGVzdFNoZWxsLmdldFNpemUoKSk7Ci0JCQluZXdTaXplLnggKz0gMTAwOwotCQkJbmV3U2l6ZS55ICs9IDEwMDsKLQkJfQotCQluZXdTaXplID0gbmV3IFBvaW50KDEyOTIsIDEwMzYpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCXRlc3RTaGVsbC5zZXRTaXplKG5ld1NpemUpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld1NpemUsIHRlc3RTaGVsbC5nZXRTaXplKCkpOwotCQkJbmV3U2l6ZS54IC09IDEwMDsKLQkJCW5ld1NpemUueSAtPSAxMDA7Ci0JCX0KLQl9Ci0JCi0JLyogbW90aWYgKi8KLQkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtaW5pbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA8ID8/IG9yIHAxLnkgPCA/PyAqLwotCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1heGltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54ID4gPz8gb3IgcDEueSA+ID8/ICovCi0JaWYgKFN3dEp1bml0LmlzTW90aWYpIHsKLQkJUG9pbnQgbmV3U2l6ZSA9IG5ldyBQb2ludCgyLCAyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQl0ZXN0U2hlbGwuc2V0U2l6ZShuZXdTaXplKTsKLQkJCWFzc2VydEVxdWFscyhuZXdTaXplLCB0ZXN0U2hlbGwuZ2V0U2l6ZSgpKTsKLQkJCW5ld1NpemUueCArPSAxMDA7Ci0JCQluZXdTaXplLnkgKz0gMTAwOwotCQl9Ci0JCW5ld1NpemUgPSBuZXcgUG9pbnQoMTYwMCwgMTYwMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJdGVzdFNoZWxsLnNldFNpemUobmV3U2l6ZSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3U2l6ZSwgdGVzdFNoZWxsLmdldFNpemUoKSk7Ci0JCQluZXdTaXplLnggLT0gMTAwOwotCQkJbmV3U2l6ZS55IC09IDEwMDsKLQkJfQotCX0KLX0KLQotU2hlbGwgdGVzdFNoZWxsOwotCi1wcml2YXRlIHZvaWQgY3JlYXRlU2hlbGwoKSB7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzaGVsbCA9IG5ldyBTaGVsbCgpOwotICAgIHRlc3RTaGVsbCA9IG5ldyBTaGVsbChzaGVsbCwgU1dULkRJQUxPR19UUklNIHwgU1dULk1JTik7Ci0JdGVzdFNoZWxsLnNldFNpemUoMTAwLDMwMCk7Ci0JdGVzdFNoZWxsLnNldFRleHQoIlNoZWxsIik7Ci0gICAgdGVzdFNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLSAgICBzZXRXaWRnZXQodGVzdFNoZWxsKTsKLSAgIAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X09wZW4oKSB7Ci0JaWYgKGZUZXN0Q29uc2lzdGVuY3kpIHsKLQkgICAgY3JlYXRlU2hlbGwoKTsKLQkgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSgpOwotCSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotCSAgICBTdHJpbmdbXSB0ZW1wID0gaG9va0V4cGVjdGVkRXZlbnRzKHRlc3RTaGVsbCwgZ2V0VGVzdE5hbWUoKSwgZXZlbnRzKTsKLQkgICAgc2hlbGwucGFjaygpOwotCSAgICBzaGVsbC5vcGVuKCk7Ci0JICAgIHRlc3RTaGVsbC5wYWNrKCk7Ci0JICAgIHRlc3RTaGVsbC5vcGVuKCk7Ci0JICAgIG5ldyBUaHJlYWQoKSB7Ci0JICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JICAgICAgICAgICAgZGlzcGxheS5hc3luY0V4ZWMobmV3IFRocmVhZCgpIHsKLQkJCQkgICAgcHVibGljIHZvaWQgcnVuKCkgewotCQkJCSAgICAgICAgc2hlbGwuZGlzcG9zZSgpOwotCQkJCSAgICB9Ci0JCQkJfSk7Ci0JICAgIH19LnN0YXJ0KCk7Ci0JCi0JICAgIHdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkgICAgICAgIGlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JICAgIH0KLQkgICAgc2V0VXAoKTsgICAgICAgIAotCSAgICBTdHJpbmdbXSByZXN1bHRzID0gbmV3IFN0cmluZ1tldmVudHMuc2l6ZSgpXTsKLQkgICAgZXZlbnRzLmNvcHlJbnRvKHJlc3VsdHMpOwotCSAgICBhc3NlcnRFcXVhbHMoZ2V0VGVzdE5hbWUoKSArICIgZXZlbnQgb3JkZXJpbmciLCB0ZW1wLCByZXN1bHRzKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfSWNvbmlmeSgpIHsKLSAgICBjcmVhdGVTaGVsbCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMSwgMCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LlNIRUxMX0lDT05JRlksIG51bGwsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9DbG9zZSgpIHsKLSAgICBjcmVhdGVTaGVsbCgpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgaWYoIVN3dEp1bml0LmlzQ2FyYm9uKQotICAgICAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIFNXVC5BTFQsIDAsIFNXVC5GNCwgQ29uc2lzdGVuY3lVdGlsaXR5LkRPVUJMRV9LRVlfUFJFU1MpOwotICAgIGVsc2UKLSAgICAgICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgY3JlYXRlU2hlbGwoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EaXNwb3NlKCkgewotICAgIGNyZWF0ZVNoZWxsKCk7Ci0KLSAgICBmaW5hbCBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbih0ZXN0U2hlbGwsIFNXVC5QVVNIKTsKLSAgICBidXR0b24uc2V0VGV4dCgiZGlzcG9zZSIpOwotICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0gICAgICAgICAgICBidXR0b24uZGlzcG9zZSgpOwotICAgICAgICAgICAgdGVzdFNoZWxsLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwodGVzdFNoZWxsKTsKLSAgICBQb2ludCBwdCA9IGJ1dHRvbi5nZXRMb2NhdGlvbigpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQocHQueCwgcHQueSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotICAgIGNyZWF0ZVNoZWxsKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2xpZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2xpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNWZhNjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NsaWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNsaWRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2xpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NsaWRlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NsaWRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0Jc2xpZGVyID0gbmV3IFNsaWRlcihzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KHNsaWRlcik7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci1wcm90ZWN0ZWQgU3RyaW5nIHZhbHVlU3RyaW5nKGludFtdIGludEFycmF5KSB7Ci0JcmV0dXJuICIgKCIraW50QXJyYXlbMV0rIiwiK2ludEFycmF5WzJdKyIsIitpbnRBcnJheVszXSsiLCIraW50QXJyYXlbNF0rIikiOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJc2xpZGVyID0gbmV3IFNsaWRlcihudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JaW50W10gY2FzZXMgPSB7MCwgU1dULkhPUklaT05UQUwsIFNXVC5WRVJUSUNBTH07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykKLQkJc2xpZGVyID0gbmV3IFNsaWRlcihzaGVsbCwgY2FzZXNbaV0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQl0cnkgewotCQlzbGlkZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlzbGlkZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCXNsaWRlci5zZXRTZWxlY3Rpb24oMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCXNsaWRlci5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdHJ5IHsKLQkJc2xpZGVyLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0JLy8gc3VwZXIgY2xhc3MgbWV0aG9kIHN1ZmZpY2llbnQgdGVzdAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVuYWJsZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHNldEVuYWJsZWQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5jcmVtZW50KCkgewotCWludFtdIGNhc2VzID0gezEsIDEwLCAxMDAwMH07Ci0JZm9yIChpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKQotCXsKLQkgIHNsaWRlci5zZXRJbmNyZW1lbnQoY2FzZXNbaV0pOwotCSAgYXNzZXJ0VHJ1ZSgiY2FzZTogIiArIFN0cmluZy52YWx1ZU9mKGkpLCBzbGlkZXIuZ2V0SW5jcmVtZW50KCk9PWNhc2VzW2ldKTsKLQl9IAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1heGltdW0oKSB7Ci0Jc2xpZGVyLnNldE1heGltdW0oMjAwMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2xpZGVyLmdldE1heGltdW0oKSA9PSAyMDAwKTsKLQlzbGlkZXIuc2V0TWF4aW11bSgyMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc2xpZGVyLmdldE1heGltdW0oKSA9PSAyMCk7Ci0Jc2xpZGVyLnNldE1heGltdW0oLTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHNsaWRlci5nZXRNYXhpbXVtKCkgPT0gMjApOwotCXNsaWRlci5zZXRNYXhpbXVtKDApOwotCWFzc2VydFRydWUoIjpkOiIsIHNsaWRlci5nZXRNYXhpbXVtKCkgPT0gMjApOwotCXNsaWRlci5zZXRNYXhpbXVtKDEwKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBzbGlkZXIuZ2V0TWF4aW11bSgpID09IDEwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNaW5pbXVtKCkgewotCXNsaWRlci5zZXRNaW5pbXVtKDUpOwotCWFzc2VydFRydWUoIjphOiIsIHNsaWRlci5nZXRNaW5pbXVtKCkgPT0gNSk7Ci0Jc2xpZGVyLnNldE1pbmltdW0oMjApOwotCWFzc2VydFRydWUoIjpiOiIsIHNsaWRlci5nZXRNaW5pbXVtKCkgPT0gMjApOwotCXNsaWRlci5zZXRNaW5pbXVtKC0xKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzbGlkZXIuZ2V0TWluaW11bSgpID09IDIwKTsKLQlzbGlkZXIuc2V0TWluaW11bSgwKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBzbGlkZXIuZ2V0TWluaW11bSgpID09IDApOwotCXNsaWRlci5zZXRNaW5pbXVtKDEwKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBzbGlkZXIuZ2V0TWluaW11bSgpID09IDEwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYWdlSW5jcmVtZW50KCkgewotCWludFtdIGNhc2VzID0gezEsIDEwLCAxMDAwMH07Ci0JZm9yIChpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKQotCXsKLQkgIHNsaWRlci5zZXRQYWdlSW5jcmVtZW50KGNhc2VzW2ldKTsKLQkgIGFzc2VydFRydWUoImNhc2U6ICIgKyBTdHJpbmcudmFsdWVPZihpKSwgc2xpZGVyLmdldFBhZ2VJbmNyZW1lbnQoKT09Y2FzZXNbaV0pOwotCX0gCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCXNsaWRlci5zZXRTZWxlY3Rpb24oMTApOwotCWFzc2VydFRydWUoIjphOiIsIHNsaWRlci5nZXRTZWxlY3Rpb24oKT09IDEwKTsKLQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUaHVtYigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRUaHVtYigpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIGFkZFNlbGVjdGlvbkxpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVuYWJsZWRaKCkgewotCXNsaWRlci5zZXRFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUoc2xpZGVyLmdldEVuYWJsZWQoKSk7Ci0Jc2xpZGVyLnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhzbGlkZXIuZ2V0RW5hYmxlZCgpLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW5jcmVtZW50SSgpIHsKLQkvLyB0ZXN0ZWQgaW4gZ2V0SW5jcmVtZW50IG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1heGltdW1JKCkgewotCi0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldE1heGltdW1WYWx1ZXMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNsaWRlci5zZXRNYXhpbXVtKGludEFycmF5WzBdKTsKLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gdmFsdWVTdHJpbmcoaW50QXJyYXkpOwotCQlyZXBvcnQoInNldE1heCAiK2ludEFycmF5WzBdKyB2YWx1ZVN0cmluZywgaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10sIGludEFycmF5WzRdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluaW11bUkoKSB7Ci0KLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0TWluaW11bVZhbHVlcygpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2xpZGVyLnNldE1pbmltdW0oaW50QXJyYXlbMF0pOwotCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSB2YWx1ZVN0cmluZyhpbnRBcnJheSk7Ci0JCXJlcG9ydCgic2V0TWluICIraW50QXJyYXlbMF0rdmFsdWVTdHJpbmcsIGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdLCBpbnRBcnJheVs0XSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFBhZ2VJbmNyZW1lbnRJKCkgewotCSBzbGlkZXIuc2V0UGFnZUluY3JlbWVudCgzKTsKLQkgYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2xpZGVyLmdldFBhZ2VJbmNyZW1lbnQoKT09IDMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkkoKSB7Ci0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldFNlbGVjdGlvblZhbHVlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNsaWRlci5zZXRTZWxlY3Rpb24oaW50QXJyYXlbMF0pOwotCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSB2YWx1ZVN0cmluZyhpbnRBcnJheSk7Ci0JCXJlcG9ydCgic2V0U2VsICIraW50QXJyYXlbMF0rdmFsdWVTdHJpbmcsaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10sIGludEFycmF5WzRdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGh1bWJJKCkgewotCi0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldFRodW1iVmFsdWVzKCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlzbGlkZXIuc2V0VGh1bWIoaW50QXJyYXlbMF0pOwotCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSB2YWx1ZVN0cmluZyhpbnRBcnJheSk7Ci0JCXJlcG9ydCgic2V0VGhtYiAiK2ludEFycmF5WzBdK3ZhbHVlU3RyaW5nLGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdLCBpbnRBcnJheVs0XSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFZhbHVlc0lJSUlJSSgpIHsKLQlzbGlkZXIuc2V0VmFsdWVzKDEwLCAxMCwgNTAsIDIsIDUsIDEwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzbGlkZXIuZ2V0U2VsZWN0aW9uKCkgPT0gMTApOwotCWFzc2VydFRydWUoIjpiOiIsIHNsaWRlci5nZXRNaW5pbXVtKCkgPT0gMTApOwotCWFzc2VydFRydWUoIjpjOiIsIHNsaWRlci5nZXRNYXhpbXVtKCkgPT0gNTApOwotCWFzc2VydFRydWUoIjpkOiIsIHNsaWRlci5nZXRUaHVtYigpID09IDIpOwotCWFzc2VydFRydWUoIjplOiIsIHNsaWRlci5nZXRJbmNyZW1lbnQoKSA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBzbGlkZXIuZ2V0UGFnZUluY3JlbWVudCgpID09IDEwKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TbGlkZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEluY3JlbWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWF4aW11bSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWluaW11bSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFnZUluY3JlbWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUaHVtYiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEluY3JlbWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1heGltdW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5pbXVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UGFnZUluY3JlbWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRodW1iSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmFsdWVzSUlJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9BcnJvd1NlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Ucm91Z2hTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1RodW1iU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RW5hYmxlZCIpKSB0ZXN0X2dldEVuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEluY3JlbWVudCIpKSB0ZXN0X2dldEluY3JlbWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWF4aW11bSIpKSB0ZXN0X2dldE1heGltdW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1pbmltdW0iKSkgdGVzdF9nZXRNaW5pbXVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYWdlSW5jcmVtZW50IikpIHRlc3RfZ2V0UGFnZUluY3JlbWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUaHVtYiIpKSB0ZXN0X2dldFRodW1iKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RW5hYmxlZFoiKSkgdGVzdF9zZXRFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW5jcmVtZW50SSIpKSB0ZXN0X3NldEluY3JlbWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1heGltdW1JIikpIHRlc3Rfc2V0TWF4aW11bUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbmltdW1JIikpIHRlc3Rfc2V0TWluaW11bUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFBhZ2VJbmNyZW1lbnRJIikpIHRlc3Rfc2V0UGFnZUluY3JlbWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUaHVtYkkiKSkgdGVzdF9zZXRUaHVtYkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFZhbHVlc0lJSUlJSSIpKSB0ZXN0X3NldFZhbHVlc0lJSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfQXJyb3dTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9BcnJvd1NlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Ucm91Z2hTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Ucm91Z2hTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1RodW1iU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfVGh1bWJTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQkvLyBvdmVycmlkZGVuIGZyb20gQ29udHJvbCBiZWNhdXNlIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UKLQkvLyB0byBzZXQgdGhlIGZvbnQgb2YgYSBTbGlkZXIuCi19Ci0KLVNsaWRlciBzbGlkZXI7Ci0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCByZXBvcnQoU3RyaW5nIGNhbGwsIGludCBzZXQsIGludCBtaW5FeHBlY3RlZCwgaW50IG1heEV4cGVjdGVkLCBpbnQgc2VsZWN0aW9uRXhwZWN0ZWQsIGludCB0aHVtYkV4cGVjdGVkKSB7Ci0JLy8gVW5jb21tZW50IHRoZXNlIGxpbmVzIGFuZCBjb21tZW50IG91dCBjYWxsIHRvIGNoZWNrKCkgaWYgeW91IHdhbnQgdGhlIHRlc3QgdG8gcmVwb3J0IGFsbCBlcnJvcnMgd2l0aG91dAotCS8vIHN0b3BwaW5nLgotLy8JaWYgKHNsaWRlci5nZXRNaW5pbXVtKCkgIT0gbWluRXhwZWN0ZWQpIHsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIgOiBNaW5pbXVtIEV4cGVjdGVkOiAiICsgbWluRXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyBzbGlkZXIuZ2V0TWluaW11bSgpKTsKLS8vCX0KLS8vCWlmIChzbGlkZXIuZ2V0TWF4aW11bSgpICE9IG1heEV4cGVjdGVkKXsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIgOiBNYXhpbXVtIEV4cGVjdGVkOiAiICsgbWF4RXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyBzbGlkZXIuZ2V0TWF4aW11bSgpKTsKLS8vCX0KLS8vCWlmIChzbGlkZXIuZ2V0U2VsZWN0aW9uKCkgIT0gc2VsZWN0aW9uRXhwZWN0ZWQpIHsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIgOiBTZWxlY3Rpb24gRXhwZWN0ZWQ6ICIgKyBzZWxlY3Rpb25FeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHNsaWRlci5nZXRTZWxlY3Rpb24oKSk7Ci0vLwl9Ci0vLwlpZiAoc2xpZGVyLmdldFRodW1iKCkgIT0gdGh1bWJFeHBlY3RlZCkgewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIiA6IFRodW1iIEV4cGVjdGVkOiAiICsgdGh1bWJFeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHNsaWRlci5nZXRUaHVtYigpKTsKLS8vCX0KLQljaGVjayhjYWxsLCBtaW5FeHBlY3RlZCwgbWF4RXhwZWN0ZWQsIHNlbGVjdGlvbkV4cGVjdGVkLCB0aHVtYkV4cGVjdGVkKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBjaGVjayhTdHJpbmcgY2FsbCwgaW50IG1pbkV4cGVjdGVkLCBpbnQgbWF4RXhwZWN0ZWQsIGludCBzZWxlY3Rpb25FeHBlY3RlZCwgaW50IHRodW1iRXhwZWN0ZWQpIHsKLQlhc3NlcnRFcXVhbHMoY2FsbCsiIG1heCAiLCBtYXhFeHBlY3RlZCwgc2xpZGVyLmdldE1heGltdW0oKSk7Ci0JYXNzZXJ0RXF1YWxzKGNhbGwrIiBtaW4gIiwgbWluRXhwZWN0ZWQsIHNsaWRlci5nZXRNaW5pbXVtKCkpOwotCWFzc2VydEVxdWFscyhjYWxsKyIgc2VsICIsIHNlbGVjdGlvbkV4cGVjdGVkLCBzbGlkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCWFzc2VydEVxdWFscyhjYWxsKyIgdGhtYiAiLCB0aHVtYkV4cGVjdGVkLCBzbGlkZXIuZ2V0VGh1bWIoKSk7Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0VGh1bWJWYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEzLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEwLCAxMCwgMTAwLCA1MCwgMTB9LAotey05LCAxMCwgMTAwLCA1MCwgMTB9LAotey04LCAxMCwgMTAwLCA1MCwgMTB9LAotey03LCAxMCwgMTAwLCA1MCwgMTB9LAotey02LCAxMCwgMTAwLCA1MCwgMTB9LAotey01LCAxMCwgMTAwLCA1MCwgMTB9LAotey00LCAxMCwgMTAwLCA1MCwgMTB9LAotey0zLCAxMCwgMTAwLCA1MCwgMTB9LAotey0yLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xLCAxMCwgMTAwLCA1MCwgMTB9LAotezAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MSwgMTAsIDEwMCwgNTAsIDF9LAotezIsIDEwLCAxMDAsIDUwLCAyfSwKLXszLCAxMCwgMTAwLCA1MCwgM30sCi17NCwgMTAsIDEwMCwgNTAsIDR9LAotezUsIDEwLCAxMDAsIDUwLCA1fSwKLXs2LCAxMCwgMTAwLCA1MCwgNn0sCi17NywgMTAsIDEwMCwgNTAsIDd9LAotezgsIDEwLCAxMDAsIDUwLCA4fSwKLXs5LCAxMCwgMTAwLCA1MCwgOX0sCi17MTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTEsIDEwLCAxMDAsIDUwLCAxMX0sCi17MTIsIDEwLCAxMDAsIDUwLCAxMn0sCi17MTMsIDEwLCAxMDAsIDUwLCAxM30sCi17MTQsIDEwLCAxMDAsIDUwLCAxNH0sCi17MTUsIDEwLCAxMDAsIDUwLCAxNX0sCi17MTYsIDEwLCAxMDAsIDUwLCAxNn0sCi17MTcsIDEwLCAxMDAsIDUwLCAxN30sCi17MTgsIDEwLCAxMDAsIDUwLCAxOH0sCi17MTksIDEwLCAxMDAsIDUwLCAxOX0sCi17MjAsIDEwLCAxMDAsIDUwLCAyMH0sCi17MjEsIDEwLCAxMDAsIDUwLCAyMX0sCi17MjIsIDEwLCAxMDAsIDUwLCAyMn0sCi17MjMsIDEwLCAxMDAsIDUwLCAyM30sCi17MjQsIDEwLCAxMDAsIDUwLCAyNH0sCi17MjUsIDEwLCAxMDAsIDUwLCAyNX0sCi17MjYsIDEwLCAxMDAsIDUwLCAyNn0sCi17MjcsIDEwLCAxMDAsIDUwLCAyN30sCi17MjgsIDEwLCAxMDAsIDUwLCAyOH0sCi17MjksIDEwLCAxMDAsIDUwLCAyOX0sCi17MzAsIDEwLCAxMDAsIDUwLCAzMH0sCi17MzEsIDEwLCAxMDAsIDUwLCAzMX0sCi17MzIsIDEwLCAxMDAsIDUwLCAzMn0sCi17MzMsIDEwLCAxMDAsIDUwLCAzM30sCi17MzQsIDEwLCAxMDAsIDUwLCAzNH0sCi17MzUsIDEwLCAxMDAsIDUwLCAzNX0sCi17MzYsIDEwLCAxMDAsIDUwLCAzNn0sCi17MzcsIDEwLCAxMDAsIDUwLCAzN30sCi17MzgsIDEwLCAxMDAsIDUwLCAzOH0sCi17MzksIDEwLCAxMDAsIDUwLCAzOX0sCi17NDAsIDEwLCAxMDAsIDUwLCA0MH0sCi17NDEsIDEwLCAxMDAsIDUwLCA0MX0sCi17NDIsIDEwLCAxMDAsIDUwLCA0Mn0sCi17NDMsIDEwLCAxMDAsIDUwLCA0M30sCi17NDQsIDEwLCAxMDAsIDUwLCA0NH0sCi17NDUsIDEwLCAxMDAsIDUwLCA0NX0sCi17NDYsIDEwLCAxMDAsIDUwLCA0Nn0sCi17NDcsIDEwLCAxMDAsIDUwLCA0N30sCi17NDgsIDEwLCAxMDAsIDUwLCA0OH0sCi17NDksIDEwLCAxMDAsIDUwLCA0OX0sCi17NTAsIDEwLCAxMDAsIDUwLCA1MH0sCi17NTEsIDEwLCAxMDAsIDQ5LCA1MX0sCi17NTIsIDEwLCAxMDAsIDQ4LCA1Mn0sCi17NTMsIDEwLCAxMDAsIDQ3LCA1M30sCi17NTQsIDEwLCAxMDAsIDQ2LCA1NH0sCi17NTUsIDEwLCAxMDAsIDQ1LCA1NX0sCi17NTYsIDEwLCAxMDAsIDQ0LCA1Nn0sCi17NTcsIDEwLCAxMDAsIDQzLCA1N30sCi17NTgsIDEwLCAxMDAsIDQyLCA1OH0sCi17NTksIDEwLCAxMDAsIDQxLCA1OX0sCi17NjAsIDEwLCAxMDAsIDQwLCA2MH0sCi17NjEsIDEwLCAxMDAsIDM5LCA2MX0sCi17NjIsIDEwLCAxMDAsIDM4LCA2Mn0sCi17NjMsIDEwLCAxMDAsIDM3LCA2M30sCi17NjQsIDEwLCAxMDAsIDM2LCA2NH0sCi17NjUsIDEwLCAxMDAsIDM1LCA2NX0sCi17NjYsIDEwLCAxMDAsIDM0LCA2Nn0sCi17NjcsIDEwLCAxMDAsIDMzLCA2N30sCi17NjgsIDEwLCAxMDAsIDMyLCA2OH0sCi17NjksIDEwLCAxMDAsIDMxLCA2OX0sCi17NzAsIDEwLCAxMDAsIDMwLCA3MH0sCi17NzEsIDEwLCAxMDAsIDI5LCA3MX0sCi17NzIsIDEwLCAxMDAsIDI4LCA3Mn0sCi17NzMsIDEwLCAxMDAsIDI3LCA3M30sCi17NzQsIDEwLCAxMDAsIDI2LCA3NH0sCi17NzUsIDEwLCAxMDAsIDI1LCA3NX0sCi17NzYsIDEwLCAxMDAsIDI0LCA3Nn0sCi17NzcsIDEwLCAxMDAsIDIzLCA3N30sCi17NzgsIDEwLCAxMDAsIDIyLCA3OH0sCi17NzksIDEwLCAxMDAsIDIxLCA3OX0sCi17ODAsIDEwLCAxMDAsIDIwLCA4MH0sCi17ODEsIDEwLCAxMDAsIDE5LCA4MX0sCi17ODIsIDEwLCAxMDAsIDE4LCA4Mn0sCi17ODMsIDEwLCAxMDAsIDE3LCA4M30sCi17ODQsIDEwLCAxMDAsIDE2LCA4NH0sCi17ODUsIDEwLCAxMDAsIDE1LCA4NX0sCi17ODYsIDEwLCAxMDAsIDE0LCA4Nn0sCi17ODcsIDEwLCAxMDAsIDEzLCA4N30sCi17ODgsIDEwLCAxMDAsIDEyLCA4OH0sCi17ODksIDEwLCAxMDAsIDExLCA4OX0sCi17OTAsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTEsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTIsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTMsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTQsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTUsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTYsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTcsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTgsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTksIDEwLCAxMDAsIDEwLCA5MH0sCi17MTAwLCAxMCwgMTAwLCAxMCwgOTB9LAotezEwMSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDIsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTAzLCAxMCwgMTAwLCAxMCwgOTB9LAotezEwNCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDUsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA2LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwNywgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDgsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA5LCAxMCwgMTAwLCAxMCwgOTB9LAotezExMCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTEsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTEyLCAxMCwgMTAwLCAxMCwgOTB9LAotezExMywgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTQsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE1LCAxMCwgMTAwLCAxMCwgOTB9LAotezExNiwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTcsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE4LCAxMCwgMTAwLCAxMCwgOTB9LAotezExOSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMjAsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTIxLCAxMCwgMTAwLCAxMCwgOTB9LAotezEyMiwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMjMsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTI0LCAxMCwgMTAwLCAxMCwgOTB9LAotfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRNaW5pbXVtVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTExLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNywgMTAsIDEwMCwgNTAsIDEwfSwKLXstNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXswLCAwLCAxMDAsIDUwLCAxMH0sCi17MSwgMSwgMTAwLCA1MCwgMTB9LAotezIsIDIsIDEwMCwgNTAsIDEwfSwKLXszLCAzLCAxMDAsIDUwLCAxMH0sCi17NCwgNCwgMTAwLCA1MCwgMTB9LAotezUsIDUsIDEwMCwgNTAsIDEwfSwKLXs2LCA2LCAxMDAsIDUwLCAxMH0sCi17NywgNywgMTAwLCA1MCwgMTB9LAotezgsIDgsIDEwMCwgNTAsIDEwfSwKLXs5LCA5LCAxMDAsIDUwLCAxMH0sCi17MTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTEsIDExLCAxMDAsIDUwLCAxMH0sCi17MTIsIDEyLCAxMDAsIDUwLCAxMH0sCi17MTMsIDEzLCAxMDAsIDUwLCAxMH0sCi17MTQsIDE0LCAxMDAsIDUwLCAxMH0sCi17MTUsIDE1LCAxMDAsIDUwLCAxMH0sCi17MTYsIDE2LCAxMDAsIDUwLCAxMH0sCi17MTcsIDE3LCAxMDAsIDUwLCAxMH0sCi17MTgsIDE4LCAxMDAsIDUwLCAxMH0sCi17MTksIDE5LCAxMDAsIDUwLCAxMH0sCi17MjAsIDIwLCAxMDAsIDUwLCAxMH0sCi17MjEsIDIxLCAxMDAsIDUwLCAxMH0sCi17MjIsIDIyLCAxMDAsIDUwLCAxMH0sCi17MjMsIDIzLCAxMDAsIDUwLCAxMH0sCi17MjQsIDI0LCAxMDAsIDUwLCAxMH0sCi17MjUsIDI1LCAxMDAsIDUwLCAxMH0sCi17MjYsIDI2LCAxMDAsIDUwLCAxMH0sCi17MjcsIDI3LCAxMDAsIDUwLCAxMH0sCi17MjgsIDI4LCAxMDAsIDUwLCAxMH0sCi17MjksIDI5LCAxMDAsIDUwLCAxMH0sCi17MzAsIDMwLCAxMDAsIDUwLCAxMH0sCi17MzEsIDMxLCAxMDAsIDUwLCAxMH0sCi17MzIsIDMyLCAxMDAsIDUwLCAxMH0sCi17MzMsIDMzLCAxMDAsIDUwLCAxMH0sCi17MzQsIDM0LCAxMDAsIDUwLCAxMH0sCi17MzUsIDM1LCAxMDAsIDUwLCAxMH0sCi17MzYsIDM2LCAxMDAsIDUwLCAxMH0sCi17MzcsIDM3LCAxMDAsIDUwLCAxMH0sCi17MzgsIDM4LCAxMDAsIDUwLCAxMH0sCi17MzksIDM5LCAxMDAsIDUwLCAxMH0sCi17NDAsIDQwLCAxMDAsIDUwLCAxMH0sCi17NDEsIDQxLCAxMDAsIDUwLCAxMH0sCi17NDIsIDQyLCAxMDAsIDUwLCAxMH0sCi17NDMsIDQzLCAxMDAsIDUwLCAxMH0sCi17NDQsIDQ0LCAxMDAsIDUwLCAxMH0sCi17NDUsIDQ1LCAxMDAsIDUwLCAxMH0sCi17NDYsIDQ2LCAxMDAsIDUwLCAxMH0sCi17NDcsIDQ3LCAxMDAsIDUwLCAxMH0sCi17NDgsIDQ4LCAxMDAsIDUwLCAxMH0sCi17NDksIDQ5LCAxMDAsIDUwLCAxMH0sCi17NTAsIDUwLCAxMDAsIDUwLCAxMH0sCi17NTEsIDUxLCAxMDAsIDUxLCAxMH0sCi17NTIsIDUyLCAxMDAsIDUyLCAxMH0sCi17NTMsIDUzLCAxMDAsIDUzLCAxMH0sCi17NTQsIDU0LCAxMDAsIDU0LCAxMH0sCi17NTUsIDU1LCAxMDAsIDU1LCAxMH0sCi17NTYsIDU2LCAxMDAsIDU2LCAxMH0sCi17NTcsIDU3LCAxMDAsIDU3LCAxMH0sCi17NTgsIDU4LCAxMDAsIDU4LCAxMH0sCi17NTksIDU5LCAxMDAsIDU5LCAxMH0sCi17NjAsIDYwLCAxMDAsIDYwLCAxMH0sCi17NjEsIDYxLCAxMDAsIDYxLCAxMH0sCi17NjIsIDYyLCAxMDAsIDYyLCAxMH0sCi17NjMsIDYzLCAxMDAsIDYzLCAxMH0sCi17NjQsIDY0LCAxMDAsIDY0LCAxMH0sCi17NjUsIDY1LCAxMDAsIDY1LCAxMH0sCi17NjYsIDY2LCAxMDAsIDY2LCAxMH0sCi17NjcsIDY3LCAxMDAsIDY3LCAxMH0sCi17NjgsIDY4LCAxMDAsIDY4LCAxMH0sCi17NjksIDY5LCAxMDAsIDY5LCAxMH0sCi17NzAsIDcwLCAxMDAsIDcwLCAxMH0sCi17NzEsIDcxLCAxMDAsIDcxLCAxMH0sCi17NzIsIDcyLCAxMDAsIDcyLCAxMH0sCi17NzMsIDczLCAxMDAsIDczLCAxMH0sCi17NzQsIDc0LCAxMDAsIDc0LCAxMH0sCi17NzUsIDc1LCAxMDAsIDc1LCAxMH0sCi17NzYsIDc2LCAxMDAsIDc2LCAxMH0sCi17NzcsIDc3LCAxMDAsIDc3LCAxMH0sCi17NzgsIDc4LCAxMDAsIDc4LCAxMH0sCi17NzksIDc5LCAxMDAsIDc5LCAxMH0sCi17ODAsIDgwLCAxMDAsIDgwLCAxMH0sCi17ODEsIDgxLCAxMDAsIDgxLCAxMH0sCi17ODIsIDgyLCAxMDAsIDgyLCAxMH0sCi17ODMsIDgzLCAxMDAsIDgzLCAxMH0sCi17ODQsIDg0LCAxMDAsIDg0LCAxMH0sCi17ODUsIDg1LCAxMDAsIDg1LCAxMH0sCi17ODYsIDg2LCAxMDAsIDg2LCAxMH0sCi17ODcsIDg3LCAxMDAsIDg3LCAxMH0sCi17ODgsIDg4LCAxMDAsIDg4LCAxMH0sCi17ODksIDg5LCAxMDAsIDg5LCAxMH0sCi17OTAsIDkwLCAxMDAsIDkwLCAxMH0sCi17OTEsIDkxLCAxMDAsIDkxLCA5fSwKLXs5MiwgOTIsIDEwMCwgOTIsIDh9LAotezkzLCA5MywgMTAwLCA5MywgN30sCi17OTQsIDk0LCAxMDAsIDk0LCA2fSwKLXs5NSwgOTUsIDEwMCwgOTUsIDV9LAotezk2LCA5NiwgMTAwLCA5NiwgNH0sCi17OTcsIDk3LCAxMDAsIDk3LCAzfSwKLXs5OCwgOTgsIDEwMCwgOTgsIDJ9LAotezk5LCA5OSwgMTAwLCA5OSwgMX0sCi17MTAwLCAxMCwgMTAwLCA1MCwgMTB9LCAKLXsxMDEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTAyLCAxMCwgMTAwLCA1MCwgMTB9LAotezEwMywgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDQsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA1LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDcsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA4LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTExLCAxMCwgMTAwLCA1MCwgMTB9LAotezExMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE0LCAxMCwgMTAwLCA1MCwgMTB9LAotezExNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTYsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE3LCAxMCwgMTAwLCA1MCwgMTB9LAotezExOCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTksIDEwLCAxMDAsIDUwLCAxMH0sCi17MTIwLCAxMCwgMTAwLCA1MCwgMTB9LAotezEyMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMjIsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTIzLCAxMCwgMTAwLCA1MCwgMTB9LAotezEyNCwgMTAsIDEwMCwgNTAsIDEwfSwKLX07Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0TWF4aW11bVZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEyLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTksIDEwLCAxMDAsIDUwLCAxMH0sCi17LTgsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTcsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTYsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxLCAxMCwgMTAwLCA1MCwgMTB9LAotezIsIDEwLCAxMDAsIDUwLCAxMH0sCi17MywgMTAsIDEwMCwgNTAsIDEwfSwKLXs0LCAxMCwgMTAwLCA1MCwgMTB9LAotezUsIDEwLCAxMDAsIDUwLCAxMH0sCi17NiwgMTAsIDEwMCwgNTAsIDEwfSwKLXs3LCAxMCwgMTAwLCA1MCwgMTB9LAotezgsIDEwLCAxMDAsIDUwLCAxMH0sCi17OSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMSwgMTAsIDExLCAxMCwgMX0sCi17MTIsIDEwLCAxMiwgMTAsIDJ9LAotezEzLCAxMCwgMTMsIDEwLCAzfSwKLXsxNCwgMTAsIDE0LCAxMCwgNH0sCi17MTUsIDEwLCAxNSwgMTAsIDV9LAotezE2LCAxMCwgMTYsIDEwLCA2fSwKLXsxNywgMTAsIDE3LCAxMCwgN30sCi17MTgsIDEwLCAxOCwgMTAsIDh9LAotezE5LCAxMCwgMTksIDEwLCA5fSwKLXsyMCwgMTAsIDIwLCAxMCwgMTB9LAotezIxLCAxMCwgMjEsIDExLCAxMH0sCi17MjIsIDEwLCAyMiwgMTIsIDEwfSwKLXsyMywgMTAsIDIzLCAxMywgMTB9LAotezI0LCAxMCwgMjQsIDE0LCAxMH0sCi17MjUsIDEwLCAyNSwgMTUsIDEwfSwKLXsyNiwgMTAsIDI2LCAxNiwgMTB9LAotezI3LCAxMCwgMjcsIDE3LCAxMH0sCi17MjgsIDEwLCAyOCwgMTgsIDEwfSwKLXsyOSwgMTAsIDI5LCAxOSwgMTB9LAotezMwLCAxMCwgMzAsIDIwLCAxMH0sCi17MzEsIDEwLCAzMSwgMjEsIDEwfSwKLXszMiwgMTAsIDMyLCAyMiwgMTB9LAotezMzLCAxMCwgMzMsIDIzLCAxMH0sCi17MzQsIDEwLCAzNCwgMjQsIDEwfSwKLXszNSwgMTAsIDM1LCAyNSwgMTB9LAotezM2LCAxMCwgMzYsIDI2LCAxMH0sCi17MzcsIDEwLCAzNywgMjcsIDEwfSwKLXszOCwgMTAsIDM4LCAyOCwgMTB9LAotezM5LCAxMCwgMzksIDI5LCAxMH0sCi17NDAsIDEwLCA0MCwgMzAsIDEwfSwKLXs0MSwgMTAsIDQxLCAzMSwgMTB9LAotezQyLCAxMCwgNDIsIDMyLCAxMH0sCi17NDMsIDEwLCA0MywgMzMsIDEwfSwKLXs0NCwgMTAsIDQ0LCAzNCwgMTB9LAotezQ1LCAxMCwgNDUsIDM1LCAxMH0sCi17NDYsIDEwLCA0NiwgMzYsIDEwfSwKLXs0NywgMTAsIDQ3LCAzNywgMTB9LAotezQ4LCAxMCwgNDgsIDM4LCAxMH0sCi17NDksIDEwLCA0OSwgMzksIDEwfSwKLXs1MCwgMTAsIDUwLCA0MCwgMTB9LAotezUxLCAxMCwgNTEsIDQxLCAxMH0sCi17NTIsIDEwLCA1MiwgNDIsIDEwfSwKLXs1MywgMTAsIDUzLCA0MywgMTB9LAotezU0LCAxMCwgNTQsIDQ0LCAxMH0sCi17NTUsIDEwLCA1NSwgNDUsIDEwfSwKLXs1NiwgMTAsIDU2LCA0NiwgMTB9LAotezU3LCAxMCwgNTcsIDQ3LCAxMH0sCi17NTgsIDEwLCA1OCwgNDgsIDEwfSwKLXs1OSwgMTAsIDU5LCA0OSwgMTB9LAotezYwLCAxMCwgNjAsIDUwLCAxMH0sCi17NjEsIDEwLCA2MSwgNTAsIDEwfSwKLXs2MiwgMTAsIDYyLCA1MCwgMTB9LAotezYzLCAxMCwgNjMsIDUwLCAxMH0sCi17NjQsIDEwLCA2NCwgNTAsIDEwfSwKLXs2NSwgMTAsIDY1LCA1MCwgMTB9LAotezY2LCAxMCwgNjYsIDUwLCAxMH0sCi17NjcsIDEwLCA2NywgNTAsIDEwfSwKLXs2OCwgMTAsIDY4LCA1MCwgMTB9LAotezY5LCAxMCwgNjksIDUwLCAxMH0sCi17NzAsIDEwLCA3MCwgNTAsIDEwfSwKLXs3MSwgMTAsIDcxLCA1MCwgMTB9LAotezcyLCAxMCwgNzIsIDUwLCAxMH0sCi17NzMsIDEwLCA3MywgNTAsIDEwfSwKLXs3NCwgMTAsIDc0LCA1MCwgMTB9LAotezc1LCAxMCwgNzUsIDUwLCAxMH0sCi17NzYsIDEwLCA3NiwgNTAsIDEwfSwKLXs3NywgMTAsIDc3LCA1MCwgMTB9LAotezc4LCAxMCwgNzgsIDUwLCAxMH0sCi17NzksIDEwLCA3OSwgNTAsIDEwfSwKLXs4MCwgMTAsIDgwLCA1MCwgMTB9LAotezgxLCAxMCwgODEsIDUwLCAxMH0sCi17ODIsIDEwLCA4MiwgNTAsIDEwfSwKLXs4MywgMTAsIDgzLCA1MCwgMTB9LAotezg0LCAxMCwgODQsIDUwLCAxMH0sCi17ODUsIDEwLCA4NSwgNTAsIDEwfSwKLXs4NiwgMTAsIDg2LCA1MCwgMTB9LAotezg3LCAxMCwgODcsIDUwLCAxMH0sCi17ODgsIDEwLCA4OCwgNTAsIDEwfSwKLXs4OSwgMTAsIDg5LCA1MCwgMTB9LAotezkwLCAxMCwgOTAsIDUwLCAxMH0sCi17OTEsIDEwLCA5MSwgNTAsIDEwfSwKLXs5MiwgMTAsIDkyLCA1MCwgMTB9LAotezkzLCAxMCwgOTMsIDUwLCAxMH0sCi17OTQsIDEwLCA5NCwgNTAsIDEwfSwKLXs5NSwgMTAsIDk1LCA1MCwgMTB9LAotezk2LCAxMCwgOTYsIDUwLCAxMH0sCi17OTcsIDEwLCA5NywgNTAsIDEwfSwKLXs5OCwgMTAsIDk4LCA1MCwgMTB9LAotezk5LCAxMCwgOTksIDUwLCAxMH0sCi17MTAwLCAxMCwgMTAwLCA1MCwgMTB9LAotezEwMSwgMTAsIDEwMSwgNTAsIDEwfSwKLXsxMDIsIDEwLCAxMDIsIDUwLCAxMH0sCi17MTAzLCAxMCwgMTAzLCA1MCwgMTB9LAotezEwNCwgMTAsIDEwNCwgNTAsIDEwfSwKLXsxMDUsIDEwLCAxMDUsIDUwLCAxMH0sCi17MTA2LCAxMCwgMTA2LCA1MCwgMTB9LAotezEwNywgMTAsIDEwNywgNTAsIDEwfSwKLXsxMDgsIDEwLCAxMDgsIDUwLCAxMH0sCi17MTA5LCAxMCwgMTA5LCA1MCwgMTB9LAotezExMCwgMTAsIDExMCwgNTAsIDEwfSwKLXsxMTEsIDEwLCAxMTEsIDUwLCAxMH0sCi17MTEyLCAxMCwgMTEyLCA1MCwgMTB9LAotezExMywgMTAsIDExMywgNTAsIDEwfSwKLXsxMTQsIDEwLCAxMTQsIDUwLCAxMH0sCi17MTE1LCAxMCwgMTE1LCA1MCwgMTB9LAotezExNiwgMTAsIDExNiwgNTAsIDEwfSwKLXsxMTcsIDEwLCAxMTcsIDUwLCAxMH0sCi17MTE4LCAxMCwgMTE4LCA1MCwgMTB9LAotezExOSwgMTAsIDExOSwgNTAsIDEwfSwKLXsxMjAsIDEwLCAxMjAsIDUwLCAxMH0sCi17MTIxLCAxMCwgMTIxLCA1MCwgMTB9LAotezEyMiwgMTAsIDEyMiwgNTAsIDEwfSwKLXsxMjMsIDEwLCAxMjMsIDUwLCAxMH0sCi17MTI0LCAxMCwgMTI0LCA1MCwgMTB9LAotfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBzZXREZWZhdWx0cygpIHsKLQotCXNsaWRlci5zZXRNYXhpbXVtKDEwMCk7Ci0Jc2xpZGVyLnNldE1pbmltdW0oMTApOwotCXNsaWRlci5zZXRUaHVtYigxMCk7Ci0Jc2xpZGVyLnNldFNlbGVjdGlvbig1MCk7Ci0KLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRTZWxlY3Rpb25WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMTQsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTEzLCAxMCwgMTAwLCAxMCwgMTB9LAotey0xMiwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMTEsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTEwLCAxMCwgMTAwLCAxMCwgMTB9LAotey05LCAxMCwgMTAwLCAxMCwgMTB9LAotey04LCAxMCwgMTAwLCAxMCwgMTB9LAotey03LCAxMCwgMTAwLCAxMCwgMTB9LAotey02LCAxMCwgMTAwLCAxMCwgMTB9LAotey01LCAxMCwgMTAwLCAxMCwgMTB9LAotey00LCAxMCwgMTAwLCAxMCwgMTB9LAotey0zLCAxMCwgMTAwLCAxMCwgMTB9LAotey0yLCAxMCwgMTAwLCAxMCwgMTB9LAotey0xLCAxMCwgMTAwLCAxMCwgMTB9LAotezAsIDEwLCAxMDAsIDEwLCAxMH0sCi17MSwgMTAsIDEwMCwgMTAsIDEwfSwKLXsyLCAxMCwgMTAwLCAxMCwgMTB9LAotezMsIDEwLCAxMDAsIDEwLCAxMH0sCi17NCwgMTAsIDEwMCwgMTAsIDEwfSwKLXs1LCAxMCwgMTAwLCAxMCwgMTB9LAotezYsIDEwLCAxMDAsIDEwLCAxMH0sCi17NywgMTAsIDEwMCwgMTAsIDEwfSwKLXs4LCAxMCwgMTAwLCAxMCwgMTB9LAotezksIDEwLCAxMDAsIDEwLCAxMH0sCi17MTAsIDEwLCAxMDAsIDEwLCAxMH0sCi17MTEsIDEwLCAxMDAsIDExLCAxMH0sCi17MTIsIDEwLCAxMDAsIDEyLCAxMH0sCi17MTMsIDEwLCAxMDAsIDEzLCAxMH0sCi17MTQsIDEwLCAxMDAsIDE0LCAxMH0sCi17MTUsIDEwLCAxMDAsIDE1LCAxMH0sCi17MTYsIDEwLCAxMDAsIDE2LCAxMH0sCi17MTcsIDEwLCAxMDAsIDE3LCAxMH0sCi17MTgsIDEwLCAxMDAsIDE4LCAxMH0sCi17MTksIDEwLCAxMDAsIDE5LCAxMH0sCi17MjAsIDEwLCAxMDAsIDIwLCAxMH0sCi17MjEsIDEwLCAxMDAsIDIxLCAxMH0sCi17MjIsIDEwLCAxMDAsIDIyLCAxMH0sCi17MjMsIDEwLCAxMDAsIDIzLCAxMH0sCi17MjQsIDEwLCAxMDAsIDI0LCAxMH0sCi17MjUsIDEwLCAxMDAsIDI1LCAxMH0sCi17MjYsIDEwLCAxMDAsIDI2LCAxMH0sCi17MjcsIDEwLCAxMDAsIDI3LCAxMH0sCi17MjgsIDEwLCAxMDAsIDI4LCAxMH0sCi17MjksIDEwLCAxMDAsIDI5LCAxMH0sCi17MzAsIDEwLCAxMDAsIDMwLCAxMH0sCi17MzEsIDEwLCAxMDAsIDMxLCAxMH0sCi17MzIsIDEwLCAxMDAsIDMyLCAxMH0sCi17MzMsIDEwLCAxMDAsIDMzLCAxMH0sCi17MzQsIDEwLCAxMDAsIDM0LCAxMH0sCi17MzUsIDEwLCAxMDAsIDM1LCAxMH0sCi17MzYsIDEwLCAxMDAsIDM2LCAxMH0sCi17MzcsIDEwLCAxMDAsIDM3LCAxMH0sCi17MzgsIDEwLCAxMDAsIDM4LCAxMH0sCi17MzksIDEwLCAxMDAsIDM5LCAxMH0sCi17NDAsIDEwLCAxMDAsIDQwLCAxMH0sCi17NDEsIDEwLCAxMDAsIDQxLCAxMH0sCi17NDIsIDEwLCAxMDAsIDQyLCAxMH0sCi17NDMsIDEwLCAxMDAsIDQzLCAxMH0sCi17NDQsIDEwLCAxMDAsIDQ0LCAxMH0sCi17NDUsIDEwLCAxMDAsIDQ1LCAxMH0sCi17NDYsIDEwLCAxMDAsIDQ2LCAxMH0sCi17NDcsIDEwLCAxMDAsIDQ3LCAxMH0sCi17NDgsIDEwLCAxMDAsIDQ4LCAxMH0sCi17NDksIDEwLCAxMDAsIDQ5LCAxMH0sCi17NTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17NTEsIDEwLCAxMDAsIDUxLCAxMH0sCi17NTIsIDEwLCAxMDAsIDUyLCAxMH0sCi17NTMsIDEwLCAxMDAsIDUzLCAxMH0sCi17NTQsIDEwLCAxMDAsIDU0LCAxMH0sCi17NTUsIDEwLCAxMDAsIDU1LCAxMH0sCi17NTYsIDEwLCAxMDAsIDU2LCAxMH0sCi17NTcsIDEwLCAxMDAsIDU3LCAxMH0sCi17NTgsIDEwLCAxMDAsIDU4LCAxMH0sCi17NTksIDEwLCAxMDAsIDU5LCAxMH0sCi17NjAsIDEwLCAxMDAsIDYwLCAxMH0sCi17NjEsIDEwLCAxMDAsIDYxLCAxMH0sCi17NjIsIDEwLCAxMDAsIDYyLCAxMH0sCi17NjMsIDEwLCAxMDAsIDYzLCAxMH0sCi17NjQsIDEwLCAxMDAsIDY0LCAxMH0sCi17NjUsIDEwLCAxMDAsIDY1LCAxMH0sCi17NjYsIDEwLCAxMDAsIDY2LCAxMH0sCi17NjcsIDEwLCAxMDAsIDY3LCAxMH0sCi17NjgsIDEwLCAxMDAsIDY4LCAxMH0sCi17NjksIDEwLCAxMDAsIDY5LCAxMH0sCi17NzAsIDEwLCAxMDAsIDcwLCAxMH0sCi17NzEsIDEwLCAxMDAsIDcxLCAxMH0sCi17NzIsIDEwLCAxMDAsIDcyLCAxMH0sCi17NzMsIDEwLCAxMDAsIDczLCAxMH0sCi17NzQsIDEwLCAxMDAsIDc0LCAxMH0sCi17NzUsIDEwLCAxMDAsIDc1LCAxMH0sCi17NzYsIDEwLCAxMDAsIDc2LCAxMH0sCi17NzcsIDEwLCAxMDAsIDc3LCAxMH0sCi17NzgsIDEwLCAxMDAsIDc4LCAxMH0sCi17NzksIDEwLCAxMDAsIDc5LCAxMH0sCi17ODAsIDEwLCAxMDAsIDgwLCAxMH0sCi17ODEsIDEwLCAxMDAsIDgxLCAxMH0sCi17ODIsIDEwLCAxMDAsIDgyLCAxMH0sCi17ODMsIDEwLCAxMDAsIDgzLCAxMH0sCi17ODQsIDEwLCAxMDAsIDg0LCAxMH0sCi17ODUsIDEwLCAxMDAsIDg1LCAxMH0sCi17ODYsIDEwLCAxMDAsIDg2LCAxMH0sCi17ODcsIDEwLCAxMDAsIDg3LCAxMH0sCi17ODgsIDEwLCAxMDAsIDg4LCAxMH0sCi17ODksIDEwLCAxMDAsIDg5LCAxMH0sCi17OTAsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTEsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTIsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTMsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTQsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTUsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTYsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTcsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTgsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTksIDEwLCAxMDAsIDkwLCAxMH0sCi17MTAwLCAxMCwgMTAwLCA5MCwgMTB9LAotezEwMSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDIsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTAzLCAxMCwgMTAwLCA5MCwgMTB9LAotezEwNCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDUsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA2LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwNywgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDgsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA5LCAxMCwgMTAwLCA5MCwgMTB9LAotezExMCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTEsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTEyLCAxMCwgMTAwLCA5MCwgMTB9LAotezExMywgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTQsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE1LCAxMCwgMTAwLCA5MCwgMTB9LAotezExNiwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTcsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE4LCAxMCwgMTAwLCA5MCwgMTB9LAotezExOSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMjAsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTIxLCAxMCwgMTAwLCA5MCwgMTB9LAotezEyMiwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMjMsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTI0LCAxMCwgMTAwLCA5MCwgMTB9LAotfTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9BcnJvd1NlbGVjdGlvbigpIHsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoc2xpZGVyLmdldFNpemUoKS54LTEwLCA1LCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfUklHSFQsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1RodW1iU2VsZWN0aW9uICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDI1LCAxMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Ucm91Z2hTZWxlY3Rpb24gKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoNDUsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjcsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg5LCA1LCAzMCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5YmY0MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3luY2hyb25pemVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TeW5jaHJvbml6ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSgpIHsKLQkvLyB0ZXN0ZWQgaW4gVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5LnRlc3Rfc2V0U3luY2hyb25pemVyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplcgotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMTFhMDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQlUYWJGb2xkZXIgbmV3VGFiRm9sZGVyOwotCXRyeSB7Ci0JCW5ld1RhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlVHJpbUlJSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGllbnRBcmVhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDbGllbnRBcmVhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCWludCBudW1iZXIgPSAxMDsKLQlUYWJJdGVtIHRpOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBpLCB0YWJGb2xkZXIuZ2V0SXRlbUNvdW50KCk9PWkpOwotCSAgCXRpID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUkoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYkl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRUcnVlKCI6YToiICtTdHJpbmcudmFsdWVPZihpKSwgdGFiRm9sZGVyLmdldEl0ZW0oaSkuZXF1YWxzKGl0ZW1zW2ldKSk7Ci0JfQotCXRyeSB7Ci0JCXRhYkZvbGRlci5nZXRJdGVtKG51bWJlcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJdGFiRm9sZGVyLmdldEl0ZW0obnVtYmVyKzEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCXRhYkZvbGRlci5nZXRJdGVtKC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPT0gLTEiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCWludCBudW1iZXIgPSA1OwotCVRhYkl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0KLQlhc3NlcnRFcXVhbHMoMCwgdGFiRm9sZGVyLmdldEl0ZW1zKCkubGVuZ3RoKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCWl0ZW1zW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGl0ZW1zLCB0YWJGb2xkZXIuZ2V0SXRlbXMoKSk7Ci0JCi0JdGFiRm9sZGVyLmdldEl0ZW1zKClbMF0uZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgdGFiRm9sZGVyLmdldEl0ZW1zKCkpOwotCi0JdGFiRm9sZGVyLmdldEl0ZW1zKClbM10uZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM119LCB0YWJGb2xkZXIuZ2V0SXRlbXMoKSk7Ci0KLQl0YWJGb2xkZXIuZ2V0SXRlbXMoKVsxXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzNdfSwgdGFiRm9sZGVyLmdldEl0ZW1zKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQlpbnQgbnVtYmVyID0gMTA7Ci0JVGFiSXRlbVtdIHRpcyA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAl0aXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCX0KLQlhc3NlcnRUcnVlKCI6YToiLCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKClbMF0gPT0gdGlzWzBdKTsJCi0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbihpKTsKLQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKVswXT09dGlzW2ldKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYkl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uSW5kZXgoKT09MCk7Ci0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG5ldyBUYWJJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCk9PTIpOwotCQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydFRydWUoIjpjOiIsIHRhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpPT0wKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0oKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCVRhYkl0ZW1bXSB0aXMgPSBuZXcgVGFiSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJdGlzW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIHRhYkZvbGRlci5pbmRleE9mKHRpc1tpXSk9PWkpOwotCX0KLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCXRpc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCXRyeSB7Ci0JCQl0YWJGb2xkZXIuaW5kZXhPZihudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRhYkl0ZW0gPT0gbnVsbCIpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwkKLQludW1iZXIgPSAyMDsKLQlUYWJJdGVtW10gaXRlbXMgPSBuZXcgVGFiSXRlbVtudW1iZXJdOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0JCWl0ZW1zW2ldLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQotCS8vYW5vdGhlciB0YWJGb2xkZXIKLQlUYWJGb2xkZXIgdGFiRm9sZGVyXzIgPSBuZXcgVGFiRm9sZGVyKHNoZWxsLCAwKTsKLQlUYWJJdGVtW10gaXRlbXNfMiA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc18yW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyXzIsIDApOwotCQlpdGVtc18yW2ldLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIFN0cmluZy52YWx1ZU9mKGkpLCB0YWJGb2xkZXIuaW5kZXhPZihpdGVtc18yW2ldKT09LTEpOwotCX0KLQotCS8vCi0JVGFiRm9sZGVyIHRhYkZvbGRlcjIgPSBuZXcgVGFiRm9sZGVyKHNoZWxsLCBTV1QuTlVMTCk7Ci0JVGFiSXRlbSB0YWJJdGVtID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyMiwgU1dULk5VTEwpOwotCQotCWFzc2VydFRydWUoIjphOiIsIHRhYkZvbGRlci5pbmRleE9mKHRhYkl0ZW0pID09IC0xKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCkgewotCWludCBudW1iZXIgPSAxMDsKLQlUYWJJdGVtIHRpOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJdGkgPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCX0KLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKGkpOwotCQlhc3NlcnRFcXVhbHMoaSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCX0KLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCXRpID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQkgIAlhc3NlcnRFcXVhbHMoImk9IiArIGksIDAsIHRhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JbnVtYmVyID0gNTsKLQlUYWJJdGVtW10gaXRlbXMgPSBuZXcgVGFiSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQl0cnkgewotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKChUYWJJdGVtW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JZmluYWxseSB7Ci0JCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzBdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JaXRlbXMgPSBuZXcgVGFiSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbMF19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbig0KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1s0XX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDIpOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzJdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDEpOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzFdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24obnVtYmVyICsgMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbMV19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwkKLQotLy8JdGFiRm9sZGVyLnNldFNlbGVjdGlvbigtMSk7Ci0vLwlhc3NlcnRFcXVhbHMoMCwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpLmxlbmd0aCk7CQotCQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMyk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbM119LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCi0vLwl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKC0yKTsKLS8vCWFzc2VydEVxdWFscygwLCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoKTsJCi0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihuZXcgVGFiSXRlbVtde30pOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde30sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24obmV3IFRhYkl0ZW1bXSB7aXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXSB7aXRlbXNbMF19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihuZXcgVGFiSXRlbVtdIHtpdGVtc1szXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtdIHtpdGVtc1szXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihuZXcgVGFiSXRlbVtdIHtpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtdIHtpdGVtc1s0XX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzJdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzFdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzFdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsJCi0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCXRyeSB7Ci0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oIG5ldyBUYWJJdGVtW117aXRlbXNbMF0sIG51bGx9KTsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbiggbmV3IFRhYkl0ZW1bXXtudWxsfSk7CQkKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWZpbmFsbHkgewotCQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1swXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVRyaW1JSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDbGllbnRBcmVhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1BndXBTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1BnZHduU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlVHJpbUlJSUkiKSkgdGVzdF9jb21wdXRlVHJpbUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgiKSkgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtIikpIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtIikpIHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JIikpIHRlc3Rfc2V0U2VsZWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9QZ2R3blNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1BnZHduU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9QZ3VwU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfUGd1cFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFRhYkZvbGRlciB0YWJGb2xkZXI7Ci0KLXByaXZhdGUgdm9pZCBtYWtlQ2xlYW5FbnZpcm9ubWVudCgpIHsKLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLQl0YWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQodGFiRm9sZGVyKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYkZvbGRlcihWZWN0b3IgZXZlbnRzKSB7Ci0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJUYWJJdGVtICYiICsgaSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlRhYkl0ZW0gVG9vbFRpcCIgKyBpKTsKLQkJVGV4dCBpdGVtVGV4dCA9IG5ldyBUZXh0KHRhYkZvbGRlciwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCWl0ZW1UZXh0LnNldFRleHQoIlxuVGV4dCBmb3IgVGFiSXRlbSAiICsgaSArICJcblxuXG4iKTsKLQkJaXRlbS5zZXRDb250cm9sKGl0ZW1UZXh0KTsKLQkJaG9va0V4cGVjdGVkRXZlbnRzKGl0ZW0sIGdldFRlc3ROYW1lKCksIGV2ZW50cyk7Ci0JfQotCQotLy8JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihuZXcgVGFiSXRlbVtdIHt0YWJGb2xkZXIuZ2V0SXRlbSgwKX0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX1JJR0hULCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCh0YWJGb2xkZXIuZ2V0U2l6ZSgpLngvMiwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1BnZHduU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkNUUkwsIDAsIFNXVC5QQUdFX0RPV04sIENvbnNpc3RlbmN5VXRpbGl0eS5ET1VCTEVfS0VZX1BSRVNTLCBldmVudHMsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9QZ3VwU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIHRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMik7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQ1RSTCwgMCwgU1dULlBBR0VfVVAsIENvbnNpc3RlbmN5VXRpbGl0eS5ET1VCTEVfS0VZX1BSRVNTLCBldmVudHMsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIHRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1MCwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgdGFiRm9sZGVyLnNldFNlbGVjdGlvbigxKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCA1LCA3MCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHLCBldmVudHMpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYmFkNzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0gewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0YWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyKHNoZWxsLCAwKTsKLQl0YWJJdGVtID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQlzZXRXaWRnZXQodGFiSXRlbSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVySSgpIHsKLQl0cnkgewotCQluZXcgVGFiSXRlbShudWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXJJSSgpIHsKLQlUYWJJdGVtIHRJdGVtID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTlVMTCwgMCk7Ci0JCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGFiRm9sZGVyLmdldEl0ZW1zKClbMF0gPT0gdEl0ZW0pOwotCQotCXRJdGVtID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTlVMTCwgMSk7CQotCWFzc2VydFRydWUoIjpiOiIsIHRhYkZvbGRlci5nZXRJdGVtcygpWzFdID09IHRJdGVtKTsKLQkJCQkKLQl0SXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5VTEwsIDEpOwkKLQlhc3NlcnRUcnVlKCI6YzoiLCB0YWJGb2xkZXIuZ2V0SXRlbXMoKVsxXSA9PSB0SXRlbSk7Ci0KLQl0cnkgewotCQluZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OVUxMLCAtMSk7CQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlmaW5hbGx5IHsKLQkJYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGFiRm9sZGVyLmdldEl0ZW1zKClbMV0gPT0gdEl0ZW0pOwkJCQotCX0KLQl0cnkgewotCQluZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OVUxMLCB0YWJGb2xkZXIuZ2V0SXRlbUNvdW50KCkgKyAxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JZmluYWxseSB7Ci0JCWFzc2VydFRydWUoIjplOiIsIHRhYkZvbGRlci5nZXRJdGVtcygpWzFdID09IHRJdGVtKTsKLQl9Ci0JdHJ5IHsKLQkJbmV3IFRhYkl0ZW0obnVsbCwgU1dULk5VTEwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCWFzc2VydFRydWUoIjphOiAiLCB0YWJJdGVtLmdldFBhcmVudCgpID09IHRhYkZvbGRlcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9vbFRpcFRleHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRvb2xUaXBUZXh0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCUNvbnRyb2wgY29udHJvbCA9IG5ldyBUYWJsZSh0YWJGb2xkZXIsIFNXVC5OVUxMKTsKLQotCWFzc2VydFRydWUoIjphOiAiLCB0YWJJdGVtLmdldENvbnRyb2woKSA9PSBudWxsKTsJCi0KLQl0YWJJdGVtLnNldENvbnRyb2woY29udHJvbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6ICIsIHRhYkl0ZW0uZ2V0Q29udHJvbCgpID09IGNvbnRyb2wpOwotCi0JdGFiSXRlbS5zZXRDb250cm9sKG51bGwpOwotCWFzc2VydFRydWUoIjpjOiAiLCB0YWJJdGVtLmdldENvbnRyb2woKSA9PSBudWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0YWJJdGVtLnNldFRvb2xUaXBUZXh0KCJmcmVkIik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6ICIsIHRhYkl0ZW0uZ2V0VG9vbFRpcFRleHQoKS5lcXVhbHMoImZyZWQiKSk7Ci0JdGFiSXRlbS5zZXRUb29sVGlwVGV4dCgiZnJlZHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dCIpOwotCWFzc2VydFRydWUoIjpiOiAiLCB0YWJJdGVtLmdldFRvb2xUaXBUZXh0KCkuZXF1YWxzKCJmcmVkdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0IikpOwotCXRhYkl0ZW0uc2V0VG9vbFRpcFRleHQobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6ICIsIHRhYkl0ZW0uZ2V0VG9vbFRpcFRleHQoKSA9PSBudWxsKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvb2xUaXBUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlckkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXJJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250cm9sIikpIHRlc3RfZ2V0Q29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb29sVGlwVGV4dCIpKSB0ZXN0X2dldFRvb2xUaXBUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLVRhYkZvbGRlciB0YWJGb2xkZXI7Ci1UYWJJdGVtIHRhYkl0ZW07Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZWU0ODYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7IC8vIGJ5IGRlZmF1bHQsIHVzZSBtdWx0aS1zZWxlY3QgdGFibGUuCQotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJbmV3IFRhYmxlKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0JEkoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MCwgM30pOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KG5ldyBpbnRbXSB7MSwgMn0pOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KG5ldyBpbnRbXSB7MSwgMywgNX0pOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KG5ldyBpbnRbXSB7OSwgMywgMH0pOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQotCXRhYmxlLnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdHJ5ewotCQl0YWJsZS5kZXNlbGVjdChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHt9KTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLQotCXRhYmxlLmRlc2VsZWN0KG5ldyBpbnRbXSB7LTEsIDEwMCwgLTEwMDB9KTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLQotCXRhYmxlLmRlc2VsZWN0KG5ldyBpbnRbXSB7MiwgLTEsIDEsIDEwMCwgMn0pOwotCWFzc2VydEVxdWFscyhudW1iZXItMiwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHsyLCAtMSwgMSwgMTAwLCAyfSk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlci0yLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdChuZXcgaW50W10gezIsIC0xLCAzLCAxMDAsIDJ9KTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTMsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0QWxsKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsyLCA0LCA1LCAxMH0pOwotCQotCWFzc2VydEVxdWFscyg0LCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RJKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JfQotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdCgwKTsJCi0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MCwgMywgNn0pOwotCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDApOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdCgwKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdCg1KTsKLQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdCgzKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdGFibGUuZGVzZWxlY3QoMTAwKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RJSSgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MCwgMywgNn0pOwotCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDcsIDEwKTsKLQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdCg2LCAxMCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QoMSwgMTApOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDAsIDEwKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdCgwLCAxMDApOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQotCXRhYmxlLnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QoLTEwLCAyKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTMsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCi0JdGFibGUuZGVzZWxlY3QoLTEwLCAyMDAwKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5kZXNlbGVjdCgyMDAwLCAtMTApOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCQotCXRhYmxlLmRlc2VsZWN0KDAsIG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5kZXNlbGVjdCgwLCAwKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCi0JdGFibGUuZGVzZWxlY3QobnVtYmVyLTEsIG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCXRhYmxlLmRlc2VsZWN0KC0xLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5kZXNlbGVjdChudW1iZXIsIG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1uQ291bnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldENvbHVtbkNvdW50KCkpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldENvbHVtbkNvdW50KCkpOwotCWNvbHVtbjAuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpKTsKLQljb2x1bW4xLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JY29sdW1uMi5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldENvbHVtbkNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbHVtbkkoKSB7Ci0JdHJ5IHsKLQkJdGFibGUuZ2V0Q29sdW1uKDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCVRhYmxlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQl0cnkgewotCQl0YWJsZS5nZXRDb2x1bW4oMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IG91dCBvZiByYW5nZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjAsIHRhYmxlLmdldENvbHVtbigwKSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCWFzc2VydEVxdWFscyhjb2x1bW4xLCB0YWJsZS5nZXRDb2x1bW4oMSkpOwotCWNvbHVtbjEuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRhYmxlLmdldENvbHVtbigxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQljb2x1bW4wLmRpc3Bvc2UoKTsKLQl0cnkgewotCQl0YWJsZS5nZXRDb2x1bW4oMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IG91dCBvZiByYW5nZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1ucygpIHsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0Q29sdW1ucygpLmxlbmd0aCk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQlhc3NlcnRFcXVhbHMoMSwgY29sdW1ucy5sZW5ndGgpOwotCWFzc2VydEVxdWFscyhjb2x1bW4wLCBjb2x1bW5zWzBdKTsKLQljb2x1bW4wLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0Q29sdW1ucygpLmxlbmd0aCk7Ci0JY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5SSUdIVCwgMSk7Ci0JY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQlhc3NlcnRFcXVhbHMoMiwgY29sdW1ucy5sZW5ndGgpOwotCWFzc2VydEVxdWFscyhjb2x1bW4wLCBjb2x1bW5zWzBdKTsKLQlhc3NlcnRFcXVhbHMoY29sdW1uMSwgY29sdW1uc1sxXSk7Ci0JY29sdW1uMC5kaXNwb3NlKCk7Ci0JY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQlhc3NlcnRFcXVhbHMoMSwgY29sdW1ucy5sZW5ndGgpOwotCWFzc2VydEVxdWFscyhjb2x1bW4xLCBjb2x1bW5zWzBdKTsKLQljb2x1bW4xLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0Q29sdW1ucygpLmxlbmd0aCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1uT3JkZXIoKSB7Ci0JLy9pbiB0ZXN0X3NldEFDb2x1bW5PcmRlciRJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0R3JpZExpbmVXaWR0aCgpIHsKLQkvLyBleGVjdXRlIG1ldGhvZCBidXQgdGhlcmUgaXMgbm8gd2F5IHRvIGNoZWNrIHRoZSB2YWx1ZSBzaW5jZSBpdCBtYXkgYmUgYW55dGhpbmcgaW5jbHVkaW5nIDAKLQl0YWJsZS5nZXRHcmlkTGluZVdpZHRoKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SGVhZGVySGVpZ2h0KCkgewotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRIZWFkZXJIZWlnaHQoKSk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKHRhYmxlLmdldEhlYWRlckhlaWdodCgpID4gMCk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldEhlYWRlckhlaWdodCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWFkZXJWaXNpYmxlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEhlYWRlclZpc2libGVaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCWludFtdIGNhc2VzID0gezAsIDEwLCAxMDB9OwotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gdGkgPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImo9IisgaiwgY2FzZXNbal0sIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotCi0JLy8gbm90ZTogU1dULlNJTkdMRQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwkKLQlmb3IgKGludCBqID0gMDsgaiA8IGNhc2VzLmxlbmd0aDsgaisrKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXNbal07IGkrKykgewotCQkJVGFibGVJdGVtIHRpID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJqPSIrIGosIGNhc2VzW2pdLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JCXRhYmxlLnJlbW92ZUFsbCgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSGVpZ2h0KCkgewotCWFzc2VydFRydWUoIjphOiBJdGVtIGhlaWdodCA8PSAwIiwgdGFibGUuZ2V0SXRlbUhlaWdodCgpID4gMCk7Ci0JbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IEl0ZW0gaGVpZ2h0IDw9IDAiLCB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSSgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydEVxdWFscygiaT0iICsgaSwgaXRlbXNbaV0sIHRhYmxlLmdldEl0ZW0oaSkpOwotCXRyeSB7Ci0JCXRhYmxlLmdldEl0ZW0obnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJdGFibGUuZ2V0SXRlbShudW1iZXIrMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gbm90ZTogU1dULlNJTkdMRQkKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCJpPSIgKyBpLCBpdGVtc1tpXSwgdGFibGUuZ2V0SXRlbShpKSk7Ci0JfQotCXRyeSB7Ci0JCXRhYmxlLmdldEl0ZW0obnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJdGFibGUuZ2V0SXRlbShudW1iZXIrMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCWludFtdIGNhc2VzID0gezAsIDEwLCAxMDB9OwotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gdGkgPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImo9IiArIGosIGNhc2VzW2pdLCB0YWJsZS5nZXRJdGVtcygpLmxlbmd0aCk7Ci0JCXRhYmxlLnJlbW92ZUFsbCgpOwotCX0KLQotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gdGkgPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJCXRpLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCQl9Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKCJqPSIgKyBqICsgIiwgaT0iICsgaSwgU3RyaW5nLnZhbHVlT2YoaSksIGl0ZW1zW2ldLmdldFRleHQoKSk7Ci0JCX0KLQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotCQotCS8vIG5vdGUgU1dULlNJTkdMRQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gdGkgPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImo9IiArIGosIGNhc2VzW2pdLCB0YWJsZS5nZXRJdGVtcygpLmxlbmd0aCk7Ci0JCXRhYmxlLnJlbW92ZUFsbCgpOwotCX0KLQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQkKLQlmb3IgKGludCBqID0gMDsgaiA8IGNhc2VzLmxlbmd0aDsgaisrKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXNbal07IGkrKykgewotCQkJVGFibGVJdGVtIHRpID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCQl0aS5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGkpKTsKLQkJfQotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscygiaj0iICsgaiArICIsIGk9IiArIGksIFN0cmluZy52YWx1ZU9mKGkpLCBpdGVtc1tpXS5nZXRUZXh0KCkpOwotCQl9Ci0JCXRhYmxlLnJlbW92ZUFsbCgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lc1Zpc2libGUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TGluZXNWaXNpYmxlWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge30sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1sxMF0sIGl0ZW1zW251bWJlci0xXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydFNhbWUoaXRlbXMsIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkKLQkvLyBub3RlOiBTV1QuU0lOR0xFCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1sxMF19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1tudW1iZXItMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1tudW1iZXItMV19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzJdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMTBdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zW251bWJlci0xXX0pOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCWFzc2VydEVxdWFscygtMSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkKLQkvLyBub3RlOiBTV1QuU0lOR0xFCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCWFzc2VydEVxdWFscygtMSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbbnVtYmVyLTFdfSk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciAtIDEsIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEwLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygtMSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoLTEsIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkluZGljZXMoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMobmV3IGludFtde30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1sxMF19KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXsyLCAxMCwgbnVtYmVyLTF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOyAvLyAxMCA8IG51bWJlcgotCi0JaW50W10gYWxsID0gbmV3IGludFtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlcjsgaSsrKQotCQlhbGxbaV09aTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydFNhbWUoYWxsLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JLy8gbm90ZTogU1dULlNJTkdMRQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMobmV3IGludFtde30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXsyfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbbnVtYmVyLTFdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXtudW1iZXItMX0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117MTB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtde30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb3BJbmRleCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VG9wSW5kZXggbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0oKSB7Ci0JaW50IG51bWJlciA9IDIwOwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQlpdGVtc1tpXS5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGkpKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscyhpLCB0YWJsZS5pbmRleE9mKGl0ZW1zW2ldKSk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQl0cnkgewotCQkJdGFibGUuaW5kZXhPZigoVGFibGVJdGVtKW51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGFibGVJdGVtID09IG51bGwiKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8vIGFub3RoZXIgdGFibGUKLQlUYWJsZSB0YWJsZV8yID0gbmV3IFRhYmxlKHNoZWxsLCAwKTsKLQlUYWJsZUl0ZW1bXSBpdGVtc18yID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNfMltpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGVfMiwgMCk7Ci0JCWl0ZW1zXzJbaV0uc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoImk9IiArIGksIC0xLCB0YWJsZS5pbmRleE9mKGl0ZW1zXzJbaV0pKTsKLQl9Ci0JCi0JLy8gbm90ZTogU1dULlNJTkdMRQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCW51bWJlciA9IDIwOwotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQlpdGVtc1tpXS5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGkpKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscyhpLCB0YWJsZS5pbmRleE9mKGl0ZW1zW2ldKSk7Ci0JfQotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCWl0ZW1zW2ldLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJdHJ5IHsKLQkJCXRhYmxlLmluZGV4T2YoKFRhYmxlSXRlbSludWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRhYmxlSXRlbSA9PSBudWxsIik7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCWl0ZW1zW2ldLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQotCS8vIGFub3RoZXIgdGFibGUKLQl0YWJsZV8yID0gbmV3IFRhYmxlKHNoZWxsLCAwKTsKLQlpdGVtc18yID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNfMltpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGVfMiwgMCk7Ci0JCWl0ZW1zXzJbaV0uc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoImk9IiArIGksIC0xLCB0YWJsZS5pbmRleE9mKGl0ZW1zXzJbaV0pKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNTZWxlY3RlZEkoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksICF0YWJsZS5pc1NlbGVjdGVkKGkpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1sxMF19KTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWlmIChpID09IDIgfHwgaSA9PSBudW1iZXItMSB8fCBpID09IDEwKQotCQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksIHRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCQllbHNlCi0JCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgIXRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCX0KLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydFRydWUoIjpjOiIgKyBpLCB0YWJsZS5pc1NlbGVjdGVkKGkpKTsKLQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkJCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0VHJ1ZSgiOmQ6IiArIGksICF0YWJsZS5pc1NlbGVjdGVkKGkpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHtpdGVtc1sxMF19KTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWlmIChpID09IDEwKQotCQkJYXNzZXJ0VHJ1ZSgiOmU6IiArIGksIHRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCQllbHNlCi0JCQlhc3NlcnRUcnVlKCI6ZToiICsgaSwgIXRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCX0KLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspewotCQlhc3NlcnRUcnVlKCI6ZjoiICsgaSwgIXRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmUkSSgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0cnkgewotCQl0YWJsZS5yZW1vdmUobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRhYmxlSXRlbXMgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQl0YWJsZS5yZW1vdmUobmV3IGludFtdIHsyLCAxLCAwLCAtMTAwLCA1LCA1LCAyLCAxLCAwLCAwLCAwfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnRzIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQl0YWJsZS5yZW1vdmUobmV3IGludFtdIHsyLCAxLCAwLCBudW1iZXIsIDUsIDUsIDIsIDEsIDAsIDAsIDB9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudHMiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRhYmxlLnJlbW92ZShuZXcgaW50W10ge30pOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgIWl0ZW1zWzJdLmlzRGlzcG9zZWQoKSk7Ci0JdGFibGUucmVtb3ZlKG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydFRydWUoIjpiOiIsIGl0ZW1zWzJdLmlzRGlzcG9zZWQoKSk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlci0xLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQlhc3NlcnRUcnVlKCI6YzoiLCAhaXRlbXNbbnVtYmVyLTFdLmlzRGlzcG9zZWQoKSk7Ci0JdGFibGUucmVtb3ZlKG5ldyBpbnRbXSB7bnVtYmVyLTJ9KTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBpdGVtc1tudW1iZXItMV0uaXNEaXNwb3NlZCgpKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTIsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCWFzc2VydFRydWUoIjplOiIsICFpdGVtc1szXS5pc0Rpc3Bvc2VkKCkpOwotCXRhYmxlLnJlbW92ZShuZXcgaW50W10gezJ9KTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBpdGVtc1szXS5pc0Rpc3Bvc2VkKCkpOwotCWFzc2VydEVxdWFscyhudW1iZXItMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JYXNzZXJ0VHJ1ZSgiOmc6IiwgIWl0ZW1zWzBdLmlzRGlzcG9zZWQoKSk7Ci0JdGFibGUucmVtb3ZlKG5ldyBpbnRbXSB7MH0pOwotCWFzc2VydFRydWUoIjpoOiIsIGl0ZW1zWzBdLmlzRGlzcG9zZWQoKSk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlci00LCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWxsKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUucmVtb3ZlQWxsKCk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5yZW1vdmVBbGwoKTsKLQl0YWJsZS5yZW1vdmVBbGwoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSUkoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0cnkgewotCQl0YWJsZS5yZW1vdmUoLW51bWJlciwgbnVtYmVyICsgMTAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdGFibGUucmVtb3ZlKDIsIDMpOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzFdLCBpdGVtc1s0XX0sIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKDIsIDEwMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQlhc3NlcnRFcXVhbHMoaXRlbXMsIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKDIsIG51bWJlcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQlhc3NlcnRFcXVhbHMoaXRlbXMsIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRhYmxlLnJlbW92ZSgyLCBudW1iZXItMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMF0sIGl0ZW1zWzFdfSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRhYmxlLnJlbW92ZSgwLCAzKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1s0XX0sIHRhYmxlLmdldEl0ZW1zKCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0YWJsZS5yZW1vdmUoMCwgbnVtYmVyLTEpOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge30sIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5yZW1vdmUobmV3IGludFtdIHt9KTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZSgtMjAsIC0xMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQlhc3NlcnRFcXVhbHMoaXRlbXMsIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZSgyMCwgNDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IHJhbmdlIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHt9Ci0JYXNzZXJ0RXF1YWxzKGl0ZW1zLCB0YWJsZS5nZXRJdGVtcygpKTsKLQkKLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0YWJsZS5yZW1vdmUoMjAwLCA0MCk7Ci0JYXNzZXJ0RXF1YWxzKGl0ZW1zLCB0YWJsZS5nZXRJdGVtcygpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRhYmxlLnJlbW92ZSgyLCAyKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1sxXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0YWJsZS5yZW1vdmUoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0sIHRhYmxlLmdldEl0ZW1zKCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdGFibGUucmVtb3ZlKDQsIDQpOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM119LCB0YWJsZS5nZXRJdGVtcygpKTsKLQkKLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKC0xMCwgMik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JaWYgKGZDaGVja1NXVFBvbGljeSkgewotCQl0YWJsZS5yZW1vdmUoMTAsIDIpOwotCQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JfQotCXRhYmxlLnJlbW92ZSgwLCAyKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyIC0gMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzNdLCBpdGVtc1s0XX0sIHRhYmxlLmdldEl0ZW1zKCkpOwotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZSgxLCAyMDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IHJhbmdlIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHt9Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciAtIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1szXSwgaXRlbXNbNF19LCB0YWJsZS5nZXRJdGVtcygpKTsKLQkKLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnJlbW92ZSgwLCBudW1iZXItMSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZShudW1iZXIsIG51bWJlcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZShudW1iZXIsIG51bWJlciArIDEwMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQkKLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCi0JbnVtYmVyID0gMTU7Ci0JaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnJlbW92ZShuZXcgaW50W10gezIsIDEsIDAsIDUsIDV9KTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTQsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0JEkoKSB7Ci0JdHJ5IHsKLQkJdGFibGUuc2VsZWN0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezIsIDEwLCAxNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsyLCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTAsIDIsIDE0fSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezIsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHtudW1iZXIsIDAsIG51bWJlci0xfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezAsIG51bWJlci0xfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCXRhYmxlLnNlbGVjdChuZXcgaW50W10ge251bWJlciwgMCwgLTF9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHswfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezEwfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezAsIDEwfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsyfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezAsIDIsIDEwfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHswLCAyLCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTV9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHstMX0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezQsIDQsIDR9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7NH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQkvLyBub3RlOiBTV1QuU0lOR0xFCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7IAotCQotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0cnkgewotCQl0YWJsZS5zZWxlY3QobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlmaW5hbGx5IHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCX0KLQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezB9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTB9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MTB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezJ9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7Mn0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTR9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTV9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHstMX0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezEwLCAyLCAxNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezQsIDQsIDR9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RBbGwoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCWFzc2VydEVxdWFscyhuZXcgaW50W117fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAxLCAyLCAzLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQkvLyB0ZXN0IHNpbmdsZS1zZWxlY3Rpb24gdGFibGUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RJKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezEwLCAyLCAxNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsyLCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdCg3KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXsyLCA3LCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDApOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDIsIDcsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQkvLyBub3RlOiBTV1QuU0lOR0xFCQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnNlbGVjdCgwKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHswfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgxKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHsxfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgxMCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7MTB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHtudW1iZXItMX0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCXRhYmxlLnNlbGVjdChudW1iZXIpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoLTEpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RJSSgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxMCwgMiwgMTR9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MiwgMTAsIDE0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZWxlY3QoNyk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MiwgNywgMTAsIDE0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgwKTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAyLCA3LCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDQsIDEwKTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAyLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDQsIDE0KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAyLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDAsIDcpOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoOSwgNSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2VsZWN0KC0xMDAsIDEwMDApOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdCgwLCAxMDAwKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCi0JdGFibGUuc2VsZWN0KDAsIG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCi0JdGFibGUuc2VsZWN0KDAsIDApOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCi0JdGFibGUuc2VsZWN0KG51bWJlci0xLCBudW1iZXIpOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCi0JdGFibGUuc2VsZWN0KG51bWJlciwgbnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2VsZWN0KDAsIDApOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7MH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoNCwgNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7NH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoMTAsIDEwKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHsxMH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QobnVtYmVyLTEsIG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHtudW1iZXItMX0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCXRhYmxlLnNlbGVjdChudW1iZXIsIG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgwLCBudW1iZXItMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgtMSwgbnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDQsIDUpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoNSwgNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgtMSwgLTEpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29sdW1uT3JkZXIkSSgpIHsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Q29sdW1uT3JkZXIoKSwgbmV3IGludFswXSk7Ci0JdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldENvbHVtbk9yZGVyKCksIG5ldyBpbnRbMF0pOwotCXRyeSB7Ci0JCXRhYmxlLnNldENvbHVtbk9yZGVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCXRyeSB7Ci0JCXRhYmxlLnNldENvbHVtbk9yZGVyKG5ldyBpbnRbMV0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCQotCVRhYmxlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRDb2x1bW5PcmRlcigpLCBuZXcgaW50W117MCwgMSwgMn0pOwotCXRyeSB7Ci0JCXRhYmxlLnNldENvbHVtbk9yZGVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCXRyeSB7Ci0JCXRhYmxlLnNldENvbHVtbk9yZGVyKG5ldyBpbnRbMF0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCXRyeSB7Ci0JCXRhYmxlLnNldENvbHVtbk9yZGVyKG5ldyBpbnRbXXswLDF9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge30KLQl0cnkgewotCQl0YWJsZS5zZXRDb2x1bW5PcmRlcihuZXcgaW50W117MCwgMSwgMiwgM30pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCXRyeSB7Ci0JCXRhYmxlLnNldENvbHVtbk9yZGVyKG5ldyBpbnRbXXswLCAwLCAxfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFtdezMsIDAsIDF9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge30KLQl0YWJsZS5zZXRDb2x1bW5PcmRlcihuZXcgaW50W117MiwgMSwgMH0pOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRDb2x1bW5PcmRlcigpLCBuZXcgaW50W10gezIsIDEsIDB9KTsKLQljb2x1bW4yLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Q29sdW1uT3JkZXIoKSwgbmV3IGludFtdIHsxLCAwfSk7Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFtdezAsIDEsIDJ9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge30KLQljb2x1bW4xLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Q29sdW1uT3JkZXIoKSwgbmV3IGludFtdezB9KTsKLQljb2x1bW4wLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Q29sdW1uT3JkZXIoKSwgbmV3IGludFswXSk7Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFsxXSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JVGFibGUgdGFibGUyID0gbmV3IFRhYmxlKHRhYmxlLmdldFBhcmVudCgpLCBTV1QuTk9ORSk7Ci0JdGFibGUyLmRpc3Bvc2UoKTsKLQl0cnkgewotCQl0YWJsZTIuZ2V0Q29sdW1uT3JkZXIoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkZ2V0IGlzIERpc3Bvc2VkIik7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7fQotCXRyeSB7Ci0JCXRhYmxlMi5zZXRDb2x1bW5PcmRlcihuZXcgaW50WzBdKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkZ2V0IGlzIERpc3Bvc2VkIik7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7fQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRIZWFkZXJWaXNpYmxlWigpIHsKLQlhc3NlcnRGYWxzZSh0YWJsZS5nZXRIZWFkZXJWaXNpYmxlKCkpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRIZWFkZXJWaXNpYmxlKCkpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUoZmFsc2UpOwotCWFzc2VydEZhbHNlKHRhYmxlLmdldEhlYWRlclZpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TGluZXNWaXNpYmxlWigpIHsKLQlpZiAoU3d0SnVuaXQuaXNDYXJib24pIHsKLQkJLyogb25seSBjYXJib24gdmVyc2lvbnMgPj0gMTAuNCBzdXBwb3J0IFRhYmxlIGxpbmVzICovCi0JCWFzc2VydEZhbHNlKHRhYmxlLmdldExpbmVzVmlzaWJsZSgpKTsKLQkJcmV0dXJuOwotCX0KLQlhc3NlcnRGYWxzZSh0YWJsZS5nZXRMaW5lc1Zpc2libGUoKSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUodGFibGUuZ2V0TGluZXNWaXNpYmxlKCkpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0RmFsc2UodGFibGUuZ2V0TGluZXNWaXNpYmxlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFJlZHJhd1ooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFJlZHJhd1ogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb24kSSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRyeSB7Ci0JCXRhYmxlLnNldFNlbGVjdGlvbigoaW50W10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtde30pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W117MCwgMywgMn0pOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDIsIDN9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W117MywgMiwgMX0pOwotCWFzc2VydFNhbWUobmV3IGludFtdezEsIDIsIDN9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXXsxLCA0LCAwfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MCwgMSwgNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXXswLCA0LCAwfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MCwgNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXXsyLCAzLCA0fSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MiwgMywgNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdezQsIDQsIDQsIDQsIDQsIDQsIDR9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXXs0fSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQkvLyB0ZXN0IHNpbmdsZS1zZWxlY3Rpb24gdGFibGUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQotCXRyeSB7Ci0JCXRhYmxlLnNldFNlbGVjdGlvbigoaW50W10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gcmFuZ2UgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JZmluYWxseSB7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl9Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7fSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10gezB9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHswfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10gezJ9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHsyfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10gezR9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10ge251bWJlci0xfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7bnVtYmVyLTF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7bnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10gey0xfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10gezAsIDMsIDJ9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10gezMsIDIsIDF9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10gezQsIDQsIDQsIDQsIDQsIDQsIDR9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKCkgewotCWludCBudW1iZXIgPSA1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUuc2V0U2VsZWN0aW9uKChUYWJsZUl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiByYW5nZSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlmaW5hbGx5IHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCX0KLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117fSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbM10sIGl0ZW1zWzJdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1szXSwgaXRlbXNbMl0sIGl0ZW1zWzFdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgVGFibGVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1s0XSwgaXRlbXNbMF19KTsKLQlhc3NlcnRTYW1lKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbMV0sIGl0ZW1zWzRdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1s0XSwgaXRlbXNbMF19KTsKLQlhc3NlcnRTYW1lKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbNF19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzRdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1s0XX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1swXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzNdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbM119LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1s0XX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzJdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHtpdGVtc1sxXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzFdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JLy8gdGVzdCBzaW5nbGUtc2VsZWN0aW9uIHRhYmxlCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXt9KTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1szXSwgaXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde30sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzNdLCBpdGVtc1syXSwgaXRlbXNbMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde30sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1s0XSwgaXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde30sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1s0XSwgaXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde30sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzRdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMF19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHtpdGVtc1szXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzNdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbNF19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzJdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzFdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMV19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQkJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde30sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDApOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117MH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JdGFibGUuc2V0U2VsZWN0aW9uKDMpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117M30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7CQotCXRhYmxlLnNldFNlbGVjdGlvbig0KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDIpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117Mn0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDEpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117MX0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQkvLyB0ZXN0IHNpbmdsZS1zZWxlY3Rpb24gdGFibGUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkJCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbigwKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDMpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117M30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDQpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117NH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXsyfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXsxfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbigwLCAxKTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAxfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbigyLCA0KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXsyLCAzLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMywgNCk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MywgNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDUsIDQpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbigyLCAyKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezJ9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbigxLCA0KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXsxLCAyLCAzLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbigwLCA0KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAxLCAyLCAzLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiB0YWJsZQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRhYmxlLnNldFNlbGVjdGlvbigwLCAxKTsKLQlpZiAoZkNoZWNrU1dUUG9saWN5KQotCQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHsxfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JaWYgKGZDaGVja1NXVFBvbGljeSkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7NH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JdGFibGUuc2V0U2VsZWN0aW9uKDUsIDQpOwotCWlmIChmQ2hlY2tTV1RQb2xpY3kpCi0JCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JdGFibGUuc2V0U2VsZWN0aW9uKDIsIDIpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezJ9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCXRhYmxlLnNldFNlbGVjdGlvbigxLCA0KTsKLQlpZiAoZkNoZWNrU1dUUG9saWN5KQotCQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24oMCwgNCk7Ci0JaWYgKGZDaGVja1NXVFBvbGljeSkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7NH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9wSW5kZXhJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUb3BJbmRleEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93Q29sdW1uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaG93Q29sdW1uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93U2VsZWN0aW9uKCkgewotCXRhYmxlLnNob3dTZWxlY3Rpb24oKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3QkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1uQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbHVtbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbHVtbk9yZGVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb2x1bW5zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRHcmlkTGluZVdpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWFkZXJIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhlYWRlclZpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZXNWaXNpYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uSW5kaWNlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1NlbGVjdGVkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb2x1bW5PcmRlciRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRIZWFkZXJWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGluZXNWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UmVkcmF3WiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wSW5kZXhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93Q29sdW1uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3QkSSIpKSB0ZXN0X2Rlc2VsZWN0JEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0QWxsIikpIHRlc3RfZGVzZWxlY3RBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0SSIpKSB0ZXN0X2Rlc2VsZWN0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RJSSIpKSB0ZXN0X2Rlc2VsZWN0SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbkNvdW50IikpIHRlc3RfZ2V0Q29sdW1uQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbkkiKSkgdGVzdF9nZXRDb2x1bW5JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb2x1bW5PcmRlciIpKSB0ZXN0X2dldENvbHVtbk9yZGVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb2x1bW5zIikpIHRlc3RfZ2V0Q29sdW1ucygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0R3JpZExpbmVXaWR0aCIpKSB0ZXN0X2dldEdyaWRMaW5lV2lkdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlYWRlckhlaWdodCIpKSB0ZXN0X2dldEhlYWRlckhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SGVhZGVyVmlzaWJsZSIpKSB0ZXN0X2dldEhlYWRlclZpc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUhlaWdodCIpKSB0ZXN0X2dldEl0ZW1IZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVzVmlzaWJsZSIpKSB0ZXN0X2dldExpbmVzVmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpKSB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpKSB0ZXN0X2dldFNlbGVjdGlvbkluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzIikpIHRlc3RfZ2V0U2VsZWN0aW9uSW5kaWNlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wSW5kZXgiKSkgdGVzdF9nZXRUb3BJbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbiIpKSB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtIikpIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzU2VsZWN0ZWRJIikpIHRlc3RfaXNTZWxlY3RlZEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZSRJIikpIHRlc3RfcmVtb3ZlJEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFsbCIpKSB0ZXN0X3JlbW92ZUFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSSIpKSB0ZXN0X3JlbW92ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUlJIikpIHRlc3RfcmVtb3ZlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3QkSSIpKSB0ZXN0X3NlbGVjdCRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3RBbGwiKSkgdGVzdF9zZWxlY3RBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEkiKSkgdGVzdF9zZWxlY3RJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3RJSSIpKSB0ZXN0X3NlbGVjdElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb2x1bW5PcmRlciRJIikpIHRlc3Rfc2V0Q29sdW1uT3JkZXIkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEhlYWRlclZpc2libGVaIikpIHRlc3Rfc2V0SGVhZGVyVmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExpbmVzVmlzaWJsZVoiKSkgdGVzdF9zZXRMaW5lc1Zpc2libGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSZWRyYXdaIikpIHRlc3Rfc2V0UmVkcmF3WigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uJEkiKSkgdGVzdF9zZXRTZWxlY3Rpb24kSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0iKSkgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbklJIikpIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcEluZGV4SSIpKSB0ZXN0X3NldFRvcEluZGV4SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd0NvbHVtbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbiIpKSB0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSIpKSB0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd1NlbGVjdGlvbiIpKSB0ZXN0X3Nob3dTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2siKSkgdGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFRhYmxlIHRhYmxlOwotCi1wcml2YXRlIHZvaWQgbWFrZUNsZWFuRW52aXJvbm1lbnQoYm9vbGVhbiBzaW5nbGUpIHsKLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLQlpZiAodGFibGUgIT0gbnVsbCkgdGFibGUuZGlzcG9zZSgpOwotCXRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBzaW5nbGU/U1dULlNJTkdMRTpTV1QuTVVMVEkpOwotCXNldFdpZGdldCh0YWJsZSk7CQotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlVGFibGUoVmVjdG9yIGV2ZW50cykgewotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlmb3IgKGludCBjb2wgPSAwOyBjb2wgPCAzOyBjb2wrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbCAiICsgY29sKTsKLQkJY29sdW1uLnNldFdpZHRoKDUwKTsKLQkJaG9va0V4cGVjdGVkRXZlbnRzKGNvbHVtbiwgZ2V0VGVzdE5hbWUoKSwgZXZlbnRzKTsKLQl9Ci0JZm9yIChpbnQgcm93ID0gMDsgcm93IDwgMzsgcm93KyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nIFtdIHsiQzBSIiArIHJvdywgIkMxUiIgKyByb3csICJDMlIiICsgcm93fSk7Ci0JCWhvb2tFeHBlY3RlZEV2ZW50cyhpdGVtLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX0RPV04sIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyMCwgdGFibGUuZ2V0SGVhZGVySGVpZ2h0KCkgKyB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkqMiwgCi0gICAgICAgICAgICAJCSAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2sgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjAsIHRhYmxlLmdldEhlYWRlckhlaWdodCgpKyB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkgKyA1LCAxLCAwLCAKLSAgICAgICAgICAgIAkgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9ET1VCTEVDTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTMsIDEwLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDIwLCAyNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDMwLCAyMCwgNTAsIDMwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRywgZXZlbnRzKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhYzI5Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbiBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlNJTkdMRSk7CQkKLQl0YWJsZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5VTEwpOwkKLQlzZXRXaWRnZXQodGFibGVDb2x1bW4pOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSgpIHsKLQl0cnkgewotCQluZXcgVGFibGVDb2x1bW4obnVsbCwgU1dULk5VTEwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJSSgpIHsKLQl0cnkgewotCQluZXcgVGFibGVDb2x1bW4obnVsbCwgU1dULk5VTEwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OVUxMLCAtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4ID09IC0xIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5VTEwsIDIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JdHJ5IHsKLQkJdGFibGVDb2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7CQkKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uTGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxpZ25tZW50KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEFsaWdubWVudEkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNb3ZlYWJsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRNb3ZlYWJsZVoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFBhcmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJlc2l6YWJsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRSZXNpemVhYmxlWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFdpZHRoKCkgewotCWludCB0ZXN0V2lkdGggPSA0MjsKLQkKLS8vCXRyeSB7Ci0vLwkJdGFibGVDb2x1bW4uc2V0V2lkdGgoLTEpOwotLy8JCWFzc2VydFRydWUoIk5vIGV4Y2VwdGlvbiB0aHJvd24iLCBmYWxzZSk7Ci0vLwl9Ci0vLwljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLS8vCQlhc3NlcnRUcnVlKCJXcm9uZyBlcnJvciB0aHJvd246ICIgKyBlLCBlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIkFyZ3VtZW50IG5vdCB2YWxpZCIpKTsKLS8vCX0KLS8vCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotLy8JCWFzc2VydFRydWUoIldyb25nIGVycm9yIHRocm93bjogIiArIGUsIGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiQXJndW1lbnQgbm90IHZhbGlkIikpOwotLy8JfQotCi0JdGFibGVDb2x1bW4uc2V0V2lkdGgoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IHdpZHRoPSIgKyB0YWJsZUNvbHVtbi5nZXRXaWR0aCgpICsgIiBzaG91bGQgYmU9IiArIDAsIHRhYmxlQ29sdW1uLmdldFdpZHRoKCkgPT0gMCk7Ci0KLQl0YWJsZUNvbHVtbi5zZXRXaWR0aCh0ZXN0V2lkdGgpOwotCWFzc2VydFRydWUoIjpiOiB3aWR0aD0iICsgdGFibGVDb2x1bW4uZ2V0V2lkdGgoKSArICIgc2hvdWxkIGJlPSIgKyB0ZXN0V2lkdGgsIHRhYmxlQ29sdW1uLmdldFdpZHRoKCkgPT0gdGVzdFdpZHRoKTsKLQotCXRhYmxlQ29sdW1uLnNldFdpZHRoKHRlc3RXaWR0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IHdpZHRoPSIgKyB0YWJsZUNvbHVtbi5nZXRXaWR0aCgpICsgIiBzaG91bGQgYmU9IiArIHRlc3RXaWR0aCwgdGFibGVDb2x1bW4uZ2V0V2lkdGgoKSA9PSB0ZXN0V2lkdGgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3BhY2soKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3BhY2sgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge319OwotCi0JdGFibGVDb2x1bW4ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwkKLQl0YWJsZUNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CQkKLQl0YWJsZUNvbHVtbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CQotCXRyeSB7Ci0JCXRhYmxlQ29sdW1uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwkJCi0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbkxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFsaWdubWVudEkoKSB7Ci0JVGFibGVDb2x1bW4gY29sdW1uMjsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0YWJsZUNvbHVtbi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuTEVGVCk7Ci0KLQl0YWJsZUNvbHVtbi5zZXRBbGlnbm1lbnQoLTEpOwotCWFzc2VydFRydWUoIjpiOiIsIHRhYmxlQ29sdW1uLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsKLQotCXRhYmxlQ29sdW1uLnNldEFsaWdubWVudChTV1QuUklHSFQpOwotCWFzc2VydFRydWUoCi0JCSI6YzogU2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIHNldCBhbGlnbm1lbnQgb2YgdGhlIGZpcnN0IGNvbHVtbiIsIAotCQl0YWJsZUNvbHVtbi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuTEVGVCk7Ci0KLQljb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7Ci0JY29sdW1uMi5zZXRBbGlnbm1lbnQoU1dULlJJR0hUKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBjb2x1bW4yLmdldEFsaWdubWVudCgpID09IFNXVC5SSUdIVCk7Ci0JCi0JY29sdW1uMi5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgY29sdW1uMi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuQ0VOVEVSKTsJCi0KLQljb2x1bW4yLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgY29sdW1uMi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuTEVGVCk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TW92ZWFibGVaKCkgewotCWFzc2VydFRydWUoIjphOiIsIHRhYmxlQ29sdW1uLmdldE1vdmVhYmxlKCkgPT0gZmFsc2UpOwotCi0JdGFibGVDb2x1bW4uc2V0TW92ZWFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGFibGVDb2x1bW4uZ2V0TW92ZWFibGUoKSA9PSB0cnVlKTsKLQotCXRhYmxlQ29sdW1uLnNldE1vdmVhYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjpjOiIsIHRhYmxlQ29sdW1uLmdldE1vdmVhYmxlKCkgPT0gdHJ1ZSk7Ci0KLQl0YWJsZUNvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGFibGVDb2x1bW4uZ2V0TW92ZWFibGUoKSA9PSBmYWxzZSk7Ci0JCi0JVGFibGVDb2x1bW4gdGFibGVDb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlQ29sdW1uLmdldFBhcmVudCgpLCBTV1QuTk9ORSk7Ci0JdGFibGVDb2x1bW4yLmRpc3Bvc2UoKTsKLQl0cnkgewotCQl0YWJsZUNvbHVtbjIuZ2V0TW92ZWFibGUoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkZ2V0IGlzIERpc3Bvc2VkIik7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7fQotCXRyeSB7Ci0JCXRhYmxlQ29sdW1uMi5zZXRNb3ZlYWJsZSh0cnVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkZ2V0IGlzIERpc3Bvc2VkIik7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7fQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFJlc2l6YWJsZVooKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGFibGVDb2x1bW4uZ2V0UmVzaXphYmxlKCkgPT0gdHJ1ZSk7Ci0KLQl0YWJsZUNvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpiOiIsIHRhYmxlQ29sdW1uLmdldFJlc2l6YWJsZSgpID09IGZhbHNlKTsKLQotCXRhYmxlQ29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGFibGVDb2x1bW4uZ2V0UmVzaXphYmxlKCkgPT0gZmFsc2UpOwotCi0JdGFibGVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjpkOiIsIHRhYmxlQ29sdW1uLmdldFJlc2l6YWJsZSgpID09IHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIHRhYmxlQ29sdW1uLmdldFRleHQoKSwgIiIpOwotCi0JdGFibGVDb2x1bW4uc2V0VGV4dCgidGV4dCIpOwotCWFzc2VydEVxdWFscygiOmI6IiwgdGFibGVDb2x1bW4uZ2V0VGV4dCgpLCAidGV4dCIpOwotCi0JdHJ5IHsKLQkJdGFibGVDb2x1bW4uc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sdW1uIGhlYWRlciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRXaWR0aEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFdpZHRoSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBbGlnbm1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1vdmVhYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJlc2l6YWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0V2lkdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3BhY2siKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QWxpZ25tZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNb3ZlYWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFJlc2l6YWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0V2lkdGhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpKSB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFsaWdubWVudCIpKSB0ZXN0X2dldEFsaWdubWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TW92ZWFibGUiKSkgdGVzdF9nZXRNb3ZlYWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSZXNpemFibGUiKSkgdGVzdF9nZXRSZXNpemFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFdpZHRoIikpIHRlc3RfZ2V0V2lkdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3BhY2siKSkgdGVzdF9wYWNrKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRBbGlnbm1lbnRJIikpIHRlc3Rfc2V0QWxpZ25tZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNb3ZlYWJsZVoiKSkgdGVzdF9zZXRNb3ZlYWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJlc2l6YWJsZVoiKSkgdGVzdF9zZXRSZXNpemFibGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFdpZHRoSSIpKSB0ZXN0X3NldFdpZHRoSSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbjsKLXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViMmVjZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUkoKSB7Ci0JdHJ5IHsKLQkJbmV3IFRhYmxlSXRlbShudWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlmb3IgKGludCBpPTA7IGk8MTA7IGkrKykgewotCQluZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7CQotCX0KLQlhc3NlcnRFcXVhbHMoMTEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQluZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSwgNSk7CQotCWFzc2VydEVxdWFscygxMiwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSUkoKSB7Ci0JdHJ5IHsKLQkJbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUsIDUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCYWNrZ3JvdW5kKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QmFja2dyb3VuZEkoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0QmFja2dyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzSSgpIHsKLQlJbWFnZSBpbWFnZSA9IGltYWdlc1swXTsKLQlSZWN0YW5nbGUgYm91bmRzOwotCVJlY3RhbmdsZSBib3VuZHMyOwotCQotCS8vIG5vIGNvbHVtbnMKLSAJYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKC0xKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7CQotIAlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjoxYzoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQkKLQl0YWJsZUl0ZW0uc2V0VGV4dCgiaGVsbG8iKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxZDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCk7Ci0JdGFibGVJdGVtLnNldFRleHQoIiIpOwotCWJvdW5kczIgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxZToiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0JLy9hc3NlcnRUcnVlKCI6MWY6IiwgYm91bmRzMi53aWR0aCA8IGJvdW5kcy53aWR0aCk7IC8vIFRPRE8gZG9lc24ndCBzaHJpbms/Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCXRhYmxlSXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWc6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDApOwotCXRhYmxlSXRlbS5zZXRJbWFnZSgoSW1hZ2UpbnVsbCk7Ci0JYm91bmRzMiA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFoOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLS8vCWFzc2VydFRydWUoIjoxaToiLCBib3VuZHMyLndpZHRoID4gYm91bmRzLndpZHRoKTsgLy8gVE9ETyBvbmNlIGFuIGltYWdlIGlzIGFkZGVkIHRoZSBzcGFjZSBmb3IgaXQgaXMgYWx3YXlzIHRoZXJlCi0gCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQl0YWJsZUl0ZW0uc2V0VGV4dCgiaGVsbG8iKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCXRhYmxlSXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JYm91bmRzMiA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFqOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLQlhc3NlcnRUcnVlKCI6MWs6IiwgYm91bmRzMi53aWR0aCA+IGJvdW5kcy53aWR0aCk7Ci0JCi0JLy8gbm8gY29sdW1ucyBhbmQgQ0hFQ0sgc3R5bGUKLQlUYWJsZSB0YWJsZTIgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JVGFibGVJdGVtIHRhYmxlSXRlbTIgPSBuZXcgVGFibGVJdGVtKHRhYmxlMiwgU1dULk5PTkUpOwotCQotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyYToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKC0xKTsKLQlhc3NlcnRUcnVlKCI6MmI6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7CQotIAlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6MmM6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JCi0JdGFibGVJdGVtMi5zZXRUZXh0KCJoZWxsbyIpOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyZDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCk7Ci0JdGFibGVJdGVtMi5zZXRUZXh0KCIiKTsKLQlib3VuZHMyID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJlOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLQkvL2Fzc2VydFRydWUoIjoyZjoiLCBib3VuZHMyLndpZHRoIDwgYm91bmRzLndpZHRoKTsgLy8gVE9ETyBkb2Vzbid0IHNocmluaz8KLQkKLQl0YWJsZTIuZGlzcG9zZSgpOwotCXRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0YWJsZUl0ZW0yID0gbmV3IFRhYmxlSXRlbSh0YWJsZTIsIFNXVC5OT05FKTsKLQkKLQl0YWJsZUl0ZW0yLnNldEltYWdlKGltYWdlKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6Mmc6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDApOwotCXRhYmxlSXRlbTIuc2V0SW1hZ2UoKEltYWdlKW51bGwpOwotCWJvdW5kczIgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6Mmg6IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotCS8vYXNzZXJ0VHJ1ZSgiOjJpOiIsIGJvdW5kczIud2lkdGggPCBib3VuZHMud2lkdGgpOyAgLy8gVE9ETyBvbmNlIGFuIGltYWdlIGlzIGFkZGVkIHRoZSBzcGFjZSBmb3IgaXQgaXMgYWx3YXlzIHRoZXJlCi0JCi0JdGFibGUyLmRpc3Bvc2UoKTsKLQl0YWJsZTIgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdGFibGVJdGVtMiA9IG5ldyBUYWJsZUl0ZW0odGFibGUyLCBTV1QuTk9ORSk7Ci0JCi0JdGFibGVJdGVtMi5zZXRUZXh0KCJoZWxsbyIpOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCXRhYmxlSXRlbTIuc2V0SW1hZ2UoaW1hZ2UpOwotCWJvdW5kczIgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6Mmo6IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotCWFzc2VydFRydWUoIjoyazoiLCBib3VuZHMyLndpZHRoID4gYm91bmRzLndpZHRoKTsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0KLQkvLyB3aXRoIGNvbHVtbnMKLQkKLQlUYWJsZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JCi0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2E6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozYjoiLCAvKmJvdW5kcy54ID4gMCAmJiovIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsgLy8gVE9ETyBib3VuZHMueCA9PSAwIElzIHRoaXMgcmlnaHQ/Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNjOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwkKLSAJYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygyKTsKLQlhc3NlcnRUcnVlKCI6M2Q6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JCi0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNlOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M2Y6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsKLQkKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2c6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozaDoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDIwMCk7Ci0JCi0JdGFibGVJdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiaGVsbG8iLCAid29ybGQifSk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2k6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozajoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCXRhYmxlSXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7IiIsICIifSk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2s6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozbDoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQljb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQkKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UobmV3IEltYWdlW10ge2ltYWdlLCBpbWFnZX0pOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNtOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M246IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLSAJdGFibGVJdGVtLnNldEltYWdlKG5ldyBJbWFnZVtdIHtudWxsLCBudWxsfSk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M286IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozcDoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQljb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQkKLQl0YWJsZUl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJoZWxsbyIsICJ3b3JsZCJ9KTsKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UobmV3IEltYWdlW10ge251bGwsIG51bGx9KTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozcToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNyOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCXRhYmxlSXRlbS5zZXRUZXh0KCJoZWxsbyIpOwotCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULlJJR0hUKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozczoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAwKTsKLQkKLQkvLyB3aXRoIGNvbHVtbnMgYW5kIENIRUNLIHN0eWxlCi0JdGFibGUyLmRpc3Bvc2UoKTsKLQl0YWJsZTIgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdGFibGVJdGVtMiA9IG5ldyBUYWJsZUl0ZW0odGFibGUyLCBTV1QuTk9ORSk7Ci0JY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZTIsIFNXVC5MRUZUKTsKLQljb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlMiwgU1dULkNFTlRFUik7Ci0JCi0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIC8qYm91bmRzLnggPiAwICYmKi8gYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOyAvLyBUT0RPIGJvdW5kcy54ID09IDAgSXMgdGhpcyByaWdodD8KLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwkKLSAJYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRkOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCQotCWNvbHVtbjAuc2V0V2lkdGgoMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGU6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NGY6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsKLQkKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRnOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRoOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMjAwKTsKLQkKLQl0YWJsZUl0ZW0yLnNldFRleHQobmV3IFN0cmluZ1tdIHsiaGVsbG8iLCAid29ybGQifSk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRpOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRqOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JdGFibGVJdGVtMi5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7IiIsICIifSk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRrOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRsOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQl0YWJsZTIuZGlzcG9zZSgpOwotCXRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0YWJsZUl0ZW0yID0gbmV3IFRhYmxlSXRlbSh0YWJsZTIsIFNXVC5OT05FKTsKLQljb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlMiwgU1dULkxFRlQpOwotCWNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUyLCBTV1QuQ0VOVEVSKTsKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQotCXRhYmxlSXRlbTIuc2V0SW1hZ2UobmV3IEltYWdlW10ge2ltYWdlLCBpbWFnZX0pOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0bToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjo0bjoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotIAl0YWJsZUl0ZW0yLnNldEltYWdlKG5ldyBJbWFnZVtdIHtudWxsLCBudWxsfSk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRvOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRwOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQl0YWJsZTIuZGlzcG9zZSgpOwotCXRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0YWJsZUl0ZW0yID0gbmV3IFRhYmxlSXRlbSh0YWJsZTIsIFNXVC5OT05FKTsKLQljb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlMiwgU1dULkxFRlQpOwotCWNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUyLCBTV1QuQ0VOVEVSKTsKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQotCXRhYmxlSXRlbTIuc2V0VGV4dChuZXcgU3RyaW5nW10geyJoZWxsbyIsICJ3b3JsZCJ9KTsKLQl0YWJsZUl0ZW0yLnNldEltYWdlKG5ldyBJbWFnZVtdIHtudWxsLCBudWxsfSk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRxOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRyOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQl0YWJsZTIuZGlzcG9zZSgpOwotCXRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0YWJsZUl0ZW0yID0gbmV3IFRhYmxlSXRlbSh0YWJsZTIsIFNXVC5OT05FKTsKLQkKLQl0YWJsZUl0ZW0yLnNldFRleHQoImhlbGxvIik7Ci0JY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlMiwgU1dULlJJR0hUKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NHM6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCAgPT0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hlY2tlZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRDaGVja2VkWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnRJKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvbnRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvcmVncm91bmRJKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEdyYXllZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRHcmF5ZWRaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2VCb3VuZHNJKCkgewotLyoqCi0gKiBUZXN0IHdpdGhvdXQgaXRlbSBpbWFnZQotICovCi0JUmVjdGFuZ2xlIGJvdW5kczsKLQlUYWJsZSB0YWJsZTIgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JVGFibGVJdGVtIHRhYmxlSXRlbTIgPSBuZXcgVGFibGVJdGVtKHRhYmxlMiwgU1dULk5VTEwpOwotCQotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0YWJsZUl0ZW0uZ2V0SW1hZ2VCb3VuZHMoLTEpKTsKLQkKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0SW1hZ2VCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgYm91bmRzLndpZHRoID09IDApOwotCQotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0YWJsZUl0ZW0uZ2V0SW1hZ2VCb3VuZHMoMSkpOwotCQotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0YWJsZUl0ZW0yLmdldEltYWdlQm91bmRzKC0xKSk7Ci0JCi0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRJbWFnZUJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBib3VuZHMud2lkdGggPT0gMCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRhYmxlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMSkpOwotIAkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbMF07CQotCWludCBpbWFnZVdpZHRoID0gaW1hZ2UuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JaW50IGltYWdlSGVpZ2h0OwotCQotCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZSk7Ci0JaW1hZ2VIZWlnaHQgPSB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkgLSB0YWJsZS5nZXRHcmlkTGluZVdpZHRoKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRhYmxlSXRlbS5nZXRJbWFnZUJvdW5kcygtMSkpOwotCQotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRJbWFnZUJvdW5kcygwKTsKLS8vCWFzc2VydFRydWUoIjpiOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMud2lkdGggPT0gaW1hZ2VXaWR0aCAmJiBib3VuZHMuaGVpZ2h0ID09IGltYWdlSGVpZ2h0KTsJCi0vLyAJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRhYmxlSXRlbS5nZXRJbWFnZUJvdW5kcygxKSk7CQotCi0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7CQotCQotCXRhYmxlMi5kaXNwb3NlKCk7Ci0JdGFibGUyID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRhYmxlSXRlbTIuZGlzcG9zZSgpOwotCXRhYmxlSXRlbTIgPSBuZXcgVGFibGVJdGVtKHRhYmxlMiwgU1dULk5VTEwpOwotCVJlY3RhbmdsZSBpbWFnZUJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCWltYWdlV2lkdGggPSBpbWFnZUJvdW5kcy53aWR0aDsgCXRhYmxlSXRlbTIuc2V0SW1hZ2UoMCwgaW1hZ2UpOwotCWltYWdlSGVpZ2h0ID0gdGFibGUyLmdldEl0ZW1IZWlnaHQoKSAtIHRhYmxlMi5nZXRHcmlkTGluZVdpZHRoKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRhYmxlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoLTEpKTsKLQkKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEltYWdlQm91bmRzKDApOwkvLyBib3VuZHMud2lkdGggc2hvdWxkIGJlIGNoZWNrIGJveCB3aWR0aCBpZiB0aGV5IGFyZSB3aWRlciB0aGFuIGltYWdlCi0vLwlhc3NlcnRUcnVlKCI6YjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMuaGVpZ2h0ID09IGltYWdlSGVpZ2h0KTsKLS8vIAlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdGFibGVJdGVtMi5nZXRJbWFnZUJvdW5kcygxKSk7CQotCi0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0KLQl0YWJsZTIuZGlzcG9zZSgpOwotCXRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0YWJsZUl0ZW0yLmRpc3Bvc2UoKTsKLQl0YWJsZUl0ZW0yID0gbmV3IFRhYmxlSXRlbSh0YWJsZTIsIFNXVC5OVUxMKTsKLQlpbWFnZSA9IGltYWdlc1sxXTsKLQlpbWFnZUJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCWltYWdlV2lkdGggPSBpbWFnZUJvdW5kcy53aWR0aDsKLSAJdGFibGVJdGVtMi5zZXRJbWFnZSgwLCBpbWFnZSk7Ci0JaW1hZ2VIZWlnaHQgPSB0YWJsZTIuZ2V0SXRlbUhlaWdodCgpIC0gdGFibGUyLmdldEdyaWRMaW5lV2lkdGgoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdGFibGVJdGVtMi5nZXRJbWFnZUJvdW5kcygtMSkpOwotIAlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEltYWdlQm91bmRzKDApOwkvLyBib3VuZHMud2lkdGggc2hvdWxkIGJlIGNoZWNrIGJveCB3aWR0aCBpZiBjaGVjayBib3ggaXMgd2lkZXIgdGhhbiBpbWFnZQotLy8JYXNzZXJ0VHJ1ZSgiOmI6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLmhlaWdodCA9PSBpbWFnZUhlaWdodCk7Ci0gCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0YWJsZUl0ZW0yLmdldEltYWdlQm91bmRzKDEpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZUkoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlSW5kZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJbWFnZUluZGVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQlhc3NlcnRFcXVhbHModGFibGUsIHRhYmxlSXRlbS5nZXRQYXJlbnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dEkoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VGV4dElMSmF2YV9sYW5nX1N0cmluZwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSB0YWJsZUl0ZW0uZ2V0RGlzcGxheSgpOwotCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCQotCS8vIG5vIGNvbHVtbnMKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0QmFja2dyb3VuZCgpLCB0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKCksIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCByZWQpOwotCWFzc2VydEVxdWFscyhyZWQsIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKDEwLCByZWQpOwotCWFzc2VydEVxdWFscyh0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgpLCB0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgxMCkpOwotCQotCS8vIHdpdGggY29sdW1ucwotCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZCgxMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHModGFibGVJdGVtLmdldEJhY2tncm91bmQoKSwgdGFibGVJdGVtLmdldEJhY2tncm91bmQoMTApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCByZWQpOwotCWFzc2VydEVxdWFscyhyZWQsIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0QmFja2dyb3VuZCgpLHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIGJsdWUpOwotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKGJsdWUsIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JCi0JdGFibGVJdGVtLnNldEJhY2tncm91bmQobnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldEJhY2tncm91bmQoKSx0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JCi0JdHJ5IHsgCi0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMCwgMCk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJdGFibGVJdGVtLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IodGFibGVJdGVtLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JYXNzZXJ0RXF1YWxzKGNvbG9yLCB0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgpKTsKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZChudWxsKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0QmFja2dyb3VuZCgpLHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQl0cnkgeyAKLQkJdGFibGVJdGVtLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2hlY2tlZFooKSB7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0YWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLQkKLQl0YWJsZUl0ZW0uc2V0Q2hlY2tlZCh0cnVlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotIAlUYWJsZSB0ID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCVRhYmxlSXRlbSB0aSA9IG5ldyBUYWJsZUl0ZW0odCwgU1dULk5VTEwpOwotCXRpLnNldENoZWNrZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0aS5nZXRDaGVja2VkKCkpOwotCQotCXRpLnNldENoZWNrZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdGkuZ2V0Q2hlY2tlZCgpKTsKLQl0LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCURpc3BsYXkgZGlzcGxheSA9IHRhYmxlSXRlbS5nZXREaXNwbGF5KCk7Ci0JRm9udCBmb250ID0gdGFibGVJdGVtLmdldEZvbnQoKTsKLQl0YWJsZUl0ZW0uc2V0Rm9udChmb250KTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KCkpKTsKLQkKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JdGFibGVJdGVtLnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyggdGFibGVJdGVtLmdldEZvbnQoKSkpOwotCi0JdGFibGVJdGVtLnNldEZvbnQobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRGb250KCkuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KCkpKTsKLQkKLQlmb250LmRpc3Bvc2UoKTsKLQl0cnkgewotCQl0YWJsZUl0ZW0uc2V0Rm9udChmb250KTsKLQkJdGFibGVJdGVtLnNldEZvbnQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGZvbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSB0YWJsZUl0ZW0uZ2V0RGlzcGxheSgpOwotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCQotCS8vIG5vIGNvbHVtbnMKLQlhc3NlcnRUcnVlKHRhYmxlLmdldEZvbnQoKS5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoMCkpKTsKLQlhc3NlcnRUcnVlKHRhYmxlSXRlbS5nZXRGb250KCkuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KDApKSk7Ci0JdGFibGVJdGVtLnNldEZvbnQoMCwgZm9udCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEZvbnQoMTAsIGZvbnQpOwotCWFzc2VydFRydWUodGFibGVJdGVtLmdldEZvbnQoKS5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoMTApKSk7Ci0JCi0JLy8gd2l0aCBjb2x1bW5zCi0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRhYmxlSXRlbS5zZXRGb250KDEwLCBmb250KTsKLQlhc3NlcnRUcnVlKHRhYmxlSXRlbS5nZXRGb250KCkuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KDEwKSkpOwotCQotCXRhYmxlSXRlbS5zZXRGb250KDAsIGZvbnQpOwotCWFzc2VydFRydWUoZm9udC5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoMCkpKTsKLQl0YWJsZUl0ZW0uc2V0Rm9udCgwLCBudWxsKTsKLQlhc3NlcnRUcnVlKHRhYmxlLmdldEZvbnQoKS5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoMCkpKTsKLQkKLQlGb250IGZvbnQyID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAyMCwgU1dULk5PUk1BTCk7Ci0JCi0JdGFibGVJdGVtLnNldEZvbnQoMCwgZm9udCk7Ci0JdGFibGVJdGVtLnNldEZvbnQoZm9udDIpOwotCWFzc2VydFRydWUoZm9udC5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoMCkpKTsKLQkKLQl0YWJsZUl0ZW0uc2V0Rm9udCgwLCBudWxsKTsKLQlhc3NlcnRUcnVlKGZvbnQyLmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCQotCXRhYmxlSXRlbS5zZXRGb250KG51bGwpOwotCWFzc2VydFRydWUodGFibGUuZ2V0Rm9udCgpLmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCQotCWZvbnQuZGlzcG9zZSgpOwotCWZvbnQyLmRpc3Bvc2UoKTsKLQkKLQl0cnkgewotCQl0YWJsZUl0ZW0uc2V0Rm9udCgwLCBmb250KTsKLQkJdGFibGVJdGVtLnNldEZvbnQoMCwgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGZvbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb3JlZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gdGFibGVJdGVtLmdldERpc3BsYXkoKTsKLQlDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCUNvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQkKLQkvLyBubyBjb2x1bW5zCi0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldEZvcmVncm91bmQoKSwgdGFibGVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCWFzc2VydEVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgpLCB0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JdGFibGVJdGVtLnNldEZvcmVncm91bmQoMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZCgxMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHModGFibGVJdGVtLmdldEZvcmVncm91bmQoKSwgdGFibGVJdGVtLmdldEZvcmVncm91bmQoMTApKTsKLQkKLQkvLyB3aXRoIGNvbHVtbnMKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEZvcmVncm91bmQoMTAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKCksIHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDEwKSk7Ci0JCi0JdGFibGVJdGVtLnNldEZvcmVncm91bmQoMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JdGFibGVJdGVtLnNldEZvcmVncm91bmQoMCwgbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldEZvcmVncm91bmQoKSx0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0KLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCBibHVlKTsKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZChyZWQpOwotCWFzc2VydEVxdWFscyhibHVlLCB0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JCi0JdGFibGVJdGVtLnNldEZvcmVncm91bmQoMCwgbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHJlZCwgdGFibGVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCQotCXRhYmxlSXRlbS5zZXRGb3JlZ3JvdW5kKG51bGwpOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRGb3JlZ3JvdW5kKCksdGFibGVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCQotCXRyeSB7IAotCQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDAsIDApOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCXRhYmxlSXRlbS5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgZGlzcG9zZWQiKTsJCQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKHRhYmxlSXRlbS5nZXREaXNwbGF5KCksIDI1NSwgMCwgMCk7Ci0JdGFibGVJdGVtLnNldEZvcmVncm91bmQoY29sb3IpOwotCWFzc2VydEVxdWFscyhjb2xvciwgdGFibGVJdGVtLmdldEZvcmVncm91bmQoKSk7Ci0JdGFibGVJdGVtLnNldEZvcmVncm91bmQobnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldEZvcmVncm91bmQoKSx0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JdHJ5IHsgCi0JCXRhYmxlSXRlbS5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgZGlzcG9zZWQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRHcmF5ZWRaKCkgewotCVRhYmxlIG5ld1RhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCVRhYmxlSXRlbSB0SXRlbSA9IG5ldyBUYWJsZUl0ZW0obmV3VGFibGUsMCk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0SXRlbS5nZXRHcmF5ZWQoKSk7Ci0JdEl0ZW0uc2V0R3JheWVkKHRydWUpOwotCWFzc2VydFRydWUodEl0ZW0uZ2V0R3JheWVkKCkpOwotCXRJdGVtLnNldEdyYXllZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0SXRlbS5nZXRHcmF5ZWQoKSk7Ci0JbmV3VGFibGUuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JYXNzZXJ0TnVsbCh0YWJsZUl0ZW0uZ2V0SW1hZ2UoMSkpOwkKLSAJdGFibGVJdGVtLnNldEltYWdlKC0xLCBudWxsKTsJCQotCWFzc2VydE51bGwodGFibGVJdGVtLmdldEltYWdlKC0xKSk7CQotCQkKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzBdLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMCkpOwkKLSAJU3RyaW5nIHRleHRzW10gPSBuZXcgU3RyaW5nW2ltYWdlcy5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJdGV4dHNbaV0gPSBTdHJpbmcudmFsdWVPZihpKTsKLQl9Ci0JCi0JLy90YWJsZS5zZXRUZXh0KHRleHRzKTsJCQkJLy8gY3JlYXRlIGVub3VnaCBjb2x1bW5zIGZvciBUYWJsZUl0ZW0uc2V0SW1hZ2UoSW1hZ2VbXSkgdG8gd29yawotCWludCBjb2x1bW5Db3VudCA9IHRhYmxlLmdldENvbHVtbkNvdW50KCk7Ci0JaWYgKGNvbHVtbkNvdW50IDwgdGV4dHMubGVuZ3RoKSB7Ci0JCWZvciAoaW50IGkgPSBjb2x1bW5Db3VudDsgaSA8IHRleHRzLmxlbmd0aDsgaSsrKXsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQl9Ci0JfQotCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbHVtbnNbaV0uc2V0VGV4dCh0ZXh0c1tpXSk7Ci0JfQotCXRhYmxlSXRlbS5zZXRJbWFnZSgxLCBpbWFnZXNbMV0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMV0sIHRhYmxlSXRlbS5nZXRJbWFnZSgxKSk7CQotIAl0YWJsZUl0ZW0uc2V0SW1hZ2UoaW1hZ2VzKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoaW1hZ2VzW2ldLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoaSkpOwotCX0KLQl0cnkgewotCQl0YWJsZUl0ZW0uc2V0SW1hZ2UoKEltYWdlIFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW1hZ2VzID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JCS8vIG5vIGNvbHVtbnMKLQlhc3NlcnRFcXVhbHMobnVsbCwgdGFibGVJdGVtLmdldEltYWdlKDApKTsKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzBdLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEltYWdlKDEwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhudWxsLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMTApKTsKLQkKLQkvLyB3aXRoIGNvbHVtbnMKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEltYWdlKDEwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhudWxsLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMTApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzBdLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHMobnVsbCwgdGFibGVJdGVtLmdldEltYWdlKDApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoaW1hZ2VzWzFdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzFdLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCQotCXRhYmxlSXRlbS5zZXRJbWFnZShpbWFnZXNbMV0pOwotCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIHRhYmxlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JCi0JaW1hZ2VzWzBdLmRpc3Bvc2UoKTsKLQl0cnkgewotCQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQkJdGFibGVJdGVtLnNldEltYWdlKDAsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBmb250Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VJbmRlbnRJKCkgewotCWlmIChTd3RKdW5pdC5pc0NhcmJvbiB8fCBTd3RKdW5pdC5pc0dUSykgewotCQkvL3NldEltYWdlSW5kZW50IG5vdCBpbXBsZW1lbnRlZCBvbiBDYXJib24KLQkJdGFibGVJdGVtLnNldEltYWdlSW5kZW50KDEpOwotCQlyZXR1cm47IAotCX0KLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldEltYWdlSW5kZW50KCkpOwotIAl0YWJsZUl0ZW0uc2V0SW1hZ2VJbmRlbnQoMSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlSXRlbS5nZXRJbWFnZUluZGVudCgpKTsKLSAJdGFibGVJdGVtLnNldEltYWdlSW5kZW50KC0xKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGFibGVJdGVtLmdldEltYWdlSW5kZW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHQkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JZmluYWwgU3RyaW5nIFRlc3RTdHJpbmcgPSAidGVzdCI7Ci0JZmluYWwgU3RyaW5nIFRlc3RTdHJpbmdzW10gPSBuZXcgU3RyaW5nW10ge1Rlc3RTdHJpbmcsIFRlc3RTdHJpbmcgKyAiMSIsIFRlc3RTdHJpbmcgKyAiMiJ9OwotCQotCXRyeSB7Ci0JCXRhYmxlSXRlbS5zZXRUZXh0KChTdHJpbmcgW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmdzID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotICAgLyoKLSAJKiBUZXN0IHRoZSBnZXRUZXh0L3NldFRleHQgQVBJIHdpdGggYSBUYWJsZSB0aGF0IGhhcyBvbmx5IAotIAkqIHRoZSBkZWZhdWx0IGNvbHVtbi4KLSAJKi8KLQkKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwotCQotCXRhYmxlSXRlbS5zZXRUZXh0KFRlc3RTdHJpbmdzKTsKLQlhc3NlcnRFcXVhbHMoVGVzdFN0cmluZ3NbMF0sIHRhYmxlSXRlbS5nZXRUZXh0KDApKTsKLQlmb3IgKGludCBpID0gMTsgaSA8IFRlc3RTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0VGV4dChpKS5sZW5ndGgoKSk7Ci0JfQotCQotCQotICAgLyoKLSAJKiBUZXN0IHRoZSBnZXRUZXh0L3NldFRleHQgQVBJIHdpdGggYSBUYWJsZSB0aGF0IGVub3VnaCAKLSAJKiBjb2x1bW5zIHRvIGZpdCBhbGwgdGVzdCBpdGVtIHRleHRzLgotIAkqLwotIAkJCi0JaW50IGNvbHVtbkNvdW50ID0gdGFibGUuZ2V0Q29sdW1uQ291bnQoKTsKLQlpZiAoY29sdW1uQ291bnQgPCBpbWFnZXMubGVuZ3RoKSB7Ci0JCWZvciAoaW50IGkgPSBjb2x1bW5Db3VudDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKyl7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJfQotCX0KLQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBUZXN0U3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQljb2x1bW5zW2ldLnNldFRleHQoVGVzdFN0cmluZ3NbaV0pOwotCX0KLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZygpewotCWZpbmFsIFN0cmluZyBUZXN0U3RyaW5nID0gInRlc3QiOwotCWZpbmFsIFN0cmluZyBUZXN0U3RyaW5nc1tdID0gbmV3IFN0cmluZ1tdIHtUZXN0U3RyaW5nLCBUZXN0U3RyaW5nICsgIjEiLCBUZXN0U3RyaW5nICsgIjIifTsKLQotICAgLyoKLSAJKiBUZXN0IHRoZSBnZXRUZXh0L3NldFRleHQgQVBJIHdpdGggYSBUYWJsZSB0aGF0IGhhcyBvbmx5IAotIAkqIHRoZSBkZWZhdWx0IGNvbHVtbi4KLSAJKi8KLQkKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwkKLSAJdGFibGVJdGVtLnNldFRleHQoMSwgVGVzdFN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlSXRlbS5nZXRUZXh0KDEpLmxlbmd0aCgpKTsJCi0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlSXRlbS5nZXRUZXh0KDApLmxlbmd0aCgpKTsKLQkKLQl0YWJsZUl0ZW0uc2V0VGV4dCgwLCBUZXN0U3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoVGVzdFN0cmluZywgdGFibGVJdGVtLmdldFRleHQoMCkpOwotIAl0YWJsZUl0ZW0uc2V0VGV4dCgtMSwgVGVzdFN0cmluZ3NbMV0pOwotCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0VGV4dCgtMSkubGVuZ3RoKCkpOwkKLQotICAgLyoKLSAJKiBUZXN0IHRoZSBnZXRUZXh0L3NldFRleHQgQVBJIHdpdGggYSBUYWJsZSB0aGF0IGVub3VnaCAKLSAJKiBjb2x1bW5zIHRvIGZpdCBhbGwgdGVzdCBpdGVtIHRleHRzLgotIAkqLwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQkvL3RhYmxlLnNldFRleHQoVGVzdFN0cmluZ3MpOwkJCQkvLyBjcmVhdGUgYW5vdWdoIGNvbHVtbnMgZm9yIFRhYmxlSXRlbS5zZXRUZXh0KFN0cmluZ1tdKSB0byB3b3JrCi0JaW50IGNvbHVtbkNvdW50ID0gdGFibGUuZ2V0Q29sdW1uQ291bnQoKTsKLQlpZiAoY29sdW1uQ291bnQgPCBpbWFnZXMubGVuZ3RoKSB7Ci0JCWZvciAoaW50IGkgPSBjb2x1bW5Db3VudDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKyl7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJfQotCX0KLQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBUZXN0U3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQljb2x1bW5zW2ldLnNldFRleHQoVGVzdFN0cmluZ3NbaV0pOwotCX0KLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwkKLQotCi0JdGFibGVJdGVtLnNldFRleHQoMSwgVGVzdFN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKFRlc3RTdHJpbmcsIHRhYmxlSXRlbS5nZXRUZXh0KDEpKTsJCi0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlSXRlbS5nZXRUZXh0KDApLmxlbmd0aCgpKTsKLQkKLQl0YWJsZUl0ZW0uc2V0VGV4dCgwLCBUZXN0U3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoVGVzdFN0cmluZywgdGFibGVJdGVtLmdldFRleHQoMCkpOwotCi0KLQl0YWJsZUl0ZW0uc2V0VGV4dCgtMSwgVGVzdFN0cmluZ3NbMV0pOwotCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0VGV4dCgtMSkubGVuZ3RoKCkpOwkKLQotCi0JdHJ5IHsKLQkJdGFibGVJdGVtLnNldFRleHQoLTEsIG51bGwpOwkJCi0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQl0YWJsZUl0ZW0uc2V0VGV4dCgwLCBudWxsKTsJCQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9IAotCi0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCYWNrZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCYWNrZ3JvdW5kSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hlY2tlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRHcmF5ZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlQm91bmRzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZUluZGVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2hlY2tlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb3JlZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRHcmF5ZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUluZGVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dCRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmQiKSkgdGVzdF9nZXRCYWNrZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kSSIpKSB0ZXN0X2dldEJhY2tncm91bmRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHNJIikpIHRlc3RfZ2V0Qm91bmRzSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hlY2tlZCIpKSB0ZXN0X2dldENoZWNrZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnQiKSkgdGVzdF9nZXRGb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250SSIpKSB0ZXN0X2dldEZvbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb3JlZ3JvdW5kIikpIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9yZWdyb3VuZEkiKSkgdGVzdF9nZXRGb3JlZ3JvdW5kSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0R3JheWVkIikpIHRlc3RfZ2V0R3JheWVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZUJvdW5kc0kiKSkgdGVzdF9nZXRJbWFnZUJvdW5kc0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlSSIpKSB0ZXN0X2dldEltYWdlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2VJbmRlbnQiKSkgdGVzdF9nZXRJbWFnZUluZGVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0SSIpKSB0ZXN0X2dldFRleHRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENoZWNrZWRaIikpIHRlc3Rfc2V0Q2hlY2tlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEdyYXllZFoiKSkgdGVzdF9zZXRHcmF5ZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlSW5kZW50SSIpKSB0ZXN0X3NldEltYWdlSW5kZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0JExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dCRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLVRhYmxlIHRhYmxlOwotVGFibGVJdGVtIHRhYmxlSXRlbTsKLQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIG1ha2VDbGVhbkVudmlyb25tZW50KCkgewotCWlmICggdGFibGVJdGVtICE9IG51bGwgKSB0YWJsZUl0ZW0uZGlzcG9zZSgpOwotCWlmICggdGFibGUgIT0gbnVsbCApIHRhYmxlLmRpc3Bvc2UoKTsKLQl0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgMCk7Ci0JdGFibGVJdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0Jc2V0V2lkZ2V0KHRhYmxlSXRlbSk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgzYzMwOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxhYmxlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7IC8vIHVzZSBtdWx0aS1saW5lIGJ5IGRlZmF1bHQKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLQlzaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQl0ZXh0ID0gbmV3IFRleHQobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludFtdIGNhc2VzID0gezAsIFNXVC5TSU5HTEUsIFNXVC5NVUxUSSwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMLCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCwgCi0JCQkJCVNXVC5XUkFQfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQl0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIGNhc2VzW2ldKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JdHJ5IHsKLQkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkKLQkvLyB0ZXN0IHdoZXRoZXIgYWxsIGNvbnRlbnQgbW9kaWZ5aW5nIEFQSSBtZXRob2RzIHNlbmQgYSBNb2RpZnkgZXZlbnQJCi0JdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LnNldFRleHQoIm5ldyB0ZXh0Iik7CQotCWFzc2VydFRydWUoInNldFRleHQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQl0ZXh0LnNldFRleHQoImxpbmUiKTsJCi0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0JdHJ5IHsKLQkJdGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQl0cnkgewotCQl0ZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JdGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0NSIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDEsMyk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCXRleHQucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCXRyeSB7Ci0JCXRleHQucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyKCkgewotCWZpbmFsIFN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQlmaW5hbCBTdHJpbmcgbmV3TGluZSA9ICJOZXdMaW5lMSI7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCQotCS8vIHRlc3QgbnVsbCBsaXN0ZW5lciBjYXNlCi0JdHJ5IHsKLQkJdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkKLQkvLyB0ZXN0IGFwcGVuZCBjYXNlCi0JVmVyaWZ5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LmVuZCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLCBldmVudC50ZXh0KTsKLQkJCWV2ZW50LnRleHQgPSBuZXdMaW5lOwotCQl9Ci0JfTsJCi0JdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LmFwcGVuZChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiYXBwZW5kIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaXN0ZW5lciBmYWlsZWQiLCBuZXdMaW5lLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkvLyB0ZXN0IGluc2VydCBjYXNlCi0JbGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDgsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDgsIGV2ZW50LmVuZCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLCBldmVudC50ZXh0KTsKLQkJCWV2ZW50LnRleHQgPSBuZXdMaW5lOwotCQl9Ci0JfTsJCi0JdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0Lmluc2VydChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiaW5zZXJ0IGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaXN0ZW5lciBmYWlsZWQiLCBuZXdMaW5lICsgbmV3TGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JLy8gdGVzdCBzZXRUZXh0IGNhc2UKLQlsaXN0ZW5lciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMCwgZXZlbnQuc3RhcnQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMTYsIGV2ZW50LmVuZCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLCBldmVudC50ZXh0KTsKLQkJCWV2ZW50LnRleHQgPSBuZXdMaW5lOwotCQl9Ci0JfTsJCi0JdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJzZXRUZXh0IGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaXN0ZW5lciBmYWlsZWQiLCBuZXdMaW5lLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQkvLyB0ZXN0IHJlbW92ZSBjYXNlCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hcHBlbmRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0cnkgewotCQl0ZXh0LmFwcGVuZChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdGV4dC5zZXRUZXh0KCIwMSIpOwotCXRleHQuYXBwZW5kKCIyMyIpOwotCWFzc2VydEVxdWFscygiMDEyMyIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LmFwcGVuZCgiNDUiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NSIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQl0ZXh0LmFwcGVuZCgiNjciKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3IiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMSIpOwotCXRleHQuYXBwZW5kKCIyMyIpOwotCWFzc2VydEVxdWFscygiMDEyMyIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LmFwcGVuZCgiNCIgKyBkZWxpbWl0ZXJTdHJpbmcrICI1Iik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNCIgKyBkZWxpbWl0ZXJTdHJpbmcgKyI1IiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDApOwotCXRleHQuYXBwZW5kKCI2NyIpOwotCWFzc2VydEVxdWFscygiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nKyI1NjciLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdHJ5IHsKLQkJdGV4dC5hcHBlbmQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gb24gc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCi0JdGV4dC5zZXRUZXh0KCIwMSIpOwotCXRleHQuYXBwZW5kKCIyMyIpOwotCWFzc2VydEVxdWFscygiMDEyMyIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LmFwcGVuZCgiNDUiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NSIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQl0ZXh0LmFwcGVuZCgiNjciKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3IiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCi0JdGV4dC5zZXRUZXh0KCIwMSIpOwotCXRleHQuYXBwZW5kKCIyMyIpOwotCWFzc2VydEVxdWFscygiMDEyMyIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LmFwcGVuZCgiNCIgKyBkZWxpbWl0ZXJTdHJpbmcrIjUiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0IiArIGRlbGltaXRlclN0cmluZysiNSIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQl0ZXh0LmFwcGVuZCgiNjciKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0IiArIGRlbGltaXRlclN0cmluZysiNTY3IiwgdGV4dC5nZXRUZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NsZWFyU2VsZWN0aW9uKCkgewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5jbGVhclNlbGVjdGlvbigpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LmNsZWFyU2VsZWN0aW9uKCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5jbGVhclNlbGVjdGlvbigpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCS8vIHN1cGVyIGNsYXNzIHRlc3QgaXMgc3VmZmljaWVudAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvcHkoKSB7Ci0JdGV4dC5jb3B5KCk7Ci0KLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuY29weSgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMDAwMCIpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5jb3B5KCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQucGFzdGUoKTsKLQlhc3NlcnRFcXVhbHMoIjAwMDAwIiwgdGV4dC5nZXRUZXh0KCkpOwotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LmNvcHkoKTsKLQotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5jb3B5KCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAwMDAwIik7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LmNvcHkoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuc2V0VGV4dCgiIik7Ci0JdGV4dC5wYXN0ZSgpOwotCWFzc2VydEVxdWFscygiMDAwMDAiLCB0ZXh0LmdldFRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY3V0KCkgewotCXRleHQuY3V0KCk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDUpOwotCXRleHQuY3V0KCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5jdXQoKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5jdXQoKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCA1KTsKLQl0ZXh0LmN1dCgpOwotCWFzc2VydEVxdWFscygiMDE1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuY3V0KCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2FyZXRMaW5lTnVtYmVyKCkgewotCXRleHQuc2V0Qm91bmRzKDAsIDAsIDUwMCwgNTAwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldENhcmV0TGluZU51bWJlcigpID09IDApOwotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRDYXJldExpbmVOdW1iZXIoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0Q2FyZXRMaW5lTnVtYmVyKCkgPT0gMCk7Ci0KLQl0ZXh0LmFwcGVuZCgiTGluZTEiKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldENhcmV0TGluZU51bWJlcigpID09IDEpOwotCVN0cmluZyBuZXdUZXh0ID0gIkxpbmUtMVxyXG4iOwotCXRleHQuc2V0U2VsZWN0aW9uKDAsMCk7Ci0JdGV4dC5pbnNlcnQobmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRDYXJldExpbmVOdW1iZXIoKSA9PSAxKTsKLQotCXRleHQuc2V0U2VsZWN0aW9uKDAsMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRDYXJldExpbmVOdW1iZXIoKSA9PSAwKTsKLQl0ZXh0LnNldFNlbGVjdGlvbig4LDgpOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0Q2FyZXRMaW5lTnVtYmVyKCkgPT0gMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2FyZXRMb2NhdGlvbigpIHsKLQkvLyBhY2NvdW50IGZvciBpbnNldHMgd2hlbiBhc3NlcnRpbmcKLQl0ZXh0LnNldFNpemUoMjAwLDUwKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwLDApOwotCXRleHQuaW5zZXJ0KCIiKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldENhcmV0TG9jYXRpb24oKS54ID49IDApOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0Q2FyZXRMb2NhdGlvbigpLnkgPj0gMCk7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG5MaW5lMVxyXG5MaW5lMiIpOwotCXRleHQuaW5zZXJ0KCIiKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldENhcmV0TG9jYXRpb24oKS54ID49IDApOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0Q2FyZXRMb2NhdGlvbigpLnkgPj0gMCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMSwxKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldENhcmV0TG9jYXRpb24oKS54ID4gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRDYXJldExvY2F0aW9uKCkueSA+PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDYXJldFBvc2l0aW9uKCkgewotCXRleHQuc2V0VGV4dCgiTGluZSIpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0Q2FyZXRQb3NpdGlvbigpID09IDApOwotCXRleHQuYXBwZW5kKCIxMjMiKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldENhcmV0UG9zaXRpb24oKSA9PSA3KTsKLQl0ZXh0LnNldFNlbGVjdGlvbigxLDMpOwotCXRleHQuaW5zZXJ0KCIxMjMiKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldENhcmV0UG9zaXRpb24oKSA9PSA0KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGFyQ291bnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMTEsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDUiICsgZGVsaW1pdGVyU3RyaW5nKyI2Nzg5MCIpOwotCWFzc2VydEVxdWFscygxMSAgKyBkZWxpbWl0ZXJTdHJpbmcubGVuZ3RoKCksIHRleHQuZ2V0Q2hhckNvdW50KCkpOyAvL21pZ2h0IGJlIGJvZ3VzIG9uIFVOSVgKLQotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzRcdDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygxMiwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0KLQkvLwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMTEsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDUiICsgZGVsaW1pdGVyU3RyaW5nKyI2Nzg5MCIpOwotCWFzc2VydEVxdWFscygxMSAgKyBkZWxpbWl0ZXJTdHJpbmcubGVuZ3RoKCksIHRleHQuZ2V0Q2hhckNvdW50KCkpOyAvL21pZ2h0IGJlIGJvZ3VzIG9uIFVOSVgKLQotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzRcdDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygxMiwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDExLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQlpZiAoZkNoZWNrQm9ndXNUZXN0Q2FzZXMpIHsKLQkJdGV4dC5zZXRUZXh0KCIwMTIzNDUiKyBkZWxpbWl0ZXJTdHJpbmcgKyAiNjc4OTAiKTsKLQkJYXNzZXJ0RXF1YWxzKDExICArIGRlbGltaXRlclN0cmluZy5sZW5ndGgoKSwgdGV4dC5nZXRDaGFyQ291bnQoKSk7IC8vbWlnaHQgYmUgYm9ndXMgb24gVU5JWAotCX0KLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQlpZiAoIVN3dEp1bml0LmlzQUlYKSB7CQotCQl0ZXh0LnNldFRleHQoIjAxMjM0XHQ1Njc4OTAiKTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgewotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUodGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci0JCi0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci0JCi0JLy8gdGhpcyBtZXRob2QgdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUodGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci0JCi0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RWNob0NoYXIoKSB7Ci0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0RWNob0NoYXIoJ2EnKTsKLQlhc3NlcnRFcXVhbHMoJ2EnLCB0ZXh0LmdldEVjaG9DaGFyKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVkaXRhYmxlKCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSB0cnVlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSB0cnVlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZUNvdW50KCkgewotCXRleHQuc2V0Qm91bmRzKDAsIDAsIDUwMCwgNTAwKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci0JdGV4dC5hcHBlbmQoImRkZGFzZCIgKyBkZWxpbWl0ZXJTdHJpbmcpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVDb3VudCgpKTsKLQl0ZXh0LmFwcGVuZCgiZGRhc2Rhc2Rhc2Rhc2QiICsgZGVsaW1pdGVyU3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoMywgdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVDb3VudCgpKTsKLQl0ZXh0LmFwcGVuZCgiZGRkYXNkIiArIGRlbGltaXRlclN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCXRleHQuYXBwZW5kKCJkZGFzZGFzZGFzZGFzZCIgKyBkZWxpbWl0ZXJTdHJpbmcpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVDb3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lRGVsaW1pdGVyKCkgewotCVN0cmluZyBwbGF0Zm9ybSA9IFNXVC5nZXRQbGF0Zm9ybSgpOwotCVN0cmluZyBkZWxpbWl0ZXIgPSB0ZXh0LmdldExpbmVEZWxpbWl0ZXIoKTsKLQlpZiAocGxhdGZvcm0uZXF1YWxzKCJ3aW4zMiIpKSB7Ci0JCWFzc2VydFRydWUoIjphOiIsIGRlbGltaXRlci5lcXVhbHMoIlxyXG4iKSk7Ci0JfSBlbHNlIGlmIChwbGF0Zm9ybS5lcXVhbHMoIm1vdGlmIikpIHsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgZGVsaW1pdGVyLmVxdWFscygiXG4iKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVIZWlnaHQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRMaW5lSGVpZ2h0KCkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRPcmllbnRhdGlvbigpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0T3JpZW50YXRpb24KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgyLCAyKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDIsIDIpKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDIsIDMpKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMiwgMykpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMywgMTEpKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMywgMTEpKSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDQpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCg0LCA0KSkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDExKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMTEsIDExKSkpOwotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgzLCAyKSk7CQotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgyLCAzKSkpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25Db3VudCgpIHsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT0wKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCA0KTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDExKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTkpOwotCXRleHQuc2V0VGV4dCgiMDEyM1xuNDU2Nzg5MCIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09MCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT0yKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCAxMik7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT0xMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uVGV4dCgpIHsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMywgNyk7Ci0JYXNzZXJ0RXF1YWxzKCIzNDU2IiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRhYnMoKSB7Ci0JaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygid2luMzIiKSkgewotCQkvLyBBUEkgbm90IHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zIChlLmcuLCBNb3RpZikKLQkJdGV4dC5zZXRUYWJzKDEpOwotCQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRhYnMoKSA9PSAxKTsKLQkJdGV4dC5zZXRUYWJzKDgpOwotCQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRhYnMoKSA9PSA4KTsKLQkJdGV4dC5zZXRUZXh0KCJMaW5lXHQxXHJcbiIpOwotCQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRhYnMoKSA9PSA4KTsKLQkJdGV4dC5zZXRUYWJzKDcpOwotCQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRhYnMoKSA9PSA3KTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpIHsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCVN0cmluZyBzdHJpbmcgPSAiMDEyMzQ1IiArIGRlbGltaXRlclN0cmluZyArICI2Nzg5MCI7Ci0JdGV4dC5zZXRUZXh0KHN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKHN0cmluZywgdGV4dC5nZXRUZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRJSSgpIHsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtNCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC0yKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTIsLTEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMSwtMSkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0xLDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgwLDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgwLDEpKTsKLQkKLQl0ZXh0LnNldFRleHQoImEiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtNCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC0yKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTIsLTEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMSwtMSkpOwotCWFzc2VydEVxdWFscygiYSIsIHRleHQuZ2V0VGV4dCgtMSwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCJhIiwgdGV4dC5nZXRUZXh0KDAsMCkpOwotCWFzc2VydEVxdWFscygiYSIsIHRleHQuZ2V0VGV4dCgwLDEpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIzNDUiLCB0ZXh0LmdldFRleHQoMywgNSkpOwotCWFzc2VydEVxdWFscygiMDEyIiwgdGV4dC5nZXRUZXh0KC0xLCAyKSk7Ci0JYXNzZXJ0RXF1YWxzKCIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgzLCAxMDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCg1LCAzKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnNldEVjaG9DaGFyKCcqJyk7Ci0JCi0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTQpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtMikpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0yLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTEsLTEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMSwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoMCwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoMCwxKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJhIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTQpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtMikpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0yLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTEsLTEpKTsKLQlhc3NlcnRFcXVhbHMoImEiLCB0ZXh0LmdldFRleHQoLTEsMCkpOwotCWFzc2VydEVxdWFscygiYSIsIHRleHQuZ2V0VGV4dCgwLDApKTsKLQlhc3NlcnRFcXVhbHMoImEiLCB0ZXh0LmdldFRleHQoMCwxKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMzQ1IiwgdGV4dC5nZXRUZXh0KDMsIDUpKTsKLQlhc3NlcnRFcXVhbHMoIjAxMiIsIHRleHQuZ2V0VGV4dCgtMSwgMikpOwotCWFzc2VydEVxdWFscygiMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoMywgMTAwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoNSwgMykpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0TGltaXQoKSB7Ci0JdGV4dC5zZXRUZXh0TGltaXQoMTApOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VGV4dExpbWl0KCkgPT0gMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvcEluZGV4KCkgewotCXRleHQuc2V0U2l6ZSg1MCx0ZXh0LmdldExpbmVIZWlnaHQoKSAqIDIpOwotCXRleHQuc2V0VG9wSW5kZXgoMCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci0JdGV4dC5hcHBlbmQoZGVsaW1pdGVyU3RyaW5nICsiMDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxNyk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wUGl4ZWwoKSB7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG5MaW5lMGFcclxuIik7Ci0KLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgtMik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoLTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSB0ZXh0LmdldExpbmVIZWlnaHQoKSk7Ci0JdGV4dC5zZXRTaXplKDEwLCB0ZXh0LmdldExpbmVIZWlnaHQoKSk7Ci0JdGV4dC5zZXRUb3BJbmRleCgyKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiAyKTsKLQl0ZXh0LnNldFRvcEluZGV4KDApOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDMpOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIDIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luc2VydExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRleHQuc2V0Qm91bmRzKDAsIDAsIDUwMCwgNTAwKTsKLQl0cnkgewotCQl0ZXh0Lmluc2VydChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5pbnNlcnQoIiIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuaW5zZXJ0KCJmcmVkIik7Ci0JYXNzZXJ0RXF1YWxzKCJmcmVkIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIpOwotCXRleHQuaW5zZXJ0KCJoZWxtdXQiKTsKLQlhc3NlcnRFcXVhbHMoImZyaGVsbXV0ZWQiLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCXRleHQuaW5zZXJ0KGRlbGltaXRlclN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRyeSB7Ci0JCXRleHQuaW5zZXJ0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIG9uIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0Lmluc2VydCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5pbnNlcnQoImZyZWQiKTsKLQlhc3NlcnRFcXVhbHMoImZyZWQiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMik7Ci0JdGV4dC5pbnNlcnQoImhlbG11dCIpOwotCWFzc2VydEVxdWFscygiZnJoZWxtdXRlZCIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCXRleHQuaW5zZXJ0KFRleHQuREVMSU1JVEVSKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdHJ5IHsKLQkJdGV4dC5pbnNlcnQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gb24gc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzVmlzaWJsZSgpIHsKLQkvLyBvdmVycmlkaW5nIHRlc3RfaXNWaXNpYmxlKCkgZnJvbSBDb250cm9sCi0JY29udHJvbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoY29udHJvbC5pc1Zpc2libGUoKSk7ICAKLQotCWNvbnRyb2wuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5pc1Zpc2libGUoKSk7Ci0KLQlpZiAoIVN3dEp1bml0LmlzQUlYKSB7Ci0JCWNvbnRyb2wuc2V0VmlzaWJsZSh0cnVlKTsKLQkJc2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgiV2luZG93IHNob3VsZCBiZSB2aXNpYmxlIiwgY29udHJvbC5pc1Zpc2libGUoKSk7Ci0JCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQlhc3NlcnRUcnVlKCJXaW5kb3cgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIiwgIWNvbnRyb2wuaXNWaXNpYmxlKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9wYXN0ZSgpIHsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LmNvcHkoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQl0ZXh0LnBhc3RlKCk7Ci0JYXNzZXJ0RXF1YWxzKCIyMzAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuY29weSgpOwotCXRleHQuc2V0U2VsZWN0aW9uKDMpOwotCXRleHQucGFzdGUoKTsKLQlhc3NlcnRFcXVhbHMoIjIzMDIzMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMCIgKyBkZWxpbWl0ZXJTdHJpbmcgKyAiMSIpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5jb3B5KCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JdGV4dC5wYXN0ZSgpOwotCWFzc2VydEVxdWFscygiMCIgKyBkZWxpbWl0ZXJTdHJpbmcgKyAiMSIgKyAiMCIgKyBkZWxpbWl0ZXJTdHJpbmcgKyAiMSIsIHRleHQuZ2V0VGV4dCgpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5jb3B5KCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JdGV4dC5wYXN0ZSgpOwotCWFzc2VydEVxdWFscygiMjMwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LmNvcHkoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigzKTsKLQl0ZXh0LnBhc3RlKCk7Ci0JYXNzZXJ0RXF1YWxzKCIyMzAyMzEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwIiArIGRlbGltaXRlclN0cmluZyArICIxIik7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LmNvcHkoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQl0ZXh0LnBhc3RlKCk7Ci0KLQlpZiAoZkNoZWNrU1dUUG9saWN5KQotCQlhc3NlcnRFcXVhbHMoIjAiICsgZGVsaW1pdGVyU3RyaW5nICsgIjEiICsgIjAiICsgZGVsaW1pdGVyU3RyaW5nICsgIjEiLCB0ZXh0LmdldFRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkTW9kaWZ5TGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkU2VsZWN0aW9uTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkVmVyaWZ5TGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0QWxsKCkgewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LmN1dCgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNCIgKyBkZWxpbWl0ZXJTdHJpbmcrIjU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nKyI1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0IiArIGRlbGltaXRlclN0cmluZysiNTY3ODkwIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuY3V0KCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LmN1dCgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCWlmIChmQ2hlY2tCb2d1c1Rlc3RDYXNlcykgewotCQl0ZXh0LnNldFRleHQoIjAxMjM0IiArIGRlbGltaXRlclN0cmluZysiNTY3ODkwIik7Ci0JCWFzc2VydEVxdWFscygiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nKyI1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JCXRleHQuc2VsZWN0QWxsKCk7Ci0JCWFzc2VydEVxdWFscygiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nKyI1Njc4OTAiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JCXRleHQuY3V0KCk7Ci0JCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREb3VibGVDbGlja0VuYWJsZWRaKCkgewotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUodGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci0JCi0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUodGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci0JCi0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWNob0NoYXJDKCkgewotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlmb3IgKGludCBpPTA7IGk8MTI4OyBpKyspewotCQl0ZXh0LnNldEVjaG9DaGFyKChjaGFyKSBpKTsKLQkJYXNzZXJ0RXF1YWxzKChjaGFyKWksIHRleHQuZ2V0RWNob0NoYXIoKSk7Ci0JfQotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldEVjaG9DaGFyKCdhJyk7Ci0JYXNzZXJ0RXF1YWxzKCdhJywgdGV4dC5nZXRFY2hvQ2hhcigpKTsKLQotCXRleHQuc2V0RWNob0NoYXIoKGNoYXIpIDApOwotCWFzc2VydEVxdWFscygoY2hhcikwLCB0ZXh0LmdldEVjaG9DaGFyKCkpOwotCi0JdGV4dC5zZXRFY2hvQ2hhcignXG4nKTsKLQlhc3NlcnRFcXVhbHMoJ1xuJywgdGV4dC5nZXRFY2hvQ2hhcigpKTsKLQotCWZvciAoaW50IGk9MDsgaTwxMjg7IGkrKyl7Ci0JCXRleHQuc2V0RWNob0NoYXIoKGNoYXIpIGkpOwotCQlhc3NlcnRFcXVhbHMoKGNoYXIpaSwgdGV4dC5nZXRFY2hvQ2hhcigpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWRpdGFibGVaKCkgewotCXRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IHRydWUpOwotCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IGZhbHNlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSB0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCUZvbnREYXRhIGZvbnREYXRhID0gdGV4dC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQlpbnQgbGluZUhlaWdodDsKLQlGb250IGZvbnQ7Ci0JCi0JZm9udCA9IG5ldyBGb250KHRleHQuZ2V0RGlzcGxheSgpLCBmb250RGF0YS5nZXROYW1lKCksIDgsIGZvbnREYXRhLmdldFN0eWxlKCkpOwotCXRleHQuc2V0Rm9udChmb250KTsKLQlsaW5lSGVpZ2h0ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCk7Ci0JdGV4dC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotCWZvbnQgPSBuZXcgRm9udCh0ZXh0LmdldERpc3BsYXkoKSwgZm9udERhdGEuZ2V0TmFtZSgpLCAxMiwgZm9udERhdGEuZ2V0U3R5bGUoKSk7Ci0JdGV4dC5zZXRGb250KGZvbnQpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0TGluZUhlaWdodCgpID4gbGluZUhlaWdodCAmJiBmb250LmVxdWFscyh0ZXh0LmdldEZvbnQoKSkpOwotCXRleHQuc2V0Rm9udChudWxsKTsKLQlmb250LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRPcmllbnRhdGlvbkkoKSB7Ci0JdGV4dC5zZXRPcmllbnRhdGlvbihTV1QuUklHSFRfVE9fTEVGVCk7Ci0JaWYgKCh0ZXh0LmdldFN0eWxlKCkgJiBTV1QuTUlSUk9SRUQpICE9IDApIHsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRPcmllbnRhdGlvbigpPT1TV1QuUklHSFRfVE9fTEVGVCk7Ci0JfQotCXRleHQuc2V0T3JpZW50YXRpb24oU1dULkxFRlRfVE9fUklHSFQpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0T3JpZW50YXRpb24oKT09U1dULkxFRlRfVE9fUklHSFQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFJlZHJhd1ooKSB7Ci0JdGV4dC5zZXRSZWRyYXcoZmFsc2UpOwotCXRleHQuc2V0UmVkcmF3KHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkkoKSB7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDMsIDcpOwotCWFzc2VydEVxdWFscygiMzQ1NiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigzLCAwKTsKLQlhc3NlcnRFcXVhbHMoIjAxMiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JSSgpIHsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgMTAwKTsKLQlhc3NlcnRFcXVhbHMoOSwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMyIgKyBkZWxpbWl0ZXJTdHJpbmcgKyI0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgMTAwKTsKLQlhc3NlcnRFcXVhbHMoOSArIGRlbGltaXRlclN0cmluZy5sZW5ndGgoKSwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDEwMCk7Ci0JYXNzZXJ0RXF1YWxzKDksIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzIisgZGVsaW1pdGVyU3RyaW5nKyI0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JaWYgKGZDaGVja0JvZ3VzVGVzdENhc2VzKSB7Ci0JCXRleHQuc2V0U2VsZWN0aW9uKDIsIDEwMCk7Ci0JCWFzc2VydEVxdWFscyg5ICtkZWxpbWl0ZXJTdHJpbmcubGVuZ3RoKCksIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JdGV4dC5zZXRUZXh0KCJkc2RzZGFzZHNsYWFzZGFzIik7Ci0JdHJ5IHsKLQkJdGV4dC5zZXRTZWxlY3Rpb24oKFBvaW50KSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgyLCAyKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgyLCAyKSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMywgMikpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMiwgMyksIHRleHQuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDMsIDEwMCkpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMywgMTEpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbig0KTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDQsIDQpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLQotCXRleHQuc2V0U2VsZWN0aW9uKDEwMCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgxMSwgMTEpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJkc2RzZGFzZHNsYWFzZGFzIik7Ci0JdHJ5IHsKLQkJdGV4dC5zZXRTZWxlY3Rpb24oKFBvaW50KSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgyLCAyKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgyLCAyKSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMywgMikpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMiwgMyksIHRleHQuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDMsIDEwMCkpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMywgMTEpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCg0LCA0KSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvbigxMDApOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMTEsIDExKSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGFic0koKSB7Ci0JaWYgKFN3dEp1bml0LmlzTW90aWYpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyMDA7IGkrKykgewotCQkJdGV4dC5zZXRUYWJzKGkpOwotCQkJYXNzZXJ0RXF1YWxzKDgsIHRleHQuZ2V0VGFicygpKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKLQkJCXRleHQuc2V0VGFicyhpKTsKLQkJCWFzc2VydEVxdWFscyhpLCB0ZXh0LmdldFRhYnMoKSk7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExpbWl0SSgpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCXRleHQuc2V0VGV4dExpbWl0KDEwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRleHRMaW1pdCgpID09IDEwKTsKLQotCXRleHQuc2V0VGV4dExpbWl0KFRleHQuTElNSVQpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VGV4dExpbWl0KCkgPT0gVGV4dC5MSU1JVCk7Ci0KLQl0cnkgewotCQl0ZXh0LnNldFRleHRMaW1pdCgwKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpjOiIsIGV4Y2VwdGlvblRocm93biA9PSB0cnVlKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JdHJ5IHsKLQkJdGV4dC5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0ZXh0LnNldFRleHQoIiIpOwotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCWlmIChmQ2hlY2tCb2d1c1Rlc3RDYXNlcykgewotCQl0ZXh0LnNldFRleHQoIjAxMjM0NSIgKyBkZWxpbWl0ZXJTdHJpbmcrICI2Nzg5MCIpOwotCQlhc3NlcnRFcXVhbHMoIjAxMjM0NSIgKyBkZWxpbWl0ZXJTdHJpbmcgKyI2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl9Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIzNDUiLCB0ZXh0LmdldFRleHQoMywgNSkpOwotCWFzc2VydEVxdWFscygiMDEyIiwgdGV4dC5nZXRUZXh0KC0xLCAyKSk7Ci0JYXNzZXJ0RXF1YWxzKCIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgzLCAxMDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCg1LCAzKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMSwgMCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDAsIDEwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoMSwgMCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvcEluZGV4SSgpIHsKLQlpbnQgbnVtYmVyID0gMTAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJdGV4dC5hcHBlbmQoIjAxMjM0XG4iKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDE7IGkgPCBudW1iZXI7IGkrKykgewotCQl0ZXh0LnNldFRvcEluZGV4KGkpOwotCQlhc3NlcnRFcXVhbHMoaSwgdGV4dC5nZXRUb3BJbmRleCgpKTsKLQl9Ci0JCi0JdGV4dC5zZXRUb3BJbmRleChudW1iZXIrNSk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGV4dC5nZXRUb3BJbmRleCgpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuYXBwZW5kKFRleHQuREVMSU1JVEVSICsiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFRvcEluZGV4KDApOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldFRvcEluZGV4KCkpOwotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxNyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIiIpOwkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCXRleHQuYXBwZW5kKCIwMTIzNCIgKyBUZXh0LkRFTElNSVRFUik7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJdGV4dC5zZXRUb3BJbmRleChpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dTZWxlY3Rpb24oKSB7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0KLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotCi0JdGV4dC5zZXRUZXh0KCIwMDAwMCIpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0JdGV4dC5jbGVhclNlbGVjdGlvbigpOwotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotCQotCS8vIHRoaXMgbWV0aG9kIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0KLQotCXRleHQuc2V0VGV4dCgiMDAwMDAiKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotCi0JdGV4dC5jbGVhclNlbGVjdGlvbigpOwotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NsZWFyU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29weSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY3V0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDYXJldExpbmVOdW1iZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENhcmV0TG9jYXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENhcmV0UG9zaXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoYXJDb3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RG91YmxlQ2xpY2tFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFY2hvQ2hhciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RWRpdGFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVDb3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZURlbGltaXRlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZUhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0T3JpZW50YXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvblRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRhYnMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dExpbWl0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BJbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wUGl4ZWwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luc2VydExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wYXN0ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0QWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREb3VibGVDbGlja0VuYWJsZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFY2hvQ2hhckMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVkaXRhYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0T3JpZW50YXRpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRSZWRyYXdaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGFic0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMaW1pdEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wSW5kZXhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW9kaWZ5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIikpIHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIiKSkgdGVzdF9hZGRWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hcHBlbmRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2FwcGVuZExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbGVhclNlbGVjdGlvbiIpKSB0ZXN0X2NsZWFyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb3B5IikpIHRlc3RfY29weSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY3V0IikpIHRlc3RfY3V0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDYXJldExpbmVOdW1iZXIiKSkgdGVzdF9nZXRDYXJldExpbmVOdW1iZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENhcmV0TG9jYXRpb24iKSkgdGVzdF9nZXRDYXJldExvY2F0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDYXJldFBvc2l0aW9uIikpIHRlc3RfZ2V0Q2FyZXRQb3NpdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hhckNvdW50IikpIHRlc3RfZ2V0Q2hhckNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREb3VibGVDbGlja0VuYWJsZWQiKSkgdGVzdF9nZXREb3VibGVDbGlja0VuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVjaG9DaGFyIikpIHRlc3RfZ2V0RWNob0NoYXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVkaXRhYmxlIikpIHRlc3RfZ2V0RWRpdGFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVDb3VudCIpKSB0ZXN0X2dldExpbmVDb3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZURlbGltaXRlciIpKSB0ZXN0X2dldExpbmVEZWxpbWl0ZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVIZWlnaHQiKSkgdGVzdF9nZXRMaW5lSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRPcmllbnRhdGlvbiIpKSB0ZXN0X2dldE9yaWVudGF0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50IikpIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvblRleHQiKSkgdGVzdF9nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUYWJzIikpIHRlc3RfZ2V0VGFicygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dCIpKSB0ZXN0X2dldFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRJSSIpKSB0ZXN0X2dldFRleHRJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dExpbWl0IikpIHRlc3RfZ2V0VGV4dExpbWl0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BJbmRleCIpKSB0ZXN0X2dldFRvcEluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BQaXhlbCIpKSB0ZXN0X2dldFRvcFBpeGVsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnNlcnRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2luc2VydExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wYXN0ZSIpKSB0ZXN0X3Bhc3RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3RBbGwiKSkgdGVzdF9zZWxlY3RBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldERvdWJsZUNsaWNrRW5hYmxlZFoiKSkgdGVzdF9zZXREb3VibGVDbGlja0VuYWJsZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFY2hvQ2hhckMiKSkgdGVzdF9zZXRFY2hvQ2hhckMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVkaXRhYmxlWiIpKSB0ZXN0X3NldEVkaXRhYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE9yaWVudGF0aW9uSSIpKSB0ZXN0X3NldE9yaWVudGF0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UmVkcmF3WiIpKSB0ZXN0X3NldFJlZHJhd1ooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JSSIpKSB0ZXN0X3NldFNlbGVjdGlvbklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGFic0kiKSkgdGVzdF9zZXRUYWJzSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExpbWl0SSIpKSB0ZXN0X3NldFRleHRMaW1pdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9wSW5kZXhJIikpIHRlc3Rfc2V0VG9wSW5kZXhJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93U2VsZWN0aW9uIikpIHRlc3Rfc2hvd1NlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW9kaWZ5IikpIHRlc3RfY29uc2lzdGVuY3lfTW9kaWZ5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1UZXh0IHRleHQ7Ci1TdHJpbmcgZGVsaW1pdGVyU3RyaW5nOwotCi0vKioKLSAqIENsZWFuIHVwIHRoZSBlbnZpcm9ubWVudCBmb3IgYSBuZXcgdGVzdC4KLSAqIAotICogQHBhcmFtIHNpbmdsZSB0cnVlIGlmIHRoZSBuZXcgdGV4dCB3aWRnZXQgc2hvdWxkIGJlIHNpbmdsZS1saW5lLgotICovCi1wcml2YXRlIHZvaWQgbWFrZUNsZWFuRW52aXJvbm1lbnQoYm9vbGVhbiBzaW5nbGUpIHsKLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLQlpZiAoIHRleHQgIT0gbnVsbCApIHRleHQuZGlzcG9zZSgpOwotCi0JaWYgKCBzaW5nbGUgPT0gdHJ1ZSApCi0JCXRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNJTkdMRSk7CQotCWVsc2UKLQkJdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQlkZWxpbWl0ZXJTdHJpbmcgPSBUZXh0LkRFTElNSVRFUjsKLX0KLXByb3RlY3RlZCB2b2lkIHNldFdpZGdldChXaWRnZXQgdykgewotCXRleHQgPSAoVGV4dCl3OwotCXN1cGVyLnNldFdpZGdldCh3KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiAoKSB7Ci0gICAgbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMywgMTAsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vZGlmeSgpIHsKLSAgICBtYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCdhJywgMCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTAsIDMsIENvbnNpc3RlbmN5VXRpbGl0eS5FU0NBUEVfTUVOVSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBtYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDMwLCAxMCwgNTAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMjYyNjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQodG9vbEJhcik7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQluZXcgVG9vbEJhcihudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVRyaW1JSUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCWludCBudW1iZXIgPSAxMDsKLQlUb29sSXRlbSB0aTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCQlhc3NlcnRUcnVlKCI6YToiICsgaSwgdG9vbEJhci5nZXRJdGVtQ291bnQoKT09aSk7Ci0JICAJdGkgPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgMCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCWludCBudW1iZXIgPSA1OwotCVRvb2xJdGVtW10gaXRlbXMgPSBuZXcgVG9vbEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCWl0ZW1zW2ldID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIDApOwotCX0KLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCQlhc3NlcnRUcnVlKCI6YToiLCB0b29sQmFyLmdldEl0ZW0oaSk9PWl0ZW1zW2ldKTsKLQl9Ci0KLQl0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIDApOwotCW51bWJlciA9IDU7Ci0JaXRlbXMgPSBuZXcgVG9vbEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCWl0ZW1zW2ldID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIDApOwotCX0KLQl0cnkgewotCQl0b29sQmFyLmdldEl0ZW0obnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JVG9vbEl0ZW1bXSBpdGVtcyA9IG5ldyBUb29sSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJaXRlbXNbaV0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgMCk7Ci0JfQotCWFzc2VydEVxdWFscyhpdGVtcywgdG9vbEJhci5nZXRJdGVtcygpKTsKLQkKLQl0b29sQmFyLmdldEl0ZW1zKClbMF0uZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyhuZXcgVG9vbEl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0sIHRvb2xCYXIuZ2V0SXRlbXMoKSk7Ci0KLQl0b29sQmFyLmdldEl0ZW1zKClbM10uZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyhuZXcgVG9vbEl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdfSwgdG9vbEJhci5nZXRJdGVtcygpKTsKLQotCXRvb2xCYXIuZ2V0SXRlbXMoKVsxXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUb29sSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1szXX0sIHRvb2xCYXIuZ2V0SXRlbXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Um93Q291bnQoKSB7Ci0JdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuV1JBUCk7Ci0JaW50IG51bWJlciA9IDU7Ci0JVG9vbEl0ZW1bXSBpdGVtcyA9IG5ldyBUb29sSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJaXRlbXNbaV0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgMCk7Ci0JfQotCWFzc2VydFRydWUoIjphOiIgKyB0b29sQmFyLmdldFJvd0NvdW50KCksIHRvb2xCYXIuZ2V0Um93Q291bnQoKT09bnVtYmVyKTsgIC8vPz8/PyAgYmVjYXVzZSBvZiBTaXplKDAsIDApCi0KLQl0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIDApOwotCW51bWJlciA9IDU7Ci0JaXRlbXMgPSBuZXcgVG9vbEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCWl0ZW1zW2ldID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIDApOwotCX0KLQlhc3NlcnRUcnVlKCI6YToiLCB0b29sQmFyLmdldFJvd0NvdW50KCk9PTEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0oKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCVRvb2xJdGVtW10gdGlzID0gbmV3IFRvb2xJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAl0aXNbaV0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgMCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBpLCB0b29sQmFyLmluZGV4T2YodGlzW2ldKT09aSk7Ci0JfQotCi0JbnVtYmVyID0gMTA7Ci0JdGlzID0gbmV3IFRvb2xJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAl0aXNbaV0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgMCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCXRyeSB7Ci0JCQl0b29sQmFyLmluZGV4T2YobnVsbCk7CQkKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRvb2xJdGVtID09IG51bGwiKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlVHJpbUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Um93Q291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVRyaW1JSUlJIikpIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJvd0NvdW50IikpIHRlc3RfZ2V0Um93Q291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVG9vbEJhciB0b29sQmFyOwotCi1wcml2YXRlIHZvaWQgY3JlYXRlVG9vbEJhcihWZWN0b3IgZXZlbnRzKSB7Ci0JdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuRkxBVCB8IFNXVC5IT1JJWk9OVEFMKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCJUb29sQmFyIiArIGkpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJUb29sSXRlbSBUb29sVGlwIiArIGkpOwotCQlob29rRXhwZWN0ZWRFdmVudHMoaXRlbSwgZ2V0VGVzdE5hbWUoKSwgZXZlbnRzKTsKLQl9Ci0Jc2V0V2lkZ2V0KHRvb2xCYXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVG9vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMzAsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24gKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVG9vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTMsIDEwLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRvb2xCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUb29sQmFyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1MCwgMTUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRvb2xCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDMwLCAyMCwgNTAsIDIwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRywgZXZlbnRzKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyNGIwMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0gewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCAwKTsKLQl0b29sSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCAwKTsgCi0Jc2V0V2lkZ2V0KHRvb2xJdGVtKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFySSgpIHsKLQl0cnkgewotCQluZXcgVG9vbEl0ZW0obnVsbCwgU1dULk5VTEwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhcklJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFySUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCb3VuZHMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlzYWJsZWRJbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RGlzYWJsZWRJbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVuYWJsZWQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEVuYWJsZWQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIb3RJbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SG90SW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFBhcmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbS5nZXRTZWxlY3Rpb24oKQotCXdhcm5VbmltcGwoICJUZXN0IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0udGVzdF81X2dldFNlbGVjdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvb2xUaXBUZXh0KCkgewotCXRvb2xJdGVtLnNldFRvb2xUaXBUZXh0KCJmcmVkIik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6ICIsIHRvb2xJdGVtLmdldFRvb2xUaXBUZXh0KCkuZXF1YWxzKCJmcmVkIikpOwotCXRvb2xJdGVtLnNldFRvb2xUaXBUZXh0KCJmcmVkdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0Iik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6ICIsIHRvb2xJdGVtLmdldFRvb2xUaXBUZXh0KCkuZXF1YWxzKCJmcmVkdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0IikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFdpZHRoKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRXaWR0aCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRW5hYmxlZCgpIHsKLQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbS5pc0VuYWJsZWQoKQotCXdhcm5VbmltcGwoICJUZXN0IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0udGVzdF83X2lzRW5hYmxlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldERpc2FibGVkSW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXREaXNhYmxlZEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVuYWJsZWRaKCkgewotCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtLnNldEVuYWJsZWQoYm9vbGVhbikKLQl3YXJuVW5pbXBsKCAiVGVzdCBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtLnRlc3RfOF9zZXRFbmFibGVkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SG90SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRIb3RJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvblooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvblogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRXaWR0aEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFdpZHRoSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFySUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGlzYWJsZWRJbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SG90SW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb29sVGlwVGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0V2lkdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREaXNhYmxlZEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEhvdEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25aIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFdpZHRoSSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0ubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFySSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFySUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFySUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRyb2wiKSkgdGVzdF9nZXRDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREaXNhYmxlZEltYWdlIikpIHRlc3RfZ2V0RGlzYWJsZWRJbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RW5hYmxlZCIpKSB0ZXN0X2dldEVuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhvdEltYWdlIikpIHRlc3RfZ2V0SG90SW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb29sVGlwVGV4dCIpKSB0ZXN0X2dldFRvb2xUaXBUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRXaWR0aCIpKSB0ZXN0X2dldFdpZHRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0VuYWJsZWQiKSkgdGVzdF9pc0VuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldERpc2FibGVkSW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0RGlzYWJsZWRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVuYWJsZWRaIikpIHRlc3Rfc2V0RW5hYmxlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEhvdEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEhvdEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25aIikpIHRlc3Rfc2V0U2VsZWN0aW9uWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0V2lkdGhJIikpIHRlc3Rfc2V0V2lkdGhJKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotVG9vbEJhciB0b29sQmFyOwotVG9vbEl0ZW0gdG9vbEl0ZW07Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJhY2tlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyYWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyZDE3Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJhY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmFja2VyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmFja2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyYWNrZXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldCB7Ci0JCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmFja2VyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0cmFja2VyID0gbmV3IFRyYWNrZXIoc2hlbGwsIDApOwotCXNldFdpZGdldCh0cmFja2VyKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY2xvc2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSZWN0YW5nbGVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRSZWN0YW5nbGVzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3RpcHBsZWQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFN0aXBwbGVkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfb3BlbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfb3BlbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q3Vyc29yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVjdGFuZ2xlcyRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0UmVjdGFuZ2xlcyRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFN0aXBwbGVkWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U3RpcHBsZWRaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJhY2tlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UmVjdGFuZ2xlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3RpcHBsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X29wZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q3Vyc29yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFJlY3RhbmdsZXMkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFN0aXBwbGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKSkgdGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Nsb3NlIikpIHRlc3RfY2xvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJlY3RhbmdsZXMiKSkgdGVzdF9nZXRSZWN0YW5nbGVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdGlwcGxlZCIpKSB0ZXN0X2dldFN0aXBwbGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9vcGVuIikpIHRlc3Rfb3BlbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvciIpKSB0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSZWN0YW5nbGVzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3Rfc2V0UmVjdGFuZ2xlcyRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U3RpcHBsZWRaIikpIHRlc3Rfc2V0U3RpcHBsZWRaKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotCVRyYWNrZXIgdHJhY2tlcjsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTUyNWM1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULk1VTFRJKTsKLQlzZXRXaWRnZXQodHJlZSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQl0cmVlID0gbmV3IFRyZWUobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludFtdIGNhc2VzID0gezAsIFNXVC5CT1JERVJ9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCXRyZWUgPSBuZXcgVHJlZShzaGVsbCwgY2FzZXNbaV0pOwotCi0JY2FzZXMgPSBuZXcgaW50W117MCwgMTAsIDEwMH07Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCVRyZWVJdGVtIHRpID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCQl9Ci0JCWFzc2VydEVxdWFscyhjYXNlc1tqXSwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0JCXRyZWUucmVtb3ZlQWxsKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0QWxsKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1s0XSwgaXRlbXNbNV0sIGl0ZW1zWzEwXX0pOwotCQotCWFzc2VydEVxdWFscyg0LCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRyZWUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRyZWUuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW5Db3VudCgpIHsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRDb2x1bW5Db3VudCgpKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCWFzc2VydEVxdWFscygyLCB0cmVlLmdldENvbHVtbkNvdW50KCkpOwotCVRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQlhc3NlcnRFcXVhbHMoMywgdHJlZS5nZXRDb2x1bW5Db3VudCgpKTsKLQljb2x1bW4wLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMiwgdHJlZS5nZXRDb2x1bW5Db3VudCgpKTsKLQljb2x1bW4xLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMSwgdHJlZS5nZXRDb2x1bW5Db3VudCgpKTsKLQljb2x1bW4yLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRDb2x1bW5Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW5JKCkgewotCXRyeSB7Ci0JCXRyZWUuZ2V0Q29sdW1uKDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCVRyZWVDb2x1bW4gY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQl0cnkgewotCQl0cmVlLmdldENvbHVtbigxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoY29sdW1uMCwgdHJlZS5nZXRDb2x1bW4oMCkpOwotCVRyZWVDb2x1bW4gY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQlhc3NlcnRFcXVhbHMoY29sdW1uMSwgdHJlZS5nZXRDb2x1bW4oMSkpOwotCWNvbHVtbjEuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRyZWUuZ2V0Q29sdW1uKDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWNvbHVtbjAuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRyZWUuZ2V0Q29sdW1uKDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbHVtbnMoKSB7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0Q29sdW1ucygpLmxlbmd0aCk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCVRyZWVDb2x1bW5bXSBjb2x1bW5zID0gdHJlZS5nZXRDb2x1bW5zKCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGNvbHVtbnMubGVuZ3RoKTsKLQlhc3NlcnRFcXVhbHMoY29sdW1uMCwgY29sdW1uc1swXSk7Ci0JY29sdW1uMC5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0Q29sdW1ucygpLmxlbmd0aCk7Ci0JY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuUklHSFQsIDEpOwotCWNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQlhc3NlcnRFcXVhbHMoMiwgY29sdW1ucy5sZW5ndGgpOwotCWFzc2VydEVxdWFscyhjb2x1bW4wLCBjb2x1bW5zWzBdKTsKLQlhc3NlcnRFcXVhbHMoY29sdW1uMSwgY29sdW1uc1sxXSk7Ci0JY29sdW1uMC5kaXNwb3NlKCk7Ci0JY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotCWFzc2VydEVxdWFscygxLCBjb2x1bW5zLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjEsIGNvbHVtbnNbMF0pOwotCWNvbHVtbjEuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldENvbHVtbnMoKS5sZW5ndGgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEdyaWRMaW5lV2lkdGgoKSB7Ci0JdHJlZS5nZXRHcmlkTGluZVdpZHRoKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SGVhZGVySGVpZ2h0KCkgewotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldEhlYWRlckhlaWdodCgpKTsKLQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlLmdldEhlYWRlckhlaWdodCgpID4gMCk7Ci0JdHJlZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRIZWFkZXJIZWlnaHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SGVhZGVyVmlzaWJsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRIZWFkZXJWaXNpYmxlWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUNvdW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUhlaWdodCgpIHsKLQlhc3NlcnRUcnVlKCI6YTogSXRlbSBoZWlnaHQgaXMgMCIsIHRyZWUuZ2V0SXRlbUhlaWdodCgpID4gMCk7Ci0JbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCWFzc2VydFRydWUoIjpiOiBJdGVtIGhlaWdodCBpcyAwIiwgdHJlZS5nZXRJdGVtSGVpZ2h0KCkgPiAwKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JaW50W10gY2FzZXMgPSB7MCwgMTAsIDEwMH07Ci0JVHJlZUl0ZW0gW11bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbSBbY2FzZXMubGVuZ3RoXVtdOwotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJaXRlbXMgW2pdID0gbmV3IFRyZWVJdGVtIFtjYXNlcyBbal1dOwotCX0KLQlmb3IgKGludCBqID0gMDsgaiA8IGNhc2VzLmxlbmd0aDsgaisrKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXNbal07IGkrKykgewotCQkJVHJlZUl0ZW0gdGkgPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JCQlpdGVtcyBbal1baV0gPSB0aTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoaXRlbXNbal0sIHRyZWUuZ2V0SXRlbXMoKSk7Ci0JCXRyZWUucmVtb3ZlQWxsKCk7Ci0JCWFzc2VydEVxdWFscygwLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCi0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCVRyZWVJdGVtIHRpID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCQkJdGkuc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JCX0KLQkJVHJlZUl0ZW1bXSBpdGVtczIgPSB0cmVlLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMyLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSksIGl0ZW1zMltpXS5nZXRUZXh0KCkpOwotCQl9Ci0JCXRyZWUucmVtb3ZlQWxsKCk7Ci0JCWFzc2VydEVxdWFscygwLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZXNWaXNpYmxlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEhlYWRlclZpc2libGVaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50SXRlbSgpIHsKLQlhc3NlcnROdWxsKHRyZWUuZ2V0UGFyZW50SXRlbSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0JLy8gVGVzdGVkIGluIHNldFNlbGVjdGlvbi4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25Db3VudCgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zW251bWJlci0xXX0pOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygzLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMTUsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXt9KTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQkKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsgLy8gdXNlIHNpbmdsZS1zZWxlY3Rpb24gdHJlZS4KLQkKLQlpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zW251bWJlci0xXX0pOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde30pOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvcEl0ZW0oKSB7Ci0vLyB0ZXN0ZWQgaW4gdGVzdF9zZXRUb3BJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWxsKCkgewotCXRyZWUucmVtb3ZlQWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCi0JaW50IG51bWJlciA9IDIwOwotCVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCX0KLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQotCXRyZWUucmVtb3ZlQWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEFsbCgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0cmVlLnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsgLy8gc2luZ2xlLXNlbGVjdGlvbiB0cmVlCi0JCQotCWl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0cmVlLnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1aKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbnNlcnRNYXJrTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEhlYWRlclZpc2libGVaKCkgewotCWFzc2VydEZhbHNlKHRyZWUuZ2V0SGVhZGVyVmlzaWJsZSgpKTsKLQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlLmdldEhlYWRlclZpc2libGUoKSk7Ci0JdHJlZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRGYWxzZSh0cmVlLmdldEhlYWRlclZpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TGluZXNWaXNpYmxlWigpIHsKLQlpZiAoU3d0SnVuaXQuaXNDYXJib24pIHsKLQkJLy8gY2FyYm9uIGRvZXMgbm90IHN1cHBvcnQgbGluZXMKLQkJdHJlZS5nZXRMaW5lc1Zpc2libGUoKTsKLQkJcmV0dXJuOwotCX0KLQlhc3NlcnRGYWxzZSh0cmVlLmdldExpbmVzVmlzaWJsZSgpKTsKLQl0cmVlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKHRyZWUuZ2V0TGluZXNWaXNpYmxlKCkpOwotCXRyZWUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRGYWxzZSh0cmVlLmdldExpbmVzVmlzaWJsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRSZWRyYXdaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRSZWRyYXdaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSgpIHsKLQlpbnQgbnVtYmVyID0gMjA7Ci0JVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1s1XSwgaXRlbXNbMTZdLCBpdGVtc1sxOV19KTsKLQlhc3NlcnRTYW1lKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1s1XSwgaXRlbXNbMTZdLCBpdGVtc1sxOV19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRTYW1lKGl0ZW1zLCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbih0cmVlLmdldEl0ZW1zKCkpOwotCWFzc2VydFNhbWUodHJlZS5nZXRJdGVtcygpLCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7fSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0cnkgewotCQl0cmVlLnNldFNlbGVjdGlvbigoVHJlZUl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW1zID09IG51bGwiKTsKLQl9IAotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde251bGx9KTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMTBdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbbnVtYmVyLTFdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1tudW1iZXItMV19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMl19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1sxMF0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMl19KTsKLQlhc3NlcnRTYW1lKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbMTBdLCBpdGVtc1tudW1iZXIgLSAxXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1szXSwgaXRlbXNbMl19KTsKLQlhc3NlcnRTYW1lKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1syXSwgaXRlbXNbM119LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1szXSwgaXRlbXNbMl0sIGl0ZW1zWzFdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgVHJlZUl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydFNhbWUobmV3IFRyZWVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzFdLCBpdGVtc1s0XX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1s0XSwgaXRlbXNbMF19KTsKLQlhc3NlcnRTYW1lKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1s0XX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19KTsKLQlhc3NlcnRTYW1lKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzRdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1swXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzNdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1szXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbNF19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMl19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzFdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5yZW1vdmVBbGwoKTsKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7fSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOyAvLyBzaW5nbGUtc2VsZWN0aW9uIHRyZWUKLQkKLQlpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1s1XSwgaXRlbXNbMTZdLCBpdGVtc1sxOV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24odHJlZS5nZXRJdGVtcygpKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHt9KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyeSB7Ci0JCXRyZWUuc2V0U2VsZWN0aW9uKChUcmVlSXRlbVtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbXMgPT0gbnVsbCIpOwotCX0gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1sxMF19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1tudW1iZXItMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zW251bWJlci0xXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1syXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzEwXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzNdLCBpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXXt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1szXSwgaXRlbXNbMl0sIGl0ZW1zWzFdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtde30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1s0XSwgaXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW117fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXXt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtde30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW117fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1swXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzNdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1szXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbNF19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMl19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzFdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5yZW1vdmVBbGwoKTsKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7fSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCkgewotCXRyZWUucmVtb3ZlQWxsKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7CQotCX0KLQlUcmVlSXRlbSB0b3AgPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7CQotCX0KLQl0cmVlLnNldFNpemUoNTAsNTApOwotCXNoZWxsLm9wZW4oKTsKLQl0cmVlLnNldFRvcEl0ZW0odG9wKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsJCi0JfQotCVRyZWVJdGVtIHRvcDIgPSB0cmVlLmdldFRvcEl0ZW0oKTsKLQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHModG9wLCB0b3AyKTsKLQl0cnkgewotCQlzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCQl0cmVlLnNldFRvcEl0ZW0obnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW0gPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfSBmaW5hbGx5IHsKLQkJc2hlbGwuc2V0VmlzaWJsZSAoZmFsc2UpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93Q29sdW1uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCkgewotCXRyeSB7Ci0JCXRyZWUuc2hvd0l0ZW0obnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW0gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JaW50IG51bWJlciA9IDIwOwotCVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCX0KLQlmb3IoaW50IGk9MDsgaTxudW1iZXI7IGkrKykKLQkJdHJlZS5zaG93SXRlbShpdGVtc1tpXSk7Ci0KLQl0cmVlLnJlbW92ZUFsbCgpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCS8vc2hvd2luZyBzb21lYm9keSBlbHNlJ3MgaXRlbXMKLQkKLQlpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JfQotCi0JVHJlZSB0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCAwKTsKLQlUcmVlSXRlbVtdIGl0ZW1zMiA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXMyW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUyLCAwKTsKLQl9OwotCi0JZm9yKGludCBpPTA7IGk8bnVtYmVyOyBpKyspCi0JCXRyZWUuc2hvd0l0ZW0oaXRlbXMyW2ldKTsKLQotCXRyZWUucmVtb3ZlQWxsKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd1NlbGVjdGlvbigpIHsKLQlUcmVlSXRlbSBpdGVtOwotCQotCXRyZWUuc2hvd1NlbGVjdGlvbigpOwotCWl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbX0pOwotCXRyZWUuc2hvd1NlbGVjdGlvbigpOwkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0QWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb2x1bW5Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1ucyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0R3JpZExpbmVXaWR0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVhZGVySGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWFkZXJWaXNpYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZXNWaXNpYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0QWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRIZWFkZXJWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW5zZXJ0TWFya0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExpbmVzVmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFJlZHJhd1oiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvcEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VFeHBhbmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleUV4cGFuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2siKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciIpKSB0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RBbGwiKSkgdGVzdF9kZXNlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1uQ291bnQiKSkgdGVzdF9nZXRDb2x1bW5Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1uSSIpKSB0ZXN0X2dldENvbHVtbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbnMiKSkgdGVzdF9nZXRDb2x1bW5zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRHcmlkTGluZVdpZHRoIikpIHRlc3RfZ2V0R3JpZExpbmVXaWR0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SGVhZGVySGVpZ2h0IikpIHRlc3RfZ2V0SGVhZGVySGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWFkZXJWaXNpYmxlIikpIHRlc3RfZ2V0SGVhZGVyVmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSGVpZ2h0IikpIHRlc3RfZ2V0SXRlbUhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZXNWaXNpYmxlIikpIHRlc3RfZ2V0TGluZXNWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnRJdGVtIikpIHRlc3RfZ2V0UGFyZW50SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpKSB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BJdGVtIikpIHRlc3RfZ2V0VG9wSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQWxsIikpIHRlc3RfcmVtb3ZlQWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3RBbGwiKSkgdGVzdF9zZWxlY3RBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRIZWFkZXJWaXNpYmxlWiIpKSB0ZXN0X3NldEhlYWRlclZpc2libGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbnNlcnRNYXJrTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtWiIpKSB0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1aKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMaW5lc1Zpc2libGVaIikpIHRlc3Rfc2V0TGluZXNWaXNpYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UmVkcmF3WiIpKSB0ZXN0X3NldFJlZHJhd1ooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0iKSkgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb3BJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIikpIHRlc3Rfc2V0VG9wSXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd0NvbHVtbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlQ29sdW1uIikpIHRlc3Rfc2hvd0NvbHVtbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlQ29sdW1uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpKSB0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93U2VsZWN0aW9uIikpIHRlc3Rfc2hvd1NlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZUV4cGFuZCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlRXhwYW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlFeHBhbmQiKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlFeHBhbmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrIikpIHRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2soKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyBUcmVlIHRyZWU7Ci0KLS8qKgotICogQ2xlYW4gdXAgdGhlIGVudmlyb25tZW50IGZvciBhIG5ldyB0ZXN0LgotICogCi0gKiBAcGFyYW0gc2luZ2xlIHRydWUgaWYgdGhlIG5ldyB0cmVlIHNob3VsZCBiZSBhIHNpbmdsZS1zZWxlY3Rpb24gb25lLAotICogb3RoZXJ3aXNlIHVzZSBtdWx0aS1zZWxlY3Rpb24uCi0gKi8KLXByaXZhdGUgdm9pZCBtYWtlQ2xlYW5FbnZpcm9ubWVudChib29sZWFuIHNpbmdsZSkgewotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotCWlmICh0cmVlICE9IG51bGwpIHRyZWUuZGlzcG9zZSgpOwotCXRyZWUgPSBuZXcgVHJlZShzaGVsbCwgc2luZ2xlP1NXVC5TSU5HTEU6U1dULk1VTFRJKTsKLQlzZXRXaWRnZXQodHJlZSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVUcmVlKFZlY3RvciBldmVudHMpIHsKLSAgICBtYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJUcmVlSXRlbSIgKyBpKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKLQkJCVRyZWVJdGVtIHRpID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCXRpLnNldFRleHQoIlRyZWVJdGVtIiArIGkgKyBqKTsKLQkJCWhvb2tFeHBlY3RlZEV2ZW50cyh0aSwgZ2V0VGVzdE5hbWUoKSwgZXZlbnRzKTsKLQkJfQotCQlob29rRXhwZWN0ZWRFdmVudHMoaXRlbSwgZ2V0VGVzdE5hbWUoKSwgZXZlbnRzKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVHJlZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX0RPV04sIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUcmVlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMzAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZUV4cGFuZCgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRyZWUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDExLCAxMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleUV4cGFuZCgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRyZWUoZXZlbnRzKTsKLSAgICBpbnQgY29kZT1TV1QuQVJST1dfUklHSFQ7Ci0gICAgaWYoU3d0SnVuaXQuaXNHVEspCi0gICAgICAgIGNvZGUgPSBTV1QuS0VZUEFEX0FERDsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIGNvZGUsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2sgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVHJlZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyMCwgdHJlZS5nZXRJdGVtSGVpZ2h0KCkqMiwgMSwgMCwgCi0gICAgICAgICAgICAJICAgICBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRE9VQkxFQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24gKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVHJlZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTMsIDEwLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRyZWUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUcmVlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1MCwgMjUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRyZWUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDMwLCAyMCwgNTAsIDMwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRywgZXZlbnRzKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZjBlNTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW4KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbiBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULlNJTkdMRSk7CQkKLQl0cmVlQ29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5VTEwpOwkKLQlzZXRXaWRnZXQodHJlZUNvbHVtbik7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUkoKSB7Ci0JdHJ5IHsKLQkJbmV3IFRyZWVDb2x1bW4obnVsbCwgU1dULk5VTEwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUlJKCkgewotCXRyeSB7Ci0JCW5ldyBUcmVlQ29sdW1uKG51bGwsIFNXVC5OVUxMLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5VTEwsIC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPT0gLTEiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5VTEwsIDIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JdHJ5IHsKLQkJdHJlZUNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsJCQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb25MaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBbGlnbm1lbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEFsaWdubWVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UGFyZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVzaXphYmxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRSZXNpemFibGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRXaWR0aCgpIHsKLQlpbnQgdGVzdFdpZHRoID0gNDI7Ci0JCi0vLwl0cnkgewotLy8JCXRyZWVDb2x1bW4uc2V0V2lkdGgoLTEpOwotLy8JCWFzc2VydFRydWUoIk5vIGV4Y2VwdGlvbiB0aHJvd24iLCBmYWxzZSk7Ci0vLwl9Ci0vLwljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLS8vCQlhc3NlcnRUcnVlKCJXcm9uZyBlcnJvciB0aHJvd246ICIgKyBlLCBlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIkFyZ3VtZW50IG5vdCB2YWxpZCIpKTsKLS8vCX0KLS8vCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotLy8JCWFzc2VydFRydWUoIldyb25nIGVycm9yIHRocm93bjogIiArIGUsIGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiQXJndW1lbnQgbm90IHZhbGlkIikpOwotLy8JfQotCi0JdHJlZUNvbHVtbi5zZXRXaWR0aCgwKTsKLQlhc3NlcnRUcnVlKCI6YTogd2lkdGg9IiArIHRyZWVDb2x1bW4uZ2V0V2lkdGgoKSArICIgc2hvdWxkIGJlPSIgKyAwLCB0cmVlQ29sdW1uLmdldFdpZHRoKCkgPT0gMCk7Ci0KLQl0cmVlQ29sdW1uLnNldFdpZHRoKHRlc3RXaWR0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IHdpZHRoPSIgKyB0cmVlQ29sdW1uLmdldFdpZHRoKCkgKyAiIHNob3VsZCBiZT0iICsgdGVzdFdpZHRoLCB0cmVlQ29sdW1uLmdldFdpZHRoKCkgPT0gdGVzdFdpZHRoKTsKLQotCXRyZWVDb2x1bW4uc2V0V2lkdGgodGVzdFdpZHRoKTsKLQlhc3NlcnRUcnVlKCI6Yzogd2lkdGg9IiArIHRyZWVDb2x1bW4uZ2V0V2lkdGgoKSArICIgc2hvdWxkIGJlPSIgKyB0ZXN0V2lkdGgsIHRyZWVDb2x1bW4uZ2V0V2lkdGgoKSA9PSB0ZXN0V2lkdGgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3BhY2soKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3BhY2sgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge319OwotCi0JdHJlZUNvbHVtbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CQotCXRyZWVDb2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwkJCi0JdHJlZUNvbHVtbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CQotCXRyeSB7Ci0JCXRyZWVDb2x1bW4ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7CQkKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uTGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxpZ25tZW50SSgpIHsKLQlUcmVlQ29sdW1uIGNvbHVtbjI7Ci0JCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdHJlZUNvbHVtbi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuTEVGVCk7Ci0KLQl0cmVlQ29sdW1uLnNldEFsaWdubWVudCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdHJlZUNvbHVtbi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuTEVGVCk7Ci0KLQl0cmVlQ29sdW1uLnNldEFsaWdubWVudChTV1QuUklHSFQpOwotCWFzc2VydFRydWUoCi0JCSI6YzogU2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIHNldCBhbGlnbm1lbnQgb2YgdGhlIGZpcnN0IGNvbHVtbiIsIAotCQl0cmVlQ29sdW1uLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsKLQotCWNvbHVtbjIgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTlVMTCk7Ci0JY29sdW1uMi5zZXRBbGlnbm1lbnQoU1dULlJJR0hUKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBjb2x1bW4yLmdldEFsaWdubWVudCgpID09IFNXVC5SSUdIVCk7Ci0JCi0JY29sdW1uMi5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgY29sdW1uMi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuQ0VOVEVSKTsJCi0KLQljb2x1bW4yLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgY29sdW1uMi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuTEVGVCk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVzaXphYmxlWigpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0cmVlQ29sdW1uLmdldFJlc2l6YWJsZSgpID09IHRydWUpOwotCi0JdHJlZUNvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpiOiIsIHRyZWVDb2x1bW4uZ2V0UmVzaXphYmxlKCkgPT0gZmFsc2UpOwotCi0JdHJlZUNvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpjOiIsIHRyZWVDb2x1bW4uZ2V0UmVzaXphYmxlKCkgPT0gZmFsc2UpOwotCi0JdHJlZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdHJlZUNvbHVtbi5nZXRSZXNpemFibGUoKSA9PSB0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCB0cmVlQ29sdW1uLmdldFRleHQoKSwgIiIpOwotCi0JdHJlZUNvbHVtbi5zZXRUZXh0KCJ0ZXh0Iik7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCB0cmVlQ29sdW1uLmdldFRleHQoKSwgInRleHQiKTsKLQotCXRyeSB7Ci0JCXRyZWVDb2x1bW4uc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sdW1uIGhlYWRlciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRXaWR0aEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFdpZHRoSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBbGlnbm1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UmVzaXphYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXaWR0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFjayIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRBbGlnbm1lbnRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFJlc2l6YWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0V2lkdGhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIikpIHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxpZ25tZW50IikpIHRlc3RfZ2V0QWxpZ25tZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJlc2l6YWJsZSIpKSB0ZXN0X2dldFJlc2l6YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0V2lkdGgiKSkgdGVzdF9nZXRXaWR0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcGFjayIpKSB0ZXN0X3BhY2soKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEFsaWdubWVudEkiKSkgdGVzdF9zZXRBbGlnbm1lbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJlc2l6YWJsZVoiKSkgdGVzdF9zZXRSZXNpemFibGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFdpZHRoSSIpKSB0ZXN0X3NldFdpZHRoSSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUcmVlQ29sdW1uIHRyZWVDb2x1bW47Ci1wcm90ZWN0ZWQgVHJlZSB0cmVlOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0MDZiMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJKCkgewotCXRyeSB7Ci0JCW5ldyBUcmVlSXRlbSgoVHJlZUl0ZW0pbnVsbCwgU1dULk5VTEwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlmb3IgKGludCBpPTA7IGk8MTA7IGkrKykgewotCQluZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwkKLQl9Ci0JYXNzZXJ0RXF1YWxzKDExLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQluZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUsIDUpOwkKLQlhc3NlcnRFcXVhbHMoMTIsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJSSgpIHsKLQl0cnkgewotCQluZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUsIDUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbUkoKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCX0KLQlhc3NlcnRFcXVhbHMoMTAsIHRyZWVJdGVtLmdldEl0ZW1Db3VudCgpKTsKLQluZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OT05FLCA1KTsKLQlhc3NlcnRFcXVhbHMoMSwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1JSSgpIHsKLQl0cnkgewotCQluZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OT05FLCA1KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHt9Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCYWNrZ3JvdW5kSSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbMF07Ci0JUmVjdGFuZ2xlIGJvdW5kczsKLQlSZWN0YW5nbGUgYm91bmRzMjsKLQlTdHJpbmcgc3RyaW5nID0gImhlbGxvIjsKLQkKLQkvLyBubyBjb2x1bW5zCi0gCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygpOwotCWFzc2VydFRydWUoIjoxYToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCQotCXRyZWVJdGVtLnNldFRleHQoc3RyaW5nKTsKLQlHQyBnYyA9IG5ldyBHQyh0cmVlKTsKLQlQb2ludCBleHRlbnQgPSBnYy5zdHJpbmdFeHRlbnQoc3RyaW5nKTsKLQlnYy5kaXNwb3NlKCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gZXh0ZW50LnkgJiYgYm91bmRzLndpZHRoID4gZXh0ZW50LngpOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCXRyZWVJdGVtLnNldEltYWdlKGltYWdlKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoKTsKLQlhc3NlcnRUcnVlKCI6MWM6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPj0gcmVjdC5oZWlnaHQpOwotCWJvdW5kczIgPSB0cmVlSXRlbS5nZXRJbWFnZUJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWQ6IiwgYm91bmRzLnggPj0gYm91bmRzMi54ICsgYm91bmRzMi53aWR0aCk7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OT05FKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygpOwotCWFzc2VydFRydWUoIjoxZToiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygpOwotCWJvdW5kczIgPSB0cmVlSXRlbS5nZXRCb3VuZHMoKTsKLQlhc3NlcnRUcnVlKCI6MWY6IiwgYm91bmRzLnggPiBib3VuZHMyLnggJiYgYm91bmRzLnkgPj0gYm91bmRzMi55ICsgYm91bmRzMi5oZWlnaHQgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKGZhbHNlKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygpOwotCWFzc2VydFRydWUoIjoxZzoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQkKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQlzdWJJdGVtLnNldFRleHQoc3RyaW5nKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygpOwotCWJvdW5kczIgPSB0cmVlSXRlbS5nZXRCb3VuZHMoKTsKLQlhc3NlcnRUcnVlKCI6MWg6IiwgYm91bmRzLnggPiBib3VuZHMyLnggJiYgYm91bmRzLnkgPj0gYm91bmRzMi55ICsgYm91bmRzMi5oZWlnaHQgJiYgYm91bmRzLmhlaWdodCA+IGV4dGVudC55ICYmIGJvdW5kcy53aWR0aCA+IGV4dGVudC54KTsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0Jc3ViSXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCXN1Ykl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFpOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID49IHJlY3QuaGVpZ2h0KTsKLQlib3VuZHMyID0gc3ViSXRlbS5nZXRJbWFnZUJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWo6IiwgYm91bmRzLnggPj0gYm91bmRzMi54ICsgYm91bmRzMi53aWR0aCk7Ci0JCi0JLy8gVE9ETyBubyBjb2x1bW5zIGFuZCBDSEVDSyBzdHlsZQotCS8vIFRPRE8gd2l0aCBjb2x1bW5zCi0JLy8gVE9ETyB3aXRoIGNvbHVtbnMgYW5kIENIRUNLIHN0eWxlCi19Ci12b2lkIHRlc3RfZ2V0Qm91bmRzSUEoKSB7CQotCS8vIG5vIGNvbHVtbnMgLSBwbGFpbiBzdHlsZQotCUltYWdlIGltYWdlID0gaW1hZ2VzWzBdOwotCVJlY3RhbmdsZSBpbWFnZUJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCVN0cmluZyBzdHJpbmcgPSAiaGVsbG8iOwotCUdDIGdjID0gbmV3IEdDKHRyZWUpOwotCVBvaW50IHN0cmluZ0V4dGVudCA9IGdjLnN0cmluZ0V4dGVudChzdHJpbmcpOwotCWdjLmRpc3Bvc2UoKTsKLQkKLQlSZWN0YW5nbGUgYm91bmRzOwotCVJlY3RhbmdsZSBib3VuZHMyOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLSAJYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxYToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwkKLSAJYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjoxYzoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQkvLyB1bmV4cGFuZGVkIGl0ZW0KLQlUcmVlSXRlbSBzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTk9ORSk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFkOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxZToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKGZhbHNlKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWY6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHN0cmluZyk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWc6IiwgYm91bmRzLnggPiBib3VuZHMyLnggJiYgYm91bmRzLnkgPj0gYm91bmRzMi55ICsgYm91bmRzMi5oZWlnaHQgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudC55ICYmIGJvdW5kcy53aWR0aCA+IHN0cmluZ0V4dGVudC54KTsJCi0JCi0JdHJlZUl0ZW0uc2V0VGV4dChzdHJpbmcpOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWg6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQueSAmJiBib3VuZHMud2lkdGggPiBzdHJpbmdFeHRlbnQueCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEJvdW5kcygpOwotCS8vYXNzZXJ0VHJ1ZSgiOjFuZXc6IiwgYm91bmRzLmVxdWFscyhib3VuZHMyKSk7IC8vIFRPRE8gc2hvdWxkIGJvdW5kcyBiZSBlcXVhbD8KLQl0cmVlSXRlbS5zZXRUZXh0KCIiKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxaToiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFqOiIsIGJvdW5kczIud2lkdGggPCBib3VuZHMud2lkdGgpOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQl0cmVlSXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxazoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoID49IGltYWdlQm91bmRzLndpZHRoKTsKLQl0cmVlSXRlbS5zZXRJbWFnZSgoSW1hZ2UpbnVsbCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWw6IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotLy8JYXNzZXJ0VHJ1ZSgiOjFtOiIsIGJvdW5kczIud2lkdGggPiBib3VuZHMud2lkdGgpOyAvLyBvbmNlIGFuIGltYWdlIGlzIGFkZGVkIHRoZSBzcGFjZSBmb3IgaXQgaXMgYWx3YXlzIHRoZXJlCi0gCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQl0cmVlSXRlbS5zZXRUZXh0KHN0cmluZyk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCXRyZWVJdGVtLnNldEltYWdlKGltYWdlKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxbjoiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFvOiIsIGJvdW5kczIud2lkdGggPiBib3VuZHMud2lkdGgpOwotCWFzc2VydFRydWUoIjoxcCIsIGJvdW5kczIud2lkdGggPj0gc3RyaW5nRXh0ZW50LnggKyBpbWFnZUJvdW5kcy53aWR0aCAmJiBib3VuZHMyLmhlaWdodCA+PSBNYXRoLm1heChzdHJpbmdFeHRlbnQueSwgaW1hZ2VCb3VuZHMuaGVpZ2h0KSk7Ci19Ci12b2lkIHRlc3RfZ2V0Qm91bmRzSUIoKSB7Ci0JLy8gbm8gY29sdW1ucyBhbmQgQ0hFQ0sgc3R5bGUKLQlJbWFnZSBpbWFnZSA9IGltYWdlc1swXTsKLQlSZWN0YW5nbGUgaW1hZ2VCb3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlTdHJpbmcgc3RyaW5nID0gImhlbGxvIjsKLQlHQyBnYyA9IG5ldyBHQyh0cmVlKTsKLQlQb2ludCBzdHJpbmdFeHRlbnQgPSBnYy5zdHJpbmdFeHRlbnQoc3RyaW5nKTsKLQlnYy5kaXNwb3NlKCk7Ci0JCi0JUmVjdGFuZ2xlIGJvdW5kczsKLQlSZWN0YW5nbGUgYm91bmRzMjsKLQkKLQlUcmVlIHRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JVHJlZUl0ZW0gdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTk9ORSk7Ci0JCi0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MmE6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKC0xKTsKLQlhc3NlcnRUcnVlKCI6MmI6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7CQotIAlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjoyYzoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQkvLyB1bmV4cGFuZGVkIGl0ZW0KLQlUcmVlSXRlbSBzdWJJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlSXRlbTIsIFNXVC5OT05FKTsKLQlib3VuZHMgPSBzdWJJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJkOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCXRyZWVJdGVtMi5zZXRFeHBhbmRlZCh0cnVlKTsKLQlib3VuZHMgPSBzdWJJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJlOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JdHJlZUl0ZW0yLnNldEV4cGFuZGVkKGZhbHNlKTsKLQlib3VuZHMgPSBzdWJJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJmOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCXRyZWVJdGVtMi5zZXRFeHBhbmRlZCh0cnVlKTsKLQlzdWJJdGVtMi5zZXRUZXh0KHN0cmluZyk7Ci0JYm91bmRzID0gc3ViSXRlbTIuZ2V0Qm91bmRzKDApOwotCWJvdW5kczIgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyZzoiLCBib3VuZHMueCA+IGJvdW5kczIueCAmJiBib3VuZHMueSA+PSBib3VuZHMyLnkgKyBib3VuZHMyLmhlaWdodCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50LnkgJiYgYm91bmRzLndpZHRoID4gc3RyaW5nRXh0ZW50LngpOwkKLQotCXRyZWVJdGVtMi5zZXRUZXh0KHN0cmluZyk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6Mmg6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQueSAmJiBib3VuZHMud2lkdGggPiBzdHJpbmdFeHRlbnQueCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoKTsKLQkvL2Fzc2VydFRydWUoIjoybmV3OiIsIGJvdW5kcy5lcXVhbHMoYm91bmRzMikpOyAvLyBUT0RPIHNob3VsZCBib3VuZHMgYmUgZXF1YWw/Ci0JdHJlZUl0ZW0yLnNldFRleHQoIiIpOwotCWJvdW5kczIgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyaToiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJqOiIsIGJvdW5kczIud2lkdGggPCBib3VuZHMud2lkdGgpOwotCQotCXRyZWUyLmRpc3Bvc2UoKTsKLQl0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5PTkUpOwotCQotCXRyZWVJdGVtMi5zZXRJbWFnZShpbWFnZSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6Mms6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCA+PSBpbWFnZUJvdW5kcy53aWR0aCk7Ci0JdHJlZUl0ZW0yLnNldEltYWdlKChJbWFnZSludWxsKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6Mmw6IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotCS8vYXNzZXJ0VHJ1ZSgiOjJtOiIsIGJvdW5kczIud2lkdGggPCBib3VuZHMud2lkdGgpOyAgLy8gb25jZSBhbiBpbWFnZSBpcyBhZGRlZCB0aGUgc3BhY2UgZm9yIGl0IGlzIGFsd2F5cyB0aGVyZQotCQotCXRyZWUyLmRpc3Bvc2UoKTsKLQl0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5PTkUpOwotCQotCXRyZWVJdGVtMi5zZXRUZXh0KHN0cmluZyk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQl0cmVlSXRlbTIuc2V0SW1hZ2UoaW1hZ2UpOwotCWJvdW5kczIgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoybjoiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJvOiIsIGJvdW5kczIud2lkdGggPiBib3VuZHMud2lkdGgpOwotCWFzc2VydFRydWUoIjoxcCIsIGJvdW5kczIud2lkdGggPj0gc3RyaW5nRXh0ZW50LnggKyBpbWFnZUJvdW5kcy53aWR0aCAmJiBib3VuZHMyLmhlaWdodCA+PSBNYXRoLm1heChzdHJpbmdFeHRlbnQueSwgaW1hZ2VCb3VuZHMuaGVpZ2h0KSk7Ci19Ci12b2lkIHRlc3RfZ2V0Qm91bmRzSUMoKSB7Ci0JLy8gd2l0aCBjb2x1bW5zCi0JCi0JSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbMF07Ci0JUmVjdGFuZ2xlIGltYWdlQm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JU3RyaW5nIHN0cmluZzEgPSAiaGVsbG8iOwotCVN0cmluZyBzdHJpbmcyID0gIndvcmxkIjsKLQlHQyBnYyA9IG5ldyBHQyh0cmVlKTsKLQlQb2ludCBzdHJpbmdFeHRlbnQxID0gZ2Muc3RyaW5nRXh0ZW50KHN0cmluZzEpOwotCS8vUG9pbnQgc3RyaW5nRXh0ZW50MiA9IGdjLnN0cmluZ0V4dGVudChzdHJpbmcyKTsKLQlnYy5kaXNwb3NlKCk7Ci0JCi0JUmVjdGFuZ2xlIGJvdW5kczsKLQlSZWN0YW5nbGUgYm91bmRzMjsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0KLQlUcmVlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkNFTlRFUik7Ci0JCi0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozYToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M2I6IiwgLypib3VuZHMueCA+IDAgJiYqLyBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMCk7IC8vIFRPRE8gYm91bmRzLnggPT0gMCBJcyB0aGlzIHJpZ2h0PwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNjOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwkKLSAJYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDIpOwotCWFzc2VydFRydWUoIjozZDoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQkvLyB1bmV4cGFuZGVkIGl0ZW0KLQlUcmVlSXRlbSBzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTk9ORSk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNlOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozZjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKGZhbHNlKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2c6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7c3RyaW5nMSwgc3RyaW5nMn0pOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKDApOwotCWJvdW5kczIgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNoOiIsIGJvdW5kcy54ID4gYm91bmRzMi54ICYmIGJvdW5kcy55ID49IGJvdW5kczIueSArIGJvdW5kczIuaGVpZ2h0ICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoID09IDApOwkKLQotCWNvbHVtbjAuc2V0V2lkdGgoMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNpOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozajoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKDApOwotCWJvdW5kczIgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNrOiIsIGJvdW5kcy54ID4gYm91bmRzMi54ICYmIGJvdW5kcy55ID49IGJvdW5kczIueSArIGJvdW5kczIuaGVpZ2h0ICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwkKLQotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNsOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozbToiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDIwMCk7Ci0JCi0JdHJlZUl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10ge3N0cmluZzEsIHN0cmluZzJ9KTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNuOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNvOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQl0cmVlSXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7IiIsICIifSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozcDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozcToiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCWNvbHVtbjAgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5DRU5URVIpOwotCWNvbHVtbjAuc2V0V2lkdGgoMTAwKTsKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JCi0JdHJlZUl0ZW0uc2V0SW1hZ2UobmV3IEltYWdlW10ge2ltYWdlLCBpbWFnZX0pOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M3I6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNzOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID49IGltYWdlQm91bmRzLmhlaWdodCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0gCXRyZWVJdGVtLnNldEltYWdlKG5ldyBJbWFnZVtdIHtudWxsLCBudWxsfSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozdDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M3U6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQljb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkNFTlRFUik7Ci0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQkKLQl0cmVlSXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7c3RyaW5nMSwgc3RyaW5nMn0pOwotCXRyZWVJdGVtLnNldEltYWdlKG5ldyBJbWFnZVtdIHtpbWFnZSwgaW1hZ2V9KTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjN2OiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjN3OiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JdHJlZUl0ZW0uc2V0VGV4dChzdHJpbmcxKTsKLQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5SSUdIVCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozeDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggID09IDApOwotfQotCi12b2lkIHRlc3RfZ2V0Qm91bmRzSUQoKSB7Ci0JLy8gd2l0aCBjb2x1bW5zIGFuZCBDSEVDSyBzdHlsZQotCUltYWdlIGltYWdlID0gaW1hZ2VzWzBdOwotCVJlY3RhbmdsZSBpbWFnZUJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCVN0cmluZyBzdHJpbmcxID0gImhlbGxvIjsKLQlTdHJpbmcgc3RyaW5nMiA9ICJ3b3JsZCI7Ci0JR0MgZ2MgPSBuZXcgR0ModHJlZSk7Ci0JUG9pbnQgc3RyaW5nRXh0ZW50MSA9IGdjLnN0cmluZ0V4dGVudChzdHJpbmcxKTsKLQkvL1BvaW50IHN0cmluZ0V4dGVudDIgPSBnYy5zdHJpbmdFeHRlbnQoc3RyaW5nMik7Ci0JZ2MuZGlzcG9zZSgpOwotCQotCVJlY3RhbmdsZSBib3VuZHM7Ci0JUmVjdGFuZ2xlIGJvdW5kczI7Ci0JCi0JVHJlZSB0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCVRyZWVJdGVtIHRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5PTkUpOwotCVRyZWVDb2x1bW4gY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUyLCBTV1QuTEVGVCk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZTIsIFNXVC5DRU5URVIpOwotCQotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NGI6IiwgLypib3VuZHMueCA+IDAgJiYqLyBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMCk7IC8vIFRPRE8gYm91bmRzLnggPT0gMCBJcyB0aGlzIHJpZ2h0PwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoLTEpOwotCWFzc2VydFRydWUoIjo0YzoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsJCi0gCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRkOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCS8vIHVuZXhwYW5kZWQgaXRlbQotCVRyZWVJdGVtIHN1Ykl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtMiwgU1dULk5PTkUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGU6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JdHJlZUl0ZW0yLnNldEV4cGFuZGVkKHRydWUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGY6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwKTsKLQl0cmVlSXRlbTIuc2V0RXhwYW5kZWQoZmFsc2UpOwotCWJvdW5kcyA9IHN1Ykl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGc6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JdHJlZUl0ZW0yLnNldEV4cGFuZGVkKHRydWUpOwotCXN1Ykl0ZW0yLnNldFRleHQobmV3IFN0cmluZ1tdIHtzdHJpbmcxLCBzdHJpbmcyfSk7Ci0JYm91bmRzID0gc3ViSXRlbTIuZ2V0Qm91bmRzKDApOwotCWJvdW5kczIgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0aDoiLCBib3VuZHMueCA+IGJvdW5kczIueCAmJiBib3VuZHMueSA+PSBib3VuZHMyLnkgKyBib3VuZHMyLmhlaWdodCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCA9PSAwKTsJCi0JCi0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRpOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NGo6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsKLQlib3VuZHMgPSBzdWJJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRrOiIsIGJvdW5kcy54ID4gYm91bmRzMi54ICYmIGJvdW5kcy55ID49IGJvdW5kczIueSArIGJvdW5kczIuaGVpZ2h0ICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwkKLQotCQotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0bDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRtOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMjAwKTsKLQkKLQl0cmVlSXRlbTIuc2V0VGV4dChuZXcgU3RyaW5nW10ge3N0cmluZzEsIHN0cmluZzJ9KTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0bjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NG86IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCXRyZWVJdGVtMi5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7IiIsICIifSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NHA6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRxOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCXRyZWUyLmRpc3Bvc2UoKTsKLQl0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5PTkUpOwotCWNvbHVtbjAgPSBuZXcgVHJlZUNvbHVtbih0cmVlMiwgU1dULkxFRlQpOwotCWNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlMiwgU1dULkNFTlRFUik7Ci0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQkKLQl0cmVlSXRlbTIuc2V0SW1hZ2UobmV3IEltYWdlW10ge2ltYWdlLCBpbWFnZX0pOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRyOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID49IGltYWdlQm91bmRzLmhlaWdodCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NHM6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLSAJdHJlZUl0ZW0yLnNldEltYWdlKG5ldyBJbWFnZVtdIHtudWxsLCBudWxsfSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NHQ6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjo0dToiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCQotCS8vCi0JdHJlZTIuZGlzcG9zZSgpOwotCXRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTk9ORSk7Ci0JY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUyLCBTV1QuTEVGVCk7Ci0JY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUyLCBTV1QuQ0VOVEVSKTsKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQotCXRyZWVJdGVtMi5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7c3RyaW5nMSwgc3RyaW5nMn0pOwotCXRyZWVJdGVtMi5zZXRJbWFnZShuZXcgSW1hZ2VbXSB7aW1hZ2UsIGltYWdlfSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NHY6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjR3OiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCXRyZWUyLmRpc3Bvc2UoKTsKLQl0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5PTkUpOwotCQotCXRyZWVJdGVtMi5zZXRUZXh0KHN0cmluZzEpOwotCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZTIsIFNXVC5SSUdIVCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NHg6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoICA9PSAwKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzSSgpIHsKLQl0ZXN0X2dldEJvdW5kc0lBKCk7Ci0JdGVzdF9nZXRCb3VuZHNJQigpOwotCXRlc3RfZ2V0Qm91bmRzSUMoKTsKLQl0ZXN0X2dldEJvdW5kc0lEKCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2dldENoZWNrZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Q2hlY2tlZFoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFeHBhbmRlZCgpIHsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRyZWVJdGVtLmdldEV4cGFuZGVkKCkpOwotCS8vIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHN1Yml0ZW0gYmVmb3JlIHlvdSBjYW4gc2V0IHRoZSB0cmVlaXRlbSBleHBhbmRlZAotCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgMCk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlSXRlbS5nZXRFeHBhbmRlZCgpKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0cmVlSXRlbS5nZXRFeHBhbmRlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250SSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb250SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvcmVncm91bmQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb3JlZ3JvdW5kSSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb3JlZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRHcmF5ZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0R3JheWVkWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlQm91bmRzSSgpIHsKLS8qKgotICogVGVzdCB3aXRob3V0IGl0ZW0gaW1hZ2UKLSAqLwotCVJlY3RhbmdsZSBib3VuZHM7Ci0JVHJlZSB0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCVRyZWVJdGVtIHRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5VTEwpOwotCQotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0cmVlSXRlbS5nZXRJbWFnZUJvdW5kcygtMSkpOwotCQotCS8vIFRPRE8gLSBzaG91bGQgdGhpcyB3aWR0aCBiZSAwIG9yIGEgdmFsdWU/Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0SW1hZ2VCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgYm91bmRzLndpZHRoID09IDApOwotCQotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0cmVlSXRlbS5nZXRJbWFnZUJvdW5kcygxKSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRyZWVJdGVtMi5nZXRJbWFnZUJvdW5kcygtMSkpOwotCQotCS8vIFRPRE8gLSBzaG91bGQgdGhpcyB3aWR0aCBiZSAwIG9yIGEgdmFsdWU/Ci0JLy9ib3VuZHMgPSB0cmVlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMCk7Ci0JLy9hc3NlcnRUcnVlKCI6ZToiLCBib3VuZHMud2lkdGggPT0gMCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRyZWVJdGVtMi5nZXRJbWFnZUJvdW5kcygxKSk7Ci0gCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQlJbWFnZSBpbWFnZSA9IGltYWdlc1swXTsJCi0JaW50IGltYWdlV2lkdGggPSBpbWFnZS5nZXRCb3VuZHMoKS53aWR0aDsKLQlpbnQgaW1hZ2VIZWlnaHQ7Ci0JCi0JdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2UpOwotCWltYWdlSGVpZ2h0ID0gdHJlZS5nZXRJdGVtSGVpZ2h0KCkgLSB0cmVlLmdldEdyaWRMaW5lV2lkdGgoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdHJlZUl0ZW0uZ2V0SW1hZ2VCb3VuZHMoLTEpKTsKLQkKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRJbWFnZUJvdW5kcygwKTsKLS8vCWFzc2VydFRydWUoIjpiOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMud2lkdGggPT0gaW1hZ2VXaWR0aCAmJiBib3VuZHMuaGVpZ2h0ID09IGltYWdlSGVpZ2h0KTsJCi0vLyAJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRyZWVJdGVtLmdldEltYWdlQm91bmRzKDEpKTsJCi0KLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsJCi0JCi0JdHJlZTIuZGlzcG9zZSgpOwotCXRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdHJlZUl0ZW0yLmRpc3Bvc2UoKTsKLQl0cmVlSXRlbTIgPSBuZXcgVHJlZUl0ZW0odHJlZTIsIFNXVC5OVUxMKTsKLQlSZWN0YW5nbGUgaW1hZ2VCb3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlpbWFnZVdpZHRoID0gaW1hZ2VCb3VuZHMud2lkdGg7IAl0cmVlSXRlbTIuc2V0SW1hZ2UoMCwgaW1hZ2UpOwotCWltYWdlSGVpZ2h0ID0gdHJlZTIuZ2V0SXRlbUhlaWdodCgpIC0gdHJlZTIuZ2V0R3JpZExpbmVXaWR0aCgpOwotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0cmVlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoLTEpKTsKLQkKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMCk7CS8vIGJvdW5kcy53aWR0aCBzaG91bGQgYmUgY2hlY2sgYm94IHdpZHRoIGlmIHRoZXkgYXJlIHdpZGVyIHRoYW4gaW1hZ2UKLS8vCWFzc2VydFRydWUoIjpiOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy5oZWlnaHQgPT0gaW1hZ2VIZWlnaHQpOwotLy8gCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0cmVlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMSkpOwkKLQotCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCi0JdHJlZTIuZGlzcG9zZSgpOwotCXRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdHJlZUl0ZW0yLmRpc3Bvc2UoKTsKLQl0cmVlSXRlbTIgPSBuZXcgVHJlZUl0ZW0odHJlZTIsIFNXVC5OVUxMKTsKLQlpbWFnZSA9IGltYWdlc1sxXTsKLQlpbWFnZUJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCWltYWdlV2lkdGggPSBpbWFnZUJvdW5kcy53aWR0aDsKLSAJdHJlZUl0ZW0yLnNldEltYWdlKDAsIGltYWdlKTsKLQlpbWFnZUhlaWdodCA9IHRyZWUyLmdldEl0ZW1IZWlnaHQoKSAtIHRyZWUyLmdldEdyaWRMaW5lV2lkdGgoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdHJlZUl0ZW0yLmdldEltYWdlQm91bmRzKC0xKSk7Ci0gCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRJbWFnZUJvdW5kcygwKTsJLy8gYm91bmRzLndpZHRoIHNob3VsZCBiZSBjaGVjayBib3ggd2lkdGggaWYgY2hlY2sgYm94IGlzIHdpZGVyIHRoYW4gaW1hZ2UKLS8vCWFzc2VydFRydWUoIjpiOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy5oZWlnaHQgPT0gaW1hZ2VIZWlnaHQpOwotIAlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdHJlZUl0ZW0yLmdldEltYWdlQm91bmRzKDEpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZUkoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKGksIHRyZWVJdGVtLmdldEl0ZW1Db3VudCgpKTsKLQkJbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCAwKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiYjogIiwgdHJlZUl0ZW0uZ2V0SXRlbUNvdW50KCkgPT0gMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCWludFtdIGNhc2VzID0gezAsIDEwLCAxMDB9OwotCVRyZWVJdGVtIFtdW10gaXRlbXMgPSBuZXcgVHJlZUl0ZW0gW2Nhc2VzLmxlbmd0aF1bXTsKLQlmb3IgKGludCBqID0gMDsgaiA8IGNhc2VzLmxlbmd0aDsgaisrKSB7Ci0JCWl0ZW1zIFtqXSA9IG5ldyBUcmVlSXRlbSBbY2FzZXMgW2pdXTsKLQl9Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCVRyZWVJdGVtIHRpID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCAwKTsKLQkJCWl0ZW1zIFtqXVtpXSA9IHRpOwotCQl9Ci0JCWFzc2VydEVxdWFscyhpdGVtc1tqXSwgdHJlZUl0ZW0uZ2V0SXRlbXMoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXNbal07IGkrKykgewotCQkJaXRlbXMgW2pdW2ldLmRpc3Bvc2UoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0SXRlbUNvdW50KCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKHRyZWUsIHRyZWVJdGVtLmdldFBhcmVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnRJdGVtKCkgewotCVRyZWVJdGVtIHRJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTlVMTCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWVJdGVtLCB0SXRlbS5nZXRQYXJlbnRJdGVtKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRJKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRleHRJTEphdmFfbGFuZ19TdHJpbmcKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gdHJlZUl0ZW0uZ2V0RGlzcGxheSgpOwotCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCQotCS8vIG5vIGNvbHVtbnMKLQlhc3NlcnRFcXVhbHModHJlZS5nZXRCYWNrZ3JvdW5kKCksIHRyZWVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCWFzc2VydEVxdWFscyh0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKCksIHRyZWVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCXRyZWVJdGVtLnNldEJhY2tncm91bmQoMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRyZWVJdGVtLnNldEJhY2tncm91bmQoMTAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWVJdGVtLmdldEJhY2tncm91bmQoKSwgdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgxMCkpOwotCQotCS8vIHdpdGggY29sdW1ucwotCVRyZWVDb2x1bW4gY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKDEwLCByZWQpOwotCWFzc2VydEVxdWFscyh0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKCksIHRyZWVJdGVtLmdldEJhY2tncm91bmQoMTApKTsKLQkKLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHJlZCwgdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JdHJlZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHModHJlZS5nZXRCYWNrZ3JvdW5kKCksdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0KLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIGJsdWUpOwotCXRyZWVJdGVtLnNldEJhY2tncm91bmQocmVkKTsKLQlhc3NlcnRFcXVhbHMoYmx1ZSwgdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQkKLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCWFzc2VydEVxdWFscyh0cmVlLmdldEJhY2tncm91bmQoKSx0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQkKLQl0cnkgeyAKLQkJQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAwLCAwKTsKLQkJY29sb3IuZGlzcG9zZSgpOwotCQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgZGlzcG9zZWQiKTsJCQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKHRyZWVJdGVtLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlhc3NlcnRFcXVhbHMoY29sb3IsIHRyZWVJdGVtLmdldEJhY2tncm91bmQoKSk7Ci0JdHJlZUl0ZW0uc2V0QmFja2dyb3VuZChudWxsKTsKLQlhc3NlcnRFcXVhbHModHJlZS5nZXRCYWNrZ3JvdW5kKCksdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JdHJ5IHsgCi0JCXRyZWVJdGVtLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDaGVja2VkWigpIHsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRyZWVJdGVtLmdldENoZWNrZWQoKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0Q2hlY2tlZCh0cnVlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRyZWVJdGVtLmdldENoZWNrZWQoKSk7Ci0KLQlUcmVlIHQgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQlUcmVlSXRlbSB0aSA9IG5ldyBUcmVlSXRlbSh0LCBTV1QuTlVMTCk7Ci0JdGkuc2V0Q2hlY2tlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHRpLmdldENoZWNrZWQoKSk7Ci0JCi0JdGkuc2V0Q2hlY2tlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aS5nZXRDaGVja2VkKCkpOwotCXQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEV4cGFuZGVkWigpIHsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRyZWVJdGVtLmdldEV4cGFuZGVkKCkpOwotCQotCS8vIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHN1Yml0ZW0gYmVmb3JlIHlvdSBjYW4gc2V0IHRoZSB0cmVlaXRlbSBleHBhbmRlZAotCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKSk7Ci0KLQotCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5VTEwpOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCWFzc2VydFRydWUodHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKSk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKSk7Ci0JCQotCVRyZWVJdGVtIHRpID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTlVMTCk7Ci0JdGkuc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdGkuZ2V0RXhwYW5kZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlGb250IGZvbnQgPSB0cmVlSXRlbS5nZXRGb250KCk7Ci0JdHJlZUl0ZW0uc2V0Rm9udChmb250KTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoKSkpOwotCQotCWZvbnQgPSBuZXcgRm9udCh0cmVlSXRlbS5nZXREaXNwbGF5KCksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCXRyZWVJdGVtLnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyh0cmVlSXRlbS5nZXRGb250KCkpKTsKLQotCXRyZWVJdGVtLnNldEZvbnQobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlLmdldEZvbnQoKS5lcXVhbHMoIHRyZWVJdGVtLmdldEZvbnQoKSkpOwotCQotCWZvbnQuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRyZWVJdGVtLnNldEZvbnQoZm9udCk7Ci0JCXRyZWVJdGVtLnNldEZvbnQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGZvbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSB0cmVlSXRlbS5nZXREaXNwbGF5KCk7Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JCi0JLy8gbm8gY29sdW1ucwotCWFzc2VydFRydWUodHJlZS5nZXRGb250KCkuZXF1YWxzKCB0cmVlSXRlbS5nZXRGb250KDApKSk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlSXRlbS5nZXRGb250KCkuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoMCkpKTsKLQl0cmVlSXRlbS5zZXRGb250KDAsIGZvbnQpOwotCWFzc2VydFRydWUoZm9udC5lcXVhbHModHJlZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdHJlZUl0ZW0uc2V0Rm9udCgxMCwgZm9udCk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlSXRlbS5nZXRGb250KCkuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoMTApKSk7Ci0JCi0JLy8gd2l0aCBjb2x1bW5zCi0JVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCVRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRyZWVJdGVtLnNldEZvbnQoMTAsIGZvbnQpOwotCWFzc2VydFRydWUodHJlZUl0ZW0uZ2V0Rm9udCgpLmVxdWFscyh0cmVlSXRlbS5nZXRGb250KDEwKSkpOwotCQotCXRyZWVJdGVtLnNldEZvbnQoMCwgZm9udCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyh0cmVlSXRlbS5nZXRGb250KDApKSk7Ci0JdHJlZUl0ZW0uc2V0Rm9udCgwLCBudWxsKTsKLQlhc3NlcnRUcnVlKHRyZWUuZ2V0Rm9udCgpLmVxdWFscyh0cmVlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JRm9udCBmb250MiA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMjAsIFNXVC5OT1JNQUwpOwotCQotCXRyZWVJdGVtLnNldEZvbnQoMCwgZm9udCk7Ci0JdHJlZUl0ZW0uc2V0Rm9udChmb250Mik7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyh0cmVlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0Rm9udCgwLCBudWxsKTsKLQlhc3NlcnRUcnVlKGZvbnQyLmVxdWFscyh0cmVlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0Rm9udChudWxsKTsKLQlhc3NlcnRUcnVlKHRyZWUuZ2V0Rm9udCgpLmVxdWFscyh0cmVlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JZm9udC5kaXNwb3NlKCk7Ci0JZm9udDIuZGlzcG9zZSgpOwotCQotCXRyeSB7Ci0JCXRyZWVJdGVtLnNldEZvbnQoMCwgZm9udCk7Ci0JCXRyZWVJdGVtLnNldEZvbnQoMCwgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGZvbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb3JlZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gdHJlZUl0ZW0uZ2V0RGlzcGxheSgpOwotCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCQotCS8vIG5vIGNvbHVtbnMKLQlhc3NlcnRFcXVhbHModHJlZS5nZXRGb3JlZ3JvdW5kKCksIHRyZWVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCWFzc2VydEVxdWFscyh0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKCksIHRyZWVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCXRyZWVJdGVtLnNldEZvcmVncm91bmQoMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRyZWVJdGVtLnNldEZvcmVncm91bmQoMTAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWVJdGVtLmdldEZvcmVncm91bmQoKSwgdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgxMCkpOwotCQotCS8vIHdpdGggY29sdW1ucwotCVRyZWVDb2x1bW4gY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKDEwLCByZWQpOwotCWFzc2VydEVxdWFscyh0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKCksIHRyZWVJdGVtLmdldEZvcmVncm91bmQoMTApKTsKLQkKLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKDAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHJlZCwgdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHModHJlZS5nZXRGb3JlZ3JvdW5kKCksdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0KLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKDAsIGJsdWUpOwotCXRyZWVJdGVtLnNldEZvcmVncm91bmQocmVkKTsKLQlhc3NlcnRFcXVhbHMoYmx1ZSwgdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQkKLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKG51bGwpOwotCWFzc2VydEVxdWFscyh0cmVlLmdldEZvcmVncm91bmQoKSx0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQkKLQl0cnkgeyAKLQkJQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAwLCAwKTsKLQkJY29sb3IuZGlzcG9zZSgpOwotCQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgZGlzcG9zZWQiKTsJCQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKHRyZWVJdGVtLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQlhc3NlcnRFcXVhbHMoY29sb3IsIHRyZWVJdGVtLmdldEZvcmVncm91bmQoKSk7Ci0JdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZChudWxsKTsKLQlhc3NlcnRFcXVhbHModHJlZS5nZXRGb3JlZ3JvdW5kKCksdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JdHJ5IHsgCi0JCXRyZWVJdGVtLnNldEZvcmVncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEdyYXllZFooKSB7Ci0JVHJlZSBuZXdUcmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JVHJlZUl0ZW0gdEl0ZW0gPSBuZXcgVHJlZUl0ZW0obmV3VHJlZSwwKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRJdGVtLmdldEdyYXllZCgpKTsKLQl0SXRlbS5zZXRHcmF5ZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0SXRlbS5nZXRHcmF5ZWQoKSk7Ci0JdEl0ZW0uc2V0R3JheWVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRJdGVtLmdldEdyYXllZCgpKTsKLQluZXdUcmVlLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCWFzc2VydE51bGwodHJlZUl0ZW0uZ2V0SW1hZ2UoMSkpOwkKLSAJdHJlZUl0ZW0uc2V0SW1hZ2UoLTEsIG51bGwpOwkJCi0JYXNzZXJ0TnVsbCh0cmVlSXRlbS5nZXRJbWFnZSgtMSkpOwkKLQkJCi0JdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzBdLCB0cmVlSXRlbS5nZXRJbWFnZSgwKSk7CQotIAlTdHJpbmcgdGV4dHNbXSA9IG5ldyBTdHJpbmdbaW1hZ2VzLmxlbmd0aF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0cy5sZW5ndGg7IGkrKykgewotCQl0ZXh0c1tpXSA9IFN0cmluZy52YWx1ZU9mKGkpOwotCX0KLQkKLQkvL3RyZWUuc2V0VGV4dCh0ZXh0cyk7CQkJCS8vIGNyZWF0ZSBlbm91Z2ggY29sdW1ucyBmb3IgVHJlZUl0ZW0uc2V0SW1hZ2UoSW1hZ2VbXSkgdG8gd29yawotCWludCBjb2x1bW5Db3VudCA9IHRyZWUuZ2V0Q29sdW1uQ291bnQoKTsKLQlpZiAoY29sdW1uQ291bnQgPCB0ZXh0cy5sZW5ndGgpIHsKLQkJZm9yIChpbnQgaSA9IGNvbHVtbkNvdW50OyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspewotCQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JCX0KLQl9Ci0JVHJlZUNvbHVtbltdIGNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbHVtbnNbaV0uc2V0VGV4dCh0ZXh0c1tpXSk7Ci0JfQotCXRyZWVJdGVtLnNldEltYWdlKDEsIGltYWdlc1sxXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1sxXSwgdHJlZUl0ZW0uZ2V0SW1hZ2UoMSkpOwkKLSAJdHJlZUl0ZW0uc2V0SW1hZ2UoaW1hZ2VzKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoaW1hZ2VzW2ldLCB0cmVlSXRlbS5nZXRJbWFnZShpKSk7Ci0JfQotCXRyeSB7Ci0JCXRyZWVJdGVtLnNldEltYWdlKChJbWFnZSBbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGltYWdlcyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCS8vIG5vIGNvbHVtbnMKLQlhc3NlcnRFcXVhbHMobnVsbCwgdHJlZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCXRyZWVJdGVtLnNldEltYWdlKDAsIGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1swXSwgdHJlZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdHJlZUl0ZW0uc2V0SW1hZ2UoMTAsIGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKG51bGwsIHRyZWVJdGVtLmdldEltYWdlKDEwKSk7Ci0JCi0JLy8gd2l0aCBjb2x1bW5zCi0JVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCVRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRyZWVJdGVtLnNldEltYWdlKDEwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhudWxsLCB0cmVlSXRlbS5nZXRJbWFnZSgxMCkpOwotCQotCXRyZWVJdGVtLnNldEltYWdlKDAsIGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1swXSwgdHJlZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCXRyZWVJdGVtLnNldEltYWdlKDAsIG51bGwpOwotCWFzc2VydEVxdWFscyhudWxsLCB0cmVlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQl0cmVlSXRlbS5zZXRJbWFnZShpbWFnZXNbMV0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMV0sIHRyZWVJdGVtLmdldEltYWdlKDApKTsKLQkKLQl0cmVlSXRlbS5zZXRJbWFnZShpbWFnZXNbMV0pOwotCXRyZWVJdGVtLnNldEltYWdlKDAsIGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1swXSwgdHJlZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCQotCWltYWdlc1swXS5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQkJdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGZvbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0JExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWZpbmFsIFN0cmluZyBUZXN0U3RyaW5nID0gInRlc3QiOwotCWZpbmFsIFN0cmluZyBUZXN0U3RyaW5nc1tdID0gbmV3IFN0cmluZ1tdIHtUZXN0U3RyaW5nLCBUZXN0U3RyaW5nICsgIjEiLCBUZXN0U3RyaW5nICsgIjIifTsKLQkKLQl0cnkgewotCQl0cmVlSXRlbS5zZXRUZXh0KChTdHJpbmcgW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmdzID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotICAgLyoKLSAJKiBUZXN0IHRoZSBnZXRUZXh0L3NldFRleHQgQVBJIHdpdGggYSBUcmVlIHRoYXQgaGFzIG9ubHkgCi0gCSogdGhlIGRlZmF1bHQgY29sdW1uLgotIAkqLwotCQotCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KDEpLmxlbmd0aCgpKTsKLQkKLQl0cmVlSXRlbS5zZXRUZXh0KFRlc3RTdHJpbmdzKTsKLQlhc3NlcnRFcXVhbHMoVGVzdFN0cmluZ3NbMF0sIHRyZWVJdGVtLmdldFRleHQoMCkpOwotCWZvciAoaW50IGkgPSAxOyBpIDwgVGVzdFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRyZWVJdGVtLmdldFRleHQoaSkubGVuZ3RoKCkpOwotCX0KLQkKLQkKLSAgIC8qCi0gCSogVGVzdCB0aGUgZ2V0VGV4dC9zZXRUZXh0IEFQSSB3aXRoIGEgVHJlZSB0aGF0IGVub3VnaCAKLSAJKiBjb2x1bW5zIHRvIGZpdCBhbGwgdGVzdCBpdGVtIHRleHRzLgotIAkqLwotIAkJCi0JaW50IGNvbHVtbkNvdW50ID0gdHJlZS5nZXRDb2x1bW5Db3VudCgpOwotCWlmIChjb2x1bW5Db3VudCA8IGltYWdlcy5sZW5ndGgpIHsKLQkJZm9yIChpbnQgaSA9IGNvbHVtbkNvdW50OyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKXsKLQkJCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCQl9Ci0JfQotCVRyZWVDb2x1bW5bXSBjb2x1bW5zID0gdHJlZS5nZXRDb2x1bW5zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBUZXN0U3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQljb2x1bW5zW2ldLnNldFRleHQoVGVzdFN0cmluZ3NbaV0pOwotCX0KLQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0VGV4dCgxKS5sZW5ndGgoKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nKCl7Ci0JZmluYWwgU3RyaW5nIFRlc3RTdHJpbmcgPSAidGVzdCI7Ci0JZmluYWwgU3RyaW5nIFRlc3RTdHJpbmdzW10gPSBuZXcgU3RyaW5nW10ge1Rlc3RTdHJpbmcsIFRlc3RTdHJpbmcgKyAiMSIsIFRlc3RTdHJpbmcgKyAiMiJ9OwotCi0gICAvKgotIAkqIFRlc3QgdGhlIGdldFRleHQvc2V0VGV4dCBBUEkgd2l0aCBhIFRyZWUgdGhhdCBoYXMgb25seSAKLSAJKiB0aGUgZGVmYXVsdCBjb2x1bW4uCi0gCSovCi0JCi0JYXNzZXJ0RXF1YWxzKDAsIHRyZWVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwkKLSAJdHJlZUl0ZW0uc2V0VGV4dCgxLCBUZXN0U3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0VGV4dCgxKS5sZW5ndGgoKSk7CQotCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KDApLmxlbmd0aCgpKTsKLQkKLQl0cmVlSXRlbS5zZXRUZXh0KDAsIFRlc3RTdHJpbmcpOwotCWFzc2VydEVxdWFscyhUZXN0U3RyaW5nLCB0cmVlSXRlbS5nZXRUZXh0KDApKTsKLSAJdHJlZUl0ZW0uc2V0VGV4dCgtMSwgVGVzdFN0cmluZ3NbMV0pOwotCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KC0xKS5sZW5ndGgoKSk7CQotCi0gICAvKgotIAkqIFRlc3QgdGhlIGdldFRleHQvc2V0VGV4dCBBUEkgd2l0aCBhIFRyZWUgdGhhdCBlbm91Z2ggCi0gCSogY29sdW1ucyB0byBmaXQgYWxsIHRlc3QgaXRlbSB0ZXh0cy4KLSAJKi8KLQotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JLy90cmVlLnNldFRleHQoVGVzdFN0cmluZ3MpOwkJCQkvLyBjcmVhdGUgYW5vdWdoIGNvbHVtbnMgZm9yIFRyZWVJdGVtLnNldFRleHQoU3RyaW5nW10pIHRvIHdvcmsKLQlpbnQgY29sdW1uQ291bnQgPSB0cmVlLmdldENvbHVtbkNvdW50KCk7Ci0JaWYgKGNvbHVtbkNvdW50IDwgaW1hZ2VzLmxlbmd0aCkgewotCQlmb3IgKGludCBpID0gY29sdW1uQ291bnQ7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspewotCQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JCX0KLQl9Ci0JVHJlZUNvbHVtbltdIGNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IFRlc3RTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbHVtbnNbaV0uc2V0VGV4dChUZXN0U3RyaW5nc1tpXSk7Ci0JfQotCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KDEpLmxlbmd0aCgpKTsJCi0KLQotCXRyZWVJdGVtLnNldFRleHQoMSwgVGVzdFN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKFRlc3RTdHJpbmcsIHRyZWVJdGVtLmdldFRleHQoMSkpOwkKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0VGV4dCgwKS5sZW5ndGgoKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0VGV4dCgwLCBUZXN0U3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoVGVzdFN0cmluZywgdHJlZUl0ZW0uZ2V0VGV4dCgwKSk7Ci0KLQotCXRyZWVJdGVtLnNldFRleHQoLTEsIFRlc3RTdHJpbmdzWzFdKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0VGV4dCgtMSkubGVuZ3RoKCkpOwkKLQotCi0JdHJ5IHsKLQkJdHJlZUl0ZW0uc2V0VGV4dCgtMSwgbnVsbCk7CQkKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXRyZWVJdGVtLnNldFRleHQoMCwgbnVsbCk7CQkKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfSAKLQotCi19Ci0KLS8vcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0vLwl0cnkgewotLy8JCXRyZWVJdGVtLnNldFRleHQoKFN0cmluZyludWxsKTsJCQotLy8JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0vLwl9Ci0vLwljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLS8vCX0KLS8vfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QmFja2dyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QmFja2dyb3VuZEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kc0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hlY2tlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RXhwYW5kZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb3JlZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb3JlZ3JvdW5kSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0R3JheWVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZUJvdW5kc0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2hlY2tlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEV4cGFuZGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEdyYXllZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dCRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1JIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QmFja2dyb3VuZCIpKSB0ZXN0X2dldEJhY2tncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmRJIikpIHRlc3RfZ2V0QmFja2dyb3VuZEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kc0kiKSkgdGVzdF9nZXRCb3VuZHNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoZWNrZWQiKSkgdGVzdF9nZXRDaGVja2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFeHBhbmRlZCIpKSB0ZXN0X2dldEV4cGFuZGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250IikpIHRlc3RfZ2V0Rm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udEkiKSkgdGVzdF9nZXRGb250SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpKSB0ZXN0X2dldEZvcmVncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvcmVncm91bmRJIikpIHRlc3RfZ2V0Rm9yZWdyb3VuZEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEdyYXllZCIpKSB0ZXN0X2dldEdyYXllZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2VCb3VuZHNJIikpIHRlc3RfZ2V0SW1hZ2VCb3VuZHNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZUkiKSkgdGVzdF9nZXRJbWFnZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnRJdGVtIikpIHRlc3RfZ2V0UGFyZW50SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dEkiKSkgdGVzdF9nZXRUZXh0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDaGVja2VkWiIpKSB0ZXN0X3NldENoZWNrZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFeHBhbmRlZFoiKSkgdGVzdF9zZXRFeHBhbmRlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEdyYXllZFoiKSkgdGVzdF9zZXRHcmF5ZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dCRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHQkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1UcmVlSXRlbSB0cmVlSXRlbTsKLVRyZWUgdHJlZTsKLQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIG1ha2VDbGVhbkVudmlyb25tZW50KCkgewotCWlmICggdHJlZUl0ZW0gIT0gbnVsbCApIHRyZWVJdGVtLmRpc3Bvc2UoKTsKLQlpZiAoIHRyZWUgIT0gbnVsbCApIHRyZWUuZGlzcG9zZSgpOwotCXRyZWUgPSBuZXcgVHJlZShzaGVsbCwgMCk7Ci0JdHJlZUl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0Jc2V0V2lkZ2V0KHRyZWVJdGVtKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UeXBlZExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHlwZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDRjMjljLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UeXBlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHlwZWRMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHlwZWRMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UeXBlZExpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UeXBlZExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9TV1RFdmVudExpc3RlbmVyKCkgewotCS8vIGRvIG5vdCB0ZXN0IGludGVybmFsIHB1YmxpYyBtZXRob2RzIChub24tQVBJKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEV2ZW50TGlzdGVuZXIoKSB7Ci0JLy8gZG8gbm90IHRlc3QgaW50ZXJuYWwgcHVibGljIG1ldGhvZHMgKG5vbi1BUEkpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0JLy8gZG8gbm90IHRlc3QgaW50ZXJuYWwgcHVibGljIG1ldGhvZHMgKG5vbi1BUEkpCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHlwZWRMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfU1dURXZlbnRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RXZlbnRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX1NXVEV2ZW50TGlzdGVuZXIiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfU1dURXZlbnRMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RXZlbnRMaXN0ZW5lciIpKSB0ZXN0X2dldEV2ZW50TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3ODIwYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCS8vIFVzZSB0aGlzIHZhcmlhYmxlIHRvIGhlbHAgdmFsaWRhdGUgY2FsbGJhY2tzCi0JYm9vbGVhbiBsaXN0ZW5lckNhbGxlZDsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JaWYgKHdpZGdldCAhPSBudWxsKSB7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgd2lkZ2V0LmlzRGlzcG9zZWQoKSk7Ci0JfQotCWFzc2VydEVxdWFscyhmYWxzZSwgc2hlbGwuaXNEaXNwb3NlZCgpKTsKLQlzaGVsbC5kaXNwb3NlKCk7Ci0JaWYgKHdpZGdldCAhPSBudWxsKSB7Ci0JCWFzc2VydFRydWUod2lkZ2V0LmlzRGlzcG9zZWQoKSk7Ci0JfQotCWFzc2VydFRydWUoc2hlbGwuaXNEaXNwb3NlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJKCkgewotCS8vIGFic3RyYWN0IGNsYXNzCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRGlzcG9zZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyKCkgewotCURpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCX0KLQl9OwotCXdpZGdldC5hZGREaXNwb3NlTGlzdGVuZXIobGlzdGVuZXIpOwotCXdpZGdldC5yZW1vdmVEaXNwb3NlTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpIHsKLQl0cnkgewotCQl3aWRnZXQuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCX0KLQl9OwotCXdpZGdldC5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbGlzdGVuZXIpOwotCXdpZGdldC5yZW1vdmVMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JLy8gdGVzdGVkIGluIHRlYXJEb3duCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGF0YSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREYXRhTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREaXNwbGF5KCkgewotCWFzc2VydEVxdWFscyh3aWRnZXQuZ2V0RGlzcGxheSgpLCB3aWRnZXQuZ2V0RGlzcGxheSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZSgpIHsKLQkvLyB0aGlzIHRlc3Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgbGVhZiBzdWJjbGFzc2VzCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNEaXNwb3NlZCgpIHsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHdpZGdldC5pc0Rpc3Bvc2VkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X25vdGlmeUxpc3RlbmVyc0lMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2lkZ2V0Lm5vdGlmeUxpc3RlbmVycygwLCBudWxsKTsKLQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCUdDIGdjID0gbnVsbDsKLQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ29udHJvbCkgewotCQlnYyA9IGV2ZW50LmdjID0gbmV3IEdDKChDb250cm9sKXdpZGdldCk7Ci0JfQotCXdpZGdldC5ub3RpZnlMaXN0ZW5lcnMoU1dULlBhaW50LCBldmVudCk7Ci0JaWYgKGdjICE9IG51bGwpIGdjLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVEaXNwb3NlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkRGlzcG9zZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKCkgewotCS8vIHRoaXMgbWV0aG9kIGlzIGZ1cnRoZXIgdGVzdGVkIGJ5IGFsbCBvZiB0aGUgcmVtb3ZlVHlwZWRMaXN0ZW5lciB0ZXN0cwotCXRyeSB7Ci0JCXdpZGdldC5yZW1vdmVMaXN0ZW5lcihTV1QuUGFpbnQsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXdpZGdldC5yZW1vdmVMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQl9Ci0JfSk7Ci0JCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJfQotCX07Ci0Jd2lkZ2V0LmFkZExpc3RlbmVyKFNXVC5QYWludCwgbGlzdGVuZXIpOwotCXdpZGdldC5yZW1vdmVMaXN0ZW5lcihTV1QuUGFpbnQsIGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0Jd2lkZ2V0LnNldERhdGEod2lkZ2V0KTsKLQlhc3NlcnRFcXVhbHMod2lkZ2V0LCB3aWRnZXQuZ2V0RGF0YSgpKTsKLQotCXdpZGdldC5zZXREYXRhKG51bGwpOwotCWFzc2VydE51bGwod2lkZ2V0LmdldERhdGEoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0Jd2lkZ2V0LnNldERhdGEoInRoZSB3aWRnZXQiLCB3aWRnZXQpOwotCWFzc2VydEVxdWFscyh3aWRnZXQsIHdpZGdldC5nZXREYXRhKCJ0aGUgd2lkZ2V0IikpOwotCi0Jd2lkZ2V0LnNldERhdGEoInRoZSB3aWRnZXQiLCBudWxsKTsKLQlhc3NlcnROdWxsKHdpZGdldC5nZXREYXRhKCJ0aGUgd2lkZ2V0IikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCWFzc2VydE5vdE51bGwod2lkZ2V0LnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUod2lkZ2V0LnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGREaXNwb3NlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREaXNwbGF5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdHlsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNEaXNwb3NlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfbm90aWZ5TGlzdGVuZXJzSUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlRGlzcG9zZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERhdGFMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGREaXNwb3NlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIiKSkgdGVzdF9hZGREaXNwb3NlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpKSB0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERhdGEiKSkgdGVzdF9nZXREYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREYXRhTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9nZXREYXRhTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERpc3BsYXkiKSkgdGVzdF9nZXREaXNwbGF5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdHlsZSIpKSB0ZXN0X2dldFN0eWxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0Rpc3Bvc2VkIikpIHRlc3RfaXNEaXNwb3NlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfbm90aWZ5TGlzdGVuZXJzSUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X25vdGlmeUxpc3RlbmVyc0lMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZURpc3Bvc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZURpc3Bvc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldERhdGFMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgU2hlbGwgc2hlbGw7Ci1wcml2YXRlIFdpZGdldCB3aWRnZXQ7Ci0KLXByb3RlY3RlZCB2b2lkIHNldFdpZGdldChXaWRnZXQgdykgewotCXdpZGdldCA9IHc7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIGhvb2tMaXN0ZW5lcnMoV2lkZ2V0IHcsIGludFtdIHR5cGVzLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgdy5hZGRMaXN0ZW5lcih0eXBlc1tpXSwgbGlzdGVuZXIpOwotICAgIH0KLX0KLQotcHJvdGVjdGVkIFN0cmluZ1tdIGhvb2tFeHBlY3RlZEV2ZW50cyhTdHJpbmcgdHlwZSwgZmluYWwgamF2YS51dGlsLlZlY3RvciBldmVudHMpIHsKLSAgICByZXR1cm4gaG9va0V4cGVjdGVkRXZlbnRzKHdpZGdldCwgdHlwZSwgZXZlbnRzKTsKLX0KLQotcHJvdGVjdGVkIFN0cmluZ1tdIGhvb2tFeHBlY3RlZEV2ZW50cyhXaWRnZXQgdywgU3RyaW5nIHR5cGUsIGZpbmFsIGphdmEudXRpbC5WZWN0b3IgZXZlbnRzKSB7Ci0gICAgU3RyaW5nW10gZXhwZWN0ZWRFdmVudHMgPSAoU3RyaW5nW10pQ29uc2lzdGVuY3lVdGlsaXR5LmV2ZW50T3JkZXJpbmcuZ2V0KHR5cGUpOwotICAgIGhvb2tFeHBlY3RlZEV2ZW50cyh3LCBleHBlY3RlZEV2ZW50cywgZXZlbnRzKTsKLSAgICByZXR1cm4gZXhwZWN0ZWRFdmVudHM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIGhvb2tFeHBlY3RlZEV2ZW50cyhXaWRnZXQgdywgU3RyaW5nW10gdHlwZXMsIGZpbmFsIGphdmEudXRpbC5WZWN0b3IgZXZlbnRzKSB7Ci0gICAgaG9va0xpc3RlbmVycyh3LCBDb25zaXN0ZW5jeVV0aWxpdHkuY29udmVydEV2ZW50TmFtZXModHlwZXMpLCAKLQkgICAgICAgIG5ldyBMaXN0ZW5lcigpIHsKLQkgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wID0gQ29uc2lzdGVuY3lVdGlsaXR5LmV2ZW50TmFtZXNbZS50eXBlXTsKLQkgICAgICAgICAgICAgICAgaWYoZS50eXBlID09IFNXVC5UcmF2ZXJzZSkKLQkgICAgICAgICAgICAgICAgICAgIHRlbXAgKz0gIjoiK0NvbnNpc3RlbmN5VXRpbGl0eS5nZXRUcmF2ZXJzYWxUeXBlKGUuZGV0YWlsKTsKLQkgICAgICAgICAgICAgICAgZWxzZSBpZihlLnR5cGUgPT0gU1dULlNlbGVjdGlvbikKLQkgICAgICAgICAgICAgICAgICAgIHRlbXAgKz0gIjoiK0NvbnNpc3RlbmN5VXRpbGl0eS5nZXRTZWxlY3Rpb25UeXBlKGUuZGV0YWlsKTsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnRzLmFkZCh0ZW1wKTsKLQkgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRlbXAgKyBlLndpZGdldCk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfSk7Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0VGVzdE5hbWUoKSB7Ci0gICAgU3RyaW5nIHRlc3QgPSBnZXROYW1lKCk7Ci0gICAgaW50IGluZGV4ID0gdGVzdC5sYXN0SW5kZXhPZignXycpOwotICAgIGlmKGluZGV4ICE9IC0xKQotICAgICAgICB0ZXN0ID0gdGVzdC5zdWJzdHJpbmcoaW5kZXgrMSwgdGVzdC5sZW5ndGgoKSk7Ci0gICAgU3RyaW5nIGNsc3MgPSBnZXRDbGFzc05hbWUoKTsKLSAgICBpZigoIXRlc3QuZXF1YWxzKCJNZW51RGV0ZWN0IikgfHwgY2xzcy5lcXVhbHMoIlRhYmxlIikgfHwgY2xzcy5lcXVhbHMoIlRhYmxlVHJlZSIpIHx8IHRlc3Quc3RhcnRzV2l0aCgiQ2hldnJvbiIpKSAmJgotICAgICAgICghdGVzdC5lcXVhbHMoIkRyYWdEZXRlY3QiKSB8fCBjbHNzLmVxdWFscygiVHJlZSIpIHx8IGNsc3MuZXF1YWxzKCJUYWJsZVRyZWUiKSB8fCB0ZXN0LnN0YXJ0c1dpdGgoIkNoZXZyb24iKSkgJiYKLSAgICAgICAoIXRlc3QuZXF1YWxzKCJEb3VibGVDbGljayIpIHx8IGNsc3MuZXF1YWxzKCJMaXN0IikpICYmCi0gICAgICAgKCF0ZXN0LmVxdWFscygiS2V5U2VsZWN0aW9uIikgfHwgY2xzcy5lcXVhbHMoIlNsaWRlciIpIHx8IGNsc3MuZXF1YWxzKCJDb21ibyIpIHx8IGNsc3MuZXF1YWxzKCJDQ29tYm8iKSB8fCBjbHNzLmVxdWFscygiQ1RhYkZvbGRlciIpKSAmJgotICAgICAgICghdGVzdC5lcXVhbHMoIkVudGVyU2VsZWN0aW9uIikgfHwgY2xzcy5lcXVhbHMoIkJ1dHRvbiIpIHx8IGNsc3MuZXF1YWxzKCJUb29sQmFyIikgfHwgY2xzcy5lcXVhbHMoIkNDb21ibyIpKSkKLSAgICAgICAgdGVzdCA9IGNsc3MgKyB0ZXN0OwotICAgIHJldHVybiB0ZXN0OwotfQotCi1wcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICBTdHJpbmcgY2xhenogPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICBpbnQgaW5kZXggPSBjbGF6ei5sYXN0SW5kZXhPZignXycpOwotICAgIGlmKGluZGV4ICE9IC0xKQotICAgICAgICBjbGF6eiA9IGNsYXp6LnN1YnN0cmluZyhpbmRleCsxLCBjbGF6ei5sZW5ndGgoKSk7Ci0gICAgcmV0dXJuIGNsYXp6OwotfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXIxLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmMGM0Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlcjEgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbG9jYXRpb25DaGFuZ2luZyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBsb2NhdGlvbkNoYW5nZWQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvZ3Jlc3NDb21wbGV0ZWQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDEoU3RyaW5nIHVybCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJVUkwgTG9hZGluZyAtIGFyZ3M6ICIrdXJsKyIgRXhwZWN0ZWQgRXZlbnQgU2VxdWVuY2U6IExvY2F0aW9uLmNoYW5naW5nID4gTG9jYXRpb24uY2hhbmdlZCAodG9wIHRydWUpPiBQcm9ncmVzcy5jb21wbGV0ZWQiKTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCWxvY2F0aW9uQ2hhbmdpbmcgPSBsb2NhdGlvbkNoYW5nZWQgPSBwcm9ncmVzc0NvbXBsZXRlZCA9IGZhbHNlOwotCQkJCQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdpbmcgIitldmVudC5sb2NhdGlvbik7Ci0JCQkJLyogY2VydGFpbiBicm93c2VycyBkbyBzZW5kIG11bHRpcGxlIGNoYW5naW5nIGV2ZW50cy4gU2FmYXJpIGRvZXMgdGhpcy4gKi8KLQkJCQkvKiB2ZXJpZnkgdGhlIHBhZ2UgaGFzIG5vdCBiZWVuIHJlcG9ydGVkIGFzIGJlaW5nIGxvYWRlZCAqLwotCQkJCXBhc3NlZCA9ICFwcm9ncmVzc0NvbXBsZXRlZDsKLQkJCQlsb2NhdGlvbkNoYW5naW5nID0gdHJ1ZTsKLQkJCQlpZiAoIXBhc3NlZCkgc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZWQgIitldmVudC5sb2NhdGlvbik7Ci0JCQkJLyogaWdub3JlIG5vbiB0b3AgZnJhbWUgbG9hZGluZyAqLwotCQkJCWlmICghZXZlbnQudG9wKSByZXR1cm47Ci0JCQkJLyogdmVyaWZ5IGEgY2hhbmdlZCBmb2xsb3dzIGF0IGxlYXN0IG9uZSBjaGFuZ2luZyAqLwotCQkJCS8qIHZlcmlmeSB0aGUgcGFnZSBoYXMgbm90IGJlZW4gcmVwb3J0ZWQgYXMgYmVpbmcgbG9hZGVkICovCi0JCQkJcGFzc2VkID0gbG9jYXRpb25DaGFuZ2luZyAmJiAhcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCQkJbG9jYXRpb25DaGFuZ2VkID0gdHJ1ZTsKLQkJCQlpZiAoIXBhc3NlZCkgc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjb21wbGV0ZWQiKTsKLQkJCQlwYXNzZWQgPSBsb2NhdGlvbkNoYW5naW5nICYmIGxvY2F0aW9uQ2hhbmdlZCAmJiAhcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCQkJcHJvZ3Jlc3NDb21wbGV0ZWQgPSB0cnVlOwotCQkJCS8vIFRFTVBPUkFSSUxZIENPTU1FTlRFRCBPVVQKLQkJCQkvKmlmICghcGFzc2VkKSovIHNoZWxsLmNsb3NlKCk7Ci0vKgkJCQlpZiAocGFzc2VkKSB7Ci0JCQkJCSB3YWl0IGEgbGl0dGxlIGJpdCBtb3JlIGJlZm9yZSBkZWNsYXJpbmcgaXQgYSBzdWNjZXNzLAotCQkJCQkgKiBpbiBjYXNlIGJvZ3VzIGV2ZW50cyBmb2xsb3cgdGhpcyBvbmUuCi0JCQkJCSAKLQkJCQkJbmV3IFRocmVhZCgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBzdGFydCIpOwotCQkJCQkJCXRyeSB7IHNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge307Ci0JCQkJCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkKLQkJCQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCl7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgYXN5bmNleGVjIHNoZWxsLmNsb3NlIik7Ci0JCQkJCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLmNsb3NlKCk7CQkJCQkJCQotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBvdmVyIik7Ci0JCQkJCQl9OwotCQkJCQl9LnN0YXJ0KCk7Ci0JCQkJfQotKi8JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCh1cmwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDIoU3RyaW5nIHVybCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJVUkwgTG9hZGluZyBGaWx0ZXJpbmcgLSBhcmdzOiAiK3VybCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBMb2NhdGlvbi5jaGFuZ2luZyBjYW5jZWwgdHJ1ZSA+IG5vIExvY2F0aW9uLmNoYW5nZWQsIG5vIFByb2dyZXNzLmNvbXBsZXRlZCIpOwotCQlsb2NhdGlvbkNoYW5naW5nID0gbG9jYXRpb25DaGFuZ2VkID0gcHJvZ3Jlc3NDb21wbGV0ZWQgPSBmYWxzZTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCWZpbmFsIFN0cmluZ1tdIGxvY2F0aW9uQ2FuY2VsbGVkID0gbmV3IFN0cmluZ1sxXTsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5naW5nICIrZXZlbnQubG9jYXRpb24pOwotCQkJCXBhc3NlZCA9ICFsb2NhdGlvbkNoYW5naW5nICYmICFsb2NhdGlvbkNoYW5nZWQgJiYgIXByb2dyZXNzQ29tcGxldGVkOwotCQkJCWxvY2F0aW9uQ2hhbmdpbmcgPSB0cnVlOwotCQkJCWlmICghcGFzc2VkKSB7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCW5ldyBUaHJlYWQoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIHN0YXJ0Iik7Ci0JCQkJCQl0cnkgeyBzbGVlcCgyMDAwKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9OwotCQkJCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkKLQkJCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgYXN5bmNleGVjIHNoZWxsLmNsb3NlIik7Ci0JCQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwuY2xvc2UoKTsJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIG92ZXIiKTsKLQkJCQkJfTsKLQkJCQl9LnN0YXJ0KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvKgotCQkJCSAqIEZlYXR1cmUgb24gSW50ZXJuZXQgRXhwbG9yZXIuIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgbG9jYXRpb24sIElFIHN0aWxsIGZpcmVzIGEgRG9jdW1lbnRDb21wbGV0ZQotCQkJCSAqIGZvbGxvd2luZyB0aGUgQmVmb3JlTmF2aWdhdGUyIGNhbmNlbCBldmVudC4gVGhpcyBEb2N1bWVudENvbXBsZXRlIGV2ZW50IGNvbnRhaW5zIGFuIGVtcHR5IFVSTAotCQkJCSAqIHNpbmNlIHRoZSBVUkwgaW4gQmVmb3JlTmF2aWdhdGUyIHdhcyBjb3JyZWN0bHkgY2FuY2VsbGVkLgotCQkJCSAqIFRoZSB0ZXN0IGNvbnNpZGVycyBpdCBpcyBPSyB0byBzZW5kIGEgTG9jYXRpb24uY2hhbmdlZCBhbmQgYSBQcm9ncmVzcy5jb21wbGV0ZWQgZXZlbnRzIGFmdGVyCi0JCQkJICogYSBMb2NhdGlvbi5jaGFuZ2luZyBjYW5jZWwgdHJ1ZSAtIGF0IHRoZSBjb25kaXRpb24gdGhhdCB0aGUgY3VycmVudCBsb2NhdGlvbiBpcyBlbXB0eSwKLQkJCQkgKiBvdGhlcndpc2UgaXQgaXMgY29uc2lkZXJlZCB0aGF0IHRoZSBsb2NhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWxseSBjYW5jZWxsZWQuIAotCQkJCSAqLwotCQkJCXBhc3NlZCA9IGV2ZW50LmxvY2F0aW9uLmxlbmd0aCgpID09IDA7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlZCAiK2V2ZW50LmxvY2F0aW9uKyIgIitwYXNzZWQpOwotCQkJCWxvY2F0aW9uQ2hhbmdlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJLyoKLQkJCQkgKiBGZWF0dXJlIG9uIEludGVybmV0IEV4cGxvcmVyLiBJZiB0aGVyZSBpcyBubyBjdXJyZW50IGxvY2F0aW9uLCBJRSBzdGlsbCBmaXJlcyBhIERvY3VtZW50Q29tcGxldGUKLQkJCQkgKiBmb2xsb3dpbmcgdGhlIEJlZm9yZU5hdmlnYXRlMiBjYW5jZWwgZXZlbnQuIFRoaXMgRG9jdW1lbnRDb21wbGV0ZSBldmVudCBjb250YWlucyBhbiBlbXB0eSBVUkwKLQkJCQkgKiBzaW5jZSB0aGUgVVJMIGluIEJlZm9yZU5hdmlnYXRlMiB3YXMgY29ycmVjdGx5IGNhbmNlbGxlZC4KLQkJCQkgKiBUaGUgdGVzdCBjb25zaWRlcnMgaXQgaXMgT0sgdG8gc2VuZCBhIExvY2F0aW9uLmNoYW5nZWQgYW5kIGEgUHJvZ3Jlc3MuY29tcGxldGVkIGV2ZW50cyBhZnRlcgotCQkJCSAqIGEgTG9jYXRpb24uY2hhbmdpbmcgY2FuY2VsIHRydWUgLSBhdCB0aGUgY29uZGl0aW9uIHRoYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gaXMgZW1wdHksCi0JCQkJICogb3RoZXJ3aXNlIGl0IGlzIGNvbnNpZGVyZWQgdGhhdCB0aGUgbG9jYXRpb24gd2FzIG5vdCBzdWNjZXNzZnVsbHkgY2FuY2VsbGVkLiAKLQkJCQkgKi8KLQkJCQlTdHJpbmcgbG9jYXRpb24gPSBicm93c2VyLmdldFVybCgpOwotCQkJCXBhc3NlZCA9IGxvY2F0aW9uLmxlbmd0aCgpID09IDA7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY29tcGxldGVkICIrcGFzc2VkKTsKLQkJCQlwcm9ncmVzc0NvbXBsZXRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIuc2V0VXJsKHVybCk7Ci0JCWJvb2xlYW4gdGltZW91dCA9IHJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgNjAwKTsKLQkJaWYgKHRpbWVvdXQpIHBhc3NlZCA9IGZhbHNlOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0Jc3RhdGljIGJvb2xlYW4gcnVuTG9vcFRpbWVyKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aW1lb3V0ID0ge2ZhbHNlfTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY29uZHM7IGkrKykgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkge30gCi0JCQkJdGltZW91dFswXSA9IHRydWU7Ci0JCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5yZWRyYXcoKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JCXdoaWxlICghdGltZW91dFswXSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJcmV0dXJuIHRpbWVvdXRbMF07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KCkgewotCQlpbnQgZmFpbCA9IDA7Ci0JCVN0cmluZ1tdIHVybHMgPSB7Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbSJ9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdDEodXJsc1tpXSk7IAotCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnQocmVzdWx0ID8gIi4iIDogIkUiKTsKLQkJCWlmICghcmVzdWx0KSBmYWlsKys7IAotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0Mih1cmxzW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxyXG5UZXN0cyBGaW5pc2hlZC4gU1VDQ0VTUzogIit0ZXN0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyMi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MzRjNTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXIyIHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsJCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGxvY2F0aW9uQ2hhbmdpbmcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbG9jYXRpb25DaGFuZ2VkID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHByb2dyZXNzQ29tcGxldGVkID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QxKFN0cmluZyBodG1sKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInNldFRleHQgLSBhcmdzOiAiK2h0bWwrIiBFeHBlY3RlZCBFdmVudCBTZXF1ZW5jZTogTG9jYXRpb24uY2hhbmdpbmcgPiBMb2NhdGlvbi5jaGFuZ2VkID4gUHJvZ3Jlc3MuY29tcGxldGVkIik7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQlsb2NhdGlvbkNoYW5naW5nID0gbG9jYXRpb25DaGFuZ2VkID0gcHJvZ3Jlc3NDb21wbGV0ZWQgPSBmYWxzZTsKLQkJCQkKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5naW5nICIrZXZlbnQubG9jYXRpb24pOwotCQkJCS8qIGNlcnRhaW4gYnJvd3NlcnMgZG8gc2VuZCBtdWx0aXBsZSBjaGFuZ2luZyBldmVudHMuIFNhZmFyaSBkb2VzIHRoaXMuICovCi0JCQkJcGFzc2VkID0gIWxvY2F0aW9uQ2hhbmdlZCAmJiAhcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCQkJbG9jYXRpb25DaGFuZ2luZyA9IHRydWU7Ci0JCQkJaWYgKCFwYXNzZWQpIHNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2VkICIrZXZlbnQubG9jYXRpb24pOwotCQkJCXBhc3NlZCA9IGxvY2F0aW9uQ2hhbmdpbmcgJiYgIWxvY2F0aW9uQ2hhbmdlZCAmJiAhcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCQkJbG9jYXRpb25DaGFuZ2VkID0gdHJ1ZTsKLQkJCQlpZiAoIXBhc3NlZCkgc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjb21wbGV0ZWQiKTsKLQkJCQlwYXNzZWQgPSBsb2NhdGlvbkNoYW5naW5nICYmIGxvY2F0aW9uQ2hhbmdlZCAmJiAhcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCQkJcHJvZ3Jlc3NDb21wbGV0ZWQgPSB0cnVlOwotCQkJCWlmICghcGFzc2VkKSBzaGVsbC5jbG9zZSgpOwotCQkJCWlmIChwYXNzZWQpIHsKLQkJCQkJLyogd2FpdCBhIGxpdHRsZSBiaXQgbW9yZSBiZWZvcmUgZGVjbGFyaW5nIGl0IGEgc3VjY2VzcywKLQkJCQkJICogaW4gY2FzZSBib2d1cyBldmVudHMgZm9sbG93IHRoaXMgb25lLgotCQkJCQkgKi8KLQkJCQkJbmV3IFRocmVhZCgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBzdGFydCIpOwotCQkJCQkJCXRyeSB7IHNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge307Ci0JCQkJCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkKLQkJCQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCl7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgYXN5bmNleGVjIHNoZWxsLmNsb3NlIik7Ci0JCQkJCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLmNsb3NlKCk7CQkJCQkJCQotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBvdmVyIik7Ci0JCQkJCQl9OwotCQkJCQl9LnN0YXJ0KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDIoU3RyaW5nIGh0bWwpIHsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigic2V0VGV4dCBVUkwgTG9hZGluZyBGaWx0ZXJpbmcgLSBhcmdzOiAiK2h0bWwrIiBFeHBlY3RlZCBFdmVudCBTZXF1ZW5jZTogTG9jYXRpb24uY2hhbmdpbmcgY2FuY2VsIHRydWUgPiBubyBMb2NhdGlvbi5jaGFuZ2VkLCBubyBQcm9ncmVzcy5jb21wbGV0ZWQiKTsKLQkJbG9jYXRpb25DaGFuZ2luZyA9IGxvY2F0aW9uQ2hhbmdlZCA9IHByb2dyZXNzQ29tcGxldGVkID0gZmFsc2U7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQlmaW5hbCBTdHJpbmdbXSBsb2NhdGlvbkNhbmNlbGxlZCA9IG5ldyBTdHJpbmdbMV07Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2luZyAiK2V2ZW50LmxvY2F0aW9uKTsKLQkJCQkvKgotCQkJCSogRmVhdHVyZSBvbiBJbnRlcm5ldCBFeHBsb3Jlci4gIFdoZW4gcGVuZGluZyByZXF1ZXN0cyBhcmUgc3RvcHBlZCwgSUUKLQkJCQkqIGVtaXRzIGEgTG9jYXRpb24uY2hhbmdpbmcgd2l0aCByZXM6Ly9DOlxXSU5ET1dTXFN5c3RlbTMyXHNoZG9jbGMuZGxsL25hdmNhbmNsLmh0bS4KLQkJCQkqIFBlbmRpbmcgcmVxdWVzdHMgYXJlIHN0b3BwZWQgYmVmb3JlIGdvaW5nIHRvIHRoZSBibGFuayBwYWdlIHRvIHNldCBIVE1MIGluIG1lbW9yeQotCQkJCSogd2l0aCBzZXRUZXh0LgotCQkJCSogVGhlIHRlc3QgY29uc2lkZXJzIGl0IGlzIE9LIHRvIGdldCBtdWx0aXBsZSBMb2NhdGlvbi5jaGFuZ2luZyBldmVudHMgYXQgdGhlIGNvbmRpdGlvbgotCQkJCSogdGhhdCBubyBsb2NhdGlvbkNoYW5nZWQgYW5kIHByb2dyZXNzQ29tcGxldGVkIGFyZSByZXBvcnRlZC4KLQkJCQkqLwotCQkJCXBhc3NlZCA9ICFsb2NhdGlvbkNoYW5nZWQgJiYgIXByb2dyZXNzQ29tcGxldGVkOwotCQkJCWxvY2F0aW9uQ2hhbmdpbmcgPSB0cnVlOwotCQkJCWlmICghcGFzc2VkKSB7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCW5ldyBUaHJlYWQoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIHN0YXJ0Iik7Ci0JCQkJCQl0cnkgeyBzbGVlcCgyMDAwKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9OwotCQkJCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkKLQkJCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgYXN5bmNleGVjIHNoZWxsLmNsb3NlIik7Ci0JCQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwuY2xvc2UoKTsJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIG92ZXIiKTsKLQkJCQkJfTsKLQkJCQl9LnN0YXJ0KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvKgotCQkJCSAqIEZlYXR1cmUgb24gSW50ZXJuZXQgRXhwbG9yZXIuIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgbG9jYXRpb24sIElFIHN0aWxsIGZpcmVzIGEgRG9jdW1lbnRDb21wbGV0ZQotCQkJCSAqIGZvbGxvd2luZyB0aGUgQmVmb3JlTmF2aWdhdGUyIGNhbmNlbCBldmVudC4gVGhpcyBEb2N1bWVudENvbXBsZXRlIGV2ZW50IGNvbnRhaW5zIGFuIGVtcHR5IFVSTAotCQkJCSAqIHNpbmNlIHRoZSBVUkwgaW4gQmVmb3JlTmF2aWdhdGUyIHdhcyBjb3JyZWN0bHkgY2FuY2VsbGVkLgotCQkJCSAqIFRoZSB0ZXN0IGNvbnNpZGVycyBpdCBpcyBPSyB0byBzZW5kIGEgTG9jYXRpb24uY2hhbmdlZCBhbmQgYSBQcm9ncmVzcy5jb21wbGV0ZWQgZXZlbnRzIGFmdGVyCi0JCQkJICogYSBMb2NhdGlvbi5jaGFuZ2luZyBjYW5jZWwgdHJ1ZSAtIGF0IHRoZSBjb25kaXRpb24gdGhhdCB0aGUgY3VycmVudCBsb2NhdGlvbiBpcyBlbXB0eSwKLQkJCQkgKiBvdGhlcndpc2UgaXQgaXMgY29uc2lkZXJlZCB0aGF0IHRoZSBsb2NhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWxseSBjYW5jZWxsZWQuIAotCQkJCSAqLwotCQkJCXBhc3NlZCA9IGV2ZW50LmxvY2F0aW9uLmxlbmd0aCgpID09IDA7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlZCAiK2V2ZW50LmxvY2F0aW9uKyIgIitwYXNzZWQpOwotCQkJCS8qIGlnbm9yZSBMb2NhdGlvbkNoYW5nZWQgdGhhdCBhcmUgZW1wdHkgKi8KLQkJCQlsb2NhdGlvbkNoYW5nZWQgPSAhcGFzc2VkOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCS8qCi0JCQkJICogRmVhdHVyZSBvbiBJbnRlcm5ldCBFeHBsb3Jlci4gSWYgdGhlcmUgaXMgbm8gY3VycmVudCBsb2NhdGlvbiwgSUUgc3RpbGwgZmlyZXMgYSBEb2N1bWVudENvbXBsZXRlCi0JCQkJICogZm9sbG93aW5nIHRoZSBCZWZvcmVOYXZpZ2F0ZTIgY2FuY2VsIGV2ZW50LiBUaGlzIERvY3VtZW50Q29tcGxldGUgZXZlbnQgY29udGFpbnMgYW4gZW1wdHkgVVJMCi0JCQkJICogc2luY2UgdGhlIFVSTCBpbiBCZWZvcmVOYXZpZ2F0ZTIgd2FzIGNvcnJlY3RseSBjYW5jZWxsZWQuCi0JCQkJICogVGhlIHRlc3QgY29uc2lkZXJzIGl0IGlzIE9LIHRvIHNlbmQgYSBMb2NhdGlvbi5jaGFuZ2VkIGFuZCBhIFByb2dyZXNzLmNvbXBsZXRlZCBldmVudHMgYWZ0ZXIKLQkJCQkgKiBhIExvY2F0aW9uLmNoYW5naW5nIGNhbmNlbCB0cnVlIC0gYXQgdGhlIGNvbmRpdGlvbiB0aGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uIGlzIGVtcHR5LAotCQkJCSAqIG90aGVyd2lzZSBpdCBpcyBjb25zaWRlcmVkIHRoYXQgdGhlIGxvY2F0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGNhbmNlbGxlZC4gCi0JCQkJICovCi0JCQkJU3RyaW5nIGxvY2F0aW9uID0gYnJvd3Nlci5nZXRVcmwoKTsKLQkJCQlwYXNzZWQgPSBsb2NhdGlvbi5sZW5ndGgoKSA9PSAwOwotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImNvbXBsZXRlZCAiK3Bhc3NlZCk7Ci0JCQkJcHJvZ3Jlc3NDb21wbGV0ZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFRleHQoaHRtbCk7Ci0JCWJvb2xlYW4gdGltZW91dCA9IHJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgNjAwKTsKLQkJaWYgKHRpbWVvdXQpIHBhc3NlZCA9IGZhbHNlOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0Jc3RhdGljIGJvb2xlYW4gcnVuTG9vcFRpbWVyKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aW1lb3V0ID0ge2ZhbHNlfTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY29uZHM7IGkrKykgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkge30gCi0JCQkJdGltZW91dFswXSA9IHRydWU7Ci0JCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5yZWRyYXcoKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JCXdoaWxlICghdGltZW91dFswXSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJcmV0dXJuIHRpbWVvdXRbMF07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KCkgewotCQlpbnQgZmFpbCA9IDA7Ci0JCVN0cmluZ1tdIGh0bWwgPSB7ZmlsZTF9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGh0bWwubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdDEoaHRtbFtpXSk7IAotCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnQocmVzdWx0ID8gIi4iIDogIkUiKTsKLQkJCWlmICghcmVzdWx0KSBmYWlsKys7IAotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaHRtbC5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0MihodG1sW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxyXG5UZXN0cyBGaW5pc2hlZC4gU1VDQ0VTUzogIit0ZXN0KCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGUxID0gIjxIVE1MPjxIRUFEPiIrCi0JCSI8TUVUQSBIVFRQLUVRVUlWPVwiQ29udGVudC1UeXBlXCIgQ09OVEVOVD1cInRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xXCI+IisKLQkJIjxUSVRMRT5UZXN0IHdpdGggMiBmcmFtZXM8L1RJVExFPiIrCi0JCSI8L0hFQUQ+PEJPRFk+c29tZSBzaW1wbGUgdGVzdCBjYXNlIGhlcmU8L0JPRFk+PC9IVE1MPiI7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyMy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXIzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMzk5YjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXIzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXIzIHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsJCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5XaW5kb3csIGxvY2F0aW9uQ2hhbmdpbmcsIGxvY2F0aW9uQ2hhbmdlZCwgdmlzaWJpbGl0eVNob3csIHByb2dyZXNzQ29tcGxldGVkOwotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0MShTdHJpbmcgdXJsKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImphdmFzY3JpcHQgd2luZG93Lm9wZW4gLSBhcmdzOiAiK3VybCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBCcm93c2VyMTpPcGVuV2luZG93Lm9wZW4gPiB7IEJyb3dzZXIyOkxvY2F0aW9uLmNoYW5naW5nLCBCcm93c2VyMjpWaXNpYmlsaXR5LnNob3csIEJyb3dzZXIyOkxvY2F0aW9uLmNoYW5nZWQgfSA+IEJyb3dzZXIyOlByb2dyZXNzLmNvbXBsZXRlZCIpOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJbG9jYXRpb25DaGFuZ2luZyA9IGxvY2F0aW9uQ2hhbmdlZCA9IHByb2dyZXNzQ29tcGxldGVkID0gZmFsc2U7Ci0JCQkJCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjEgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlmaW5hbCBTaGVsbCBzaGVsbDIgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsMi5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjIgPSBuZXcgQnJvd3NlcihzaGVsbDIsIFNXVC5OT05FKTsKLQkJYnJvd3NlcjEuYWRkT3BlbldpbmRvd0xpc3RlbmVyKG5ldyBPcGVuV2luZG93TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBvcGVuKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJb3BlbldpbmRvdyA9IHRydWU7Ci0JCQkJQnJvd3NlciBzcmMgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJaWYgKHNyYyAhPSBicm93c2VyMSkgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gZXhwZWN0ZWQgIiticm93c2VyMSsiLCBnb3QgIitzcmMpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoZXZlbnQuYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBleHBlY3RlZCBudWxsLCBnb3QgIitldmVudC5icm93c2VyKTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZXZlbnQuYnJvd3NlciA9IGJyb3dzZXIyOwotCQkJfQotCQl9KTsKLQkJYnJvd3NlcjIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICghb3BlbldpbmRvdyB8fCAhbG9jYXRpb25DaGFuZ2luZykgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gTG9jYXRpb25FdmVudC5jaGFuZ2luZyByZWNlaXZlZCBhdCB3cm9uZyB0aW1lIik7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWxvY2F0aW9uQ2hhbmdlZCA9IHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFvcGVuV2luZG93KSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBMb2NhdGlvbkV2ZW50LmNoYW5naW5nIHJlY2VpdmVkIGF0IHdyb25nIHRpbWUiKTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJbG9jYXRpb25DaGFuZ2luZyA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyMi5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIobmV3IFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gZGlkIG5vdCBleHBlY3QgVmlzaWJpbGl0eUV2ZW50LmhpZGUiKTsKLQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2hvdyhXaW5kb3dFdmVudCBldmVudCkgewotCQkJCWlmICghb3BlbldpbmRvdykgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gVmlzaWJpbGl0eUV2ZW50LnNob3cgcmVjZWl2ZWQgYXQgd3JvbmcgdGltZSIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwkJCQkJCi0JCQkJfQotCQkJCXNoZWxsMi5vcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyMi5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJbmV3IFRocmVhZCgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgc3RhcnQiKTsKLQkJCQkJCXRyeSB7IHNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge307Ci0JCQkJCQlwYXNzZWQgPSB0cnVlOwotCQkJCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkKLQkJCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgYXN5bmNleGVjIHNoZWxsLmNsb3NlIik7Ci0JCQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwuY2xvc2UoKTsJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIG92ZXIiKTsKLQkJCQkJfTsKLQkJCQl9LnN0YXJ0KCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyMS5zZXRVcmwodXJsKTsKLQkJCi0JCWJvb2xlYW4gdGltZW91dCA9IHJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgNjAwKTsKLQkJaWYgKHRpbWVvdXQpIHBhc3NlZCA9IGZhbHNlOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0Jc3RhdGljIGJvb2xlYW4gcnVuTG9vcFRpbWVyKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aW1lb3V0ID0ge2ZhbHNlfTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY29uZHM7IGkrKykgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkge30gCi0JCQkJdGltZW91dFswXSA9IHRydWU7Ci0JCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5yZWRyYXcoKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JCXdoaWxlICghdGltZW91dFswXSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJcmV0dXJuIHRpbWVvdXRbMF07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KCkgewotCQlpbnQgZmFpbCA9IDA7CQkKLQkJU3RyaW5nIHVybDsKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIlBMVUdJTl9QQVRIIik7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlBMVUdJTl9QQVRIIDwiK3BsdWdpblBhdGgrIj4iKTsKLQkJaWYgKHBsdWdpblBhdGggPT0gbnVsbCkgdXJsID0gQnJvd3NlcjMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgiYnJvd3NlcjMuaHRtbCIpLnRvU3RyaW5nKCk7Ci0JCWVsc2UgdXJsID0gcGx1Z2luUGF0aCArICIvZGF0YS9icm93c2VyMy5odG1sIjsKLQkJU3RyaW5nW10gdXJscyA9IHt1cmx9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdDEodXJsc1tpXSk7IAotCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnQocmVzdWx0ID8gIi4iIDogIkUiKTsKLQkJCWlmICghcmVzdWx0KSBmYWlsKys7IAotCQl9Ci0JCXJldHVybiBmYWlsID09IDA7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsJCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxyXG5UZXN0cyBGaW5pc2hlZC4gU1VDQ0VTUzogIit0ZXN0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NDgwY2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXI0IHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsJCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5XaW5kb3csIGxvY2F0aW9uQ2hhbmdpbmcsIGxvY2F0aW9uQ2hhbmdlZCwgdmlzaWJpbGl0eVNob3csIHByb2dyZXNzQ29tcGxldGVkLCBjbG9zZVdpbmRvdzsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDEoU3RyaW5nIHVybCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJqYXZhc2NyaXB0IHdpbmRvdy5vcGVuIC0gYXJnczogIit1cmwrIiBFeHBlY3RlZCBFdmVudCBTZXF1ZW5jZTogQnJvd3NlcjE6T3BlbldpbmRvdy5vcGVuID4geyBCcm93c2VyMjpMb2NhdGlvbi5jaGFuZ2luZywgQnJvd3NlcjI6VmlzaWJpbGl0eS5zaG93LCBCcm93c2VyMjpMb2NhdGlvbi5jaGFuZ2VkIH0gPiBCcm93c2VyMjpQcm9ncmVzcy5jb21wbGV0ZWQgPiBCcm93c2VyMi5DbG9zZVdpbmRvdy5jbG9zZSIpOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJbG9jYXRpb25DaGFuZ2luZyA9IGxvY2F0aW9uQ2hhbmdlZCA9IHByb2dyZXNzQ29tcGxldGVkID0gZmFsc2U7Ci0JCQkJCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjEgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlmaW5hbCBTaGVsbCBzaGVsbDIgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsMi5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjIgPSBuZXcgQnJvd3NlcihzaGVsbDIsIFNXVC5OT05FKTsKLQkJYnJvd3NlcjEuYWRkT3BlbldpbmRvd0xpc3RlbmVyKG5ldyBPcGVuV2luZG93TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBvcGVuKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJb3BlbldpbmRvdyA9IHRydWU7Ci0JCQkJQnJvd3NlciBzcmMgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJaWYgKHNyYyAhPSBicm93c2VyMSkgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gZXhwZWN0ZWQgIiticm93c2VyMSsiLCBnb3QgIitzcmMpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoZXZlbnQuYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBleHBlY3RlZCBudWxsLCBnb3QgIitldmVudC5icm93c2VyKTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZXZlbnQuYnJvd3NlciA9IGJyb3dzZXIyOwotCQkJfQotCQl9KTsKLQkJYnJvd3NlcjIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICghb3BlbldpbmRvdyB8fCAhbG9jYXRpb25DaGFuZ2luZykgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gTG9jYXRpb24uY2hhbmdpbmcgcmVjZWl2ZWQgYXQgd3JvbmcgdGltZSIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlsb2NhdGlvbkNoYW5nZWQgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICghb3BlbldpbmRvdykgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gTG9jYXRpb24uY2hhbmdpbmcgcmVjZWl2ZWQgYXQgd3JvbmcgdGltZSIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlsb2NhdGlvbkNoYW5naW5nID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihuZXcgVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBkaWQgbm90IGV4cGVjdCBWaXNpYmlsaXR5RXZlbnQuaGlkZSIpOwotCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzaG93KFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFvcGVuV2luZG93KSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBWaXNpYmlsaXR5LnNob3cgcmVjZWl2ZWQgYXQgd3JvbmcgdGltZSIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwkJCQkJCi0JCQkJfQotCQkJCXNoZWxsMi5vcGVuKCk7Ci0JCQkJdmlzaWJpbGl0eVNob3cgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYnJvd3NlcjIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCWlmICghbG9jYXRpb25DaGFuZ2luZyB8fCAhbG9jYXRpb25DaGFuZ2VkIHx8ICF2aXNpYmlsaXR5U2hvdykgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gUHJvZ3Jlc3MuY29tcGxldGVkIHJlY2VpdmVkIGF0IHdyb25nIHRpbWUiKTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJcHJvZ3Jlc3NDb21wbGV0ZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYnJvd3NlcjIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihuZXcgQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFwcm9ncmVzc0NvbXBsZXRlZCkgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gQ2xvc2VXaW5kb3cuY2xvc2UgcmVjZWl2ZWQgYXQgd3JvbmcgdGltZSIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQljbG9zZVdpbmRvdyA9IHRydWU7Ci0JCQkJZmluYWwgQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCVNoZWxsIHBhcmVudCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCQlwYXJlbnQuY2xvc2UoKTsKLQkJCQkKLQkJCQluZXcgVGhyZWFkKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBzdGFydCIpOwotCQkJCQkJdHJ5IHsgc2xlZXAoMjAwMCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fTsKLQkJCQkJCXBhc3NlZCA9IHRydWU7Ci0JCQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKQotCQkJCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBhc3luY2V4ZWMgc2hlbGwuY2xvc2UiKTsKLQkJCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5jbG9zZSgpOwkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgb3ZlciIpOwotCQkJCQl9OwotCQkJCX0uc3RhcnQoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIxLnNldFVybCh1cmwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlzdGF0aWMgYm9vbGVhbiBydW5Mb29wVGltZXIoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIHRpbWVvdXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vjb25kczsgaSsrKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCQl0aW1lb3V0WzBdID0gdHJ1ZTsKLQkJCQkvKiB3YWtlIHVwIHRoZSBldmVudCBsb29wICovCi0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCF0aW1lb3V0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQlyZXR1cm4gdGltZW91dFswXTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoKSB7Ci0JCWludCBmYWlsID0gMDsJCQotCQlTdHJpbmcgdXJsOwotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB1cmwgPSBCcm93c2VyNC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJicm93c2VyNC5odG1sIikudG9TdHJpbmcoKTsKLQkJZWxzZSB1cmwgPSBwbHVnaW5QYXRoICsgIi9kYXRhL2Jyb3dzZXI0Lmh0bWwiOwotCQlTdHJpbmdbXSB1cmxzID0ge3VybH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0MSh1cmxzW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiXHJcblRlc3RzIEZpbmlzaGVkLiBTVUNDRVNTOiAiK3Rlc3QoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI1LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlkODViNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlcjUgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwotCXN0YXRpYyBQb2ludFtdW10gcmVncmVzc2lvbkJvdW5kcyA9IHsKLQkJCQl7bmV3IFBvaW50KDEwLDIwMCksIG5ldyBQb2ludCgzMDAsMTAwKX0sCi0JCQkJe25ldyBQb2ludCgxMCwyMDApLCBudWxsfSwKLQkJCQl7bnVsbCwgbmV3IFBvaW50KDMwMCwxMDApfSwKLQkJCQl7bnVsbCwgbnVsbH19OwotCXN0YXRpYyBpbnQgaW5kZXggPSAwOwotCXN0YXRpYyBpbnQgY250UGFzc2VkID0gMDsKLQlzdGF0aWMgaW50IGNudENsb3NlZCA9IDA7Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QxKFN0cmluZyB1cmwpIHsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiamF2YXNjcmlwdCB3aW5kb3cub3BlbiB3aXRoIGxvY2F0aW9uIGFuZCBzaXplIHBhcmFtZXRlcnMgLSBhcmdzOiAiK3VybCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBWaXNpYmlsaXR5Lm9wZW4iKTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIuYWRkT3BlbldpbmRvd0xpc3RlbmVyKG5ldyBPcGVuV2luZG93TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBvcGVuKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiT3BlbldpbmRvdyAiK2luZGV4KTsKLQkJCQlTaGVsbCBuZXdTaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJCQluZXdTaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIobmV3U2hlbGwsIFNXVC5OT05FKTsKLQkJCQlicm93c2VyLnNldERhdGEoImluZGV4IiwgbmV3IEludGVnZXIoaW5kZXgpKTsKLQkJCQlicm93c2VyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihuZXcgVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoaWRlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJCX0KLQkJCQkJcHVibGljIHZvaWQgc2hvdyhXaW5kb3dFdmVudCBldmVudCkgewotCQkJCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCQkJU2hlbGwgcGFyZW50ID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJCQkJaWYgKGV2ZW50LmxvY2F0aW9uICE9IG51bGwpIHBhcmVudC5zZXRMb2NhdGlvbihldmVudC5sb2NhdGlvbik7Ci0JCQkJCQlpZiAoZXZlbnQuc2l6ZSAhPSBudWxsKSBwYXJlbnQuc2V0U2l6ZShldmVudC5zaXplKTsKLQkJCQkJCWludCBpbmRleCA9ICgoSW50ZWdlcilicm93c2VyLmdldERhdGEoImluZGV4IikpLmludFZhbHVlKCk7Ci0JCQkJCQlwYXJlbnQuc2V0VGV4dCgiU1dUIEJyb3dzZXIgc2hlbGwgIitpbmRleCk7Ci0JCQkJCQlwYXJlbnQub3BlbigpOwotCQkJCQkJaWYgKGluZGV4IDwgMCkgewotCQkJCQkJCS8qIENlcnRhaW4gYnJvd3NlcnMgZmlyZSBtdWx0aXBsZSBzaG93IGV2ZW50cyBmb3Igbm8gZ29vZCByZWFzb24uIEZ1cnRoZXIgc2hvdyBldmVudHMKLQkJCQkJCQkgKiBhcmUgY29uc2lkZXJlZCAnbGVnYWwnIGFzIGxvbmcgYXMgdGhleSBkb24ndCBjb250YWluIHNpemUgYW5kIGxvY2F0aW9uIGluZm9ybWF0aW9uLgotCQkJCQkJCSAqLwotCQkJCQkJCWlmIChldmVudC5sb2NhdGlvbiAhPSBudWxsIHx8IGV2ZW50LnNpemUgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gQnJvd3NlciAiK2luZGV4KyIgaXMgcmVjZWl2aW5nIG11bHRpcGxlIHNob3cgZXZlbnRzIik7Ci0JCQkJCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlVubmVjZXNzYXJ5IChidXQgaGFybWxlc3MpIHZpc2liaWxpdHkuc2hvdyBldmVudCBCcm93c2VyICIraW5kZXgpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYnJvd3Nlci5zZXREYXRhKCJpbmRleCIsIG5ldyBJbnRlZ2VyKC0xMDAtaW5kZXgpKTsKLQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJWaXNpYmlsaXR5LnNob3cgYnJvd3NlciAiK2luZGV4KyIgbG9jYXRpb24gIitldmVudC5sb2NhdGlvbisiIHNpemUgIitldmVudC5zaXplKTsKLQkJCQkJCQkvKiBDZXJ0YWluIGJyb3dzZXJzIGluY2x1ZGUgZGVjb3JhdGlvbnMgdG8gdGhlIGV4cGVjdGVkIHNpemUuIEFjY2VwdCBzaXplIHRoYXQgYXJlIGxhcmdlciBvciBlcXVhbCB0aGFuCi0JCQkJCQkJICogZXhwZWN0ZWQuIENlcnRhaW4gYnJvd3NlcnMgaW52ZW50IHNpemUgb3IgbG9jYXRpb24gd2hlbiBzb21lIHBhcmFtZXRlcnMgYXJlIG1pc3NpbmcuIElmIHdlIGV4cGVjdAotCQkJCQkJCSAqIG51bGwgZm9yIG9uZSBvZiBzaXplIG9yIGxvY2F0aW9uLCBhbHNvIGFjY2VwdCBub24gbnVsbCBhbnN3ZXJzLgotCQkJCQkJCSAqLwotCQkJCQkJCWJvb2xlYW4gY2hlY2tMb2NhdGlvbiA9IChldmVudC5sb2NhdGlvbiA9PSBudWxsICYmIHJlZ3Jlc3Npb25Cb3VuZHNbaW5kZXhdWzBdID09IG51bGwpIHx8Ci0JCQkJCQkJCShldmVudC5sb2NhdGlvbiAhPSBudWxsICYmIGV2ZW50LmxvY2F0aW9uLmVxdWFscyhyZWdyZXNzaW9uQm91bmRzW2luZGV4XVswXSkgfHwKLQkJCQkJCQkJKGV2ZW50LmxvY2F0aW9uICE9IG51bGwgJiYgcmVncmVzc2lvbkJvdW5kc1tpbmRleF1bMF0gPT0gbnVsbCkpOwotCQkJCQkJCWJvb2xlYW4gY2hlY2tTaXplICA9ICgoZXZlbnQuc2l6ZSA9PSBudWxsICYmIHJlZ3Jlc3Npb25Cb3VuZHNbaW5kZXhdWzFdID09IG51bGwpIHx8IAotCQkJCQkJCShldmVudC5zaXplICE9IG51bGwgJiYgZXZlbnQuc2l6ZS5lcXVhbHMocmVncmVzc2lvbkJvdW5kc1tpbmRleF1bMV0pKSB8fAotCQkJCQkJCShldmVudC5zaXplICE9IG51bGwgJiYgcmVncmVzc2lvbkJvdW5kc1tpbmRleF1bMV0gPT0gbnVsbCkgfHwKLQkJCQkJCQkoZXZlbnQuc2l6ZSAhPSBudWxsICYmIGV2ZW50LnNpemUueCA+PSByZWdyZXNzaW9uQm91bmRzW2luZGV4XVsxXS54ICYmIGV2ZW50LnNpemUueSA+PSByZWdyZXNzaW9uQm91bmRzW2luZGV4XVsxXS55KSk7Ci0JCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0ZWQgbG9jYXRpb24gIityZWdyZXNzaW9uQm91bmRzW2luZGV4XVswXSsiIHNpemUgIityZWdyZXNzaW9uQm91bmRzW2luZGV4XVsxXSk7Ci0JCQkJCQkJaWYgKCFjaGVja1NpemUgfHwgIWNoZWNrTG9jYXRpb24gfHwgKChldmVudC5zaXplICE9IG51bGwgfHwgZXZlbnQubG9jYXRpb24gIT0gbnVsbCkgJiYgcmVncmVzc2lvbkJvdW5kc1tpbmRleF1bMF0gPT0gbnVsbCAmJiByZWdyZXNzaW9uQm91bmRzW2luZGV4XVsxXSA9PSBudWxsKSkgewotCQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCIJRmFpbHVyZSAiKTsKLQkJCQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9IGVsc2UgY250UGFzc2VkKys7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicm93c2VyLmFkZENsb3NlV2luZG93TGlzdGVuZXIobmV3IENsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJCQljbnRDbG9zZWQrKzsKLQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkNsb3NlIik7Ci0JCQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJCQlicm93c2VyLmdldFNoZWxsKCkuY2xvc2UoKTsKLQkJCQkJCWlmIChjbnRQYXNzZWQgPT0gcmVncmVzc2lvbkJvdW5kcy5sZW5ndGgpIHBhc3NlZCA9IHRydWU7Ci0JCQkJCQlpZiAoY250Q2xvc2VkID09IHJlZ3Jlc3Npb25Cb3VuZHMubGVuZ3RoKSB7Ci0JCQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlldmVudC5icm93c2VyID0gYnJvd3NlcjsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9KTsKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCh1cmwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlzdGF0aWMgYm9vbGVhbiBydW5Mb29wVGltZXIoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIHRpbWVvdXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vjb25kczsgaSsrKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCQl0aW1lb3V0WzBdID0gdHJ1ZTsKLQkJCQkvKiB3YWtlIHVwIHRoZSBldmVudCBsb29wICovCi0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCF0aW1lb3V0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQlyZXR1cm4gdGltZW91dFswXTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoKSB7Ci0JCWludCBmYWlsID0gMDsJCQotCQlTdHJpbmcgdXJsOwotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB1cmwgPSBCcm93c2VyNS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJicm93c2VyNS5odG1sIikudG9TdHJpbmcoKTsKLQkJZWxzZSB1cmwgPSBwbHVnaW5QYXRoICsgIi9kYXRhL2Jyb3dzZXI1Lmh0bWwiOwotCQlTdHJpbmdbXSB1cmxzID0ge3VybH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0MSh1cmxzW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiXHJcblRlc3RzIEZpbmlzaGVkLiBTVUNDRVNTOiAiK3Rlc3QoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI2LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwZDNmMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlcjYgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwkKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDEoU3RyaW5nIHVybCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJVUkwgTG9hZGluZywgdmVyaWZ5IGdldCB0aXRsZSBldmVudCAtIGFyZ3M6ICIrdXJsKyIgRXhwZWN0ZWQgRXZlbnQgU2VxdWVuY2U6IFRpdGxlLmNoYW5nZWQiKTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIuYWRkVGl0bGVMaXN0ZW5lcihuZXcgVGl0bGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoVGl0bGVFdmVudCBldmVudCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCQlTdHJpbmcgdXJsID0gYnJvd3Nlci5nZXRVcmwoKTsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJUaXRsZSBjaGFuZ2VkIDwiK2V2ZW50LnRpdGxlKyI+IGZvciBsb2NhdGlvbiA8Iit1cmwrIj4iKTsKLQkJCQlwYXNzZWQgPSB0cnVlOwotCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCh1cmwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDIoU3RyaW5nIHVybCwgZmluYWwgU3RyaW5nIGV4cGVjdGVkVGl0bGUpIHsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiVVJMIExvYWRpbmcsIHZlcmlmeSBnZXQgdGl0bGUgZXZlbnQgLSBhcmdzOiAiK3VybCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBUaXRsZS5jaGFuZ2VkIik7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQkKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyKG5ldyBUaXRsZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChUaXRsZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCVN0cmluZyB1cmwgPSBicm93c2VyLmdldFVybCgpOwotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlRpdGxlIGNoYW5nZWQgPCIrZXZlbnQudGl0bGUrIj4gZm9yIGxvY2F0aW9uIDwiK3VybCsiPiIpOwotCQkJCWlmIChldmVudC50aXRsZS5lcXVhbHMoZXhwZWN0ZWRUaXRsZSkpIHsKLQkJCQkJcGFzc2VkID0gdHJ1ZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRVcmwodXJsKTsKLQkJCi0JCWJvb2xlYW4gdGltZW91dCA9IHJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgNjAwKTsKLQkJaWYgKHRpbWVvdXQpIHBhc3NlZCA9IGZhbHNlOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0Jc3RhdGljIGJvb2xlYW4gcnVuTG9vcFRpbWVyKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aW1lb3V0ID0ge2ZhbHNlfTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY29uZHM7IGkrKykgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkge30gCi0JCQkJdGltZW91dFswXSA9IHRydWU7Ci0JCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5yZWRyYXcoKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JCXdoaWxlICghdGltZW91dFswXSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJcmV0dXJuIHRpbWVvdXRbMF07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KCkgewotCQlpbnQgZmFpbCA9IDA7Ci0JCQotCQlTdHJpbmdbXSB1cmxzID0geyJodHRwOi8vd3d3Lmdvb2dsZS5jb20ifTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRlc3QxKHVybHNbaV0pOyAKLQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQlpZiAoIXJlc3VsdCkgZmFpbCsrOyAKLQkJfQotCQkKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIlBMVUdJTl9QQVRIIik7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlBMVUdJTl9QQVRIIDwiK3BsdWdpblBhdGgrIj4iKTsKLQkJU3RyaW5nIHVybDsKLQkJaWYgKHBsdWdpblBhdGggPT0gbnVsbCkgdXJsID0gQnJvd3NlcjYuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgiYnJvd3NlcjYuaHRtbCIpLnRvU3RyaW5nKCk7Ci0JCWVsc2UgdXJsID0gcGx1Z2luUGF0aCArICIvZGF0YS9icm93c2VyNi5odG1sIjsKLQkJdXJscyA9IG5ldyBTdHJpbmdbXSB7dXJsfTsKLQkJU3RyaW5nW10gdGl0bGVzID0geyJUaGlzIGlzIGEgdGVzdCB0aXRsZSB0aGF0IG11c3QgYmUgY2FyZWZ1bGx5IGNoZWNrZWQgd2hlbiB0aGF0IHBhZ2UgaXMgbG9hZGVkIn07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0Mih1cmxzW2ldLCB0aXRsZXNbaV0pOyAKLQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQlpZiAoIXJlc3VsdCkgZmFpbCsrOyAKLQkJfQotCQkKLQkJCi0JCXJldHVybiBmYWlsID09IDA7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcclxuVGVzdHMgRmluaXNoZWQuIFNVQ0NFU1M6ICIrdGVzdCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjcuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTBjMWMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyNyB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGFzc2VkID0gZmFsc2U7CQotCQotCXN0YXRpYyBpbnQgY250T3BlbiA9IDA7Ci0Jc3RhdGljIGludCBjbnRTaG93ID0gMDsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdChTdHJpbmcgdXJsKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIndpbmRvdy5vcGVuLCB2ZXJpZnkgZ2V0IFdpbmRvdy5vcGVuIGFuZCBXaW5kb3cuc2hvdyBldmVudHMgLSBhcmdzOiAiK3VybCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBXaW5kb3cub3BlbiwgV2luZG93LnNob3cgbXVsdGlwbGUgdGltZXMiKTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCQotCQljbnRPcGVuID0gMDsKLQkJY250U2hvdyA9IDA7Ci0JCQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlpbml0aWFsaXplKGRpc3BsYXksIGJyb3dzZXIpOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCh1cmwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCAxMCk7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIldpbmRvdyBvcGVuZWQ6ICIrY250T3BlbisiIFdpbmRvdyBzaG93bjogIitjbnRTaG93KTsKLQkJLyoKLQkJICogQnVnIGluIE1vemlsbGEuIE11bHRpcGxlIHNob3cgZXZlbnRzIGFyZSBmaXJlZCBieSBNb3ppbGxhLgotCQkgKi8KLQkJaWYgKHRpbWVvdXQpIHBhc3NlZCA9IGNudE9wZW4gPT0gNCAmJiBjbnRTaG93ID49IDQ7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQotCXN0YXRpYyB2b2lkIGluaXRpYWxpemUoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBCcm93c2VyIGJyb3dzZXIpIHsKLQkJYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIub3BlbiIpOwotCQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJCXNoZWxsLnNldFRleHQoIk5ldyBXaW5kb3ciKTsKLQkJCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJCQlpbml0aWFsaXplKGRpc3BsYXksIGJyb3dzZXIpOwotCQkJCWV2ZW50LmJyb3dzZXIgPSBicm93c2VyOwotCQkJCWNudE9wZW4rKzsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoaWRlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCVNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2hvdyhXaW5kb3dFdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lci5zaG93IGxvY2F0aW9uPSIrZXZlbnQubG9jYXRpb24rIiBzaXplPSIrZXZlbnQuc2l6ZSsiIGFkZHJlc3NCYXI9IitldmVudC5hZGRyZXNzQmFyKyIgbWVudUJhcj0iK2V2ZW50Lm1lbnVCYXIrIiBzdGF0dXNCYXI9IitldmVudC5zdGF0dXNCYXIrIiB0b29sQmFyPSIrZXZlbnQudG9vbEJhcik7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCVNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJCWlmIChldmVudC5sb2NhdGlvbiAhPSBudWxsKSBzaGVsbC5zZXRMb2NhdGlvbihldmVudC5sb2NhdGlvbik7Ci0JCQkJaWYgKGV2ZW50LnNpemUgIT0gbnVsbCkgewotCQkJCQlQb2ludCBzaXplID0gZXZlbnQuc2l6ZTsKLQkJCQkJc2hlbGwuc2V0U2l6ZShzaGVsbC5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSkpOwotCQkJCX0KLQkJCQljbnRTaG93Kys7Ci0JCQkJc2hlbGwub3BlbigpOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRDbG9zZVdpbmRvd0xpc3RlbmVyKG5ldyBDbG9zZVdpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2xvc2UoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJU2hlbGwgc2hlbGwgPSBicm93c2VyLmdldFNoZWxsKCk7Ci0JCQkJc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci19Ci0JIAotCXN0YXRpYyBib29sZWFuIHJ1bkxvb3BUaW1lcihmaW5hbCBEaXNwbGF5IGRpc3BsYXksIGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBpbnQgc2Vjb25kcykgewotCQlmaW5hbCBib29sZWFuW10gdGltZW91dCA9IHtmYWxzZX07Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWNvbmRzOyBpKyspIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQkJCXRpbWVvdXRbMF0gPSB0cnVlOwotCQkJCS8qIHdha2UgdXAgdGhlIGV2ZW50IGxvb3AgKi8KLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQl3aGlsZSAoIXRpbWVvdXRbMF0gJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCXJldHVybiB0aW1lb3V0WzBdOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdCgpIHsKLQkJaW50IGZhaWwgPSAwOwotCQkJCQotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCQlTdHJpbmcgdXJsOwotCQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB1cmwgPSBCcm93c2VyNy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJicm93c2VyNy5odG1sIikudG9TdHJpbmcoKTsKLQkJZWxzZSB1cmwgPSBwbHVnaW5QYXRoICsgIi9kYXRhL2Jyb3dzZXI3Lmh0bWwiOwotCQlTdHJpbmdbXSB1cmxzID0gbmV3IFN0cmluZ1tdIHt1cmx9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdCh1cmxzW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxyXG5UZXN0cyBGaW5pc2hlZC4gU1VDQ0VTUzogIit0ZXN0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyOC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZjlmNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXI4IHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsJCi0JCi0Jc3RhdGljIFN0cmluZyBodG1sW10gPSB7IjxodG1sPjx0aXRsZT5TbmlwcGV0PC90aXRsZT48Ym9keT48cCBpZD0nbXlpZCc+QmVzdCBGcmllbmRzPC9wPjxwIGlkPSdteWlkMic+Q2F0IGFuZCBEb2c8L3A+PC9ib2R5PjwvaHRtbD4ifTsKLQlzdGF0aWMgU3RyaW5nIHNjcmlwdFtdID0gewotCQkidmFyIG5ld05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdQJyk7IFxyXG4iKwotCQkidmFyIHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnQXQgbGVhc3Qgd2hlbiBJIGFtIGFyb3VuZCcpO1xyXG4iKwotCQkibmV3Tm9kZS5hcHBlbmRDaGlsZCh0ZXh0KTtcclxuIisKLQkJImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteWlkJykuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XHJcbiIrCi0JCSJcclxuIisKLQkJImRvY3VtZW50LmJnQ29sb3I9J3llbGxvdyc7In07Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoZmluYWwgaW50IGluZGV4KSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkphdmFzY3JpcHQgLSB2ZXJpZnkgZXhlY3V0ZSgpIHdvcmtzIG9uIEhUTUwgcmVuZGVyZWQgZnJvbSBtZW1vcnkgd2l0aCBnZXRUZXh0IC0gc2NyaXB0IGluZGV4ICIraW5kZXgpOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQlwYXNzZWQgPSBicm93c2VyLmV4ZWN1dGUoc2NyaXB0W2luZGV4XSk7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIuc2V0VGV4dChodG1sW2luZGV4XSk7Ci0JCQotCQlydW5Mb29wVGltZXIoZGlzcGxheSwgc2hlbGwsIDEwKTsKLQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JIAotCXN0YXRpYyBib29sZWFuIHJ1bkxvb3BUaW1lcihmaW5hbCBEaXNwbGF5IGRpc3BsYXksIGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBpbnQgc2Vjb25kcykgewotCQlmaW5hbCBib29sZWFuW10gdGltZW91dCA9IHtmYWxzZX07Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWNvbmRzOyBpKyspIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQkJCXRpbWVvdXRbMF0gPSB0cnVlOwotCQkJCS8qIHdha2UgdXAgdGhlIGV2ZW50IGxvb3AgKi8KLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQl3aGlsZSAoIXRpbWVvdXRbMF0gJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCXJldHVybiB0aW1lb3V0WzBdOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdCgpIHsKLQkJaW50IGZhaWwgPSAwOwotCQkJCQotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCQlTdHJpbmcgdXJsOwotCQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB1cmwgPSBCcm93c2VyOC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJicm93c2VyNy5odG1sIikudG9TdHJpbmcoKTsKLQkJZWxzZSB1cmwgPSBwbHVnaW5QYXRoICsgIi9kYXRhL2Jyb3dzZXI3Lmh0bWwiOwotCQlTdHJpbmdbXSB1cmxzID0gbmV3IFN0cmluZ1tdIHt1cmx9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdChpKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxyXG5UZXN0cyBGaW5pc2hlZC4gU1VDQ0VTUzogIit0ZXN0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyOS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZTRiMGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXI5IHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsJCi0JCi0Jc3RhdGljIFN0cmluZyBodG1sW10gPSB7ImJyb3dzZXI5Lmh0bWwifTsKLQlzdGF0aWMgU3RyaW5nIHNjcmlwdFtdID0gewotCQkiY2hhbmdlU3RhdHVzKCduZXcgdGl0bGUnKTsifTsKLQlzdGF0aWMgU3RyaW5nIHN0YXR1c1tdID0geyJuZXcgdGl0bGUifTsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdChTdHJpbmcgdXJsLCBmaW5hbCBTdHJpbmcgc2NyaXB0LCBmaW5hbCBTdHJpbmcgc3RhdHVzKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkphdmFzY3JpcHQgLSB2ZXJpZnkgZXhlY3V0ZSgiK3NjcmlwdCsiKSB3b3JrcyBvbiBhIHN0YXRpYyBIVE1MIGZpbGUgIit1cmwpOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoU3RhdHVzVGV4dEV2ZW50IGV2ZW50KSB7Ci0JCQkJYnJvd3Nlci5zZXREYXRhKCJxdWVyeSIsIGV2ZW50LnRleHQpOwotCQl9fSk7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQlib29sZWFuIHJlc3VsdCA9IGJyb3dzZXIuZXhlY3V0ZShzY3JpcHQpOwotCQkJCWlmICghcmVzdWx0KSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImV4ZWN1dGUgZmFpbGVkIGZvciAiK3NjcmlwdCk7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCS8qIFNjcmlwdCBtYXkgYWRkaXRpb25hbGx5IHNldCB0aGUgU3RhdHVzIHZhbHVlICovCi0JCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZylicm93c2VyLmdldERhdGEoInF1ZXJ5Iik7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigid2luZG93LnN0YXR1cyBhZnRlciBzY3JpcHQ6ICIrdmFsdWUpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJCQlwYXNzZWQgPSBzdGF0dXMuZXF1YWxzKHZhbHVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gZXhwZWN0ZWQgIitzY3JpcHQrIiwgbm90ICIrdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRVcmwodXJsKTsKLQkJCi0JCXJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgMTApOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JIAotCXN0YXRpYyBib29sZWFuIHJ1bkxvb3BUaW1lcihmaW5hbCBEaXNwbGF5IGRpc3BsYXksIGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBpbnQgc2Vjb25kcykgewotCQlmaW5hbCBib29sZWFuW10gdGltZW91dCA9IHtmYWxzZX07Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWNvbmRzOyBpKyspIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQkJCXRpbWVvdXRbMF0gPSB0cnVlOwotCQkJCS8qIHdha2UgdXAgdGhlIGV2ZW50IGxvb3AgKi8KLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQl3aGlsZSAoIXRpbWVvdXRbMF0gJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCXJldHVybiB0aW1lb3V0WzBdOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdCgpIHsKLQkJaW50IGZhaWwgPSAwOwotCQkJCQotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCQlTdHJpbmcgdXJsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGh0bWwubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwbHVnaW5QYXRoID09IG51bGwpIHVybCA9IEJyb3dzZXI5LmNsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoaHRtbFtpXSkudG9TdHJpbmcoKTsKLQkJCWVsc2UgdXJsID0gcGx1Z2luUGF0aCArICIvZGF0YS8iK2h0bWxbaV07Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRlc3QodXJsLCBzY3JpcHRbaV0sIHN0YXR1c1tpXSk7IAotCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnQocmVzdWx0ID8gIi4iIDogIkUiKTsKLQkJCWlmICghcmVzdWx0KSBmYWlsKys7IAotCQl9Ci0JCXJldHVybiBmYWlsID09IDA7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcclxuVGVzdHMgRmluaXNoZWQuIFNVQ0NFU1M6ICIrdGVzdCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvVGVzdF9Ccm93c2VyU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9UZXN0X0Jyb3dzZXJTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTY2M2IxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9UZXN0X0Jyb3dzZXJTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3NlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuU3RhdHVzVGV4dExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X0Jyb3dzZXJTdWl0ZSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCi1wdWJsaWMgVGVzdF9Ccm93c2VyU3VpdGUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIEJyb3dzZXIxKCkgewotCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIEJyb3dzZXIxICoqIik7Ci0JYm9vbGVhbiByZXN1bHQgPSBCcm93c2VyMS50ZXN0KCk7Ci0JYXNzZXJ0VHJ1ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCBCcm93c2VyMigpIHsKLQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCIqKiBCcm93c2VyMiAqKiIpOwotCWJvb2xlYW4gcmVzdWx0ID0gQnJvd3NlcjIudGVzdCgpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgQnJvd3NlcjMoKSB7Ci0JaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiKiogQnJvd3NlcjMgKioiKTsKLQlib29sZWFuIHJlc3VsdCA9IEJyb3dzZXIzLnRlc3QoKTsKLQlhc3NlcnRUcnVlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIEJyb3dzZXI0KCkgewotCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIEJyb3dzZXI0ICoqIik7Ci0JYm9vbGVhbiByZXN1bHQgPSBCcm93c2VyNC50ZXN0KCk7Ci0JYXNzZXJ0VHJ1ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCBCcm93c2VyNSgpIHsKLQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCIqKiBCcm93c2VyNSAqKiIpOwotCWJvb2xlYW4gcmVzdWx0ID0gQnJvd3NlcjUudGVzdCgpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgQnJvd3NlcjYoKSB7Ci0JaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiKiogQnJvd3NlcjYgKioiKTsKLQlib29sZWFuIHJlc3VsdCA9IEJyb3dzZXI2LnRlc3QoKTsKLQlhc3NlcnRUcnVlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIEJyb3dzZXI3KCkgewotCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIEJyb3dzZXI3ICoqIik7Ci0JYm9vbGVhbiByZXN1bHQgPSBCcm93c2VyNy50ZXN0KCk7Ci0JYXNzZXJ0VHJ1ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCBCcm93c2VyOCgpIHsKLQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCIqKiBCcm93c2VyOCAqKiIpOwotCWJvb2xlYW4gcmVzdWx0ID0gQnJvd3NlcjgudGVzdCgpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgQnJvd3NlcjkoKSB7Ci0JaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiKiogQnJvd3NlcjkgKioiKTsKLQlib29sZWFuIHJlc3VsdCA9IEJyb3dzZXI5LnRlc3QoKTsKLQlhc3NlcnRUcnVlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RfQnJvd3NlclN1aXRlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoIkJyb3dzZXIxIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgiQnJvd3NlcjIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJCcm93c2VyMyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoIkJyb3dzZXI0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgiQnJvd3NlcjUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJCcm93c2VyNiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoIkJyb3dzZXI3Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgiQnJvd3NlcjgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJCcm93c2VyOSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCS8qCi0JICogVGhlIHRlc3RzIGluIHRoaXMgc3VpdGUgbWFuYWdlIHRoZWlyIG93biBEaXNwbGF5IGFuZCBldmVudCBsb29wCi0JICogdG8gdmFsaWRhdGUgYXN5bmNocm9ub3VzIHVzZSBjYXNlcy4KLQkgKiBEaXNwb3NlIGFueSBwcmV2aW91c2x5IGV4aXN0aW5nIGRpc3BsYXkgZm9yIHRoZSBjYWxsaW5nIHRocmVhZAotCSAqIGJlZm9yZSBzdGFydGluZyB0aGUgdGVzdHMuCi0JICovCi0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JaWYgKGRpc3BsYXkgIT0gbnVsbCkgZGlzcGxheS5kaXNwb3NlKCk7Ci0JCi0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXIxIikpIEJyb3dzZXIxKCk7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXIyIikpIEJyb3dzZXIyKCk7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXIzIikpIEJyb3dzZXIzKCk7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXI0IikpIEJyb3dzZXI0KCk7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXI1IikpIEJyb3dzZXI1KCk7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXI2IikpIEJyb3dzZXI2KCk7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXI3IikpIEJyb3dzZXI3KCk7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXI4IikpIEJyb3dzZXI4KCk7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXI5IikpIEJyb3dzZXI5KCk7Ci0KLQkvKgotCSAqIEVuc3VyZSB3ZSBkb24ndCBsZWF2ZSBhIERpc3BsYXkgZnJvbSB0aGUgdGVzdHMgd2UgcnVuLgotCSAqLwkKLQlkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JaWYgKGRpc3BsYXkgIT0gbnVsbCkgZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQuYm1wIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxZDNhYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZGM4ZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LmdpZgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUdJRjg3YRIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQuanBnIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwMTlkYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQuanBnCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAot/9j/ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODYwYWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdEJhZEJpdERlcHRoLnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdEJhZEJpdERlcHRoLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQzY2I5MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHRCYWRCaXREZXB0aC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2VtcHR5LnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZW1wdHkudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZW1wdHkudHh0CisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLmJtcCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0MzUxZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMTdjNzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIuanBnIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODcwMTcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmMmRjMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4uYm1wIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhMTIxNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4uYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODg2YmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5qcGcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWY4ODgyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4ucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzNmQ2Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9pbnRlcmxhY2VkX3RhcmdldC5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ludGVybGFjZWRfdGFyZ2V0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0NzQ1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ludGVybGFjZWRfdGFyZ2V0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvanVuaXRHZW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvanVuaXRHZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlMDkxZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2p1bml0R2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi0vKioKLSAqIENyZWF0ZSBTV1QgSnVuaXQgc3R1YnMgYmFzZWQgb24gYSBzd3QgamFyIHVzZWQgYXMgYSByZWZlcmVuY2UKLSAqIENvbW1hbmQgbGluZSB0b29sIC0gcnVuIHdpdGhvdXQgcGFyYW1ldGVycyB0byBnZXQgaGVscCBpbmZvcm1hdGlvbgotICovCi1wdWJsaWMgY2xhc3MganVuaXRHZW4gewotCVN0cmluZyBkZXN0Rm9sZGVyID0gbnVsbDsKLQlpbnQgY291bnRlciA9IDA7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGphcmZpbGUgdGhlIHVybCBvZiBhIGphciBmaWxlCi0JICogQHJldHVybiBhbGwgcHVibGljIGNsYXNzZXMgaW4gdGhlIGphcgotCSAqLwotCXB1YmxpYyBWZWN0b3IgZ2V0Q2xhc3NlcyhTdHJpbmcgamFyZmlsZSkgewotCQlWZWN0b3IgdmVjdG9yID0gbmV3IFZlY3RvcigpOwotCQl0cnkgewotCQkJWmlwRmlsZSB6aXBGaWxlID0gbmV3IFppcEZpbGUoamFyZmlsZSk7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShqYXJmaWxlKTsKLQkJCVVSTCB1cmwgPSBmaWxlLnRvVVJMKCk7Ci0JCQlDbGFzc0xvYWRlciBsb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFtdIHsgdXJsIH0pOwotCi0JCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gemlwRmlsZS5lbnRyaWVzKCk7Ci0JCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KWVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLQkJCQlpZiAobmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKLQkJCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSAiLmNsYXNzIi5sZW5ndGgoKSk7Ci0JCQkJCW5hbWUgPSBuYW1lLnJlcGxhY2UoJy8nLCAnLicpOwotCQkJCQlDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUobmFtZSwgZmFsc2UsIGxvYWRlcik7Ci0JCQkJCWlmIChmaWx0ZXJDbGFzcyhjbGF6eikpIHZlY3Rvci5hZGQoY2xhenopOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uICIgKyBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB2ZWN0b3I7Ci0JfQotCS8qKgotCSAqIENyZWF0ZSBhIEp1bml0IGphdmEgdGVzdCBmaWxlCi0JICogQHBhcmFtIGNsYXp6IGNsYXNzIHRvIGNyZWF0ZSB0aGUgdGVzdCBmb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWxlVGVzdChDbGFzcyBjbGF6eikgewotCQl0cnkgewotCQkJU3RyaW5nIG5hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCQkJbmFtZSA9IGRlc3RGb2xkZXIgKyAiLyIgKyBuYW1lICsgIi5qYXZhIjsKLQkJCUZpbGVXcml0ZXIgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIobmFtZSk7Ci0JCQljcmVhdGVTd3RUZXN0KHdyaXRlciwgY2xhenopOwotCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiAiICsgZSk7Ci0JCX0KLQkJCi0JfQotCi0Jdm9pZCBjcmVhdGVTd3RUZXN0KEZpbGVXcml0ZXIgd3JpdGVyLCBDbGFzcyBjbGF6eikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3d0VGVzdCB0ZXN0ID0gbmV3IFN3dFRlc3Qod3JpdGVyLCBjbGF6eik7Ci0JCXRlc3Qud3JpdGVDb3B5UmlnaHRzKCk7Ci0JCXRlc3Qud3JpdGVQYWNrYWdlKCk7Ci0JCXRlc3QubmV3TGluZSgpOwotCQl0ZXN0LndyaXRlSW1wb3J0cygpOwotCQl0ZXN0Lm5ld0xpbmUoKTsKLQkJdGVzdC53cml0ZUNsYXNzQ29tbWVudHMoKTsKLQkJdGVzdC53cml0ZUNsYXNzRGVjbGFyYXRpb24oKTsKLQkJdGVzdC5uZXdMaW5lKCk7Ci0JCXRlc3Qud3JpdGVDb25zdHJ1Y3RvcigpOwkJCi0JCXRlc3QubmV3TGluZSgpOwotCQl0ZXN0LndyaXRlTWFpbigpOwotCQl0ZXN0Lm5ld0xpbmUoKTsKLQkJdGVzdC53cml0ZVNldFVwKCk7Ci0JCXRlc3QubmV3TGluZSgpOwotCQl0ZXN0LndyaXRlVGVhckRvd24oKTsKLQkJdGVzdC5uZXdMaW5lKCk7Ci0JCXRlc3Qud3JpdGVNZXRob2RzKCk7Ci0JCXRlc3QubmV3TGluZSgpOwotCQl0ZXN0LndyaXRlU3VpdGUoKTsKLQkJdGVzdC5uZXdMaW5lKCk7Ci0JCXRlc3Qud3JpdGVNZXRob2ROYW1lcygpOwotCQl0ZXN0Lm5ld0xpbmUoKTsKLQkJdGVzdC53cml0ZVJ1blRlc3QoKTsKLQkJdGVzdC53cml0ZUNsYXNzQ2xvc3VyZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvbkZvbGRlcihTdHJpbmcgZGVzdCkgewotCQlkZXN0Rm9sZGVyID0gZGVzdDsJCi0JfQotCi0JcHVibGljIHZvaWQgaW5jcmVtZW50Q291bnRlcigpIHsKLQkJY291bnRlcisrOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldENvdW50ZXIoKSB7Ci0JCXJldHVybiBjb3VudGVyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlVGVzdHMoU3RyaW5nIGphcmZpbGUsIFN0cmluZyBkZXN0Rm9sZGVyKSB7Ci0JCWp1bml0R2VuIGdlbiA9IG5ldyBqdW5pdEdlbigpOwotCQlWZWN0b3IgY2xhc3NlcyA9IGdlbi5nZXRDbGFzc2VzKGphcmZpbGUpOwotCQlnZW4uc2V0RGVzdGluYXRpb25Gb2xkZXIoZGVzdEZvbGRlcik7Ci0JCWlmIChjbGFzc2VzID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gY2xhc3NlcyBmb3VuZC4iKTsKLQkJCXJldHVybjsKLQkJfQotCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gY2xhc3Nlcy5lbGVtZW50cygpOwotCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZ2VuLmNyZWF0ZUZpbGVUZXN0KChDbGFzcyllbnRyaWVzLm5leHRFbGVtZW50KCkpOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBzdHVicyB3cml0dGVuOiAiICsgZ2VuLmdldENvdW50ZXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlmZihWZWN0b3Igb2xkQ2xhc3NlcywgVmVjdG9yIG5ld0NsYXNzZXMpIHsKLQkJU3d0RGlmZiBkaWZmID0gbmV3IFN3dERpZmYob2xkQ2xhc3NlcywgbmV3Q2xhc3Nlcyk7Ci0JCWRpZmYuY29tcHV0ZSgpOwkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaWZmVGVzdHMoU3RyaW5nIGphcmZpbGVPbGQsIFN0cmluZyBqYXJmaWxlTmV3KSB7Ci0JCWp1bml0R2VuIGdlbiA9IG5ldyBqdW5pdEdlbigpOwotCQlWZWN0b3Igb2xkQ2xhc3NlcyA9IGdlbi5nZXRDbGFzc2VzKGphcmZpbGVPbGQpOwotCQlpZiAob2xkQ2xhc3NlcyA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGNsYXNzZXMgZm91bmQgaW4gb2xkIGphciIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVZlY3RvciBuZXdDbGFzc2VzID0gZ2VuLmdldENsYXNzZXMoamFyZmlsZU5ldyk7Ci0JCWlmIChuZXdDbGFzc2VzID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gY2xhc3NlcyBmb3VuZCBpbiBuZXcgamFyIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZ2VuLmRpZmYob2xkQ2xhc3NlcywgbmV3Q2xhc3Nlcyk7CQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaWYgKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmxlbmd0aCA8IDMpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGphdmEganVuaXRHZW4gZmxhZyBhcmcxIGFyZzIgLi4uIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiB3aGVyZSBmbGFnIGlzIG9uZSBvZjoiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlOiBjcmVhdGUgdGhlIGp1bml0IHRlc3Qgc3R1YnMiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIGFyZzE6IHNvdXJjZSBqYXIgZS5nLiBkOi9zd3QuamFyIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICBhcmcyOiBkZXN0aW5hdGlvbiBlLmcuIGQ6L3Rlc3RzIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImRpZmY6ICAgZGlmZiAyIGphcnMgc2hvd2luZyB3aGljaCB0ZXN0cyBtdXN0IGJlIHJlbW92ZWQsIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgYW5kIGFkZGVkIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICBhcmcxOiBvbGQgamFyIGUuZy4gZDovb2xkL3N3dC5qYXIiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIGFyZzI6IG5ldyBqYXIgZS5nLiBkOi9uZXcvc3d0LmphciIpOwkKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoYXJnc1swXS5lcXVhbHMoImNyZWF0ZSIpKSBjcmVhdGVUZXN0cyhhcmdzWzFdLCBhcmdzWzJdKTsKLQkJZWxzZSBpZiAoYXJnc1swXS5lcXVhbHMoImRpZmYiKSkgZGlmZlRlc3RzKGFyZ3NbMV0sIGFyZ3NbMl0pOwotCX0KLQkKLQlib29sZWFuIGZpbHRlckNsYXNzKENsYXNzIGNsYXp6KSB7Ci0JCS8qIEpVbml0IHRlc3RzIGZvciBwdWJsaWMgY2xhc3NlcyBvbmx5ICovCi0JCWludCBtb2RpZmllcnMgPSBjbGF6ei5nZXRNb2RpZmllcnMoKTsKLQkJaWYgKCFNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpKSByZXR1cm4gZmFsc2U7Ci0KLQkJLyogSlVuaXQgdGVzdHMgZm9yIGNsYXNzZXMgd2hpY2ggYXJlIG5vdCBwYXJ0IG9mIGFuIGludGVybmFsIHBhY2thZ2UgKi8KLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gY2xhenouZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKLQkJaWYgKHBhY2thZ2VOYW1lLmluZGV4T2YoImludGVybmFsIikgIT0gLTEpIHJldHVybiBmYWxzZTsKLQotCQkvKiBKVW5pdCB0ZXN0cyBmb3IgY2xhc3NlcyB3aXRoIHB1YmxpYyBjb25zdHJ1Y3RvcnMgb3IgcHVibGljIG1ldGhvZHMgKi8KLQkJQ29uc3RydWN0b3JbXSBjb25zdHJ1Y3RvcnMgPSBnZXRGaWx0ZXJlZENvbnN0cnVjdG9ycyhjbGF6eik7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBnZXRGaWx0ZXJlZE1ldGhvZHMoY2xhenopOwotCQlpZiAoY29uc3RydWN0b3JzLmxlbmd0aCA9PSAwICYmIG1ldGhvZHMubGVuZ3RoID09IDApIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JU3RyaW5nIGdldENsYXNzTmFtZShDbGFzcyBjbGF6eikgewotCQlTdHJpbmcgbmFtZSA9IGNsYXp6LmdldE5hbWUoKTsKLQkJbmFtZSA9ICJUZXN0XyIgKyBuYW1lLnJlcGxhY2UoJy4nLCAnXycpOwotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0TWV0aG9kTmFtZShDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgewotCQlTdHJpbmcgbmFtZSA9ICJ0ZXN0X0NvbnN0cnVjdG9yIjsKLQkJQ2xhc3NbXSBwYXJhbWV0ZXJzID0gY29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQluYW1lICs9IGdldFR5cGVTaWduYXR1cmUocGFyYW1ldGVyc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JU3RyaW5nIGdldE1ldGhvZE5hbWUoTWV0aG9kIG1ldGhvZCkgewotCQlTdHJpbmcgbmFtZSA9ICJ0ZXN0XyIgKyBtZXRob2QuZ2V0TmFtZSgpOwotCQlDbGFzc1tdIHBhcmFtZXRlcnMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQluYW1lICs9IGdldFR5cGVTaWduYXR1cmUocGFyYW1ldGVyc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQkKLQlTdHJpbmcgZ2V0VHlwZVNpZ25hdHVyZShDbGFzcyBjbGF6eikgewotCQlpZiAoY2xhenogPT0gSW50ZWdlci5UWVBFKSByZXR1cm4gIkkiOwotCQlpZiAoY2xhenogPT0gQm9vbGVhbi5UWVBFKSByZXR1cm4gIloiOwotCQlpZiAoY2xhenogPT0gTG9uZy5UWVBFKSByZXR1cm4gIkoiOwotCQlpZiAoY2xhenogPT0gU2hvcnQuVFlQRSkgcmV0dXJuICJTIjsKLQkJaWYgKGNsYXp6ID09IENoYXJhY3Rlci5UWVBFKSByZXR1cm4gIkMiOwotCQlpZiAoY2xhenogPT0gQnl0ZS5UWVBFKSByZXR1cm4gIkIiOwotCQlpZiAoY2xhenogPT0gRmxvYXQuVFlQRSkgcmV0dXJuICJGIjsKLQkJaWYgKGNsYXp6ID09IERvdWJsZS5UWVBFKSByZXR1cm4gIkQiOwotCQlpZiAoY2xhenouaXNBcnJheSgpKSB7Ci0JCQlDbGFzcyBjb21wb25lbnRUeXBlID0gY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJcmV0dXJuICIkIiArIGdldFR5cGVTaWduYXR1cmUoY29tcG9uZW50VHlwZSk7Ci0JCX0KLQkJcmV0dXJuICJMIiArIGNsYXp6LmdldE5hbWUoKS5yZXBsYWNlKCcuJywgJ18nKTsKLQl9Ci0KLQlDb25zdHJ1Y3RvcltdIGdldEZpbHRlcmVkQ29uc3RydWN0b3JzKENsYXNzIGNsYXp6KSB7Ci0JCUNvbnN0cnVjdG9yW10gY29uc3RydWN0b3JzID0gY2xhenouZ2V0Q29uc3RydWN0b3JzKCk7Ci0JCUFycmF5cy5zb3J0KGNvbnN0cnVjdG9ycywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQkJcmV0dXJuIChnZXRNZXRob2ROYW1lKChDb25zdHJ1Y3RvcilhKS5jb21wYXJlVG8oZ2V0TWV0aG9kTmFtZSgoQ29uc3RydWN0b3IpYikpKTsJCQkJCQotCQkJfQotCQl9KTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJ1Y3RvcnMubGVuZ3RoOyBpKyspIHsKLQkJCUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gY29uc3RydWN0b3JzW2ldOwotCQkJaW50IG1vZGlmaWVycyA9IGNvbnN0cnVjdG9yLmdldE1vZGlmaWVycygpOwotCQkJaWYgKE1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpIHsKLQkJCQljb25zdHJ1Y3RvcnNbY291bnQrK10gPSBjb25zdHJ1Y3RvcnNbaV07Ci0JCQl9Ci0JCX0KLQkJQ29uc3RydWN0b3JbXSByZXN1bHQgPSBuZXcgQ29uc3RydWN0b3JbY291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnN0cnVjdG9ycywgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQkKLQlNZXRob2RbXSBnZXRGaWx0ZXJlZE1ldGhvZHMoQ2xhc3MgY2xhenopIHsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCQlBcnJheXMuc29ydChtZXRob2RzLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCQlyZXR1cm4gKGdldE1ldGhvZE5hbWUoKE1ldGhvZClhKS5jb21wYXJlVG8oZ2V0TWV0aG9kTmFtZSgoTWV0aG9kKWIpKSk7CQkJCQkKLQkJCX0KLQkJfSk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCQlpbnQgbW9kaWZpZXJzID0gbWV0aG9kLmdldE1vZGlmaWVycygpOwotCQkJaWYgKE1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpIHsKLQkJCQltZXRob2RzW2NvdW50KytdID0gbWV0aG9kc1tpXTsKLQkJCX0KLQkJfQotCQlNZXRob2RbXSByZXN1bHQgPSBuZXcgTWV0aG9kW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weShtZXRob2RzLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsJCQotCX0KLQotCi0JcHVibGljIGNsYXNzIFN3dFRlc3QgewotCQlGaWxlV3JpdGVyIHdyaXRlcjsKLQkJQ2xhc3MgY2xheno7Ci0JCVN0cmluZyBsaW5lU2VwID0gIlxyXG4iOwotCQkKLQkJU3d0VGVzdChGaWxlV3JpdGVyIHdyaXRlciwgQ2xhc3MgY2xhenopIHsKLQkJCXRoaXMud3JpdGVyID0gd3JpdGVyOwotCQkJdGhpcy5jbGF6eiA9IGNsYXp6OwotCQl9Ci0JCQotCQl2b2lkIG5ld0xpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlUGFja2FnZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoInBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OyIpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlQ29weVJpZ2h0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiArIGxpbmVTZXAgKwotIAkJCQkiICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiIgKyBsaW5lU2VwICsKLSAJCQkJIiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMiICsgbGluZVNlcCArCi0gCQkJCSIgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAiICsgbGluZVNlcCArCi0gCQkJCSIgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCIgKyBsaW5lU2VwICsKLSAJCQkJIiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIiArIGxpbmVTZXAgKwotIAkJCQkiICogIiArIGxpbmVTZXAgKwotIAkJCQkiICogQ29udHJpYnV0b3JzOiIgKyBsaW5lU2VwICsKLSAJCQkJIiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iICsgbGluZVNlcCArCi0JCQkJIiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyIpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlSW1wb3J0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJImltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsiICsgbGluZVNlcCArCi0JCQkJImltcG9ydCBqdW5pdC50ZXh0dWkuKjsiKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCQkKLQkJdm9pZCB3cml0ZUNsYXNzQ29tbWVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJd3JpdGVyLndyaXRlKAotCQkJCSIvKioiICsgbGluZVNlcCArCi0JCQkJIiAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyAiICsgY2xhenouZ2V0TmFtZSgpICsgbGluZVNlcCArCi0JCQkJIiAqIiArIGxpbmVTZXAgKwotCQkJCSIgKiBAc2VlICIgKyBjbGF6ei5nZXROYW1lKCkgKyBsaW5lU2VwICsKLQkJCQkiICovIgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCi0JCWJvb2xlYW4gaGFzU3d0SnVuaXRTdXBlckNsYXNzKENsYXNzIGNsYXp6KSB7Ci0JCQlDbGFzcyBzdXBlckNsYXNzID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOwotCQkJaWYgKHN1cGVyQ2xhc3MgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gc3VwZXJDbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCQkJaWYgKCFwYWNrYWdlTmFtZS5zdGFydHNXaXRoKCJvcmcuZWNsaXBzZS5zd3QiKSkgcmV0dXJuIGZhbHNlOwotCQkJaWYgKCFmaWx0ZXJDbGFzcyhzdXBlckNsYXNzKSkgcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHRydWU7CQkJCQkJCi0JCX0KLQkJCi0JCVN0cmluZyBnZXRTd3RKdW5pdFN1cGVyQ2xhc3NOYW1lKENsYXNzIGNsYXp6KSB7Ci0JCQlTdHJpbmcgZGVmYXVsdENsYXNzID0gIlN3dFRlc3RDYXNlIjsKLQkJCUNsYXNzIHN1cGVyQ2xhc3MgPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7Ci0JCQlpZiAoc3VwZXJDbGFzcyA9PSBudWxsKSByZXR1cm4gZGVmYXVsdENsYXNzOwotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gc3VwZXJDbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCQkJaWYgKCFwYWNrYWdlTmFtZS5zdGFydHNXaXRoKCJvcmcuZWNsaXBzZS5zd3QiKSkgcmV0dXJuIGRlZmF1bHRDbGFzczsKLQkJCWlmICghZmlsdGVyQ2xhc3Moc3VwZXJDbGFzcykpIHJldHVybiBkZWZhdWx0Q2xhc3M7Ci0JCQlyZXR1cm4gZ2V0Q2xhc3NOYW1lKHN1cGVyQ2xhc3MpOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlQ2xhc3NEZWNsYXJhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlTdHJpbmcgbmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0JCQlTdHJpbmcgc3VwZXJDbGFzc05hbWUgPSBnZXRTd3RKdW5pdFN1cGVyQ2xhc3NOYW1lKGNsYXp6KTsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHVibGljIGNsYXNzICIgKyBuYW1lICsgIiBleHRlbmRzICIgKyBzdXBlckNsYXNzTmFtZSArIiB7IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCQkKLQkJdm9pZCB3cml0ZUNvbnN0cnVjdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHVibGljICIgKyBuYW1lICsgIihTdHJpbmcgbmFtZSkgeyIgKyBsaW5lU2VwICsKLQkJCQkiCXN1cGVyKG5hbWUpOyIgKyBsaW5lU2VwICsKLQkJCQkifSIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0JCQotCQkKLQkJdm9pZCB3cml0ZU1haW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJd3JpdGVyLndyaXRlKAotCQkJCSJwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7IiArIGxpbmVTZXAgKwotCQkJCSIJVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7IiArIGxpbmVTZXAgKwotCQkJCSJ9IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCi0JCXZvaWQgd3JpdGVTZXRVcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJInByb3RlY3RlZCB2b2lkIHNldFVwKCkgeyIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQlpZiAoaGFzU3d0SnVuaXRTdXBlckNsYXNzKGNsYXp6KSkgewotCQkJCXdyaXRlci53cml0ZSgiCXN1cGVyLnNldFVwKCk7Iik7Ci0JCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJfQotCQkJd3JpdGVyLndyaXRlKCJ9Iik7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQotCQl2b2lkIHdyaXRlVGVhckRvd24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJd3JpdGVyLndyaXRlKAotCQkJCSJwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsiCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJaWYgKGhhc1N3dEp1bml0U3VwZXJDbGFzcyhjbGF6eikpIHsKLQkJCQl3cml0ZXIud3JpdGUoIglzdXBlci50ZWFyRG93bigpOyIpOwotCQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCX0KLQkJCXdyaXRlci53cml0ZSgifSIpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlTWV0aG9kcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlDb25zdHJ1Y3RvcltdIGNvbnN0cnVjdG9ycyA9IGdldEZpbHRlcmVkQ29uc3RydWN0b3JzKGNsYXp6KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RydWN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJd3JpdGVNZXRob2QoY29uc3RydWN0b3JzW2ldKTsKLQkJCQlpZiAoaSA8IGNvbnN0cnVjdG9ycy5sZW5ndGggLSAxKSB3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQl9Ci0JCQkKLQkJCU1ldGhvZFtdIG1ldGhvZHMgPSBnZXRGaWx0ZXJlZE1ldGhvZHMoY2xhenopOwotCQkJaWYgKGNvbnN0cnVjdG9ycy5sZW5ndGggPiAwICYmIG1ldGhvZHMubGVuZ3RoID4gMCkgd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJd3JpdGVNZXRob2QobWV0aG9kc1tpXSk7Ci0JCQkJaWYgKGkgPCBtZXRob2RzLmxlbmd0aCAtIDEpIHdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCX0KLQkJfQotCQkKLQkJdm9pZCB3cml0ZU1ldGhvZChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0TWV0aG9kTmFtZShjb25zdHJ1Y3Rvcik7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJInB1YmxpYyB2b2lkICIgKyBuYW1lICsgIigpIHsiICsgbGluZVNlcCArCi0JCQkJIgl3YXJuVW5pbXBsKFwiVGVzdCAiICsgbmFtZSArICIgbm90IHdyaXR0ZW5cIik7IiArIGxpbmVTZXAgKwotCQkJCSJ9IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCWluY3JlbWVudENvdW50ZXIoKTsKLQkJfQotCQkKLQkJdm9pZCB3cml0ZU1ldGhvZChNZXRob2QgbWV0aG9kKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJU3RyaW5nIG5hbWUgPSBnZXRNZXRob2ROYW1lKG1ldGhvZCk7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJInB1YmxpYyB2b2lkICIgKyBuYW1lICsgIigpIHsiICsgbGluZVNlcCArCi0JCQkJIgl3YXJuVW5pbXBsKFwiVGVzdCAiICsgbmFtZSArICIgbm90IHdyaXR0ZW5cIik7IiArIGxpbmVTZXAgKwotCQkJCSJ9IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCWluY3JlbWVudENvdW50ZXIoKTsKLQkJfQotCQkKLQkJdm9pZCB3cml0ZVN1aXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyIgKyBsaW5lU2VwICsKLQkJCQkiCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsiICsgbGluZVNlcCArCQotCQkJCSIJamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7IiArIGxpbmVTZXAgKwotCQkJCSIJamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOyIgKyBsaW5lU2VwICsKLQkJCQkiCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7IiArIGxpbmVTZXAgKwotCQkJCSIJCXN1aXRlLmFkZFRlc3QobmV3ICIgKyBuYW1lICsgIigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOyIgKyBsaW5lU2VwICsKLQkJCQkiCX0iICsgbGluZVNlcCArCi0JCQkJIglyZXR1cm4gc3VpdGU7IiArIGxpbmVTZXAgKwotCQkJCSJ9IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCi0JCXZvaWQgd3JpdGVNZXRob2ROYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJInB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsiICsgbGluZVNlcCArCi0JCQkJIglqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsiCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJQ29uc3RydWN0b3JbXSBjb25zdHJ1Y3RvcnMgPSBnZXRGaWx0ZXJlZENvbnN0cnVjdG9ycyhjbGF6eik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0cnVjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gZ2V0TWV0aG9kTmFtZShjb25zdHJ1Y3RvcnNbaV0pOwotCQkJCXdyaXRlci53cml0ZSgKLQkJCQkJIgltZXRob2ROYW1lcy5hZGRFbGVtZW50KFwiIiArIG5hbWUgKyAiXCIpOyIKLQkJCQkpOwotCQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCX0KLQkJCU1ldGhvZFtdIG1ldGhvZHMgPSBnZXRGaWx0ZXJlZE1ldGhvZHMoY2xhenopOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBnZXRNZXRob2ROYW1lKG1ldGhvZHNbaV0pOwotCQkJCXdyaXRlci53cml0ZSgKLQkJCQkJIgltZXRob2ROYW1lcy5hZGRFbGVtZW50KFwiIiArIG5hbWUgKyAiXCIpOyIKLQkJCQkpOwotCQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCX0KLQkJCWlmIChoYXNTd3RKdW5pdFN1cGVyQ2xhc3MoY2xhenopKSB7Ci0JCQkJU3RyaW5nIHN1cGVyQ2xhc3NOYW1lID0gZ2V0U3d0SnVuaXRTdXBlckNsYXNzTmFtZShjbGF6eik7Ci0JCQkJd3JpdGVyLndyaXRlKCIJbWV0aG9kTmFtZXMuYWRkQWxsKCIgKyBzdXBlckNsYXNzTmFtZSArICIubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcyIpOwotCQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCX0KLQkJCXdyaXRlci53cml0ZSgKLQkJCQkiCXJldHVybiBtZXRob2ROYW1lczsiICsgbGluZVNlcCArCi0JCQkJIn0iCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlUnVuVGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJInByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsiCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJQ29uc3RydWN0b3JbXSBjb25zdHJ1Y3RvcnMgPSBnZXRGaWx0ZXJlZENvbnN0cnVjdG9ycyhjbGF6eik7Ci0JCQlNZXRob2RbXSBtZXRob2RzID0gZ2V0RmlsdGVyZWRNZXRob2RzKGNsYXp6KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RydWN0b3JzLmxlbmd0aCArIG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSA9PSAwKSB3cml0ZXIud3JpdGUoIglpZiIpOyBlbHNlIHdyaXRlci53cml0ZSgiCWVsc2UgaWYiKTsKLQkJCQlTdHJpbmcgbmFtZSA9IGkgPCBjb25zdHJ1Y3RvcnMubGVuZ3RoID8gZ2V0TWV0aG9kTmFtZShjb25zdHJ1Y3RvcnNbaV0pIDogZ2V0TWV0aG9kTmFtZShtZXRob2RzW2kgLSBjb25zdHJ1Y3RvcnMubGVuZ3RoXSk7Ci0JCQkJd3JpdGVyLndyaXRlKAotCQkJCQkiIChnZXROYW1lKCkuZXF1YWxzKFwiIiArIG5hbWUgKyAiXCIpKSAiICsgbmFtZSArICIoKTsiCi0JCQkJKTsKLQkJCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQl9Ci0JCQlpZiAoaGFzU3d0SnVuaXRTdXBlckNsYXNzKGNsYXp6KSkgewotCQkJCWlmIChjb25zdHJ1Y3RvcnMubGVuZ3RoICsgbWV0aG9kcy5sZW5ndGggPiAwKSB7Ci0JCQkJCXdyaXRlci53cml0ZSgiCWVsc2UgIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJd3JpdGVyLndyaXRlKCIJIik7Ci0JCQkJfQotCQkJCXdyaXRlci53cml0ZSgic3VwZXIucnVuVGVzdCgpOyIpOwotCQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCX0JCQkKLQkJCXdyaXRlci53cml0ZSgifSIpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwkJCi0JCX0KLQkJCi0JCXZvaWQgd3JpdGVDbGFzc0Nsb3N1cmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJd3JpdGVyLndyaXRlKCJ9Iik7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGNsYXNzIERpZmZDbGFzcyB7Ci0JCS8qIHRoZSBuZXdDbGFzcyBoYXMgYmVlbiBhZGRlZCAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVcgPSAxOwotCQkvKiB0aGUgb2xkQ2xhc3MgaGFzIGJlZW4gcmVtb3ZlZCAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVEID0gMjsKLQkJLyogdGhlIHJlbW92ZWRNZXRob2RzIGZyb20gb2xkQ2xhc3MgaGF2ZSBiZWVuIHJlbW92ZWQgKGlmIGFueSkKLQkJICogdGhlIG5ld01ldGhvZHMgZnJvbSBuZXdDbGFzcyBoYXZlIGJlZW4gYWRkZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PRElGSUVEID0gMzsKLQkJCi0JCWludCB0eXBlOwotCQlDbGFzcyBvbGRDbGFzczsKLQkJQ2xhc3MgbmV3Q2xhc3M7Ci0JCU1ldGhvZFtdIHJlbW92ZWRNZXRob2RzOwotCQlNZXRob2RbXSBuZXdNZXRob2RzOwotCQlDb25zdHJ1Y3RvcltdIHJlbW92ZWRDb25zdHJ1Y3RvcnM7Ci0JCUNvbnN0cnVjdG9yW10gbmV3Q29uc3RydWN0b3JzOwotCi0JCXB1YmxpYyBEaWZmQ2xhc3MoaW50IHR5cGUsIAotCQkJQ2xhc3Mgb2xkQ2xhc3MsIENsYXNzIG5ld0NsYXNzLCAKLQkJCU1ldGhvZFtdIHJlbW92ZWRNZXRob2RzLCBNZXRob2RbXSBuZXdNZXRob2RzLAotCQkJQ29uc3RydWN0b3JbXSByZW1vdmVkQ29uc3RydWN0b3JzLCBDb25zdHJ1Y3RvcltdIG5ld0NvbnN0cnVjdG9ycykgewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMub2xkQ2xhc3MgPSBvbGRDbGFzczsKLQkJCXRoaXMubmV3Q2xhc3MgPSBuZXdDbGFzczsKLQkJCXRoaXMucmVtb3ZlZE1ldGhvZHMgPSByZW1vdmVkTWV0aG9kczsKLQkJCXRoaXMubmV3TWV0aG9kcyA9IG5ld01ldGhvZHM7Ci0JCQl0aGlzLnJlbW92ZWRDb25zdHJ1Y3RvcnMgPSByZW1vdmVkQ29uc3RydWN0b3JzOwotCQkJdGhpcy5uZXdDb25zdHJ1Y3RvcnMgPSBuZXdDb25zdHJ1Y3RvcnM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQljYXNlIE5FVzogewotCQkJCQlyZXR1cm4gIk5FVzogIiArIGdldENsYXNzTmFtZShuZXdDbGFzcyk7Ci0JCQkJfQotCQkJCWNhc2UgUkVNT1ZFRDogewotCQkJCQlyZXR1cm4gIlJFTU9WRUQ6ICIgKyBnZXRDbGFzc05hbWUob2xkQ2xhc3MpOwotCQkJCX0KLQkJCQljYXNlIE1PRElGSUVEOiB7Ci0JCQkJCVN0cmluZyBzdHJpbmcgPSAiTU9ESUZJRUQ6ICIgKyBnZXRDbGFzc05hbWUob2xkQ2xhc3MpOwotCQkJCQlpZiAocmVtb3ZlZENvbnN0cnVjdG9ycyAhPSBudWxsKSB7Ci0JCQkJCQlzdHJpbmcgKz0gIlxyXG5cdCIgKyByZW1vdmVkQ29uc3RydWN0b3JzLmxlbmd0aCArICIgY29uc3RydWN0b3IocykgcmVtb3ZlZCI7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbW92ZWRDb25zdHJ1Y3RvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlzdHJpbmcgKz0gIlxyXG5cdCIgKyBnZXRNZXRob2ROYW1lKHJlbW92ZWRDb25zdHJ1Y3RvcnNbaV0pOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKG5ld0NvbnN0cnVjdG9ycyAhPSBudWxsKSB7Ci0JCQkJCQlzdHJpbmcgKz0gIlxyXG5cdCIgKyBuZXdDb25zdHJ1Y3RvcnMubGVuZ3RoICsgIiBjb25zdHJ1Y3RvcihzKSBhZGRlZCI7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0NvbnN0cnVjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCXN0cmluZyArPSAiXHJcblx0IiArIGdldE1ldGhvZE5hbWUobmV3Q29uc3RydWN0b3JzW2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocmVtb3ZlZE1ldGhvZHMgIT0gbnVsbCkgewotCQkJCQkJc3RyaW5nICs9ICJcclxuXHQiICsgcmVtb3ZlZE1ldGhvZHMubGVuZ3RoICsgIiBtZXRob2QocykgcmVtb3ZlZCI7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbW92ZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJc3RyaW5nICs9ICJcclxuXHQiICsgZ2V0TWV0aG9kTmFtZShyZW1vdmVkTWV0aG9kc1tpXSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAobmV3TWV0aG9kcyAhPSBudWxsKSB7Ci0JCQkJCQlzdHJpbmcgKz0gIlxyXG5cdCIgKyBuZXdNZXRob2RzLmxlbmd0aCArICIgbWV0aG9kKHMpIGFkZGVkIjsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3TWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCXN0cmluZyArPSAiXHJcblx0IiArIGdldE1ldGhvZE5hbWUobmV3TWV0aG9kc1tpXSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN0cmluZzsKLQkJCQl9Ci0JCQkJZGVmYXVsdDogewotCQkJCQlyZXR1cm4gImludmFsaWQgRGlmZkNsYXNzICIrdHlwZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGNsYXNzIFN3dERpZmYgewotCQlDbGFzc1tdIG9sZENsYXNzZXMsIG5ld0NsYXNzZXM7Ci0JCS8qIHJlbW92ZWRbaV0gdHJ1ZSBtZWFucyBvbGRDbGFzc2VzW2ldIGhhcyBiZWVuIHJlbW92ZWQgKi8KLQkJYm9vbGVhbltdIHJlbW92ZWQ7Ci0JCS8qIGFkZGVkW2ldIHRydWUgbWVhbnMgbmV3Q2xhc3Nlc1tpXSBoYXMgYmVlbiBhZGRlZCAqLwotCQlib29sZWFuW10gYWRkZWQ7Ci0JCS8qIG9sZDJOZXdbaV0gPT0gaiA+PSAwIG1lYW5zIG9sZENsYXNzZXNbaV0gY29ycmVzcG9uZHMgdG8gbmV3Q2xhc3Nlc1tqXSAqLwotCQlpbnRbXSBvbGQyTmV3OwotCQlpbnRbXSBuZXcyT2xkOwotCQlWZWN0b3IgZGlmZnMgPSBuZXcgVmVjdG9yKCk7Ci0JCQotCQlwdWJsaWMgU3d0RGlmZihWZWN0b3Igb2xkQ2xhc3NlcywgVmVjdG9yIG5ld0NsYXNzZXMpIHsKLQkJCUVudW1lcmF0aW9uIG9sZENsYXNzZXNFbnVtID0gb2xkQ2xhc3Nlcy5lbGVtZW50cygpOwotCQkJdGhpcy5vbGRDbGFzc2VzID0gbmV3IENsYXNzW29sZENsYXNzZXMuc2l6ZSgpXTsKLQkJCWludCBjbnQgPSAwOwotCQkJd2hpbGUgKG9sZENsYXNzZXNFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJdGhpcy5vbGRDbGFzc2VzW2NudCsrXSA9IChDbGFzcylvbGRDbGFzc2VzRW51bS5uZXh0RWxlbWVudCgpOwotCQkJfQotCi0JCQlFbnVtZXJhdGlvbiBuZXdDbGFzc2VzRW51bSA9IG5ld0NsYXNzZXMuZWxlbWVudHMoKTsKLQkJCXRoaXMubmV3Q2xhc3NlcyA9IG5ldyBDbGFzc1tuZXdDbGFzc2VzLnNpemUoKV07Ci0JCQljbnQgPSAwOwotCQkJd2hpbGUgKG5ld0NsYXNzZXNFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJdGhpcy5uZXdDbGFzc2VzW2NudCsrXSA9IChDbGFzcyluZXdDbGFzc2VzRW51bS5uZXh0RWxlbWVudCgpOwotCQkJfQotCQkJb2xkMk5ldyA9IG5ldyBpbnRbdGhpcy5vbGRDbGFzc2VzLmxlbmd0aF07Ci0JCQluZXcyT2xkID0gbmV3IGludFt0aGlzLm5ld0NsYXNzZXMubGVuZ3RoXTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY29tcHV0ZSgpIHsKLQkJCWNvbXBhcmVDbGFzc2VzKCk7Ci0JCQljcmVhdGVDbGFzc0RpZmYoKTsKLQkJCW91dHB1dENsYXNzRGlmZigpOwkJCi0JCX0KLQotCQl2b2lkIGNvbXBhcmVDbGFzc2VzKCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJb2xkMk5ld1tpXSA9IC0xOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbmV3Q2xhc3Nlcy5sZW5ndGg7IGorKykgewotCQkJCQlpZiAob2xkQ2xhc3Nlc1tpXS5nZXROYW1lKCkuZXF1YWxzKG5ld0NsYXNzZXNbal0uZ2V0TmFtZSgpKSkgewotCQkJCQkJb2xkMk5ld1tpXSA9IGo7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3Q2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJCW5ldzJPbGRbaV0gPSAtMTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9sZENsYXNzZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKG5ld0NsYXNzZXNbaV0uZ2V0TmFtZSgpLmVxdWFscyhvbGRDbGFzc2VzW2pdLmdldE5hbWUoKSkpIHsKLQkJCQkJCW5ldzJPbGRbaV0gPSBqOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQl2b2lkIGNyZWF0ZUNsYXNzRGlmZigpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkMk5ldy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChvbGQyTmV3W2ldIDwgMCkgewotCQkJCQkvKiBGb3VuZCBhIGNsYXNzIHdoaWNoIGhhcyBiZWVuIHJlbW92ZWQgKi8KLQkJCQkJRGlmZkNsYXNzIGRpZmYgPSBuZXcgRGlmZkNsYXNzKAotCQkJCQkJRGlmZkNsYXNzLlJFTU9WRUQsCi0JCQkJCQlvbGRDbGFzc2VzW2ldLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwpOwotCQkJCQlkaWZmcy5hZGQoZGlmZik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogRm91bmQgYSBjbGFzcyB3aGljaCBpcyBlaXRoZXIgaWRlbnRpY2FsIG9yIHdoaWNoIGNvbnRhaW5zCi0JCQkJCSAqIG1vZGlmaWVkIG1ldGhvZHMKLQkJCQkJICovCi0JCQkJCUNsYXNzIG9sZENsYXNzID0gb2xkQ2xhc3Nlc1tpXTsKLQkJCQkJQ2xhc3MgbmV3Q2xhc3MgPSBuZXdDbGFzc2VzW29sZDJOZXdbaV1dOwotCQkJCQlNZXRob2RbXSByZW1vdmVkTWV0aG9kcyA9IGdldFJlbW92ZWRNZXRob2RzKG9sZENsYXNzLCBuZXdDbGFzcyk7Ci0JCQkJCU1ldGhvZFtdIGFkZGVkTWV0aG9kcyA9IGdldEFkZGVkTWV0aG9kcyhvbGRDbGFzcywgbmV3Q2xhc3MpOwotCQkJCQlDb25zdHJ1Y3RvcltdIHJlbW92ZWRDb25zdHJ1Y3RvcnMgPSBnZXRSZW1vdmVkQ29uc3RydWN0b3JzKG9sZENsYXNzLCBuZXdDbGFzcyk7Ci0JCQkJCUNvbnN0cnVjdG9yW10gYWRkZWRDb25zdHJ1Y3RvcnMgPSBnZXRBZGRlZENvbnN0cnVjdG9ycyhvbGRDbGFzcywgbmV3Q2xhc3MpOwotCQkJCQlpZiAocmVtb3ZlZE1ldGhvZHMgIT0gbnVsbCB8fCBhZGRlZE1ldGhvZHMgIT0gbnVsbCB8fCAKLQkJCQkJCXJlbW92ZWRDb25zdHJ1Y3RvcnMgIT0gbnVsbCB8fCBhZGRlZENvbnN0cnVjdG9ycyAhPSBudWxsKSB7Ci0JCQkJCQlEaWZmQ2xhc3MgZGlmZiA9IG5ldyBEaWZmQ2xhc3MoCi0JCQkJCSAJCURpZmZDbGFzcy5NT0RJRklFRCwKLQkJCQkJIAkJb2xkQ2xhc3MsCi0JCQkJCSAJCW5ld0NsYXNzLAotCQkJCQkgCQlyZW1vdmVkTWV0aG9kcywKLQkJCQkJIAkJYWRkZWRNZXRob2RzLAotCQkJCQkgCQlyZW1vdmVkQ29uc3RydWN0b3JzLAotCQkJCQkgCQlhZGRlZENvbnN0cnVjdG9ycwotCQkJCQkgCSk7Ci0JCQkJCSAJZGlmZnMuYWRkKGRpZmYpOwotCQkJCQkgfQotCQkJCX0KLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3Mk9sZC5sZW5ndGg7IGkrKykgewotCQkJCWlmIChuZXcyT2xkW2ldIDwgMCkgewotCQkJCQkvKiBGb3VuZCBhIGNsYXNzIHdoaWNoIGhhcyBiZWVuIGFkZGVkICovCi0JCQkJCURpZmZDbGFzcyBkaWZmID0gbmV3IERpZmZDbGFzcygKLQkJCQkJCURpZmZDbGFzcy5ORVcsCi0JCQkJCQludWxsLAotCQkJCQkJbmV3Q2xhc3Nlc1tpXSwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwKLQkJCQkJKTsKLQkJCQkJZGlmZnMuYWRkKGRpZmYpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCU1ldGhvZFtdIGdldFJlbW92ZWRNZXRob2RzKENsYXNzIG9sZENsYXNzLCBDbGFzcyBuZXdDbGFzcykgewotCQkJTWV0aG9kW10gb2xkTWV0aG9kcyA9IGdldEZpbHRlcmVkTWV0aG9kcyhvbGRDbGFzcyk7Ci0JCQlNZXRob2RbXSBuZXdNZXRob2RzID0gZ2V0RmlsdGVyZWRNZXRob2RzKG5ld0NsYXNzKTsKLQkJCQotCQkJaW50IGNvdW50ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkTWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBvbGROYW1lID0gZ2V0TWV0aG9kTmFtZShvbGRNZXRob2RzW2ldKTsKLQkJCQlib29sZWFuIHJlbW92ZWQgPSB0cnVlOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbmV3TWV0aG9kcy5sZW5ndGg7IGorKykgewotCQkJCQlTdHJpbmcgbmV3TmFtZSA9IGdldE1ldGhvZE5hbWUobmV3TWV0aG9kc1tqXSk7Ci0JCQkJCWlmIChvbGROYW1lLmVxdWFscyhuZXdOYW1lKSkgewotCQkJCQkJcmVtb3ZlZCA9IGZhbHNlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHJlbW92ZWQpIG9sZE1ldGhvZHNbY291bnQrK10gPSBvbGRNZXRob2RzW2ldOwotCQkJfQotCQkJaWYgKGNvdW50ID09IDApIHJldHVybiBudWxsOwotCQkJTWV0aG9kW10gcmVzdWx0ID0gbmV3IE1ldGhvZFtjb3VudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9sZE1ldGhvZHMsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJTWV0aG9kW10gZ2V0QWRkZWRNZXRob2RzKENsYXNzIG9sZENsYXNzLCBDbGFzcyBuZXdDbGFzcykgewotCQkJcmV0dXJuIGdldFJlbW92ZWRNZXRob2RzKG5ld0NsYXNzLCBvbGRDbGFzcyk7Ci0JCX0KLQkJCi0JCUNvbnN0cnVjdG9yW10gZ2V0UmVtb3ZlZENvbnN0cnVjdG9ycyhDbGFzcyBvbGRDbGFzcywgQ2xhc3MgbmV3Q2xhc3MpIHsKLQkJCUNvbnN0cnVjdG9yW10gb2xkQ29uc3RydWN0b3JzID0gZ2V0RmlsdGVyZWRDb25zdHJ1Y3RvcnMob2xkQ2xhc3MpOwotCQkJQ29uc3RydWN0b3JbXSBuZXdDb25zdHJ1Y3RvcnMgPSBnZXRGaWx0ZXJlZENvbnN0cnVjdG9ycyhuZXdDbGFzcyk7Ci0JCQkKLQkJCWludCBjb3VudCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZENvbnN0cnVjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBvbGROYW1lID0gZ2V0TWV0aG9kTmFtZShvbGRDb25zdHJ1Y3RvcnNbaV0pOwotCQkJCWJvb2xlYW4gcmVtb3ZlZCA9IHRydWU7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBuZXdDb25zdHJ1Y3RvcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJU3RyaW5nIG5ld05hbWUgPSBnZXRNZXRob2ROYW1lKG5ld0NvbnN0cnVjdG9yc1tqXSk7Ci0JCQkJCWlmIChvbGROYW1lLmVxdWFscyhuZXdOYW1lKSkgewotCQkJCQkJcmVtb3ZlZCA9IGZhbHNlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHJlbW92ZWQpIG9sZENvbnN0cnVjdG9yc1tjb3VudCsrXSA9IG9sZENvbnN0cnVjdG9yc1tpXTsKLQkJCX0KLQkJCWlmIChjb3VudCA9PSAwKSByZXR1cm4gbnVsbDsKLQkJCUNvbnN0cnVjdG9yW10gcmVzdWx0ID0gbmV3IENvbnN0cnVjdG9yW2NvdW50XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkob2xkQ29uc3RydWN0b3JzLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCUNvbnN0cnVjdG9yW10gZ2V0QWRkZWRDb25zdHJ1Y3RvcnMoQ2xhc3Mgb2xkQ2xhc3MsIENsYXNzIG5ld0NsYXNzKSB7Ci0JCQlyZXR1cm4gZ2V0UmVtb3ZlZENvbnN0cnVjdG9ycyhuZXdDbGFzcywgb2xkQ2xhc3MpOwotCQl9Ci0JCQotCQl2b2lkIG91dHB1dENsYXNzRGlmZigpIHsKLQkJCUVudW1lcmF0aW9uIGVsZW1lbnRzID0gZGlmZnMuZWxlbWVudHMoKTsKLQkJCWludCBjaGFuZ2VzID0gMDsKLQkJCXdoaWxlIChlbGVtZW50cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCURpZmZDbGFzcyBkaWZmID0gKERpZmZDbGFzcyllbGVtZW50cy5uZXh0RWxlbWVudCgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiWyIrY2hhbmdlcysiXSAiKyBkaWZmKTsKLQkJCQljaGFuZ2VzKys7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzAxM2FlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5wZXJmb3JtYW5jZTsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogU3VpdGUgZm9yIHJ1bm5pbmcgU1dUIHBlcmZvcm1hbmNlIHRlc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJmb3JtYW5jZVRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgUGVyZm9ybWFuY2VUZXN0cygpOwotfQotCi1wdWJsaWMgUGVyZm9ybWFuY2VUZXN0cygpIHsKLQlzdXBlcigpOwotCWFkZFRlc3QoVGVzdF9zaXR1YXRpb25hbC5zdWl0ZSgpKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvcGVyZm9ybWFuY2UvU3d0UGVyZm9ybWFuY2VUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9wZXJmb3JtYW5jZS9Td3RQZXJmb3JtYW5jZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YjBlNWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9wZXJmb3JtYW5jZS9Td3RQZXJmb3JtYW5jZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5wZXJmb3JtYW5jZTsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS4qOwotCi0KLXB1YmxpYyBjbGFzcyBTd3RQZXJmb3JtYW5jZVRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCS8vIHVzZWQgdG8gc3BlY2lmeSB2ZXJib3NlIG1vZGUsIGlmIHRydWUgdW5pbXBsZW1lbnRlZCB3YXJuaW5nIG1lc3NhZ2VzIHdpbGwgCi0JLy8gYmUgd3JpdHRlbiB0byBTeXN0ZW0ub3V0Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc0dUSyA9IFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygiZ3RrIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzV2luZG93cyA9IFNXVC5nZXRQbGF0Zm9ybSgpLnN0YXJ0c1dpdGgoIndpbjMyIik7Ci0JCi0JLy8gYWxsb3cgc3BlY2lmaWMgaW1hZ2UgZm9ybWF0cyB0byBiZSB0ZXN0ZWQKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGltYWdlRm9ybWF0cyA9IG5ldyBTdHJpbmdbXSB7ImJtcCIsICJqcGciLCAiZ2lmIiwgInBuZyJ9OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gaW1hZ2VGaWxlbmFtZXMgPSBuZXcgU3RyaW5nW10geyJmb2xkZXIiLCAiZm9sZGVyT3BlbiIsICJ0YXJnZXQifTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHRyYW5zcGFyZW50SW1hZ2VGaWxlbmFtZXMgPSBuZXcgU3RyaW5nW10geyJ0cmFuc3BhcmVudC5wbmcifTsKLQotCQotcHVibGljIFN3dFBlcmZvcm1hbmNlVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHJvdGVjdGVkIFBlcmZvcm1hbmNlTWV0ZXIgY3JlYXRlTWV0ZXIoU3RyaW5nIGlkKSB7Ci0JUGVyZm9ybWFuY2UgcGVyZm9ybWFuY2UgPSBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7Ci0JU3RyaW5nIHNjZW5hcmlvSWQgPSAib3JnLmVjbGlwc2Uuc3d0LnRlc3QuIiArIGlkOwotCVBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIgPSBwZXJmb3JtYW5jZS5jcmVhdGVQZXJmb3JtYW5jZU1ldGVyKHNjZW5hcmlvSWQpOwotCXBlcmZvcm1hbmNlLnRhZ0FzU3VtbWFyeShtZXRlciwgaWQsIERpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MpOwotCXJldHVybiBtZXRlcjsKLX0KLQotcHJvdGVjdGVkIFBlcmZvcm1hbmNlTWV0ZXIgY3JlYXRlTWV0ZXJXaXRob3V0U3VtbWFyeShTdHJpbmcgaWQpIHsKLQlQZXJmb3JtYW5jZSBwZXJmb3JtYW5jZSA9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKLQlTdHJpbmcgc2NlbmFyaW9JZCA9ICJvcmcuZWNsaXBzZS5zd3QudGVzdC4iICsgaWQ7Ci0JUGVyZm9ybWFuY2VNZXRlciBtZXRlciA9IHBlcmZvcm1hbmNlLmNyZWF0ZVBlcmZvcm1hbmNlTWV0ZXIoc2NlbmFyaW9JZCk7Ci0JcmV0dXJuIG1ldGVyOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBkaXNwb3NlTWV0ZXIoUGVyZm9ybWFuY2VNZXRlciBtZXRlcikgewotCXRyeSB7Ci0JCW1ldGVyLmNvbW1pdCgpOwotCQlQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCkuYXNzZXJ0UGVyZm9ybWFuY2UobWV0ZXIpOwotCX0gZmluYWxseSB7Ci0JCW1ldGVyLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0UGF0aChTdHJpbmcgZmlsZU5hbWUpIHsKLQlTdHJpbmcgdXJsUGF0aDsKLQkKLQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQlpZiAodmVyYm9zZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBMVUdJTl9QQVRIIDwiK3BsdWdpblBhdGgrIj4iKTsKLQl9Ci0JaWYgKHBsdWdpblBhdGggPT0gbnVsbCkgewotCQlVUkwgdXJsID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKGZpbGVOYW1lKTsKLQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQlmYWlsKCJVUkwgPT0gbnVsbCBmb3IgZmlsZSAiICsgZmlsZU5hbWUpOwotCQl9Ci0JCXVybFBhdGggPSB1cmwuZ2V0RmlsZSgpOwotCX0gZWxzZSB7Ci0JCXVybFBhdGggPSBwbHVnaW5QYXRoICsgIi9kYXRhLyIgKyBmaWxlTmFtZTsKLQl9Ci0JCi0JaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciAhPSAnLycpIHVybFBhdGggPSB1cmxQYXRoLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwkKLQlpZiAoaXNXaW5kb3dzICYmIHVybFBhdGguaW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpID09IDApIHVybFBhdGggPSB1cmxQYXRoLnN1YnN0cmluZygxKTsKLQl1cmxQYXRoID0gdXJsUGF0aC5yZXBsYWNlQWxsKCIlMjAiLCAiICIpOwkKLQkKLQlpZiAodmVyYm9zZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc29sdmVkIGZpbGUgbmFtZSBmb3IgIiArIGZpbGVOYW1lICsgIiA9ICIgKyB1cmxQYXRoKTsKLQl9Ci0JcmV0dXJuIHVybFBhdGg7Ci19Ci0KLXByb3RlY3RlZCBib29sZWFuIGlzSjJNRSgpIHsKLQl0cnkgewotCQlDb21wYXRpYmlsaXR5Lm5ld0ZpbGVJbnB1dFN0cmVhbSgiIik7Ci0JfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvcGVyZm9ybWFuY2UvVGVzdF9zaXR1YXRpb25hbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9wZXJmb3JtYW5jZS9UZXN0X3NpdHVhdGlvbmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MjY1NjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9wZXJmb3JtYW5jZS9UZXN0X3NpdHVhdGlvbmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlTWV0ZXI7Ci0KLS8qKgotICogQXV0b21hdGVkIFBlcmZvcm1hbmNlIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X3NpdHVhdGlvbmFsIGV4dGVuZHMgU3d0UGVyZm9ybWFuY2VUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X3NpdHVhdGlvbmFsKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlzdXBlci5zZXRVcCgpOwotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLX0KLQotCi0vKioKLSAqIFNpdHVhdGlvbnM6Ci0gKiAKLSAqIC0gV2lkZ2V0IGNyZWF0aW9uCi0gKiAtIHN5bmNFeGVjL2FzeW5jRXhlYyBwZXJmb3JtYW5jZQotICogLSBJbWFnZSBjcmVhdGlvbgotICogLSBEcmF3aW5nIG9wZXJhdGlvbnMKLSAqIC0gU3RyaW5nIG1lYXN1cmluZwotICogLSBTdHJpbmcgZHJhd2luZwotICogLSBSZWdpb24gb3BlcmF0aW9ucwotICogLSBGb250cwotICogLSBJbWFnZSBsb2FkaW5nCi0gKiAtIExheW91dHMKLSAqLwotcHVibGljIHZvaWQgdGVzdF9jcmVhdGVDb21wb3NpdGVzKCkgewotCVBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIgPSBjcmVhdGVNZXRlcigiQ3JlYXRlIGNvbXBvc2l0ZXMiKTsKLQlpbnQgc2FtcGxlczsKLQotICAgIFBlcmZvcm1hbmNlIHBlcmZvcm1hbmNlID0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOwotICAgIHBlcmZvcm1hbmNlLnNldENvbW1lbnQobWV0ZXIsIFBlcmZvcm1hbmNlLkVYUExBSU5TX0RFR1JBREFUSU9OX0NPTU1FTlQsICJGb3IgdW5rbm93biByZWFzb25zIHRoaXMgdGVzdCBoYXMgYSBwZXJmb3JtYW5jZSByZWdyZXNzaW9uIG9uIHRoZSAyIEdIeiBMaW51eCBtYWNoaW5lLiAgVGhlIHJlZ3Jlc3Npb24gaXMgbm90IHJlcHJvZHVjYWJsZSBvbiBzaW1pbGFyIG1hY2hpbmVzLiAgU2VlIGJ1ZyA5NjY1Mi4iKTsKLQkKLQkvLyBXYXJtIHVwLgotCWZvcihzYW1wbGVzID0gMDsgc2FtcGxlcyA8IDI7IHNhbXBsZXMrKykgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgewotCQkJQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspIHsKLQkJCQlDb21wb3NpdGUgYzIgPSBuZXcgQ29tcG9zaXRlKGMsIFNXVC5OT05FKTsKLQkJCX0KLQkJfQotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpOwotCX0KLQotCWZvcihzYW1wbGVzID0gMDsgc2FtcGxlcyA8IDEwMDsgc2FtcGxlcysrKSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQltZXRlci5zdGFydCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgNTA7IGorKykgewotCQkJCUNvbXBvc2l0ZSBjMiA9IG5ldyBDb21wb3NpdGUoYywgU1dULk5PTkUpOwotCQkJfQotCQl9Ci0JCW1ldGVyLnN0b3AoKTsKLQkJc2hlbGwuZGlzcG9zZSgpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKTsKLQl9CQotCWRpc3Bvc2VNZXRlcihtZXRlcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlV2lkZ2V0cygpIHsKLQlQZXJmb3JtYW5jZU1ldGVyIG1ldGVyID0gY3JlYXRlTWV0ZXIoIkNyZWF0ZSBjb21wb3NpdGVzIGFuZCB3aWRnZXRzIik7Ci0JaW50IHNhbXBsZXM7Ci0KLSAgICBQZXJmb3JtYW5jZSBwZXJmb3JtYW5jZSA9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKLSAgICBwZXJmb3JtYW5jZS50YWdBc0dsb2JhbFN1bW1hcnkobWV0ZXIsICJDcmVhdGUgY29tcG9zaXRlcyBhbmQgd2lkZ2V0cyIsIERpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MpOwotICAgIHBlcmZvcm1hbmNlLnNldENvbW1lbnQobWV0ZXIsIFBlcmZvcm1hbmNlLkVYUExBSU5TX0RFR1JBREFUSU9OX0NPTU1FTlQsICJGb3IgdW5rbm93biByZWFzb25zIHRoaXMgdGVzdCBoYXMgYSBwZXJmb3JtYW5jZSByZWdyZXNzaW9uIG9uIHRoZSAyIEdIeiBMaW51eCBtYWNoaW5lLiAgVGhlIHJlZ3Jlc3Npb24gaXMgbm90IHJlcHJvZHVjYWJsZSBvbiBzaW1pbGFyIG1hY2hpbmVzLiAgU2VlIGJ1ZyA5NjY1Mi4iKTsKLQotCWZvcihzYW1wbGVzID0gMDsgc2FtcGxlcyA8IDEwOyBzYW1wbGVzKyspIHsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJbWV0ZXIuc3RhcnQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSsrKSB7Ci0JCQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykgewotCQkJCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0JCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoYywgU1dULk5PTkUpOwotCQkJCVNjYWxlIHNjYWxlID0gbmV3IFNjYWxlKGMsIFNXVC5OT05FKTsKLQkJCQlQcm9ncmVzc0JhciBiYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoYywgU1dULk5PTkUpOwotCQkJCUxpc3QgbGlzdCA9IG5ldyBMaXN0KGMsIFNXVC5OT05FKTsKLQkJCQlUZXh0IHRleHQgPSBuZXcgVGV4dChjLCBTV1QuU0lOR0xFKTsKLQkJCQlUZXh0IG11bHRpdGV4dCA9IG5ldyBUZXh0KGMsIFNXVC5NVUxUSSk7Ci0JCQkJU2xpZGVyIHNsaWRlciA9IG5ldyBTbGlkZXIoYywgU1dULk5PTkUpOwotCQkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGMsIFNXVC5OT05FKTsKLQkJCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShjLCBTV1QuTk9ORSk7Ci0JCQkJVGFiRm9sZGVyIHRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIoYywgU1dULk5PTkUpOwotCQkJCUdyb3VwIGcgPSBuZXcgR3JvdXAoYywgU1dULkJPUkRFUik7CQkJCQotCQkJCUNvbXBvc2l0ZSBjMiA9IG5ldyBDb21wb3NpdGUoYywgU1dULk5PTkUpOwotCQkJfQotCQl9Ci0JCW1ldGVyLnN0b3AoKTsKLQkJc2hlbGwuZGlzcG9zZSgpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKTsKLQl9CQotCWRpc3Bvc2VNZXRlcihtZXRlcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0KCkgewotCVBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIgPSBjcmVhdGVNZXRlcigibGF5b3V0IGNvbXBvc2l0ZXMiKTsKLQlpbnQgc2FtcGxlczsKLQotCWZvcihzYW1wbGVzID0gMDsgc2FtcGxlcyA8IDEwOyBzYW1wbGVzKyspIHsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJU3RyaW5nIGN1clRleHQgPSAiIjsKLQkJTGFiZWwgY2hhbmdlZExhYmVsOwotCQlDb21wb3NpdGUgcGFyZW50ID0gc2hlbGw7Ci0JCUdyaWREYXRhIGRhdGE7Ci0JCQotCQlmb3IoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQljLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQljLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkJCi0JCQlDb21wb3NpdGUgYzEgPSBuZXcgQ29tcG9zaXRlKGMsIFNXVC5CT1JERVIpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS53aWR0aEhpbnQgPSBkYXRhLmhlaWdodEhpbnQgPSAyOwotCQkJYzEuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJQ29tcG9zaXRlIGMyID0gbmV3IENvbXBvc2l0ZShjLCBTV1QuQk9SREVSKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWRhdGEud2lkdGhIaW50ID0gZGF0YS5oZWlnaHRIaW50ID0gMjsKLQkJCWMyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJCUNvbXBvc2l0ZSBjMyA9IG5ldyBDb21wb3NpdGUoYywgU1dULkJPUkRFUik7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlkYXRhLndpZHRoSGludCA9IGRhdGEuaGVpZ2h0SGludCA9IDI7Ci0JCQljMy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCi0JCQlDb21wb3NpdGUgYzQgPSBuZXcgQ29tcG9zaXRlKGMsIFNXVC5CT1JERVIpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJYzQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWM0LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCXBhcmVudCA9IGM0OwotCQl9Ci0JCWNoYW5nZWRMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWNoYW5nZWRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKTsKLQkJdHJ5IHsgVGhyZWFkLnNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSk7Ci0JCW1ldGVyLnN0YXJ0KCk7Ci0JCWZvcihpbnQgbnVtbGF5b3V0cyA9IDA7IG51bWxheW91dHMgPCAyMDsgbnVtbGF5b3V0cysrKSB7Ci0JCQlzaGVsbC5sYXlvdXQodHJ1ZSk7Ci0JCQljdXJUZXh0ID0gIiEhISIgKyBjdXJUZXh0ICsgIiEhIVxuISI7Ci0JCQljaGFuZ2VkTGFiZWwuc2V0VGV4dChjdXJUZXh0KTsKLQkJCS8vd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSk7Ci0JCX0KLQkJbWV0ZXIuc3RvcCgpOwotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpOwotCX0JCi0JZGlzcG9zZU1ldGVyKG1ldGVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbWFnZURyYXdpbmcoKSB7Ci0JUGVyZm9ybWFuY2VNZXRlciBtZXRlciA9IGNyZWF0ZU1ldGVyKCJEcmF3IG9uIGFuIGltYWdlIik7Ci0JaW50IHNhbXBsZXM7Ci0JCi0JZm9yKHNhbXBsZXMgPSAwOyBzYW1wbGVzIDwgMTA7IHNhbXBsZXMrKykgewotCQlpbnQgd2lkdGggPSA2NDA7Ci0JCWludCBoZWlnaHQgPSA0ODA7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHdpZHRoLCBoZWlnaHQpOwotCQlDb2xvciBjb2xvcjEgPSBuZXcgQ29sb3IoZGlzcGxheSwgMHhmZiwgMCwgMHhmZik7Ci0JCUNvbG9yIGNvbG9yMiA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAweGZmLCAweGZmKTsKLQkJaW50IHgxID0gMCwgeTEgPSBoZWlnaHQvMiwgeDIgPSB3aWR0aC8yLCB5MiA9IDA7Ci0JCW1ldGVyLnN0YXJ0KCk7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKLQkJCXgxID0gKHgxICsgNSkgJSB3aWR0aDsgeTEgPSAoeTEgKyA1KSAlIGhlaWdodDsgeDIgPSAoeDIgKyA1KSAlIHdpZHRoOyB5MiA9ICh5MiArIDUpICUgaGVpZ2h0OwotCQkJZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQkJCWdjLmRyYXdMaW5lKHgxLCB5MSwgeDIsIHkyKTsKLQkJCWdjLnNldEZvcmVncm91bmQoKGkgJiAxKSA9PSAwID8gY29sb3IxIDogY29sb3IyKTsKLQkJCWdjLnNldEJhY2tncm91bmQoKGkgJiAxKSA9PSAwID8gY29sb3IxIDogY29sb3IyKTsKLQkJCWdjLmZpbGxSZWN0YW5nbGUoeDEsIHkxLCAyMDAsIDIwMCk7Ci0JCQlnYy5kcmF3Um91bmRSZWN0YW5nbGUoeDIsIHkyLCAyMDAsIDIwMCwgNTAsIDUwKTsKLQkJCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9EQVNIRE9UKTsKLQkJCWdjLmRyYXdMaW5lKHgyLCB5MSwgeDEsIHkyKTsKLQkJfQotCQlnYy5kaXNwb3NlKCk7Ci0JCW1ldGVyLnN0b3AoKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQljb2xvcjEuZGlzcG9zZSgpOwotCQljb2xvcjIuZGlzcG9zZSgpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKTsKLQl9CQotCWRpc3Bvc2VNZXRlcihtZXRlcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2luZG93RHJhd2luZygpIHsKLQlQZXJmb3JtYW5jZU1ldGVyIG1ldGVyID0gY3JlYXRlTWV0ZXIoIkRyYXcgb24gYSB3aW5kb3ciKTsKLQlpbnQgc2FtcGxlczsKLQkKLQlmb3Ioc2FtcGxlcyA9IDA7IHNhbXBsZXMgPCAxMDsgc2FtcGxlcysrKSB7Ci0JCWludCB3aWR0aCA9IDY0MDsKLQkJaW50IGhlaWdodCA9IDQ4MDsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJQ2FudmFzIGMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQljLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKTsKLQkJdHJ5IHsgVGhyZWFkLnNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSk7Ci0JCUNvbG9yIGNvbG9yMSA9IG5ldyBDb2xvcihkaXNwbGF5LCAweGZmLCAwLCAweGZmKTsKLQkJQ29sb3IgY29sb3IyID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDB4ZmYsIDB4ZmYpOwotCQlpbnQgeDEgPSAwLCB5MSA9IGhlaWdodC8yLCB4MiA9IHdpZHRoLzIsIHkyID0gMDsKLQkJbWV0ZXIuc3RhcnQoKTsKLQkJR0MgZ2MgPSBuZXcgR0MoYyk7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCA2MDAwOyBpKyspIHsKLQkJCXgxID0gKHgxICsgNSkgJSB3aWR0aDsgeTEgPSAoeTEgKyA1KSAlIGhlaWdodDsgeDIgPSAoeDIgKyA1KSAlIHdpZHRoOyB5MiA9ICh5MiArIDUpICUgaGVpZ2h0OwotCQkJZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQkJCWdjLmRyYXdMaW5lKHgxLCB5MSwgeDIsIHkyKTsKLQkJCWdjLnNldEZvcmVncm91bmQoKGkgJiAxKSA9PSAwID8gY29sb3IxIDogY29sb3IyKTsKLQkJCWdjLnNldEJhY2tncm91bmQoKGkgJiAxKSA9PSAwID8gY29sb3IxIDogY29sb3IyKTsKLQkJCWdjLmZpbGxSZWN0YW5nbGUoeDEsIHkxLCAyMDAsIDIwMCk7Ci0JCQlnYy5kcmF3Um91bmRSZWN0YW5nbGUoeDIsIHkyLCAyMDAsIDIwMCwgNTAsIDUwKTsKLQkJCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9EQVNIRE9UKTsKLQkJCWdjLmRyYXdMaW5lKHgyLCB5MSwgeDEsIHkyKTsKLQkJfQotCQlnYy5kaXNwb3NlKCk7Ci0JCW1ldGVyLnN0b3AoKTsKLQkJc2hlbGwuZGlzcG9zZSgpOwotCQljb2xvcjEuZGlzcG9zZSgpOwotCQljb2xvcjIuZGlzcG9zZSgpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKTsKLQl9CQotCWRpc3Bvc2VNZXRlcihtZXRlcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc3RyaW5nRHJhd2luZygpIHsKLQlQZXJmb3JtYW5jZU1ldGVyIG1ldGVyID0gY3JlYXRlTWV0ZXJXaXRob3V0U3VtbWFyeSgiRHJhdyBzdHJpbmdzIHVzaW5nIEdDLmRyYXdUZXh0Iik7Ci0JaW50IHNhbXBsZXM7Ci0JCi0JZm9yKHNhbXBsZXMgPSAwOyBzYW1wbGVzIDwgMTA7IHNhbXBsZXMrKykgewotCQlpbnQgd2lkdGggPSA2NDA7Ci0JCWludCBoZWlnaHQgPSA0ODA7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUNhbnZhcyBjID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJYy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSk7Ci0JCXRyeSB7IFRocmVhZC5zbGVlcCgyMDAwKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpOwotCQlDb2xvciBjb2xvcjEgPSBuZXcgQ29sb3IoZGlzcGxheSwgMHhmZiwgMCwgMHhmZik7Ci0JCUNvbG9yIGNvbG9yMiA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAweGZmLCAweGZmKTsKLQkJRm9udCBmb250MSA9IG5ldyBGb250KGRpc3BsYXksICJIZWx2ZXRpY2EiLCAyMCwgU1dULk5PTkUpOwotCQlGb250IGZvbnQyID0gbmV3IEZvbnQoZGlzcGxheSwgIkhlbHZldGljYSIsIDEwLCBTV1QuQk9MRCk7Ci0JCVN0cmluZyB0ZXN0U3RyaW5nID0gIlRoZSBxdWljayBcdGJyJm93biBTV1QganVtJnBlZCBmb3hpbHkgb1xudmVyIHRoZSBsYXp5IGRvZy4iOwotCQlpbnQgeDEgPSAwLCB5MSA9IGhlaWdodC8yLCB4MiA9IHdpZHRoLzIsIHkyID0gMDsKLQkJbWV0ZXIuc3RhcnQoKTsKLQkJR0MgZ2MgPSBuZXcgR0MoYyk7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCA0MDAwOyBpKyspIHsKLQkJCXgxID0gKHgxICsgNSkgJSB3aWR0aDsgeTEgPSAoeTEgKyA1KSAlIGhlaWdodDsgeDIgPSAoeDIgKyA1KSAlIHdpZHRoOyB5MiA9ICh5MiArIDUpICUgaGVpZ2h0OwotCQkJZ2Muc2V0Rm9udCgoaSAmIDEpID09IDAgPyBmb250MSA6IGZvbnQyKTsKLQkJCWdjLnNldEZvcmVncm91bmQoKGkgJiAxKSA9PSAwID8gY29sb3IxIDogY29sb3IyKTsKLQkJCWdjLnRleHRFeHRlbnQodGVzdFN0cmluZyk7Ci0JCQlnYy5kcmF3VGV4dCh0ZXN0U3RyaW5nLCB4MiwgeTEpOwotCQkJZ2MuZHJhd1RleHQodGVzdFN0cmluZywgeDIsIHkxLzIsIFNXVC5EUkFXX01ORU1PTklDIHwgU1dULkRSQVdfVFJBTlNQQVJFTlQpOwotCQkJZ2MuZHJhd1RleHQodGVzdFN0cmluZywgeDIsIHkyLCB0cnVlKTsKLQkJfQotCQlnYy5kaXNwb3NlKCk7Ci0JCW1ldGVyLnN0b3AoKTsKLQkJc2hlbGwuZGlzcG9zZSgpOwotCQljb2xvcjEuZGlzcG9zZSgpOwotCQljb2xvcjIuZGlzcG9zZSgpOwotCQlmb250MS5kaXNwb3NlKCk7Ci0JCWZvbnQyLmRpc3Bvc2UoKTsKLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSk7Ci0JfQkKLQlkaXNwb3NlTWV0ZXIobWV0ZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Zhc3RTdHJpbmdEcmF3aW5nKCkgewotCVBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIgPSBjcmVhdGVNZXRlcldpdGhvdXRTdW1tYXJ5KCJEcmF3IHN0cmluZ3MgdXNpbmcgR0MuZHJhd1N0cmluZygpIik7Ci0JaW50IHNhbXBsZXM7Ci0KLQlmb3Ioc2FtcGxlcyA9IDA7IHNhbXBsZXMgPCAxMDsgc2FtcGxlcysrKSB7Ci0JCWludCB3aWR0aCA9IDY0MDsKLQkJaW50IGhlaWdodCA9IDQ4MDsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJQ2FudmFzIGMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQljLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKTsKLQkJdHJ5IHsgVGhyZWFkLnNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSk7Ci0JCUNvbG9yIGNvbG9yMSA9IG5ldyBDb2xvcihkaXNwbGF5LCAweGZmLCAwLCAweGZmKTsKLQkJQ29sb3IgY29sb3IyID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDB4ZmYsIDB4ZmYpOwotCQlGb250IGZvbnQxID0gbmV3IEZvbnQoZGlzcGxheSwgIkhlbHZldGljYSIsIDIwLCBTV1QuTk9ORSk7Ci0JCUZvbnQgZm9udDIgPSBuZXcgRm9udChkaXNwbGF5LCAiSGVsdmV0aWNhIiwgMTAsIFNXVC5CT0xEKTsKLQkJU3RyaW5nIHRlc3RTdHJpbmcgPSAiVGhlIHF1aWNrIGJyb3duIFNXVCBqdW1wZWQgZm94aWx5IG92ZXIgdGhlIGxhenkgZG9nLiI7Ci0JCWludCB4MSA9IDAsIHkxID0gaGVpZ2h0LzIsIHgyID0gd2lkdGgvMiwgeTIgPSAwOwotCQltZXRlci5zdGFydCgpOwotCQlHQyBnYyA9IG5ldyBHQyhjKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IDIwMDA7IGkrKykgewotCQkJeDEgPSAoeDEgKyA1KSAlIHdpZHRoOyB5MSA9ICh5MSArIDUpICUgaGVpZ2h0OyB4MiA9ICh4MiArIDUpICUgd2lkdGg7IHkyID0gKHkyICsgNSkgJSBoZWlnaHQ7Ci0JCQlnYy5zZXRGb250KChpICYgMSkgPT0gMCA/IGZvbnQxIDogZm9udDIpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZCgoaSAmIDEpID09IDAgPyBjb2xvcjEgOiBjb2xvcjIpOwotCQkJZ2Muc3RyaW5nRXh0ZW50KHRlc3RTdHJpbmcpOwotCQkJZ2MuZHJhd1N0cmluZyh0ZXN0U3RyaW5nLCB4MSwgeTIpOwotCQkJZ2MuZHJhd1N0cmluZyh0ZXN0U3RyaW5nLCB4MSwgeTEsIHRydWUpOwotCQl9Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJbWV0ZXIuc3RvcCgpOwotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCWNvbG9yMS5kaXNwb3NlKCk7Ci0JCWNvbG9yMi5kaXNwb3NlKCk7Ci0JCWZvbnQxLmRpc3Bvc2UoKTsKLQkJZm9udDIuZGlzcG9zZSgpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKTsKLQl9CQotCWRpc3Bvc2VNZXRlcihtZXRlcik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfc2l0dWF0aW9uYWwoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY3JlYXRlQ29tcG9zaXRlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY3JlYXRlV2lkZ2V0cyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW1hZ2VEcmF3aW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW5kb3dEcmF3aW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdHJpbmdEcmF3aW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9mYXN0U3RyaW5nRHJhd2luZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGF5b3V0Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NyZWF0ZUNvbXBvc2l0ZXMiKSkgdGVzdF9jcmVhdGVDb21wb3NpdGVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jcmVhdGVXaWRnZXRzIikpIHRlc3RfY3JlYXRlV2lkZ2V0cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbGF5b3V0IikpIHRlc3RfbGF5b3V0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbWFnZURyYXdpbmciKSkgdGVzdF9pbWFnZURyYXdpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpbmRvd0RyYXdpbmciKSkgdGVzdF93aW5kb3dEcmF3aW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdHJpbmdEcmF3aW5nIikpIHRlc3Rfc3RyaW5nRHJhd2luZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmFzdFN0cmluZ0RyYXdpbmciKSkgdGVzdF9mYXN0U3RyaW5nRHJhd2luZygpOwotfQotCi0vKiBjdXN0b20gKi8KLURpc3BsYXkgZGlzcGxheTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LmJtcCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM3ZDUwOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RhcmdldC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RhcmdldC5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RhcmdldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZThiNWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQuanBnIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzNlYTFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1ZDdlYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RhcmdldC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RyYW5zcGFyZW50LnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdHJhbnNwYXJlbnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjI1ZjE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdHJhbnNwYXJlbnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwZTk5Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS5zd3R0ZXN0cy5qYXI9SlVuaXQgVGVzdHMvCi0KLWJpbi5pbmNsdWRlcz0qLmphcixwbHVnaW4ueG1sLHRlc3QueG1sLGFib3V0Lmh0bWwscGx1Z2luLnByb3BlcnRpZXMsZGF0YS8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyMy5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFjYTBiZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyMy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08aHRtbD4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij53aW5kb3cub3BlbigiaHR0cDovL3d3dy5nb29nbGUuY29tIiwgIkRpYWxvZyIpPC9zY3JpcHQ+Ci08Ym9keT4KLVRoaXMgdGVzdCB1c2VzIGphdmFzY3JpcHQgdG8gb3BlbiBhIG5ldyB3aW5kb3cuCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlNGJmNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPGh0bWw+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JdyA9IHdpbmRvdy5vcGVuKCJicm93c2VyNGEuaHRtbCIsICJEaWFsb2ciKTsKLQlzZXRUaW1lb3V0KCJ3LmNsb3NlKCkiLCA1MDAwKTsKLTwvc2NyaXB0PgotPGJvZHk+Ci08cD5UaGlzIHRlc3QgdXNlcyBqYXZhc2NyaXB0LgotPHA+SXQgb3BlbnMgYSBuZXcgd2luZG93LiBTZXRzIGEgdGltZXIuIFRoZW4gY2xvc2UgdGhlIG5ldyB3aW5kb3cgd2hlbiB0aGUgdGltZXIgZXhwaXJlcy4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI0YS5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjRhLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMzU4NTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjRhLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIKLSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0gIDx0aXRsZT5zaW1wbGUgcGFnZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjA0LCAwKTsgY29sb3I6IHJnYigwLCAwLCAwKTsiCi0gbGluaz0iIzAwMDBlZSIgYWxpbms9IiMwMDAwZWUiIHZsaW5rPSIjNTUxYThiIj4KLTxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxiaWc+PGJpZz48YmlnPjxiaWc+PGJpZz48YmlnPjxzcGFuCi0gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+VGhpcyBpcyBhIHNpbXBsZSBwYWdlPC9zcGFuPjwvYmlnPjwvYmlnPjwvYmlnPjwvYmlnPjwvYmlnPjwvYmlnPjxicj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjUuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI1Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNWJmY2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTxodG1sPgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCXZhciB3aW47Ci0JZnVuY3Rpb24gdGVzdE9wZW4oKSB7Ci0JCXdpbiA9IHdpbmRvdy5vcGVuKCdqYXZhc2NyaXB0OiI8aDE+U2ltcGxlIE5ldyBXaW5kb3c8L2gyPiInLCAiIiwgImxlZnQ9MTAsdG9wPTIwMCxoZWlnaHQ9MTAwLHdpZHRoPTMwMCIpOwotCX0KLQlmdW5jdGlvbiB0ZXN0UmVzaXplVG8oKSB7Ci0JCXdpbi5yZXNpemVUbyg2MDAsODAwKTsKLQl9Ci0JZnVuY3Rpb24gdGVzdE1vdmVUbygpIHsKLQkJd2luLm1vdmVUbygyMDAsMTAwKTsKLQl9Ci0JZnVuY3Rpb24gdGVzdE1vdmVCeSgpIHsKLQkJd2luLm1vdmVCeSgyLDIpOwotCX0KLQlmdW5jdGlvbiB0ZXN0U2Nyb2xsQnkoKSB7Ci0JCXdpbi5zY3JvbGxCeSgxLDIwKTsKLQl9Ci0JZnVuY3Rpb24gdGVzdFJlc2l6ZUJ5KCkgewotCQl3aW4ucmVzaXplQnkoMiwzKTsKLQl9Ci0JZnVuY3Rpb24gdGVzdENsb3NlKCkgewotCQl3aW4uY2xvc2UoKTsKLQl9Ci0KLQl3aW4xID0gd2luZG93Lm9wZW4oJ2phdmFzY3JpcHQ6IjxoMT5TaW1wbGUgTmV3IFdpbmRvdyAxPC9oMj48cD5ib3VuZHM6IGxlZnQ9MTAsdG9wPTIwMCxoZWlnaHQ9MTAwLHdpZHRoPTMwMDxwPiInLCAiIiwgImxlZnQ9MTAsdG9wPTIwMCxoZWlnaHQ9MTAwLHdpZHRoPTMwMCIpOwotCXdpbjIgPSB3aW5kb3cub3BlbignamF2YXNjcmlwdDoiPGgxPlNpbXBsZSBOZXcgV2luZG93IDI8L2gyPjxwPmJvdW5kczogbGVmdD0xMCx0b3A9MjAwPHA+IicsICIiLCAibGVmdD0xMCx0b3A9MjAwIik7Ci0Jd2luMyA9IHdpbmRvdy5vcGVuKCdqYXZhc2NyaXB0OiI8aDE+U2ltcGxlIE5ldyBXaW5kb3cgMzwvaDI+PHA+Ym91bmRzOiBoZWlnaHQ9MTAwLHdpZHRoPTMwMDxwPiInLCAiIiwgImhlaWdodD0xMDAsd2lkdGg9MzAwIik7Ci0Jd2luNCA9IHdpbmRvdy5vcGVuKCdqYXZhc2NyaXB0OiI8aDE+U2ltcGxlIE5ldyBXaW5kb3cgNDwvaDI+PHA+Ym91bmRzOiBub3Qgc3BlY2lmaWVkPHA+IicsICIiLCAiIik7Ci0JCi0Jc2V0VGltZW91dCgid2luMS5jbG9zZSgpO3dpbjIuY2xvc2UoKTt3aW4zLmNsb3NlKCk7d2luNC5jbG9zZSgpIiwgNTAwMCk7Ci0JCi08L3NjcmlwdD4KLQotPGZvcm0+Ci0JPGlucHV0IHR5cGU9ImJ1dHRvbiIgVkFMVUU9IndpbmRvdy5vcGVuIiBvbkNsaWNrPSJ0ZXN0T3BlbigpIj4KLQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBWQUxVRT0icmVzaXplVG8iIG9uQ2xpY2s9InRlc3RSZXNpemVUbygpIj4KLQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBWQUxVRT0ibW92ZVRvIiBvbkNsaWNrPSJ0ZXN0TW92ZVRvKCkiPgotCTxpbnB1dCB0eXBlPSJidXR0b24iIFZBTFVFPSJtb3ZlQnkiIG9uQ2xpY2s9InRlc3RNb3ZlQnkoKSI+Ci0JPGlucHV0IHR5cGU9ImJ1dHRvbiIgVkFMVUU9InNjcm9sbEJ5IiBvbkNsaWNrPSJ0ZXN0U2Nyb2xsQnkoKSI+Ci0JPGlucHV0IHR5cGU9ImJ1dHRvbiIgVkFMVUU9InJlc2l6ZUJ5IiBvbkNsaWNrPSJ0ZXN0UmVzaXplQnkoKSI+Ci0JPGlucHV0IHR5cGU9ImJ1dHRvbiIgVkFMVUU9ImNsb3NlIiBvbkNsaWNrPSJ0ZXN0Q2xvc2UoKSI+Ci08L0ZPUk0+Ci08Ym9keT4KLTxwPlRoaXMgdGVzdCB1c2VzIGphdmFzY3JpcHQuCi08cD5JdCBvcGVucyBhIG5ldyB3aW5kb3cuIFNldHMgYSB0aW1lci4gVGhlbiBjbG9zZSB0aGUgbmV3IHdpbmRvdyB3aGVuIHRoZSB0aW1lciBleHBpcmVzLgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjYuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI2Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjc1MDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPGh0bWw+Ci08dGl0bGU+VGhpcyBpcyBhIHRlc3QgdGl0bGUgdGhhdCBtdXN0IGJlIGNhcmVmdWxseSBjaGVja2VkIHdoZW4gdGhhdCBwYWdlIGlzIGxvYWRlZDwvdGl0bGU+Ci08Ym9keT4KLVRoaXMgdGVzdCBpcyB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgY2hlY2sgdGhlIGNvbnRlbnQgb2YgdGhlIHRpdGxlIHRhZy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNy5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1N2Q1My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPGh0bWw+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci13aW4xID0gd2luZG93Lm9wZW4oJ2phdmFzY3JpcHQ6IjxoMT5URVNUIHdpbmRvdy5vcGVuPC9oMj48cD5sZWZ0PTAsdG9wPTAsaGVpZ2h0PTEwMCx3aWR0aD0yMDA8L3A+IicsICIiLCAibGVmdD0wLHRvcD0wLGhlaWdodD0yMDAsd2lkdGg9MzAwIik7CQotd2luMiA9IHdpbmRvdy5vcGVuKCdqYXZhc2NyaXB0OiI8aDE+VEVTVCB3aW5kb3cub3BlbjwvaDI+PHA+bWVudWJhcj1ubyxzdGF0dXM9bm8sbG9jYXRpb249bm8sdG9vbGJhcj1ubyxyZXNpemFibGU9bm8sbGVmdD0zMDEsdG9wPTAsaGVpZ2h0PTYwMCx3aWR0aD0yMDA8L3A+IicsICIiLCAibWVudWJhcj1ubyxzdGF0dXM9bm8sbG9jYXRpb249bm8sdG9vbGJhcj1ubyxyZXNpemFibGU9bm8sbGVmdD0zMDEsdG9wPTAsaGVpZ2h0PTYwMCx3aWR0aD0yMDAiKTsJCi13aW4zID0gd2luZG93Lm9wZW4oJ2phdmFzY3JpcHQ6IjxoMT5URVNUIHdpbmRvdy5vcGVuPC9oMj48cD5zdGF0dXM9bm8sbG9jYXRpb249bm8sdG9vbGJhcj15ZXMscmVzaXphYmxlPXllcyxsZWZ0PTAsdG9wPTIwMSxoZWlnaHQ9NDAwLHdpZHRoPTMwMDwvcD4iJywgIiIsICJzdGF0dXM9bm8sbG9jYXRpb249bm8sdG9vbGJhcj15ZXMscmVzaXphYmxlPXllcyxsZWZ0PTAsdG9wPTIwMSxoZWlnaHQ9NDAwLHdpZHRoPTMwMCIpOwkKLXdpbjQgPSB3aW5kb3cub3BlbignamF2YXNjcmlwdDoiPGgxPlRFU1Qgd2luZG93Lm9wZW48L2gyPjxwPm1lbnViYXI9eWVzLHN0YXR1cz15ZXMsbG9jYXRpb249bm8sdG9vbGJhcj1ubyxyZXNpemFibGU9bm8sbGVmdD0wLHRvcD02MDEsaGVpZ2h0PTIwMCx3aWR0aD01MDA8L3A+IicsICIiLCAibWVudWJhcj15ZXMsc3RhdHVzPXllcyxsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHJlc2l6YWJsZT1ubyxsZWZ0PTAsdG9wPTYwMSxoZWlnaHQ9MjAwLHdpZHRoPTUwMCIpOwkKLTwvc2NyaXB0PgotPGJvZHk+Ci08cD5UaGlzIHRlc3QgdXNlcyBqYXZhc2NyaXB0LgotPHA+SXQgb3BlbnMgYSBzZXJpZXMgb2Ygd2luZG93cyB3aXRoIGRpZmZlcmVudCBhdHRyaWJ1dGVzLgotPHA+VGhlIGJ1dHRvbnMgYmVsb3cgY2FuIGJlIHVzZWQgZm9yIG1hbnVhbGx5IHRlc3RpbmcgdmFyaW91cyB0eXBlcyBvZiBqYXZhc2NyaXB0IHdpbmRvd3MuCi08Zm9ybT4KLTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJicmluZyBhbGVydChtZXNzYWdlKSIgb25DbGljaz0iYWxlcnQoJ21lc3NhZ2UnKSI+Ci08aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0id2luZG93LnByaW50IiBvbkNsaWNrPSJ3aW5kb3cucHJpbnQoKSI+Ci08aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iY29uZmlybSIgb25DbGljaz0iaWYgKGNvbmZpcm0oJ1ByZXNzIE9rIG9yIENhbmNlbCB0byBjb25maXJtJykpIHthbGVydCgnWW91IHByZXNzZWQgT0snKTt9IGVsc2Uge2FsZXJ0KCdZb3UgcHJlc3NlZCBDYW5jZWwnKTt9Ij4KLTwvZm9ybT4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyOS5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZhMDZlZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyOS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkhlbGxvIFRpdGxlPC90aXRsZT4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIGNoYW5nZVN0YXR1cyh0eHQpIHsKLQlkb2N1bWVudC5iZ0NvbG9yID0gInllbGxvdyI7Ci0Jd2luZG93LnN0YXR1cyA9IHR4dDsKLX0KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHk+Ci1IZWxsbyBib2R5Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0LmJtcCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDFkM2FiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkYzhlMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0LmdpZgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUdJRjg3YRIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0LmpwZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTAxOWRjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQuanBnCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAot/9j/ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4NjBhYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHRCYWRCaXREZXB0aC5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0QmFkQml0RGVwdGgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDNjYjkxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHRCYWRCaXREZXB0aC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9lbXB0eS50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9lbXB0eS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZW1wdHkudHh0CisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5ibXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzQzNTFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIuZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUxN2M3NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLmpwZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NzAxNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWYyZGMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLmJtcCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4uYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmExMjE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4uYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4ODZiYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4uanBnIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZjg4ODIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjM2ZDYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LmJtcCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjN2Q1MDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWU4YjVhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQuanBnIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczZWExYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNWQ3ZWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RyYW5zcGFyZW50LnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RyYW5zcGFyZW50LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyNWYxNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90cmFuc3BhcmVudC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMGE4ZDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IFRlc3RzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MWU4OGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSBGaWxlIHdyaXR0ZW4gYnkgUERFIDEuMCAtLT4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3QudGVzdHMiCi0gICBuYW1lPSIlcGx1Z2luTmFtZSIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMCI+Ci0KLTxyZXF1aXJlcz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlIi8+Ci08L3JlcXVpcmVzPgotCi08cnVudGltZT4KLSAgICA8bGlicmFyeSBuYW1lPSJzd3R0ZXN0cy5qYXIiPgotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgPC9saWJyYXJ5PgotICA8L3J1bnRpbWU+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkMmVkZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotICA8IS0tIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBtb3JlIHRpZ2h0bHkgY291cGxlZCB3aXRoIHRoZSAtLT4KLSAgPCEtLSBvcmcuZWNsaXBzZS51aSBwbHVnaW4sIGZvciB0ZXN0aW5nLiAtLT4KLQotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uLy4uIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnN3dC50ZXN0cyIvPgotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke29yZy5lY2xpcHNlLnN3dC50ZXN0c30iLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0ic3VpdGUiIHVubGVzcz0icGVyZm9ybWFuY2UiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3N3dF9zbmlmZl9mb2xkZXIiLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtsb2NhdGlvbjF9IiBxdWlldD0idHJ1ZSIvPgotICAgIDwhLS0gUnVuIGFsbCBTV1QgdGVzdHMgb24gV2luZG93cywgYW5kIGVpdGhlciBDYXJib24gdGVzdHMgb3IgR3RrIHRlc3RzIG90aGVyd2lzZS4gLS0+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY2xhc3MtdGVzdHMiIHZhbHVlPSJvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuQWxsR3RrVGVzdHMiPgotICAgICAgPGVxdWFscyBhcmcxPSIke29zfSIgYXJnMj0ibGludXgiLz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjbGFzcy10ZXN0cyIgdmFsdWU9Im9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5BbGxDYXJib25UZXN0cyI+Ci0gICAgICA8ZXF1YWxzIGFyZzE9IiR7b3N9IiBhcmcyPSJtYWNvc3giLz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjbGFzcy10ZXN0cyIgdmFsdWU9Im9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5BbGxUZXN0cyI+Ci0gICAgICA8ZXF1YWxzIGFyZzE9IiR7b3N9IiBhcmcyPSJ3aW4zMiIvPgotICAgIDwvY29uZGl0aW9uPgotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtkYXRhfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSIke2NsYXNzLXRlc3RzfSIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciB0aGUgdGVzdHMgLS0+Ci0gIDwhLS0gaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0byBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgYXJlIGNyZWF0ZWQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICA8L3RhcmdldD4KLQotICA8IS0tICBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSBwZXJmb3JtYW5jZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4gCi0gIDx0YXJnZXQgbmFtZT0icGVyZm9ybWFuY2Utc3VpdGUiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzd3QtcGVyZm9ybWFuY2UtZm9sZGVyIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3N3dF9wZXJmb3JtYW5jZV9mb2xkZXIiIC8+IAotICAgIDxkZWxldGUgZGlyPSIke3N3dC1wZXJmb3JtYW5jZS1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIgLz4gCi0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0idGltZW91dCIgdmFsdWU9IjE0NDAwMDAwIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3N3dC1wZXJmb3JtYW5jZS1mb2xkZXJ9IiAvPiAKLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9IiAvPiAKLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0cyIgLz4gCi0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0icGVyZm9ybWFuY2UiIGRlcGVuZHM9ImluaXQscGVyZm9ybWFuY2Utc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnKi54bWwiIC8+IAotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIiAvPiAKLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIGFmdGVyIGFsbCAtLT4KLSAgPCEtLSB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0gIAotPC9wcm9qZWN0Pgo=